從linux2.6核心起,引入一套新的驅動管理和註冊機制:platform_device 和platform_driver 。linux 中大部分的裝置驅動,都可以使用這套機制,裝置用platform_device 表示;驅動用platform_driver 進行註冊。
linux platform driver 機制和傳統的device driver機制(即:通過driver_register 函式進行註冊)相比,乙個十分明顯的優勢在於platform機制將裝置本身的資源註冊進核心,由核心統一管理,在驅動程式中用使用這些資源時,通過platform device提供的標準介面進行申請並使用。
platform 是乙個虛擬的位址匯流排,相比pci、usb,它主要用於描述soc上的片上資源。platform 所描述的資源有乙個共同點:在cpu 的匯流排上直接取址。平台裝置會分到乙個名稱(用在驅動繫結中)以及一系列諸如位址和中斷請求號(irq)之類的資源。
platform 匯流排下驅動的開發步驟是:
1、裝置
需要實現的結構體是:platform_device 。
1)初始化resource 結構變數
2)初始化platform_device 結構變數
3)向系統註冊裝置:platform_device_register。
以上三步,必須在裝置驅動載入前完成,即執行platform_driver_register()之前,原因是驅動註冊時需要匹配核心中所有已註冊的裝置名。platform_driver_register()中新增device
到核心最終還是呼叫的device_add
函式。platform_device_add
和device_add
最主要的區別是多了一步insert_resource(p, r)
,即將platform
資源(resource)
新增進核心,由核心統一管理。
2、驅動
驅動註冊中,需要實現的結構體是:platform_driver 。
在驅動程式的初始化函式中,呼叫了platform_driver_register()註冊platform_driver 。需要注意的是:platform_driver 和platform_device 中的name 變數的值必須是相同的。這樣在platform_driver_register() 註冊時,會將當前註冊的platform_driver 中的name 變數的值和已註冊的所有platform_device 中的name 變數的值進行比較,只有找到具有相同名稱的platform_device 才能註冊成功。當註冊成功時,會呼叫platform_driver 結構元素probe 函式指標。
platform_driver_register()的註冊過程:
1 platform_driver_register(&s3c2410fb_driver)
2 driver_register(&drv->driver)
3 bus_add_driver(drv)
4 driver_attach(drv)
5 bus_for_each_dev(drv->bus, null, drv, __driver_attach)
6 __driver_attach(struct device * dev, void * data)
7 driver_probe_device(drv, dev)
8 really_probe(dev, drv)
在really_probe()中:為裝置指派管理該裝置的驅動:dev->driver = drv, 呼叫probe()函式初始化裝置:drv->probe(dev)
Linux 驅動框架 驅動中的非同步
非同步io是對阻塞和輪詢io的機制補充,所謂非同步io就是在裝置資料就緒時主動通知所屬程序進行處理的機制。之所以說是非同步是相對與被通知程序的,因為程序不知道也無法知道什麼時候會被通知 這一機制非常類似於硬體上的中斷。非同步io的實現也依賴於linux核心程序的訊號機制,因為非同步io就是通過sig...
Linux驅動中的platform
從linux2.6核心起,引入一套新的驅動管理和註冊機制 platform device 和 platform driver linux 中大部分的裝置驅動,都可以使用這套機制,裝置用 platform device 表示 驅動用 platform driver 進行註冊。linux platfor...
linux驅動中的request irq
我是乙個linux菜鳥,學習初期,寫此小博不為推廣知識,只為總結心得,不準確之處還請看官擔當。驅動中的中斷機制大致如下 1 首先要為裝置向核心申請乙個中斷號,裝置向cpu發生中斷請求的本質,其實就是通過裝置的中斷控制器 interrupt controller 向cpu傳送中斷號,然後cpu根據中斷...