在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

設備樹下的字符設備驅動框架

CHANBAEK ? 來源:嵌入式攻城獅 ? 作者:安迪西 ? 2023-04-14 11:35 ? 次閱讀

設備樹下的字符設備驅動框架

沒有引入設備樹時,相關寄存器物理地址是直接定義在驅動文件中的,通過地址映射成為虛擬地址后,再操作虛擬地址完成GPIO的初始化。 設備樹的本質也是操作寄存器,只不過寄存器的相關信息 放在了設備樹中,配置寄存器時使用OF函數從設備樹中讀取寄存器數據后再進行配置

下圖為設備樹下的字符設備驅動框架圖:

圖片

接下來根據上面的框架圖,以驅動LED (GPIO1_IO03)為例,分步介紹具體的代碼編寫流程

1. 修改設備樹文件

在內核源碼的/arch/arm/boot/dts/文件夾中復制一份官方I.MX6ULL EVK EMMC版的設備樹文件imx6ull-14x14-evk-emmc.dts,并自定義文件名,此處重命名為了imx6ull-andyxi-emmc.dts,在根節點中添加LED設備節點

andyxiled {
    #address-cells = <1>;      /*reg中起始地址占用一個字長*/
    #size-cells = <1>;         /*reg中地址長度占用一個字長*/
    compatible = "andyxi-led";
    status = "okay";
    reg = < 0X020C406C 0x04    /*CCM_CCGR1_BASE*/ 
            0X020E0068 0x04    /*SW_MUX_GPIO1_IO03_BASE*/
            0X020E02F4 0x04    /*SW_PAD_GPIO1_IO03_BASE*/
            0X0209C000 0x04    /*GPIO1_DR_BASE*/
            0X0209C004 0x04 >; /*GPIO1_GDIR_BASE*/
};

設備樹修改完成后,在內核源碼的根目錄下執行make命令編譯設備樹

make dtbs                       #編譯設備樹
make imx6ull-andyxi-emmc.dtb    #單獨編譯指定設備樹

編譯完成后,使用新的設備樹啟動Linux內核,之后可進入/proc/device-tree文件夾查看dtsled節點是否存在

#啟動Linux系統后,在開發板中查看節點
cd /proc/device-tree         #查看andyxiled節點是否存在

2. 編寫驅動程序

創建驅動程序文件dtsled.c,添加如下代碼

宏定義及設備結構體定義

#define DTSLED_CNT 1            //設備號個數
#define DTSLED_NAME "dtsled"    //名字
#define LEDOFF 0                //關燈
#define LEDON 1                 //開燈
/* 映射后的寄存器虛擬地址指針 */
static void __iomem *IMX6U_CCM_CCGR1;
static void __iomem *SW_MUX_GPIO1_IO03;
static void __iomem *SW_PAD_GPIO1_IO03;
static void __iomem *GPIO1_DR;
static void __iomem *GPIO1_GDIR;
/* dtsled 設備結構體 */
struct dtsled_dev{
    dev_t devid;               //設備號
    struct cdev cdev;          //cdev
    struct class *class;       //類
    struct device *device;     //設備
    int major;                 //主設備號
    int minor;                 //次設備號
    struct device_node *nd;    //設備節點
};

struct dtsled_dev dtsled;      //led設備

編寫設備操作函數:設備操作函數和LED開關函數,具體代碼可參考Linux點燈一文相關部分

驅動入口函數中:使用OF函數獲取設備樹中的屬性值,并初始化

