目錄程式編寫步驟
程式示例
引入 platform_device/platform_driver,將「資源」與「驅動」分離開來。**稍微複雜,但是易於擴充套件。冗餘**太多,修改引腳時裝置端的**需要重新編譯。(其實就是系統將物件導向的分層分離思想給抽象出來供人們使用,見驅動設計的思想:物件導向/分層/分離)
更換引腳時,上圖中的 led_drv.c 基本不用改,但是需要修改 led_dev.c
①最先比較:platform_device. driver_override和platform_driver.driver.name
可以設定 platform_device 的 driver_override,強制選擇某個 platform_driver。
②然後比較:platform_device. name和platform_driver.id_table[i].name
platform_driver.id_table 是「platform_device_id」指標,表示該 drv 支援若干個 device,它
裡面列出了各個 device 的,其中的「name」表示該 drv 支援的裝置的名
字,driver_data 是些提供給該 device 的私有資料。
③最後比較:platform_device.name和platform_driver.driver.name
platform_driver.id_table 可能為空,
這時可以根據 platform_driver.driver.name 來尋找同名的 platform_device。
④函式呼叫關係
platform_device_register
platform_device_add
device_add
bus_add_device // 放入鍊錶
bus_probe_device // probe 列舉裝置,即找到匹配的(dev, drv)
device_initial_probe
__device_attach
bus_for_each_drv(...,__device_attach_driver,...)
__device_attach_driver
driver_match_device(drv, dev) // 是否匹配
driver_probe_device // 呼叫 drv 的 probe
platform_driver_register
__platform_driver_register
driver_register
bus_add_driver // 放入鍊錶
driver_attach(drv)
bus_for_each_dev(drv->bus, null, drv, __driver_attach);
__driver_attach
driver_match_device(drv, dev) // 是否匹配
driver_probe_device // 呼叫 drv 的 probe
這些函式可檢視核心原始碼:drivers/base/platform.c,根據函式名即可知道其含義。下面摘取常用的幾個函式。①註冊/反註冊
platform_device_register/ platform_device_unregister
platform_driver_register/ platform_driver_unregister
platform_add_devices // 註冊多個 device
②獲得資源① 分配/設定/註冊 platform_device 結構體在裡面定義所用資源,指定裝置名字。② 分配/設定/註冊 platform_driver 結構體
**在其中的 probe 函式裡,分配/設定/註冊 file_operations 結構體,並從 platform_device 中確實所用硬體資 **
源。指定 platform_driver 的名字。
匯流排 裝置 驅動模型
裝置元素 匯流排,驅動,裝置 匯流排 處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬 platform 匯流排 定時器,看門狗並沒有直接相連 在linux裝置模型中,匯流排由bus type結構表示,定義在 匯流排的註冊使用 bus register struct...
匯流排裝置驅動模型
匯流排裝置驅動模型 匯流排是主機和裝置之間的通道,由bus type 結構描述。int bus register struct bus type bus 匯流排的註冊,若成功,新的匯流排將被新增進系統,並可在 sysfs 的 sys bus 下看到。void bus unregister struc...
匯流排裝置驅動模型
匯流排 乙個匯流排是處理器和乙個或多個裝置之間的通道。為裝置模型的目的,所有的裝置都通過乙個匯流排連線,甚至當它是乙個內部的虛擬的 平台 匯流排。裝置 裝置就是連線在匯流排上的物理實體。裝置是有功能之分的。具有相同功能的裝置被歸到乙個類 class 中。在linux 系統中,每個裝置由乙個 stru...