国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

Linux設(shè)備驅(qū)動(dòng)開發(fā) - 平臺(tái)設(shè)備驅(qū)動(dòng)

發(fā)布者:Lihua1314520最新更新時(shí)間:2024-09-20 來源: cnblogs關(guān)鍵字:Linux  設(shè)備驅(qū)動(dòng)開發(fā) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

Linux2.6的內(nèi)核中引入了一種新的設(shè)備驅(qū)動(dòng)模型-平臺(tái)(platform)設(shè)備驅(qū)動(dòng),平臺(tái)設(shè)備驅(qū)動(dòng)分為平臺(tái)設(shè)備(platform_device)和平臺(tái)驅(qū)動(dòng)(platform_driver),平臺(tái)設(shè)備的引入使得Linux設(shè)備驅(qū)動(dòng)更加便于移植。


一、平臺(tái)設(shè)備

平臺(tái)設(shè)備結(jié)構(gòu)體:


 1 struct platform_device {

 2     const char    * name;                      /* 設(shè)備名 */

 3     int        id;

 4     struct device    dev;                     /* 設(shè)備結(jié)構(gòu)體 */

 5     u32        num_resources;                   /* 設(shè)備資源數(shù)量 */

 6     struct resource    * resource;              /* 設(shè)備資源 */

 7 

 8     const struct platform_device_id    *id_entry;

 9 

10     /* arch specific additions */

11     struct pdev_archdata    archdata;

12 };


平臺(tái)設(shè)備主要是提供設(shè)備資源和平臺(tái)數(shù)據(jù)給平臺(tái)驅(qū)動(dòng),resource為設(shè)備資源數(shù)組,類型有IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA、IORESOURCE_DMA。下面是一個(gè)網(wǎng)卡芯片DM9000的外設(shè)資源:


 1 static struct resource dm9000_resources[] = {

 2     [0] = {

 3         .start        = S3C64XX_PA_DM9000,

 4         .end        = S3C64XX_PA_DM9000 + 3,

 5         .flags        = IORESOURCE_MEM,

 6     },

 7     [1] = {

 8         .start        = S3C64XX_PA_DM9000 + 4,

 9         .end        = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,

10         .flags        = IORESOURCE_MEM,

11     },

12     [2] = {

13         .start        = IRQ_EINT(7),

14         .end        = IRQ_EINT(7),

15         .flags        = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,

16     },

17 };


dm9000_resources里面有三個(gè)設(shè)備資源,第一個(gè)為IORESOURCE_MEM類型,指明了第一個(gè)資源內(nèi)存的起始地址為S3C64XX_PA_DM9000結(jié)束地址為S3C64XX_PA_DM9000 + 3,第二個(gè)同樣為IORESOURCE_MEM類型,指明了第二個(gè)資源內(nèi)存的起始地址為S3C64XX_PA_DM9000 + 4結(jié)束地址為S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,第三個(gè)為IORESOURCE_IRQ類型,指明了中斷號(hào)為IRQ_EINT(7)。


 1 struct device {

 2     struct device        *parent;

 3 

 4     struct device_private    *p;

 5 

 6     struct kobject kobj;

 7     const char        *init_name; /* initial name of the device */

 8     struct device_type    *type;

 9 

10     struct mutex        mutex;    /* mutex to synchronize calls to

11                      * its driver.

12                      */

13 

14     struct bus_type    *bus;        /* type of bus device is on */

15     struct device_driver *driver;    /* which driver has allocated this

16                        device */

17     void        *platform_data;    /* Platform specific data, device

18                        core doesn't touch it */

19     ...

20 };


struct device結(jié)構(gòu)體里面有一個(gè)重要成員platform_data,它是平臺(tái)設(shè)備和平臺(tái)驅(qū)動(dòng)進(jìn)行數(shù)據(jù)傳遞的重要成員。


平臺(tái)設(shè)備注冊:


1 int platform_device_register(struct platform_device *pdev);

platform_device_register()會(huì)對平臺(tái)設(shè)備進(jìn)行相應(yīng)的初始化之后調(diào)用platform_device_register()函數(shù)把它添加到子系統(tǒng)中。



平臺(tái)設(shè)備注銷:


1 void platform_device_unregister(struct platform_device *pdev);