static int __init led_init(void) { 
    u32 val = 0; 
    int ret; 
    u32 regdata[14]; 
    const char *str; 
    struct property *proper; 
    /* 獲取設備樹中的屬性數據 */ 
    /* 1、獲取設備節點:andyxiled */ 
    dtsled.nd = of_find_node_by_path("/andyxiled"); 
    if(dtsled.nd == NULL) { 
        printk("andyxiled node can not found!\\r\\n"); 
        return -EINVAL; 
    } else { 
        printk("andyxiled node has been found!\\r\\n"); 
    } 
    /* 2、獲取compatible屬性內容 */ 
    proper = of_find_property(dtsled.nd, "compatible", NULL); 
    if(proper == NULL) { 
        printk("compatible property find failed\\r\\n"); 
    } else { 
        printk("compatible = %s\\r\\n", (char*)proper->value); 
    }  
    /* 3、獲取status屬性內容 */ 
    ret = of_property_read_string(dtsled.nd, "status", &str); 
    if(ret < 0){ 
        printk("status read failed!\\r\\n"); 
    } else { 
        printk("status = %s\\r\\n",str); 
    }
    /* 4、獲取reg屬性內容 */ 
    ret = of_property_read_u32_array(dtsled.nd, "reg", regdata, 10); 
    if(ret < 0) { 
        printk("reg property read failed!\\r\\n"); 
    } else { 
        u8 i = 0; 
        printk("reg data:\\r\\n"); 
        for(i = 0; i < 10; i++) 
        printk("%#X ", regdata[i]); 
        printk("\\r\\n"); 
    }

    /* 初始化LED */ 
#if 0 
    /* 1、寄存器地址映射 */ 
    IMX6U_CCM_CCGR1 = ioremap(regdata[0], regdata[1]); 
    SW_MUX_GPIO1_IO03 = ioremap(regdata[2], regdata[3]); 
    SW_PAD_GPIO1_IO03 = ioremap(regdata[4], regdata[5]); 
    GPIO1_DR = ioremap(regdata[6], regdata[7]); 
    GPIO1_GDIR = ioremap(regdata[8], regdata[9]); 
#else 
    IMX6U_CCM_CCGR1 = of_iomap(dtsled.nd, 0); 
    SW_MUX_GPIO1_IO03 = of_iomap(dtsled.nd, 1); 
    SW_PAD_GPIO1_IO03 = of_iomap(dtsled.nd, 2); 
    GPIO1_DR = of_iomap(dtsled.nd, 3); 
    GPIO1_GDIR = of_iomap(dtsled.nd, 4); 
#endif 
    /* 2、使能GPIO1時鐘 */ 
    val = readl(IMX6U_CCM_CCGR1); 
    val &= ~(3 << 26);     //之前的設置
    val |= (3 << 26);      //設置新值
    writel(val, IMX6U_CCM_CCGR1); 
    /* 3、設置GPIO1_IO03復用功能,并設置IO屬性 */ 
    writel(5, SW_MUX_GPIO1_IO03); 
    writel(0x10B0, SW_PAD_GPIO1_IO03); 
    /* 4、設置GPIO1_IO03為輸出功能 */ 
    val = readl(GPIO1_GDIR); 
    val &= ~(1 << 3);      //之前的設置 
    val |= (1 << 3);       //設置為輸出
    writel(val, GPIO1_GDIR); 
    /* 5、默認關閉LED */ 
    val = readl(GPIO1_DR); 
    val |= (1 << 3); 
    writel(val, GPIO1_DR);

驅動入口函數中:注冊字符設備驅動,代碼與Linux點燈一文中的一樣

驅動出口函數中:注銷設備驅動,刪除類和設備,代碼可參考Linux點燈一文

3. 編寫測序程序

實現操作驅動文件對外設進行控制的功能。 創建測試程序文件dtsledApp.c,代碼內容與Linux點燈一文中的測試程序代碼一致,此處不再贅述

4. 編譯測試

編譯驅動程序:當前目錄下創建Makefile文件,并make編譯

KERNELDIR := /home/andyxi/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_andyxi
CURRENT_PATH := $(shell pwd)
obj-m := dtsled.o

build: kernel_modules

kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

編譯測試程序:無需內核參與,直接編譯即可

arm-linux-gnueabihf-gcc dtsledApp.c -o dtsledApp

運行測試:拷貝驅動模塊和測試程序到開發板,啟動開發板,加載驅動模塊后,使用應用程序測試驅動是否正常工作

depmod                         #第一次加載驅動的時候需運行此命令
modprobe dtsled.ko             #加載驅動
./dtsledApp /dev/dtsled 1      #打開LED燈
./dtsledApp /dev/dtsled 0      #關閉LED燈
rmmod dtsled.ko                #卸載驅動模塊
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5372

    瀏覽量

    121304
  • 內核
    +關注

    關注

    3

    文章

    1384

    瀏覽量

    40444
  • 字符
    +關注

    關注

    0

    文章

    234

    瀏覽量

    25268
  • GPIO
    +關注

    關注

    16

    文章

    1217

    瀏覽量

    52443
  • 設備樹
    +關注

    關注

    0

    文章

    39

    瀏覽量

    3166
收藏 人收藏

    評論

    相關推薦

    Linux平臺設備框架驅動

    ? 平臺設備框架(platform)是將一個驅動分為設備層和驅動層兩個部分,通過總線模型將設備
    的頭像 發表于 09-25 08:59 ?1890次閱讀
    Linux平臺<b class='flag-5'>設備</b><b class='flag-5'>框架</b><b class='flag-5'>驅動</b>

    Linux字符設備驅動開發框架介紹

    字符設備是Linux驅動中最基本的一類設備驅動字符設備
    發表于 04-15 11:52 ?1447次閱讀
    Linux<b class='flag-5'>字符</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發<b class='flag-5'>框架</b>介紹

    ArmSoM系列板卡 嵌入式Linux驅動開發實戰指南 之 字符設備驅動

    字符設備驅動 本章,我們將學習字符設備使用、字符設備
    的頭像 發表于 04-10 09:53 ?1133次閱讀
    ArmSoM系列板卡 嵌入式Linux<b class='flag-5'>驅動</b>開發實戰指南 之 <b class='flag-5'>字符</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>

    「正點原子Linux連載」第五十五章設備樹下的platform驅動編寫

    學習一下如何在設備樹下編寫platform驅動。55.1設備樹下的platform驅動簡介pla
    發表于 03-21 10:03

    字符設備驅動 —— 字符設備驅動框架

      3、字符設備驅動框架作為字符設備驅動要素:1,必
    發表于 10-19 17:08

    什么是字符設備驅動字符設備驅動開發步驟有哪些?

    什么是字符設備驅動字符設備驅動開發步驟有哪些?如何實現實現
    發表于 10-20 08:02

    字符設備驅動的開發流程

    做嵌入式linux驅動開發,首先要搞明白大致框架。linux的驅動通常分為字符設備驅動、塊
    發表于 12-24 08:30

    嵌入式Linux字符設備驅動的設計與應用

    描述了基于嵌入式Linux的字符設備驅動程序的設計方法和實現過程。以電機、數碼管、串口和mini鍵盤的驅動設計為例,詳細闡述了嵌入式linux下字符
    發表于 02-23 15:45 ?24次下載

    深度解析字符設備驅動模型

    ,read,write和ioctl等例程。所以根據應用不同,字符驅動能會調用其他驅動模塊,如i2c、spi和v4l2等,于是字符驅動還可分W
    發表于 10-17 10:09 ?0次下載

    VxWorks設備驅動字符設備驅動詳解

    VxWorks設備驅動字符設備驅動詳解
    發表于 10-26 10:28 ?7次下載
    VxWorks<b class='flag-5'>設備</b><b class='flag-5'>驅動</b>之<b class='flag-5'>字符</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>詳解

    《Linux設備驅動開發詳解》第6章、字符設備驅動

    《Linux設備驅動開發詳解》第6章、字符設備驅動
    發表于 10-27 11:46 ?23次下載
    《Linux<b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發詳解》第6章、<b class='flag-5'>字符</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>

    你了解過Linux字符設備驅動框架

    字符設備是Linux三大設備之一(另外兩種是塊設備,網絡設備),字符
    發表于 05-08 14:28 ?475次閱讀

    驅動之路-高級字符設備驅動程序

    高級字符設備驅動在簡單字符驅動的基礎上添加ioctl方法、阻塞非阻塞讀寫、poll方法、和自動創建設備
    發表于 05-15 14:24 ?830次閱讀
    <b class='flag-5'>驅動</b>之路-高級<b class='flag-5'>字符</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>程序

    字符設備驅動框架

    1、概述: linux中一切皆文件,設備也如此,并且以操作文件即文件IO的方式訪問設備。 應用程序只能通過庫函數中的系統調用來操作硬件,對于每個系統調用,驅動程序中都會有一個與之對應的函數,對于
    發表于 10-19 17:20 ?742次閱讀

    Linux新字符設備驅動開發方式

    Linux字符設備驅動開發模板中介紹了舊版本的驅動開發模板,其需要手動分配設備號后,再進行注冊,驅動
    的頭像 發表于 04-14 12:02 ?917次閱讀
    Linux新<b class='flag-5'>字符</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發方式
    主站蜘蛛池模板: 在线精品国产第一页 | 亚洲成a人片在线观看www | 久久婷人人澡人人爽 | 国内一级特黄女人精品毛片 | 欧美色图亚洲激情 | 色.www| 伊人网视频 | 午夜性爽视频男人的天堂在线 | 日本www在线观看 | 最新国产你懂的在线网址 | 久久国产精品亚洲综合 | 一色屋成人免费精品网 | 人人做天天爱夜夜爽中字 | 亚洲精品视频免费 | 午夜影院入口 | 免费高清一级欧美片在线观看 | 丁香婷婷电影 | 欧美怡红院免费全部视频 | 天天爽天天干 | 5月婷婷6月丁香 | 你懂的在线视频网站 | 国产视频综合 | 婷婷 夜夜 | 一级特黄高清完整大片 | 久久精品国产免费观看99 | 美女扒开尿囗给男人玩的动图 | 好吊妞视频988在线播放 | 久久99热久久精品动漫 | 5566精品资源在线播放 | 国产三级精品最新在线 | 午夜欧美精品久久久久久久 | 91久久夜色精品国产网站 | 日韩欧美国产电影 | 欧美性黄色 | 欧美另类图片亚洲偷 | 一级骚片超级骚在线观看 | 国产免费人成在线视频视频 | 色激情网 | 伊人网在线观看 | 欧美性受xxxx极品 | 手机在线观看一级午夜片 |