ARM嵌入式Linux設備樹簡介及應用示例

1). 簡介

       設 備樹(Device Tree)是一種用來描述系統硬件的數據結構,一些硬件設備設計機制就是可被系統發現的(如PCIExpress或者USB總線), 而有一些則不是(尤其是內存映射外設)。對於後一種情況,不同於X86架構系統採用BIOS和操作系統溝通硬件拓撲信息,ARMLinux通常情況是將硬 件設備描述硬編碼到系統內核(LinuxKernel)中,但由於ARM嵌入式設備的多樣和離散性,即便如此也不能保證覆蓋到所有設備,而且長久以來給 ARMLinux內核代碼維護造成了很大負擔;基於這種情況,設備樹的概念就被提出,將ARMSOC和板卡硬件平臺描述信息從內核獨立出來成爲設備樹文 件,通過bootloader傳遞給內核來識別當前平臺設備並加載相應的資源和驅動,這樣就把ARM嵌入式Linux內核統一起來,更好的利於內核維護, 而對於廣泛的ARM嵌入式設備系統維護和遷移也更方便和有效率。

       設備樹機制從Linux 內核3.2 版本左右開始採用,其不僅可以定義ARMSoC內部內存映射外設,還可以定義整個板卡,下面就以ToradexColibri VF61計算機模塊搭配ColibriEva Board爲例來展示設備樹的具體應用,另外關於設備樹的更深入介紹,請參考這裏。

2).設備樹文件說明

       Toradex ARM計算機模塊工業產品級Embedded Linux源代碼下載及編譯指南請見這裏,其中設備樹文件位於Kernel源代碼 arch/arm/boot/dts/ 目錄下。

產品系列

SoC

Image版本

SoC級別

模塊級別

EvaBoard級別

ColibriVF50

NXP/FreescaleVybrid

V2.3Beta5onwards

vf500.dtsi

vf500-colibri.dtsi

vf500-colibri-eval-v3.dts

ColibriVF61

NXP/FreescaleVybrid

V2.3Beta5onwards

vf610.dtsi

vf610-colibri.dtsi

vf610-colibri-eval-v3.dts

ColibriiMX6DL/S

NXP/Freescalei.MX6

allcompatible

imx6q.dtsi

imx6qdl-colibri.dtsi

imx6dl-colibri-eval-v3.dts

ApalisiMX6Q/D

NXP/Freescalei.MX6

V2.3Beta3onwards

imx6q.dtsi

imx6qdl-apalis.dtsi

imx6q-apalis-eval.dts

 

       設 備樹通常由多級別的多個設備樹文件構成,一個設備樹文件(dts和dtsi)可以包含另外一個可包含設備樹文件(dtsi),如一個板卡級設備樹文件 (dts)一般會包含其所使用的SoC級別的設備樹文件(dtsi)。如上圖所示,爲了支持Toradex產品,定義了三個級別的設備樹文件:載板級別, 模塊基本以及SoC級別,這些區別也體現在了設備樹文件的命名上面。

       載板級別的設備樹文件(如vf610-colibri-eval- v3.dts)定義自Colibri EvaBoard載板,但基於Colibri模塊的標準定義,同樣也兼容於其他Colibri載板(如Iris載 板);不過如果用戶針對自己應用定製了載板,則需要對應定製化設備樹文件以便使能非默認定義功能設備(如第二個網口)或者關閉一些無用的設備。

       設備樹文件(dts)最後要被編譯成設備樹二進制文件(dtb)以供Linux內核啓動加載所使用,所需的編譯器也都集成在Linux源文件裏面可以直接調用,從後面的示例可以看到具體的編譯方法。

       設 備樹文件的基本單元是node,一個設備樹文件只能有一個root node (/),其他node按照parent/childnode以樹狀結構分 布,每個node裏面包含一些property/value來描述該node特性,如下面是一個UART設備的描述;另外低級別設備樹文件的定義可以在更 高級別的設備樹文件中重新定義或者更改,最後生成的二進制文件以最後一次定義爲準,因此我們定製化設備樹文件時候通常只定制修改最高級別的載板級設備樹文 件即可;更詳細的關於設備樹文件語法的說明請見這裏。

3).定製設備樹文件

        本文以Colibri VF61計算機模塊和Eva board載板爲例,定製設備樹文件以使能GPIO和CANbus。Colibri Vybird系列產品設備樹文件的架構如下圖所示:

a).創建新的載板級別設備樹文件,這裏爲了方便直接複製vf610-colibri-eval-v3.dts

----------------------------------------------------------------------------------------

$ cp arch/arm/boot/dts/vf610-colibri-eval-v3.dtsarch/arm/boot/dts/vf610-colibri-my-carrier.dts

----------------------------------------------------------------------------------------

b).編輯設備樹文件vf610-colibri-my-carrier.dts,將默認配置爲PWM設備管腳配置爲GPIO

----------------------------------------------------------------------------------------

$ vi vf610-colibri-my-carrier.dts

----------------------------------------------------------------------------------------

//添加下面內容於設備樹文件中

c). 配置編譯環境並編譯新的設備樹文件

./ 安裝交叉編譯Tool Chain,請從這裏下載

----------------------------------------------------------------------------------------

$ tar xvfgcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz

$ ln -s gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihfgcc-linaro

----------------------------------------------------------------------------------------

./ 配置環境變量

----------------------------------------------------------------------------------------

$ 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

----------------------------------------------------------------------------------------

./編譯設備樹文件,源代碼根目錄linux-toradex下,生成的文件可以在arch/arm/boot/dts/下找到

----------------------------------------------------------------------------------------

$ make colibri_vf_defconfig

$ make dtbs

----------------------------------------------------------------------------------------

4).部署新的設備樹文件並測試

a). 將新的設備樹文件"vf610-colibri-my-carrier.dtb"放置到目標板ColibriVF61 Linux系統 /boot目錄下

b). 如下修改目標板 uboot環境變量

----------------------------------------------------------------------------------------

$ setenv fdt_board 'my-carrier'

$ s**eenv

----------------------------------------------------------------------------------------

c). 重啓後則系統加載新的設備樹文件

下面兩個截圖分別是更改前和更改後使用Toradex提供的GPIOConfig工具對PWM對應管腳進行查看,可以看到由原來的PWM屬性變成了GPIO,修改成功後則可以按照這裏的說明直接調用GPIO使用。

d). 對於CAN,ColibriVF61支持兩個CAN接口,CAN0和CAN1,在設備樹中使能CAN設備示例如下

./ 編輯vf610-colibri-my-carrier.dts,添加下面內容

./ 和上述方法一樣重新編譯設備樹文件後部署,然後就可以在系統中調用CAN了,更詳細的說明可以參考這裏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章