ARM嵌入式Linux設(shè)備樹簡介及應(yīng)用示例
設(shè)備樹(Device Tree)是一種用來描述系統(tǒng)硬件的數(shù)據(jù)結(jié)構(gòu),一些硬件設(shè)備設(shè)計機制就是可被系統(tǒng)發(fā)現(xiàn)的(如PCI Express或者USB總線),而有一些則不是(尤其是內(nèi)存映射外設(shè))。對于后一種情況,不同于X86架構(gòu)系統(tǒng)采用BIOS和操作系統(tǒng)溝通硬件拓撲信息,ARM Linux通常情況是將硬件設(shè)備描述硬編碼到系統(tǒng)內(nèi)核(Linux Kernel)中,但由于ARM嵌入式設(shè)備的多樣和離散性,即便如此也不能保證覆蓋到所有設(shè)備,而且長久以來給ARM Linux內(nèi)核代碼維護造成了很大負擔;基于這種情況,設(shè)備樹的概念就被提出,將ARM SOC和板卡硬件平臺描述信息從內(nèi)核獨立出來成為設(shè)備樹文件,通過bootloader傳遞給內(nèi)核來識別當前平臺設(shè)備并加載相應(yīng)的資源和驅(qū)動,這樣就把ARM嵌入式Linux 內(nèi)核統(tǒng)一起來,更好的利于內(nèi)核維護,而對于廣泛的ARM嵌入式設(shè)備系統(tǒng)維護和遷移也更方便和有效率。
本文引用地址:http://cafeforensic.com/article/201611/319519.htm設(shè)備樹機制從Linux 內(nèi)核3.2 版本左右開始采用,其不僅可以定義ARM SoC內(nèi)部內(nèi)存映射外設(shè),還可以定義整個板卡,下面就以Toradex Colibri VF61計算機模塊搭配Colibri Eva Board為例來展示設(shè)備樹的具體應(yīng)用,另外關(guān)于設(shè)備樹的更深入介紹,請參考這里。
2). 設(shè)備樹文件說明
Toradex ARM計算機模塊工業(yè)產(chǎn)品級Embedded Linux源代碼下載及編譯指南請見這里,其中設(shè)備樹文件位于Kernel 源代碼 arch/arm/boot/dts/ 目錄下。
產(chǎn)品系列 | SoC | Image 版本 | SoC 級別 | 模塊級別 | Eva Board級別 |
Colibri VF50 | NXP/Freescale Vybrid | V2.3Beta5 onwards | vf500.dtsi | vf500-colibri.dtsi | vf500-colibri-eval-v3.dts |
Colibri VF61 | NXP/Freescale Vybrid | V2.3Beta5 onwards | vf610.dtsi | vf610-colibri.dtsi | vf610-colibri-eval-v3.dts |
Colibri iMX6DL/S | NXP/Freescale i.MX6 | all compatible | imx6q.dtsi | imx6qdl-colibri.dtsi | imx6dl-colibri-eval-v3.dts |
Apalis iMX6Q/D | NXP/Freescale i.MX6 | V2.3Beta3 onwards | imx6q.dtsi | imx6qdl-apalis.dtsi | imx6q-apalis-eval.dts |
設(shè)備樹通常由多級別的多個設(shè)備樹文件構(gòu)成,一個設(shè)備樹文件(dts 和dtsi)可以包含另外一個可包含設(shè)備樹文件(dtsi),如一個板卡級設(shè)備樹文件(dts)一般會包含其所使用的SoC級別的設(shè)備樹文件(dtsi)。如上圖所示,為了支持Toradex產(chǎn)品,定義了三個級別的設(shè)備樹文件:載板級別,模塊基本以及SoC級別,這些區(qū)別也體現(xiàn)在了設(shè)備樹文件的命名上面。
載板級別的設(shè)備樹文件(如vf610-colibri-eval-v3.dts)定義自Colibri Eva Board載板,但基于Colibri模塊的標準定義,同樣也兼容于其他Colibri載板(如Iris載板);不過如果用戶針對自己應(yīng)用定制了載板,則需要對應(yīng)定制化設(shè)備樹文件以便使能非默認定義功能設(shè)備(如第二個網(wǎng)口)或者關(guān)閉一些無用的設(shè)備。
設(shè)備樹文件(dts)最后要被編譯成設(shè)備樹二進制文件(dtb)以供Linux 內(nèi)核啟動加載所使用,所需的編譯器也都集成在Linux源文件里面可以直接調(diào)用,從后面的示例可以看到具體的編譯方法。
設(shè)備樹文件的基本單元是node,一個設(shè)備樹文件只能有一個root node (/),其他node按照parent/child node以樹狀結(jié)構(gòu)分布,每個node里面包含一些property/value來描述該node特性,如下面是一個UART 設(shè)備的描述;另外低級別設(shè)備樹文件的定義可以在更高級別的設(shè)備樹文件中重新定義或者更改,最后生成的二進制文件以最后一次定義為準,因此我們定制化設(shè)備樹文件時候通常只定制修改最高級別的載板級設(shè)備樹文件即可;更詳細的關(guān)于設(shè)備樹文件語法的說明請見這里。
3). 定制設(shè)備樹文件
本文以Colibri VF61計算機模塊和Eva board載板為例,定制設(shè)備樹文件以使能GPIO和CAN bus。Colibri Vybird系列產(chǎn)品設(shè)備樹文件的架構(gòu)如下圖所示:
a). 創(chuàng)建新的載板級別設(shè)備樹文件,這里為了方便直接復(fù)制vf610-colibri-eval-v3.dts
----------------------------------------------------------------------------------------
$ cp arch/arm/boot/dts/vf610-colibri-eval-v3.dts arch/arm/boot/dts/vf610-colibri-my-carrier.dts
----------------------------------------------------------------------------------------
b). 編輯設(shè)備樹文件vf610-colibri-my-carrier.dts,將默認配置為PWM設(shè)備管腳配置為GPIO
----------------------------------------------------------------------------------------
$ vi vf610-colibri-my-carrier.dts
-------------------
//添加下面內(nèi)容于設(shè)備樹文件中
c). 配置編譯環(huán)境并編譯新的設(shè)備樹文件
./ 安裝交叉編譯Tool Chain,請從這里下載
----------------------------------------------------------------------------------------
$ tar xvf gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
$ ln -s gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf gcc-linaro
----------------------------------------------------------------------------------------
./ 配置環(huán)境變量
----------------------------------------------------------------------------------------
$ export ARCH=arm
$ export PATH=~/gcc-linaro/bin/:$PATH
$ export CROSS_COMPILE=arm-linux-gnueabihf-
----------------------------------------------------------------------------------------
./ 修改arch/arm/boot/dts/Makefile文件, 插入"vf610-colibri-my-carrier.dtb"
----------------------------------------------------------------------------------------
dtb-$(CONFIG_SOC_VF610) +=
vf500-colibri-eval-v3.dtb
vf610-colibri-eval-v3.dtb
vf610-colibri-my-carrier.dtb
vf500-colibri-dual-eth.dtb
vf610-colibri-dual-eth.dtb
vf610-cosmic.dtb
vf610-twr.dtb
----------------------------------------------------------------------------------------
./ 編譯設(shè)備樹文件,源代碼根目錄linux-toradex下,生成的文件可以在arch/arm/boot/dts/下找到
----------------------------------------------------------------------------------------
$ make colibri_vf_defconfig
$ make dtbs
----------------------------------------------------------------------------------------
4). 部署新的設(shè)備樹文件并測試
a). 將新的設(shè)備樹文件"vf610-colibri-my-carrier.dtb"放置到目標板Colibri VF61 Linux系統(tǒng) /boot目錄下
b). 如下修改目標板 uboot環(huán)境變量
----------------------------------------------------------------------------------------
$ setenv fdt_board my-carrier
$ saveenv
----------------------------------------------------------------------------------------
c). 重啟后則系統(tǒng)加載新的設(shè)備樹文件
下面兩個截圖分別是更改前和更改后使用Toradex提供的GPIOConfig工具對PWM對應(yīng)管腳進行查看,可以看到由原來的PWM屬性變成了GPIO,修改成功后則可以按照這里的說明直接調(diào)用GPIO使用。
d). 對于CAN,Colibri VF61支持兩個CAN接口,CAN0和CAN1,在設(shè)備樹中使能CAN設(shè)備示例如下
./ 編輯vf610-colibri-my-carrier.dts,添加下面內(nèi)容
./ 和上述方法一樣重新編譯設(shè)備樹文件后部署,然后就可以在系統(tǒng)中調(diào)用CAN了,更詳細的說明可以參考這里。
評論