platform_device_unregister()函數(shù)釋放設(shè)備資源之后從子系統(tǒng)中將其移除。


平臺(tái)設(shè)備模板:


 1 static struct resource xxx_resource = 

 2 {

 3     [0] = 

 4     {

 5         .start = ...,

 6         .end = ...,

 7         .flags = ...,

 8     },

 9     [1] = 

10     {

11         ...

12     }

13     ...

14 };

15 

16 static struct xxx_plat_data xxx_data = 

17 {

18     ...

19 };

20 

21 static struct platform_device xxx_platform_device = 

22 {

23     .name = NAME,

24     .num_resources = ARRAY_SIZE(xxx_resource),

25     .resource = xxx_resource,

26     .dev = 

27     {

28         .platform_data = &xxx_data,

29     }

30 };

31 

32 static int __init xxx_device_init(void)

33 {

34     ...

35     /* 注冊平臺(tái)設(shè)備 */

36     platform_device_register(&xxx_platform_device);

37     ...

38 }

39 

40 static void __exit xxx_device_exit(void)

41 {

42     ...

43     /* 注銷平臺(tái)設(shè)備 */

44     platform_device_unregister(&xxx_platform_device);

45     ...

46 }


二、平臺(tái)驅(qū)動(dòng)

平臺(tái)驅(qū)動(dòng)結(jié)構(gòu)體:


1 struct platform_driver {

2     int (*probe)(struct platform_device *);

3     int (*remove)(struct platform_device *);

4     void (*shutdown)(struct platform_device *);

5     int (*suspend)(struct platform_device *, pm_message_t state);

6     int (*resume)(struct platform_device *);

7     struct device_driver driver;

8     const struct platform_device_id *id_table;

9 };


平臺(tái)驅(qū)動(dòng)結(jié)構(gòu)體driver成員里面的name必須與平臺(tái)設(shè)備結(jié)構(gòu)體里面的name成員一致,在系統(tǒng)注冊一個(gè)設(shè)備的時(shí)候,會(huì)通過設(shè)備結(jié)構(gòu)體里面的name成員和平臺(tái)驅(qū)動(dòng)driver里面的name成員匹配,當(dāng)匹配成功則調(diào)用平臺(tái)驅(qū)動(dòng)的probe函數(shù),

通常在probe函數(shù)中獲取平臺(tái)設(shè)備的資源和私有數(shù)據(jù)并進(jìn)行設(shè)備的初始化。


獲取設(shè)備資源:


1 struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);

platform_get_resource()函數(shù)用于獲取平臺(tái)設(shè)備的資源,dev為要平臺(tái)設(shè)備,type為平臺(tái)設(shè)備資源類型,num為平臺(tái)資源號(hào)(比如同一個(gè)資源有兩個(gè)則資源號(hào)為0,1)。

 


平臺(tái)驅(qū)動(dòng)注冊:


1 int platform_driver_register(struct platform_driver *drv);

platform_driver_register()函數(shù)完成平臺(tái)驅(qū)動(dòng)的注冊,在驅(qū)動(dòng)模塊加載時(shí)調(diào)用。


平臺(tái)驅(qū)動(dòng)注銷:


1 void platform_driver_unregister(struct platform_driver *drv);

platform_driver_unregister()函數(shù)完成平臺(tái)驅(qū)動(dòng)的注銷,在驅(qū)動(dòng)模塊卸載時(shí)調(diào)用。


平臺(tái)驅(qū)動(dòng)模板:


 1 static int __devinit xxx_probe(struct platform_device *pdev)

 2 {

 3     struct xxx_plat_data *pdata = pdev->dev.platform_data;    /* 獲取私有數(shù)據(jù) */

 4     platform_get_resource(pdev,xxx,x);                        /* 獲取設(shè)備資源 */

 5     ...

 6 }

 7 

 8 static struct platform_driver xxx_platform_driver = 

 9 {

10     .probe = xxx_probe,

11     .remove = __devexit_p(xxx_remove),

12     .driver = 

13     {

14         .name = NAME,    /* 跟平臺(tái)設(shè)備名一致 */

15         ...

16     },

17     ...

18 };

19 

20 static int __init xxx_driver_init(void)

21 {

22     ...

23     /* 驅(qū)動(dòng)注冊 */

24     platform_driver_register(&xxx_platform_driver);

25     ...

26 }

