概念
Linux內(nèi)核從3.x開始引入設(shè)備樹的概念,用于實現(xiàn)驅(qū)動代碼與設(shè)備信息相分離。在設(shè)備樹出現(xiàn)以前,所有關(guān)于設(shè)備的具體信息都要寫在驅(qū)動里,一旦外圍設(shè)備變化,驅(qū)動代碼就要重寫。引入了設(shè)備樹之后,驅(qū)動代碼只負責(zé)處理驅(qū)動的邏輯,而關(guān)于設(shè)備的具體信息存放到設(shè)備樹文件中,這樣,如果只是硬件接口信息的變化而沒有驅(qū)動邏輯的變化,驅(qū)動開發(fā)者只需要修改設(shè)備樹文件信息,不需要改寫驅(qū)動代碼。比如在ARM Linux內(nèi),一個.dts(device tree source)文件對應(yīng)一個ARM的machine,一般放置在內(nèi)核的"arch/arm/boot/dts/"目錄內(nèi),比如exynos4412參考板的板級設(shè)備樹文件就是"arch/arm/boot/dts/exynos4412-origen.dts"。這個文件可以通過$make dtbs
命令編譯成二進制的.dtb文件供內(nèi)核驅(qū)動使用。
基于同樣的軟件分層設(shè)計的思想,由于一個SoC可能對應(yīng)多個machine,如果每個machine的設(shè)備樹都寫成一個完全獨立的.dts文件,那么勢必相當一些.dts文件有重復(fù)的部分,為了解決這個問題,Linux設(shè)備樹目錄把一個SoC公用的部分或者多個machine共同的部分提煉為相應(yīng)的.dtsi文件。這樣每個.dts就只有自己差異的部分,公有的部分只需要"include"相應(yīng)的.dtsi文件, 這樣就是整個設(shè)備樹的管理更加有序。我這里用`Linux4.8.5源碼自帶的dm9000網(wǎng)卡為例來分析設(shè)備樹的使用和移植。這個網(wǎng)卡的設(shè)備樹節(jié)點信息在"Documentation/devicetree/bindings/net/davicom-dm9000.txt"有詳細說明,其網(wǎng)卡驅(qū)動源碼是"drivers/net/ethernet/davicom/dm9000.c"。
設(shè)備樹框架
設(shè)備樹用樹狀結(jié)構(gòu)描述設(shè)備信息,它有以下幾種特性
每個設(shè)備樹文件都有一個根節(jié)點,每個設(shè)備都是一個節(jié)點。
節(jié)點間可以嵌套,形成父子關(guān)系,這樣就可以方便的描述設(shè)備間的關(guān)系。<