娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

linux驅動(九)platform驅動模型詳解,以及基于platform驅動模型的led驅動

發布者:幸福花開最新更新時間:2025-01-07 來源: cnblogs關鍵字:linux驅動  platform  驅動模型  led驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

參考:

http://blog.csdn.net/qq_28992301/article/details/52385518

http://blog.csdn.net/zoe6553/article/details/6372445

http://blog.chinaunix.net/uid-25014876-id-111745.html

 

1:什么是platform總線
platform總線是區別于實體總線USB、 I2C、SPI 、PIC總線的虛擬總線,一些usb設備選址的話需要通過USB總線來進行尋址,

而有些類似于SoC內部外設如led 看門狗 定時器是直接通過內存的尋址空間來進行尋址的,cpu與這些設備通信是不需要總線的,2.6內核以后要

對所有設備進行統一管理,通過kset、kobject來建立層次關系,對這些直接通過內存尋址的設備虛擬了一種總線即platform總線,在硬件上

實際是沒有這個總線;platform內核純軟件的總線,所有的直接通過內存尋址的設備都映射到這條總線上;

2:platform總線的優點

  a:可以通過platform總線,可以遍歷所有的platform總線設備;platform本質其實也是kset、kobject,具有kobject的特性

  b:實現設備與驅動的分離,通過platform總線,設備與驅動是分開注冊的,通過platform總線的probe來隨時檢測與設備匹配的驅動,如匹配上即進行這個設備的驅動注冊;

  c:由于上面這個優勢,一個驅動可以供同類的幾個設備使用;

3:platform總線以及platform總線設備驅動的實現流程

  a:platform總線注冊

  b:platform_device注冊

  c:platform_driver注冊

  d:設備與驅動的匹配

  e:驅動的注冊

platform總線的工作流程如下圖:

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 1:根據上面的流程我們來分析一下具體代碼
  platform總線的注冊:platform的注冊是linux內核工程師已經設注冊好的;重點看一下.match = platform_match函數;platform_driver和platform_device就是通過這個函數來匹配的


1 struct bus_type platform_bus_type = {

2     .name        = 'platform',

3     .dev_attrs    = platform_dev_attrs,

4     .match        = platform_match,

5     .uevent        = platform_uevent,

6     .pm        = &platform_dev_pm_ops,

7 };


 1 int __init platform_bus_init(void)

 2 {

 3     int error;

 4 

 5     early_platform_cleanup();

 6 

 7     error = device_register(&platform_bus);

 8     if (error)

 9         return error;

10     error =  bus_register(&platform_bus_type);

11     if (error)

12         device_unregister(&platform_bus);

13     return error;

14 }


 1 static int platform_match(struct device *dev, struct device_driver *drv)

 2 {

 3     struct platform_device *pdev = to_platform_device(dev);

 4     struct platform_driver *pdrv = to_platform_driver(drv);

 5 

 6     /* match against the id table first */

 7     if (pdrv->id_table)

 8         return platform_match_id(pdrv->id_table, pdev) != NULL;

 9 

10     /* fall-back to driver name match */

11     return (strcmp(pdev->name, drv->name) == 0);

12 }


由platform_match_id函數來進行匹配的,如果id_table不為空,則通過id_table來pdev_name匹配,如果為空,則drv->name與pdev->name來進行匹配,

匹配上以后再執行probe函數,這個函數即注冊這個設備的驅動;

---------------------------------------------------------------------------------------------------------------------------------------------------------------

2:platform_device的注冊

在arch/arm/mach-s3c2440/mach-mini2440.c文件中

 這里注意.name、.dev.platform_data 這兩個變量 

platform_driver和platform_device就是通過name來匹配的。name一致則匹配上;

.dev.platform_data這個元素是中的內容是name、gpio flag def_trigger四個元素

 1 static struct platform_device mini2440_led1 = {

 2     .name        = 's3c24xx_led',      

 3     .id        = 1,

 4     .dev        = {

 5         .platform_data    = &mini2440_led1_pdata,

 6     },

 7 };

 8 

 9 static struct platform_device mini2440_led2 = {

10     .name        = 's3c24xx_led',

11     .id        = 2,

12     .dev        = {

13         .platform_data    = &mini2440_led2_pdata,

14     },

15 };

 


設置好platform_device 結構體以后就可以注冊platform_device設備了,把我們設置好的platform_device結構體放到mini2440這個結構體數組指針中;


 1 static struct platform_device *mini2440_devices[] __initdata = {

 2     &s3c_device_ohci,

 3     &s3c_device_wdt,

 4     &s3c_device_i2c0,

 5     &s3c_device_rtc,

 6     &s3c_device_usbgadget,

 7     &mini2440_device_eth,

 8     &mini2440_led1,

 9     &mini2440_led2,

10     &mini2440_led3,

11     &mini2440_led4,

12     &mini2440_button_device,

13     &s3c_device_nand,

14     &s3c_device_sdi,

15     &s3c_device_iis,

16     &mini2440_audio,

17 };


在arch/arm/mach-s3c2440/mach-mini2440.c


mini2440_init 函數下


platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));


