在线观看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>開發方式
    主站蜘蛛池模板: 日本三级在线视频 | 手机看片1024在线 | 永久在线 | 色先峰| 精品女同同性视频很黄很色 | 99色视频在线 | 夜色爽爽| 在线视频 一区二区 | 又黄又湿又爽吸乳视频 | 久久精品综合网 | 国产片在线观看狂喷潮bt天堂 | 国产乱人视频免费播放 | 欧美ol丝袜高跟秘书在线播放 | 国产午夜视频高清 | 欧美激情αv一区二区三区 欧美激情第一欧美在线 | 中文天堂网 | 色批网站www | 四虎精品成人a在线观看 | 亚洲国产欧美精品一区二区三区 | 亚洲午夜久久久精品影院视色 | 激情狠狠干 | 38pao强力打造永久免费高清视频 | jdav视频在线观看 | 国产视频福利 | 亚洲va久久久噜噜噜久久狠狠 | 一级毛片成人免费看a | 成人免费淫片95视频观看网站 | 人人草人人干 | 久久香蕉国产线看观看亚洲片 | 天天爽夜夜爽夜夜爽精品视频 | 四虎影城库 | 99精品国产高清自在线看超 | 禁h粗大太大好爽好涨受不了了 | 欧美第一色| 人人爱天天做夜夜爽毛片 | 成 人 免 费 黄 色 | 性欧美精品久久久久久久 | 欧美专区在线播放 | 精品国产香港三级 | 亚洲一区二区三区免费视频 | 羞羞漫画喷水漫画yy漫画 |