設備樹時對應的驅動編程


一、字符設備驅動程序的三種寫法

驅動程序編寫有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中獲得各種屬性來確定硬件資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM