概念

Linux內(nèi)核從3.x開(kāi)始引入設(shè)備樹(shù)的概念,用于實(shí)現(xiàn)驅(qū)動(dòng)代碼與設(shè)備信息相分離。在設(shè)備樹(shù)出現(xiàn)以前,所有關(guān)于設(shè)備的具體信息都要寫在驅(qū)動(dòng)里,一旦外圍設(shè)備變化,驅(qū)動(dòng)代碼就要重寫。引入了設(shè)備樹(shù)之后,驅(qū)動(dòng)代碼只負(fù)責(zé)處理驅(qū)動(dòng)的邏輯,而關(guān)于設(shè)備的具體信息存放到設(shè)備樹(shù)文件中,這樣,如果只是硬件接口信息的變化而沒(méi)有驅(qū)動(dòng)邏輯的變化,驅(qū)動(dòng)開(kāi)發(fā)者只需要修改設(shè)備樹(shù)文件信息,不需要改寫驅(qū)動(dòng)代碼。比如在ARM Linux內(nèi),一個(gè).dts(device tree source)文件對(duì)應(yīng)一個(gè)ARM的machine,一般放置在內(nèi)核的"arch/arm/boot/dts/"目錄內(nèi),比如exynos4412參考板的板級(jí)設(shè)備樹(shù)文件就是"arch/arm/boot/dts/exynos4412-origen.dts"。這個(gè)文件可以通過(guò)$make dtbs命令編譯成二進(jìn)制的.dtb文件供內(nèi)核驅(qū)動(dòng)使用。

基于同樣的軟件分層設(shè)計(jì)的思想,由于一個(gè)SoC可能對(duì)應(yīng)多個(gè)machine,如果每個(gè)machine的設(shè)備樹(shù)都寫成一個(gè)完全獨(dú)立的.dts文件,那么勢(shì)必相當(dāng)一些.dts文件有重復(fù)的部分,為了解決這個(gè)問(wèn)題,Linux設(shè)備樹(shù)目錄把一個(gè)SoC公用的部分或者多個(gè)machine共同的部分提煉為相應(yīng)的.dtsi文件。這樣每個(gè).dts就只有自己差異的部分,公有的部分只需要"include"相應(yīng)的.dtsi文件, 這樣就是整個(gè)設(shè)備樹(shù)的管理更加有序。我這里用`Linux4.8.5源碼自帶的dm9000網(wǎng)卡為例來(lái)分析設(shè)備樹(shù)的使用和移植。這個(gè)網(wǎng)卡的設(shè)備樹(shù)節(jié)點(diǎn)信息在"Documentation/devicetree/bindings/net/davicom-dm9000.txt"有詳細(xì)說(shuō)明,其網(wǎng)卡驅(qū)動(dòng)源碼是"drivers/net/ethernet/davicom/dm9000.c"。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

設(shè)備樹(shù)框架

設(shè)備樹(shù)用樹(shù)狀結(jié)構(gòu)描述設(shè)備信息,它有以下幾種特性

  1. 每個(gè)設(shè)備樹(shù)文件都有一個(gè)根節(jié)點(diǎn),每個(gè)設(shè)備都是一個(gè)節(jié)點(diǎn)。

  2. 節(jié)點(diǎn)間可以嵌套,形成父子關(guān)系,這樣就可以方便的描述設(shè)備間的關(guān)系。<