娇小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-29 11:07

迅為i.MX6ULL終結者Linux MISC驅動運行測試
1 編譯驅動程序 和前面章節中驅動測試程序一樣需要一個Makefile文件,只是將obj-m的值改為beep_misc.o,Makefile文件內容如下: 然后執行“make”命令編譯模塊,編譯完成生成beep_misc.ko模塊文件。 2 編譯應用測試程序 輸入如下命令編譯應用測試程序: arm-linux-gnueabihf-gcc -o beep_misc_test beep_misc_test.c 編譯完成后,會生成beep_misc_test可執行文件。 3 運行測試 啟動開發板,將編譯好的beep_misc.ko模塊文件和beep_misc_test應用程序拷貝到/lib/modules/4.1.15目錄下(檢查
[單片機]
迅為i.MX6ULL終結者<font color='red'>Linux</font> MISC<font color='red'>驅動</font>運行測試
s3c6410在linux下的WATCHDOG TIMER(看門狗定時器)驅動(1)
還是先說下整體結構,又要說到大家很熟悉的平臺設備了,同樣看門狗定時器也是作為平臺設備存在的,但與以前的不同的地方是,看門狗定時器是一種混雜設備,先介紹下混雜設備。 1、混雜設備 1.1、混雜設備并沒有明確的定義。它的主設備號是10,不同的設備用次設備號區分。混雜設備用結構體miscdevice表示,源碼如下: struct miscdevice { int minor; 次設備號 const char *name; 設備名 const struct file_operations *fops;設備的操作函數,與字符設備相同 struct list_head list; 鏈接混雜設備的鏈表 struct device *
[單片機]
DM9000的驅動在TQ2440+linux2.6.32下的移植
這里我們主要闡述DM9000的驅動在TQ2440+linux2.6.32下的移植,分倆部分,一是驅動移植,一是測試程序 硬件平臺:TQ2440,DM9000EP 內核 : linux2.6.32 編譯工具: codesource出品 arm-linux-none-gnueabi-4.3.3 文件系統: busybox1.1.11+yaffs 在此推薦一個文檔: http://singleboy.blog.163.com/blog/static/5490019420115141426387/ mini2440的,在移植過程中參考了此文,鳴謝 一、DM9000驅動移植 主要修改倆個文件,一是mach-smdk2440.c,一
[單片機]
DM9000的<font color='red'>驅動</font>在TQ2440+<font color='red'>linux</font>2.6.32下的移植
嵌入式Linux的USB驅動設計
  隨著計算機外圍硬件的擴展,各種外圍設備使用不同的總線接口,導致計算機外部各種總線繁多,管理困難,USB總線可以解決這些問題,因此而誕生。USB總線提供統一的外設的接口方式,并且支持熱插拔,方便了廠商開發設備和用戶使用設備。USB(通用串行總線)是由Microsft,Compad,Inter和NEC等推出的外圍總線接口,目前已發展到2.0標準最高支持480Mb/s的速率,最多可以支持127個外設。   嵌入式Linux是一款源代碼完全免費的新興操作系統,用戶可以用戶可以通過網絡等其他途徑免費獲得,并可以任意修改其源代碼,這是其他的操作系統做不到的。正是由于這一點,Linux得到了廣泛的應用。   1 Linux中USB設
[嵌入式]
CAN總線在嵌入式Linux驅動程序的實現
1?? 引言 ??? 基于嵌入式系統設計的工業控制裝置,在工業控制現場受到各種干擾,如電磁、粉塵、天氣等對系統的正常運行造成很大的影響。在工業控制現場各個設備之間要經常交換、傳輸數據,需要一種抗干擾性強、穩定、傳輸速率快的現場總線進行通信。文章采用CAN總線,基于嵌入式系統32位的S3C44B0X微處理器,通過其SPI接口,MCP2510 CAN控制器擴展CAN總線;將嵌入式操作系統嵌入到S3C44B0X微處理器中,能實現多任務、友好圖形用戶界面;針對S3C44B0X微處理器沒有內存管理單元MMU,采用uClinux嵌入式操作系統。這樣在嵌入式系統中擴展CAN設備關鍵技術就是CAN設備在嵌入式操作系統下驅動程序的實現。文章重點
[嵌入式]
CAN能信卡的Linux設備驅動程序設計實現
??? 摘要: 介紹了Linux下設備驅動程序的結構,描述了CAN通信卡設備驅動程序的軟件框架以及如何將CAN設備驅動程序加入到Linux系統內核中。討論了具體實現中為了提高通信效率和通信能力,改進設備驅動程序的緩沖區管理以及利用Linux的特點合理設計中斷處理程序。 ??? 關鍵詞: Linux操作系統 設備驅動程序 CAN通信卡 中斷處理程序 目前,許多工業現場如電力系統、化工系統等大量使用控制器局部網(CAN-Controller Area Network)現場總線網絡,CAN通信卡作為計算機的外設將計算機接入CAN網絡。市場上有不少CAN通信卡,但基本上都不帶Linux驅動程序,當需要在Linu
[應用]
Power Integrations GaN技術LED驅動器IC問市,展現出色性能
高效率、高可靠性LED驅動器IC領域的知名公司Power Integrations(納斯達克股票代號:POWI)今日推出LYTSwitch?-6系列安全隔離型LED驅動器IC的最新成員 —— 適合智能照明應用的新器件LYT6078C。這款新的LYTSwitch-6 IC采用了Power Integrations的PowiGaN?氮化鎵(GaN)技術,在該公司今天同時發布的新設計范例報告(DER-920)中,展現了其出色的效率和性能優勢。 基于PowiGaN的LYT6078C IC集成了一個750V功率開關,可提供高達90W的無閃爍輸出,同系列的其他器件可提供高達110W的無閃爍輸出。包括PFC級和LYTSwitch-6
[電源管理]
Power Integrations GaN技術<font color='red'>LED驅動</font>器IC問市,展現出色性能
技術文章:LED驅動電源測試
LED驅動電源質量的好壞,直接影響到LED照明系統的品質,但在LED照明系統中相對容易損壞的卻是驅動電源。為保證LED驅動電源的安全、高效、可靠,在研發或者生產階段,必須對LED驅動電源進行嚴格的測試。 相比傳統節能燈,LED照明燈具具有光效更高,更環保的特性。LED驅動電源是把交流供電或者其它直流電源轉換為LED燈具可用的恒壓或恒流的特定電源,LED驅動電源是LED照明燈具的核心組件之一,其性能和可靠性直接決定了LED照明燈具的使用效果和壽命。為了能夠更好地應用在LED照明燈具中,在LED驅動電源的研發或者生產階段,需要采用合適的測試方案對LED驅動電源各項指標進行測試。 一、LED驅動電源測試簡介 LED驅動電源
[家用電子]
技術文章:<font color='red'>LED驅動</font>電源測試
小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 绵阳市| 临高县| 乌兰县| 黔西| 宜春市| 福安市| 大同县| 厦门市| 西宁市| 永济市| 宜阳县| 尼勒克县| 棋牌| 饶阳县| 卓资县| 南木林县| 通城县| 望奎县| 张家港市| 彭泽县| 松溪县| 洪泽县| 温州市| 和平区| 乌鲁木齐县| 祁门县| 泰安市| 沅江市| 湄潭县| 绥化市| 嘉定区| 淅川县| 新密市| 海伦市| 镇安县| 大化| 全州县| 舞阳县| 郧西县| 大埔县| 茌平县|