使用的platform_add_devices這個函數把mini2440的所有設備注冊到內核中;內核會自動查找platform_device鏈表以及platform_driver鏈表,當match以后字自動執行platform_driver的probe函數;


在整理一下platform_device的注冊過程:


1:設置好platform_device結構體(對于led驅動來說關鍵是name、dev->platform_data兩個元素)


2:初始化好dev->platform_data結構體,這里主要涉及到led驅動所要用到的gpio,


這里我們可以看到linux內核platform驅動框架的設計思想:首先設備和驅動是分開的,同類設備有共性的部分,不同的部分,不同的部分在初始化的即被設置好;共性的部分內核工程師以及設置好;然后在通過一個匹配函數如果內核鏈表的設備與驅動鏈表的驅動匹配,則會自動安裝驅動,否則不會安裝驅動;


3:把設置好的platform_device設備加入到mini2440_devices中


4:在mini2440_device初始化的時候通過platform_add_devices函數把platform設備注冊上去;注冊以后再/sys/bus/platform/devices目錄下會看到dev.name的文件夾


---------------------------------------------------------------------------------------------------------------------------------------------------------


3:platform_driver的注冊


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 };


 1 static struct platform_driver s3c24xx_led_driver = {

 2     .probe        = s3c24xx_led_probe,

 3     .remove        = s3c24xx_led_remove,

 4     .driver        = {

 5         .name        = 's3c24xx_led',

 6         .owner        = THIS_MODULE,

 7     },

 8 };

 9 

10 static int __init s3c24xx_led_init(void)

11 {

12     return platform_driver_register(&s3c24xx_led_driver);

13 }


設置好platform_driver  結構體,使用platform_driver_register注冊即可,這里關鍵的是probe、remove、driver.name 三個變量;


platform_driver_register  使用這個函數注冊以后再 /sys/bus/platform/drivers目錄下會看到 dev.name的文件夾


內核會自動檢測匹配以后會自動執行probe函數;


-----------------------------------------------------------------------------------------------------------------------------------------------------------


代碼實戰:


