裝置樹時對應的驅動程式設計
一、字元裝置驅動程式的三種寫法
驅動程式編寫有3種方法:傳統方法、使用匯流排裝置驅動模型、使用裝置樹
這3種方法也核心都是一樣的: 分配、設定、註冊 file_operations結構體
這個結構體中有.open, .read, .write, .ioctl等成員
驅動程式要實現這些成員,在這些成員函式中操作硬體
這3種方法的差別在於:如何指定硬體資源,比如如何指定LED引腳是哪個
1 傳統方法:
在驅動程式程式碼中寫死硬體資源, 程式碼簡單/不易擴充套件
2 匯流排裝置驅動模型:
把驅動程式分為兩部分(platform_driver, platform_device)
在platform_device中指定硬體資源,
在platform_driver中分配/設定/註冊 file_operations結構體, 並從platform_device獲得硬體資源
特點
易於擴充套件,但是有很多冗餘程式碼(每種配置都對應一個platform_device結構體),
硬體有變動時需要重新編譯核心或驅動程式。
3 使用裝置樹指定硬體資源:
驅動程式也分為兩部分(platform_driver, 裝置樹*.dts)
在裝置樹*.dts中指定硬體資源, dts被編譯為dtb檔案, 在啟動單板時會將dtb檔案傳給核心,
核心根據dtb檔案分配/設定/註冊多個platform_device
platform_driver的編寫方法跟"匯流排裝置驅動模型"一樣。
特點:
易於擴充套件,沒有冗餘程式碼
硬體有變動時不需要重新編譯核心或驅動程式,只需要提供不一樣的dtb檔案
注:
dts - device tree source // 裝置樹原始檔
dtb - device tree blob // 裝置樹二進位制檔案, 由dts編譯得來
blob - binary large object
二、匯流排裝置驅動模型
驅動程式分為platform_device和platform_driver兩部分
platform_device : 指定硬體資源
platform_driver : 根據與之匹配的platform_device獲得硬體資源, 並分配/設定/註冊file_operations
如何確定platform_device和platform_driver是否匹配?
1 platform_device含有name
2 platform_driver.id_table"可能"指向一個數組, 每個陣列項都有name, 表示該platform_driver所能支援的platform_device
3 platform_driver.driver含有name, 表示該platform_driver所能支援的platform_device
4 優先比較b.1, b.2兩者的name, 若相同則表示互相匹配
5 如果platform_driver.id_table為NULL, 則比較b.1, b.3兩者的name, 若相同則表示互相匹配
匯流排裝置驅動模型只是一個程式設計技巧, 它把驅動程式分為"硬體相關的部分"、"變化不大的驅動程式本身",
這個技巧並不是驅動程式的核心,
核心仍然是"分配/設定/註冊file_operations"
三、使用裝置樹時對應的驅動程式設計
使用"匯流排裝置驅動模型"編寫的驅動程式分為platform_device和platform_driver兩部分
platform_device : 指定硬體資源, 來自.c檔案
platform_driver : 根據與之匹配的platform_device獲得硬體資源, 並分配/設定/註冊file_operations
實際上platform_device也可以來自裝置樹檔案.dts
dts檔案被編譯為dtb檔案,
dtb檔案會傳給核心,
核心會解析dtb檔案, 構造出一系列的device_node結構體,
device_node結構體會轉換為platform_device結構體
所以: 我們可以在dts檔案中指定資源, 不再需要在.c檔案中設定platform_device結構體
"來自dts的platform_device結構體" 與 "我們寫的platform_driver" 的匹配過程:
"來自dts的platform_device結構體"裡面有成員".dev.of_node", 它裡面含有各種屬性, 比如 compatible, reg, pin
"我們寫的platform_driver"裡面有成員".driver.of_match_table", 它表示能支援哪些來自於dts的platform_device
如果"of_node中的compatible" 跟 "of_match_table中的compatible" 一致, 就表示匹配成功, 則呼叫 platform_driver中的probe函式;
在probe函式中, 可以繼續從of_node中獲得各種屬性來確定硬體資源