27 

28 static void __exit xxx_driver_exit(void)

29 {

30     ...

31     /* 驅(qū)動(dòng)注銷 */

32     platform_driver_unregister(&xxx_platform_driver);

33     ...

34 }


關(guān)鍵字:Linux  設(shè)備驅(qū)動(dòng)開發(fā) 引用地址:Linux設(shè)備驅(qū)動(dòng)開發(fā) - 平臺(tái)設(shè)備驅(qū)動(dòng)

上一篇:Linux混雜設(shè)備驅(qū)動(dòng) - 按鍵設(shè)備驅(qū)動(dòng)
下一篇:Linux設(shè)備驅(qū)動(dòng)開發(fā) - 混雜設(shè)備驅(qū)動(dòng)

推薦閱讀最新更新時(shí)間:2025-06-22 20:41

2416開發(fā)記錄五: misc設(shè)備驅(qū)動(dòng)
對于linux的驅(qū)動(dòng)程序來說,主要分為三種:miscdevice、platform_device、platform_driver 。 這三個(gè)結(jié)構(gòu)體關(guān)系: (基類) kobject ——————– / \ \ / \ \ device cdev driver / \ (設(shè)備驅(qū)動(dòng)操作方法) \ / \ \ miscdevice platform_device platform_driver (設(shè)備驅(qū)動(dòng)操作方法) (設(shè)備的資源) (設(shè)備驅(qū)動(dòng)) 這時(shí),我們先不討論這幾個(gè)間的關(guān)系與驅(qū)別,對于新手來說,上手最重要! 首先我們先看看混雜項(xiàng): 在Linux驅(qū)動(dòng)中把無法歸類的五花八門的設(shè)備定義為混雜設(shè)備(用misc
[單片機(jī)]
【IMX6ULL學(xué)習(xí)筆記】九、Linux內(nèi)核移植
一、在 Linux 中添加自己的開發(fā)板 1、添加開發(fā)板默認(rèn)配置文件 將 arch/arm/configs 目 錄 下 的 imx_v7_mfg_defconfig 重新復(fù)制一份,命名為 imx_kodo_emmc_defconfig,命令如下: cd arch/arm/configs cp imx_v7_mfg_defconfig imx_kodo_emmc_defconfig 以后就可以使用如下命令來配置正點(diǎn)原子 EMMC 版開發(fā)板對應(yīng)的 Linux 內(nèi)核了: make imx_kodo_emmc_defconfig 2、添加開發(fā)板對應(yīng)的設(shè)備樹文件 添加適合 EMMC 版開發(fā)板的設(shè)備樹文件,進(jìn)入目錄 arch/arm/b
[單片機(jī)]
【IMX6ULL學(xué)習(xí)筆記】九、<font color='red'>Linux</font>內(nèi)核移植
基于linux操作系統(tǒng)下s5pv210板子的按鍵中斷實(shí)驗(yàn)
首先,在做這個(gè)實(shí)驗(yàn)之前有三件事是要明確的: 1. linux下的中斷實(shí)驗(yàn)不需要像裸機(jī)實(shí)驗(yàn)一樣要自己寫取消屏蔽,清除中斷標(biāo)志位的操作,系統(tǒng)會(huì)自動(dòng)幫你完成; 2.中斷號(hào)的申請我使用的是gpio_to_irq()這個(gè)宏,它會(huì)幫我們自動(dòng)分配中斷號(hào),返回值為中斷號(hào); 3. 在每個(gè)板子配套來的內(nèi)核代碼大部分都是已經(jīng)包含了按鍵中斷驅(qū)動(dòng),如果想另自己寫的按鍵中斷驅(qū)動(dòng)不與內(nèi)核本身帶的發(fā)生中斷號(hào)上的沖突,應(yīng)先找到內(nèi)核代碼下的arch/arm/mach-s5pv210/mach-mini210.c中的gpio_bottons中的對按鍵初始化的代碼注釋掉(其他板子也類似),如下代碼所示: static struct gpio_keys_
[單片機(jī)]
LINUX下ARM匯編的常用指令解析
1.ldr 和 str : (1) ldr 作為指令,叫做寄存器加載指令。將內(nèi)存中的值加載到寄存器中。 (2) ldr 作為偽指令,實(shí)現(xiàn)一個(gè)32位常數(shù)或地址值加載到寄存器中。后面加載的常量或地址值標(biāo)號(hào)前面必須有一個(gè) “=” ,編譯器會(huì)將偽指令替換成指令實(shí)現(xiàn)。 (3) str 將寄存器中的值保存到內(nèi)存單元中。 2..long 偽操作,給數(shù)值分配內(nèi)存單元。 start: virable: .long start 如上,表示將start表示的值存到virable所代表的內(nèi)存中。 virable: .long 0x66666666 如上,表示將0x66666666存入virable所在的內(nèi)存單元中。 3.adr
[單片機(jī)]
OK6410A 開發(fā)板 (八) 107 linux-5.11 OK6410A devtmpfs 文件系統(tǒng)
drivers/base/devtmpfs.c devtmpfs 分為兩種實(shí)現(xiàn) 1. 沒有定義 CONFIG_TMPFS 2. 定義了 CONFIG_TMPFS 67 static struct file_system_type internal_fs_type = { 68 .name = devtmpfs , 69 #ifdef CONFIG_TMPFS 70 .init_fs_context = shmem_init_fs_context,
[單片機(jī)]
記:關(guān)于W806的Linux下基本教程(一)——環(huán)境建立與第一次燒寫
0x00 前言 本文主要在Linux下實(shí)現(xiàn)了對于聯(lián)盛德的W806芯片的SDK相關(guān)的操作,包括但不限于指定燒寫、擦除、編譯。 0x10 準(zhǔn)備工作 首先需要一個(gè)Linux系統(tǒng),這里筆者選擇了Debian 11,按照默認(rèn)的安裝方式下,下面就可以在完成換源、準(zhǔn)備賬號(hào),之后就可以安裝一些依賴。這里筆者選擇飽和安裝,里面應(yīng)該有一些東西不需要,但是也不怎么重要。 sudo apt install gcc-10-cross-base gcc-10-arm-linux-gnueabihf gcc-10-arm-linux-gnueabi cpp-10-arm-linux-gnueabi cpp-10-arm-linux-gnueabihf
[單片機(jī)]
記:關(guān)于W806的<font color='red'>Linux</font>下基本教程(一)——環(huán)境建立與第一次燒寫
s3c6410的RTC在linux中的驅(qū)動(dòng)(5)
在上一篇中我們在中分析了RTC驅(qū)動(dòng)的注冊和注銷,重點(diǎn)講了平臺(tái)設(shè)備驅(qū)動(dòng)的probe函數(shù),最后引出了這篇我們要講解的內(nèi)容,那就是下面這個(gè)結(jié)構(gòu)體中的一些函數(shù)。 static const struct rtc_class_ops s3c_rtcops = { .open= s3c_rtc_open, .release = s3c_rtc_release, .ioctl = s3c_rtc_ioctl, .read_time = s3c_rtc_gettime, .set_time = s3c_rtc_settime, .read_alarm = s3c_rtc_getalarm, .set_alarm = s3c_rtc_seta
[單片機(jī)]
s3c6410的RTC在<font color='red'>linux</font>中的驅(qū)動(dòng)(5)
【ARM】一步一步移植Linux Kernel 2.6.13到板子
#1環(huán)境搭建所需材料 Linux 內(nèi)核代碼 編譯器 文件系統(tǒng) samba tftp SecureCRT6.0 開發(fā)板uboot nfs-kernel-server #2環(huán)境搭建所需材料之間的關(guān)系 #3所使用的開發(fā)板 #4譯內(nèi)核 ##4.1修改makefile ##4.2拷貝配置文件 ##4.3編譯得到zImage ##4.4把zImage轉(zhuǎn)成uImage #5開發(fā)板串口連接 串口形狀 ,在電腦上映射出來的串口設(shè)備連接串口 到0回車。。。 #6uboot設(shè)置 #7通過tftp服務(wù)器下載uImage #8啟動(dòng)內(nèi)核 這時(shí)啟動(dòng)內(nèi)核后還不會(huì)進(jìn)入文件系統(tǒng) #9先看掛載文件系統(tǒng)的樣子 先看現(xiàn)象
[單片機(jī)]
【ARM】一步一步移植<font color='red'>Linux</font> Kernel 2.6.13到板子
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved