新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM嵌入式Linux設(shè)備樹(shù)簡(jiǎn)介及應(yīng)用示例

        ARM嵌入式Linux設(shè)備樹(shù)簡(jiǎn)介及應(yīng)用示例

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        1). 簡(jiǎn)介

        設(shè)備樹(shù)(Device Tree)是一種用來(lái)描述系統(tǒng)硬件的數(shù)據(jù)結(jié)構(gòu),一些硬件設(shè)備設(shè)計(jì)機(jī)制就是可被系統(tǒng)發(fā)現(xiàn)的(如PCI Express或者USB總線),而有一些則不是(尤其是內(nèi)存映射外設(shè))。對(duì)于后一種情況,不同于X86架構(gòu)系統(tǒng)采用BIOS和操作系統(tǒng)溝通硬件拓?fù)?/strong>信息,ARM Linux通常情況是將硬件設(shè)備描述硬編碼到系統(tǒng)內(nèi)核(Linux Kernel)中,但由于ARM嵌入式設(shè)備的多樣和離散性,即便如此也不能保證覆蓋到所有設(shè)備,而且長(zhǎng)久以來(lái)給ARM Linux內(nèi)核代碼維護(hù)造成了很大負(fù)擔(dān);基于這種情況,設(shè)備樹(shù)的概念就被提出,將ARM SOC和板卡硬件平臺(tái)描述信息從內(nèi)核獨(dú)立出來(lái)成為設(shè)備樹(shù)文件,通過(guò)bootloader傳遞給內(nèi)核來(lái)識(shí)別當(dāng)前平臺(tái)設(shè)備并加載相應(yīng)的資源和驅(qū)動(dòng),這樣就把ARM嵌入式Linux 內(nèi)核統(tǒng)一起來(lái),更好的利于內(nèi)核維護(hù),而對(duì)于廣泛的ARM嵌入式設(shè)備系統(tǒng)維護(hù)和遷移也更方便和有效率。

        本文引用地址:http://www.104case.com/article/201611/319519.htm

        設(shè)備樹(shù)機(jī)制從Linux 內(nèi)核3.2 版本左右開(kāi)始采用,其不僅可以定義ARM SoC內(nèi)部?jī)?nèi)存映射外設(shè),還可以定義整個(gè)板卡,下面就以Toradex Colibri VF61計(jì)算機(jī)模塊搭配Colibri Eva Board為例來(lái)展示設(shè)備樹(shù)的具體應(yīng)用,另外關(guān)于設(shè)備樹(shù)的更深入介紹,請(qǐng)參考這里。

        2). 設(shè)備樹(shù)文件說(shuō)明

        Toradex ARM計(jì)算機(jī)模塊工業(yè)產(chǎn)品級(jí)Embedded Linux源代碼下載及編譯指南請(qǐng)見(jiàn)這里,其中設(shè)備樹(shù)文件位于Kernel 源代碼 arch/arm/boot/dts/ 目錄下。

        產(chǎn)品系列

        SoC

        Image 版本

        SoC 級(jí)別

        模塊級(jí)別

        Eva Board級(jí)別

        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ù)通常由多級(jí)別的多個(gè)設(shè)備樹(shù)文件構(gòu)成,一個(gè)設(shè)備樹(shù)文件(dts 和dtsi)可以包含另外一個(gè)可包含設(shè)備樹(shù)文件(dtsi),如一個(gè)板卡級(jí)設(shè)備樹(shù)文件(dts)一般會(huì)包含其所使用的SoC級(jí)別的設(shè)備樹(shù)文件(dtsi)。如上圖所示,為了支持Toradex產(chǎn)品,定義了三個(gè)級(jí)別的設(shè)備樹(shù)文件:載板級(jí)別,模塊基本以及SoC級(jí)別,這些區(qū)別也體現(xiàn)在了設(shè)備樹(shù)文件的命名上面。

        載板級(jí)別的設(shè)備樹(shù)文件(如vf610-colibri-eval-v3.dts)定義自Colibri Eva Board載板,但基于Colibri模塊的標(biāo)準(zhǔn)定義,同樣也兼容于其他Colibri載板(如Iris載板);不過(guò)如果用戶針對(duì)自己應(yīng)用定制了載板,則需要對(duì)應(yīng)定制化設(shè)備樹(shù)文件以便使能非默認(rèn)定義功能設(shè)備(如第二個(gè)網(wǎng)口)或者關(guān)閉一些無(wú)用的設(shè)備。

        設(shè)備樹(shù)文件(dts)最后要被編譯成設(shè)備樹(shù)二進(jìn)制文件(dtb)以供Linux 內(nèi)核啟動(dòng)加載所使用,所需的編譯器也都集成在Linux源文件里面可以直接調(diào)用,從后面的示例可以看到具體的編譯方法。

        設(shè)備樹(shù)文件的基本單元是node,一個(gè)設(shè)備樹(shù)文件只能有一個(gè)root node (/),其他node按照parent/child node以樹(shù)狀結(jié)構(gòu)分布,每個(gè)node里面包含一些property/value來(lái)描述該node特性,如下面是一個(gè)UART 設(shè)備的描述;另外低級(jí)別設(shè)備樹(shù)文件的定義可以在更高級(jí)別的設(shè)備樹(shù)文件中重新定義或者更改,最后生成的二進(jìn)制文件以最后一次定義為準(zhǔn),因此我們定制化設(shè)備樹(shù)文件時(shí)候通常只定制修改最高級(jí)別的載板級(jí)設(shè)備樹(shù)文件即可;更詳細(xì)的關(guān)于設(shè)備樹(shù)文件語(yǔ)法的說(shuō)明請(qǐng)見(jiàn)這里。

        3). 定制設(shè)備樹(shù)文件

        本文以Colibri VF61計(jì)算機(jī)模塊和Eva board載板為例,定制設(shè)備樹(shù)文件以使能GPIO和CAN bus。Colibri Vybird系列產(chǎn)品設(shè)備樹(shù)文件的架構(gòu)如下圖所示:

        a). 創(chuàng)建新的載板級(jí)別設(shè)備樹(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è)備樹(shù)文件vf610-colibri-my-carrier.dts,將默認(rèn)配置為PWM設(shè)備管腳配置為GPIO

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

        $ vi vf610-colibri-my-carrier.dts

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

        //添加下面內(nèi)容于設(shè)備樹(shù)文件中

        c). 配置編譯環(huán)境并編譯新的設(shè)備樹(shù)文件

        ./ 安裝交叉編譯Tool Chain,請(qǐng)從這里下載

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

        $ 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è)備樹(shù)文件,源代碼根目錄linux-toradex下,生成的文件可以在arch/arm/boot/dts/下找到

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

        $ make colibri_vf_defconfig

        $ make dtbs

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

        4). 部署新的設(shè)備樹(shù)文件并測(cè)試

        a). 將新的設(shè)備樹(shù)文件"vf610-colibri-my-carrier.dtb"放置到目標(biāo)板Colibri VF61 Linux系統(tǒng) /boot目錄下

        b). 如下修改目標(biāo)板 uboot環(huán)境變量

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

        $ setenv fdt_board my-carrier

        $ saveenv

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

        c). 重啟后則系統(tǒng)加載新的設(shè)備樹(shù)文件

        下面兩個(gè)截圖分別是更改前和更改后使用Toradex提供的GPIOConfig工具對(duì)PWM對(duì)應(yīng)管腳進(jìn)行查看,可以看到由原來(lái)的PWM屬性變成了GPIO,修改成功后則可以按照這里的說(shuō)明直接調(diào)用GPIO使用。

        d). 對(duì)于CAN,Colibri VF61支持兩個(gè)CAN接口,CAN0和CAN1,在設(shè)備樹(shù)中使能CAN設(shè)備示例如下

        ./ 編輯vf610-colibri-my-carrier.dts,添加下面內(nèi)容

        ./ 和上述方法一樣重新編譯設(shè)備樹(shù)文件后部署,然后就可以在系統(tǒng)中調(diào)用CAN了,更詳細(xì)的說(shuō)明可以參考這里。



        關(guān)鍵詞: ARMLinux設(shè)備

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 磴口县| 西和县| 衢州市| 思南县| 永泰县| 曲麻莱县| 乐陵市| 长丰县| 上虞市| 新乡县| 阳西县| 通山县| 天峨县| 鄱阳县| 兴城市| 陇川县| 栾川县| 新民市| 修文县| 黑山县| 博兴县| 天镇县| 光山县| 山阳县| 房产| 淮安市| 英德市| 连山| 平乡县| 湘阴县| 城市| 枣强县| 滦南县| 大丰市| 丹东市| 鄯善县| 阿鲁科尔沁旗| 无棣县| 张家港市| 长春市| 环江|