1.總線、設備、驅動模型
本着高內聚、低耦合的原則,Linux 把設備驅動模型分為了總線、設備和驅動三個實體,這三個實體在內核里的職責分別如下:
設備和驅動向總線進行注冊,總線負責把設備和對應的驅動綁定起來。
驅動通過總線 API 接口 platform_get_resource()
取得板級設備信息,這樣驅動和設備之間就實現了高內聚、低耦合的設計,
無論設備怎么換,驅動都可以巋然不動。
代碼架構如下圖所示:
2、設備樹
引入設備樹之前,關於硬件設備的描述信息一般放在一個個類似 arch/xxx/mach-xxx/board-xxx.c 的文件中,
這些代碼中除了描述的設備信息不同,其代碼邏輯都是一樣的。我們有理由,把這些設備端的信息,用一個非 C 的腳本語言來描述,這個腳本文件,就是 Device Tree(設備樹)。
設備樹是一種 dts 文件,它用簡單的語法描述每個板子上的所有設備,以及這些設備的連接信息。
設備樹文件存儲在目錄 arch/xxx/boot/dts 中,每一個 board 對應一個 dts 文件。
引入設備樹之后,大量重復的 C 代碼(arch/xxx/mach-xxx/board-xxx.c)被去除——驅動的歸於驅動 C 代碼,設備的歸於設備樹腳本文件。
arch/arm/mach-xxx/board-a.c 這樣的文件永遠地進入了歷史的故紙堆,換個板子,只要換個 Device Tree 文件就好。
代碼架構如下圖所示: