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 }
上一篇: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




設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 【訓(xùn)練營】基于涂鴉智能-智能窗簾-502046A
- 超迷你WS2812驅(qū)動(dòng)板
- usb2.0集線器
- EV-VN9D30Q100F 評(píng)估板
- 使用 Microchip Technology 的 U2270B 的參考設(shè)計(jì)
- DC1082A-D、LTC1403A 演示板、14 位 1CH 2.8 Msps SAR ADC
- LT1117CM-3.3 高效低壓差穩(wěn)壓器的典型應(yīng)用
- 使用 NXP Semiconductors 的 MC07XS6517EK 的參考設(shè)計(jì)
- 使用 Richtek Technology Corporation 的 RT9917 的參考設(shè)計(jì)
- LT1956IFE 雙極性輸出降壓轉(zhuǎn)換器的典型應(yīng)用電路
- TI推出全新GaN技術(shù),攜手臺(tái)達(dá)打造高效能服務(wù)器電源供應(yīng)器
- KST51單片機(jī):通過中斷實(shí)現(xiàn)矩陣按鍵的次數(shù)檢測與消抖
- 蘋果Apple支持應(yīng)用4.4.2版更新,可顯示AirPods為第幾代
- OLED自定義顯示圖像實(shí)驗(yàn)(基礎(chǔ)->進(jìn)階)
- CA8435三相電能質(zhì)量分析儀的特點(diǎn)及應(yīng)用范圍
- 高通加速Snapdragon Spaces在中國開發(fā)者生態(tài)的擴(kuò)展
- TC2 100BASE-T1信道基本概念及連接器級(jí)別測試解讀
- 位移測量裝置的軟硬件設(shè)計(jì)和測試方法
- 蘋果被判侵犯3G專利,需向西班牙公司TOT賠償1.1億美元
- 從設(shè)計(jì)概念到 FPGA 原型僅需數(shù)分鐘,印度 InCore 完成 SoC Generator 平臺(tái)硅驗(yàn)證
- 消息稱因難尋客戶,三星推遲美國芯片工廠的完工時(shí)間
- BOE(京東方)聯(lián)合榮耀打造榮耀Magic V5 以領(lǐng)先LTPO技術(shù)打造行業(yè)新標(biāo)桿
- 華為ADS 4發(fā)布:多傳感器融合,提升自動(dòng)駕駛安全性
- 曉鶯說:線控制動(dòng)變革風(fēng)云
- 大眾商用車推出AirConsole 將其信息娛樂系統(tǒng)擴(kuò)展為游戲機(jī)
- 福州大學(xué)發(fā)明新機(jī)器視覺傳感器 可使機(jī)器人對極端光照做出超快反應(yīng)
- 蘋果獲沉浸式虛擬顯示器相關(guān)的專利
- 英特爾汽車“折戟”,十年布局一夜歸零
- 外國調(diào)研機(jī)構(gòu):三星Galaxy S10系列單季賣1600萬臺(tái)
- 華為Mate 30背部渲染圖曝光,又一新設(shè)計(jì)
- 6萬億韓元!韓加大半導(dǎo)體材料研發(fā),應(yīng)對日本對韓出口管制
- 安靠中國區(qū)總經(jīng)理周曉陽加盟初創(chuàng)公司廣州芯聚能半導(dǎo)體
- 100%讓利!激勵(lì)開發(fā)者,OPPO DEVELOPER DAY上海站震撼來襲
- 2018年全球電動(dòng)汽車充電站市場達(dá)53億美元
- 小米IPO,全球智能手機(jī)行業(yè)的最后高潮
- 2018年Q1平板電腦市場規(guī)模下跌7%而領(lǐng)先廠商發(fā)揮優(yōu)勢
- 富士康致力于成為另一個(gè)三星又邁出了一步
- Cadence Innovus助力Realtek成功開發(fā)DTV SoC解決方案
- BlueNRG-1藍(lán)牙自拍桿
- AD16.0 Copy Room Formats 遇到的問題
- L298N 空載正常 負(fù)載輸出電壓低于1V
- 智能用電監(jiān)控、保護(hù)系統(tǒng)創(chuàng)意進(jìn)度帖+ 原理圖
- 2812程序中有超過8K數(shù)據(jù)時(shí)的CMD文件分配問題請教!
- OSEK邏輯環(huán)建環(huán)過程
- VxWorks下編譯的.o文件, 如何得到函數(shù)符號(hào)表。
- (已結(jié)束)今天上午10點(diǎn)直播:TI低功耗藍(lán)牙與阿里云IoT智能生活開放平臺(tái)iLOP的完美...
- evc移植到VS2005的錯(cuò)誤
- 【STM32F446 NUCLEO-144 測評(píng)】 (1)---板子外觀測評(píng)及資料分享