編譯ZedBoard的devicetree.dtb

設備樹是一種用來描述硬件的數據結構,它能夠描述CPU,能夠描述時鐘、中斷控制器、IO控制器、SPI總線控制器、I2C控制器、存儲設備等任何現有驅動設備。內核能夠識別這棵樹,並根據它展開出Linux 內核中的platform_device、i2c_client、spi_device等設備,而這些設備用到的內存、IRQ等資源,也被傳遞給了內核, 內核會將這些資源綁定給展開的相應的設備。html

ARM架構的板極硬件細節過多地被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx,採用Device Tree後,許多硬件的細節能夠直接透過它傳遞給Linux,而再也不須要在kernel中進行大量的冗餘編碼。linux

設備樹的編譯器在linux源碼目錄下scripts/dtc/中。注意:要使用設備樹,內核在編譯時須要配置爲打開設備樹編譯器。git

         生成設備樹有兩種方法:一種是經過linux源碼中的設備樹源文件生成設備樹、另外一種是使用xilinx的SDK2014.2軟件生成設備樹。github

方法一:web

一、在linux源碼目錄下的arch/arm/boot/dts目錄中有設備樹源文件,ZedBoard對應的設備樹源文件名爲zynq-zed.dts(若是須要包含PL部分的藉口,則須要手動在zynq-zed.dts中添加相應的設備描述)數據結構

二、編譯設備樹:在linux源碼根目錄下運行以下命令,便可生成devicetree.dtb文件。架構

scripts/dtc/dtc –I dts –O dtb –o devicetree.dtb arch/arm/boot/dts/zynq-zed.dtssvg


注:dtb的反編譯命令:ui

scripts/dtc/dtc –I dtb –O dts –o my_devicetree.dts devicetree.dtb
編碼

方法二:

 

因爲從2014.1版本開始,SDK裏面軟硬件管理的機制發生了變化,沒法在2014.1上生成DTS文件。爲了解決這個問題,xilinx在2014.2版本的SDK裏面提供了一個新的BSP包。爲了和以前的版本隔離開,下載位置也發生了變化:https://github.com/Xilinx/device-tree-xlnx/releases

 

將2014.2對應的gz文件下載下來,解壓後發現和之前相比變化很是大:

下面是2013.4的SDK生成devicetree的BSP包解壓後的內容

 

而2014.2版本的SDK生成devicetree的BSP包解壓後的內容以下:

隨便進入其中一個目錄查看文件夾內容: 在2014.2的版本里面將每一個接口放到獨立的文件夾去描述了。

       以前製做dts的步驟咱們能夠參考http://www.wiki.xilinx.com/Build+Device+Tree+Blob。在2014.2版本里面也是參考該連接的步驟來作。

         將下載的文件device-tree-xlnx-xilinx-v2014.2.tar.gz解壓獲得一個叫device-tree-xlnx-xilinx-v2014.2目錄,將該目錄下一樣名爲device-tree-xlnx-xilinx-v2014.2的目錄重命名爲device-tree_v0_00_a,而後將device-tree_v0_00_a拷貝到一個名叫bsp的目錄中,bsp的上一級目錄的路徑將會是添加到repo中的路徑。

         好比個人device-tree_v0_00_a文件夾的路徑是D:\Xilinx-doc\Code\targz_devicetree\devicetree_repo\bsp,其中D:\Xilinx-doc\Code\targz_devicetree\devicetree_repo就是被添加到repo中的路徑: 

添加完了repo路徑以後,經過file->New->Board Support Package來建立DTS的BSP:

在彈出的界面中選擇device tree

而後點擊Finish按鈕:

 這裏能夠直接先點擊OK,固然也能夠添加本身的bootargs,若是你的硬件工程裏面有多個串口,可能還要配置一下console_device,也就是linux啓動後的打印串口。

         點擊OK以後,在工程窗口會生成一個device_tree_bsp_0的目錄,這個目錄裏面有ps.dtsi和system.dts兩個文件是咱們須要的。

其中ps.dtsi包含了你外設接口信息的內容,但它不是一個完整的DTS,後綴中的i表示它相似於C語言裏面的頭文件。在system.dts裏面經過/include/ "ps.dtsi"來包含它。

         system.dts裏面的內容比較簡單,值有chosen、aliases以及memory的信息:

/*

* CAUTION: This file is automatically generated by Xilinx.

* Version: 

 * Today is: Mon Jul 07 16:24:07 2014

*/

 

/dts-v1/;

/include/ "ps.dtsi"

/{

    chosen {

        bootargs = "console=ttyPS0,115200";

        linux,stdout-path = &ps7_uart_1;

    } ;

    aliases {

        ethernet0 = &ps7_ethernet_0;

        serial0 = &ps7_uart_1;

        spi0 = &ps7_qspi_0;

    } ;

    ps7_ddr_0: memory@00100000 {

        device_type = "memory";

        reg = <0x0 0x20000000>;

    } ;

};

 若是硬件工程裏面包含了PL的接口怎麼辦?事實上若是你的硬件工程裏面有PL的信息的話,會另外生成一個pl.dtsi的文件。

    將ps.dtsi和system.dts文件拷貝到虛擬機裏面,你能夠考慮放到2014.2的內核arch/arm/boot/dts目錄中,也能夠放到別的地方。

    若是你將上述兩個文件放到arch/arm/boot/dts目錄中,在linux的目錄裏面直接make system.dtb就能夠生成dtb文件。

    若是你放到別的目錄,也能夠在對應目錄執行dtc -I dts -O dtb -o system.dtb system.dts生成dtb文件。

    須要特別指出的一點是,SDK裏面生成的ps.dtsi文件裏面會將ZYNQ全部的接口都加進去,好比說你沒有選擇UART0,在ps.dtsi裏面也會有UART0的信息:

        ps7_uart_0: ps7-uart@0xe0000000 {

            clock-names = "ref_clk", "aper_clk";

            clocks = <&clkc 23>, <&clkc 40>;

            compatible = "xlnx,ps7-uart-1.00.a";

            interrupt-parent = <&ps7_scugic_0>;

            interrupts = <0 27 4>;

            reg = <0xE0000000 0x1000>;

            status = "disabled";

        } ;

 

    可是與你硬件工程中包括的接口相比,在這種不存在的接口的描述信息裏面有一個status = 「disabled」字段,用戶能夠根據這個字段將不須要的接口刪除。