led_driver.c driver注冊;


  1 #include // module_init  module_exit

  2 #include    // __init   __exit

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8 #include

  9 #include

 10 #include

 11 #include

 12 #include

 13 #include

 14 #include

 15 #include

 16 #include

 17 #include

 18 #include

 19 

 20 struct led_classdev *led_device;

 21 struct s5pv210_led_platdata *pdata;

 22 

 23 

 24 #define x210_led_on     0

 25 #define x210_led_off     1

 26 

 27 static void s5pv210_led_set(struct led_classdev *led_cdev,

 28                    enum led_brightness value)

 29 {

 30     

 31     //真正控制硬件的函數

 32     if (value == LED_OFF) {        

 33         gpio_set_value(pdata->gpio, x210_led_off);

 34         printk(KERN_INFO 'LED1 OFF...');

 35     }

 36     else {

 37         

 38         gpio_set_value(pdata->gpio, x210_led_on);

 39         printk(KERN_INFO 'LED1 ON...');

 40     }

 41 

 42 }

 43 

 44 

 45 

 46 

 47 // 模塊安裝函數

 48 static int s5pv210_led_probe(struct platform_device *dev)

 49 {

 50     int ret = -1;

 51     printk(KERN_INFO 'led_device initn');

 52 

 53 

 54     led_device = kzalloc(sizeof(struct led_classdev), GFP_KERNEL);

 55     if (led_device == NULL)

 56     {

 57     printk(KERN_ERR 'No memory for led_devicen');

 58     return -ENOMEM;

 59     }

 60 

 61     pdata = dev->dev.platform_data;

 62     

 63     led_device->name = pdata->name;

 64     led_device->brightness_set = s5pv210_led_set;

 65 

 66     

 67 

 68     //在這里進行注冊驅動;

 69     ret = led_classdev_register(NULL, led_device);

[1] [2]
關鍵字:linux驅動  platform  驅動模型  led驅動 引用地址:linux驅動(九)platform驅動模型詳解,以及基于platform驅動模型的led驅動

上一篇:tiny210裸機第1課(啟動原理)
下一篇:linux下的misc設備led示例

推薦閱讀最新更新時間:2025-04-15 20:14

基于tiny4412的Linux內核移植 -- eMMC驅動移植(六)
平臺簡介 開發板:tiny4412ADK + S700 + 4GB Flash 要移植的內核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自帶的 U-Boot 2010.12 (為支持uImage啟動,做了少許改動) busybox版本:busybox 1.25 eMMC:KLMxGxFE3x-x00x 交叉編譯工具鏈: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 概述 eMMC驅動在內核中也已經支持好了,代碼在:
[單片機]
基于tiny4412的<font color='red'>Linux</font>內核移植 -- eMMC<font color='red'>驅動</font>移植(六)
linux串口終端驅動——s3c6410平臺(三)
上一篇關注的是tty上層字符層面的操作和注冊,這一篇主要關注線程的注冊,如何與上層建筑聯系起來。 一、 tty_ldisc.c提供了tty_register_ldisc()接口用于注冊線路規程,例如/driver/char/n_tty.c文件則針對N_TTY線路規程實現了具體的tty_disc結構體中的成員。 tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY) 其中有 #define N_TTY 0 struct tty_ldisc_ops tty_ldisc_N_TTY = { .magic = TTY_LDISC_MAGIC, .name = n_tt
[單片機]
linux 2.6.32 在arm9(s3c2440)平臺的移植 - LCD背光驅動
LCD背光是通過 CPU的 LCD_PWR引腳來控制的, 當LCD_PWR輸出1, 亮 , 輸出0則滅. 以下的代碼均參考mini2440的移植手冊 (1)新建/drivers/video/mini2440_backlight.c #include linux/errno.h #include linux/kernel.h #include linux/module.h #include linux/slab.h #include linux/input.h #include linux/init.h #include linux/serio.h #include linux/delay.h #include
[單片機]
【IMX6ULL學習筆記】十八、Platform 驅動框架
一、platform 驅動 Linux 提出了 platform 這個虛擬總線,相應的就有 platform_driver 和 platform_device。 platform 驅動使用 platform_driver 結構體表示,此結構體定義在文件 include/linux/platform_device.h 中,內容如下: struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_devic
[單片機]
arm驅動linux并發與競態并發控制
《 linux并發與競態---并發控制》涉及內核驅動函數五個,內核結構體一個,分析了內核驅動函數六個;可參考的相關應用程序模板或內核驅動模板五個,可參考的相關應用程序模板或內核驅動零個 一、并發與競態 1、并發:多個執行單元同時被執行。例如:同一個test.out可執行程序被n次同時運行 2、競態:并發的執行單元對共享資源(硬件資源和軟件上的全局變量,靜態變量等)的訪問導致的競爭。 a)靜態的列子: char *p;//全局變量 // 讀取函數 module_drv_read(struct file *file, constchar __user *buf, size_t count, loff_t * ppos) {copy_
[單片機]
嵌入式Linux中基于Qt/Embeded觸摸屏驅動的設計
嵌入式 Linux 以其開源性、內核的健壯性和穩定性、可裁減性,以及有著專業的商業公司和世界頂尖的自由軟件開發者的支持和維護等各方面優勢,吸引了嵌入式系統開發商的目光,成為嵌入式操作系統的新寵。觸摸屏由于其友善的人機交互性、操作簡單靈活、輸入速度快,大大簡化了嵌入式系統的輸入而被廣泛運用。本文介紹了基于嵌入式 Linux 系統平臺上 Qt/Embedded 的觸摸屏驅動的設計。該方案已成功運用于工程機械安全儀和電能質量監測儀項目,實現了 GUI(圖形用戶操作接口)界面對觸摸屏的支持,并能根據觸摸屏的不同進行定制。 1、Qt/Embedded 簡介 Qt/Embedded 是著名的 Trolltech 公司發布的專門面向嵌
[單片機]
嵌入式<font color='red'>Linux</font>中基于Qt/Embeded觸摸屏<font color='red'>驅動</font>的設計
Synopsys Design Platform通過三星 8LPP工藝技術認證
經硅驗證的參考設計流程為高性能、低功耗應用帶來高質量結果和時間優勢 2018年5月31日,中國 北京——全球第一大芯片自動化設計解決方案提供商及全球第一大芯片接口IP供應商、信息安全和軟件質量的全球領導者Synopsys(NASDAQ: SNPS)宣布,Synopsys Design Platform已通過全球領先半導體技術企業三星電子的工藝認證,支持三星代工部門的8nm LPP(低功耗+)工藝。Synopsys Design Platform可以為8LPP工藝的多次圖形曝光光刻技術和全顏色感知變化技術,提供完整的全流程支持。 Synopsys的SiliconSmart?庫表征工具是開發認證過程和參考流程所需基礎IP的關鍵
[半導體設計/制造]
S3C6410開發板LED驅動代碼分析及測試代碼分析
在本文中,我們對S3C6410開發板LED驅動代碼的實現過程進行分析,然后通過一個實例對LED進行控制。在本文的資源中包含了設備驅動的源碼和測試的源碼。 一、設備驅動源碼分析 設備驅動主要實現了模塊的初始化、模塊的卸載、io模塊操作的功能。 1、模塊初始化 模塊的初始化的源碼如下所示。 static int __init dev_init(void) { int ret; { unsigned tmp; tmp = readl(S3C64XX_GPKCON); tmp = (tmp & ~(0xffffU 16))|(0x1111U 16); writel(tmp, S3C64XX_GPKCON);
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 汉源县| 介休市| 萍乡市| 深泽县| 湖口县| 芜湖市| 化隆| 浮山县| 临泽县| 佳木斯市| 北安市| 仁怀市| 年辖:市辖区| 奉新县| 女性| 双鸭山市| 闸北区| 康乐县| 平山县| 雷州市| 泽普县| 井研县| 通城县| 湾仔区| 太谷县| 慈利县| 长春市| 韶山市| 铜川市| 松阳县| 通河县| 泾阳县| 青州市| 芦山县| 南澳县| 大同县| 浦东新区| 景洪市| 兴海县| 安化县| 阿克苏市|