[ZedBoard移植嵌入式Linux教程(4)]建立裝置樹(Device-Tree)檔案dts
裝置樹用於硬體和軟體之間的資訊互動,也就是將ZedBoard的硬體資訊傳遞給linux核心,避免在linux核心中硬編碼而影響在其他平臺上的可移植性。裝置樹一般以兩種檔案格式存在,一個是dts檔案,也就是文字檔案,便於閱讀,另外一種是dtb檔案,是二進位制格式,是dts使用dtc編譯器編譯而來,由uboot展開並傳遞給linux核心。裝置樹的檔案格式可以參考http://www.devicetree.org/Device_Tree_Usage 和
如果你已經下載了最開始提到的linux-digilent核心原始碼,你可以在arch/arm/boot/dts/目錄中找到digilent-zed.dts檔案。這個dts檔案包含比較豐富的硬體結構,但是不適合我們前面配置的最小系統。所以,我們需要自己來建立一個適合我們自己平臺的dts檔案。但這並不意味著我們需要使用文字編輯器從頭按照繁瑣的格式來編寫。參考Xilinx Wiki上的一篇教程
首先下載device tree generator,安裝到SDK
下載方式一:使用git
# For SDK 2014.1 (or earlier) use this repo:
git clone git://github.com/Xilinx/device-tree.git bsp/device-tree_v0_00_x
# Otherwise for SDK 2014.2 use this repo:
git clone git://github.com/Xilinx/device-tree-xlnx.git
下載方式二:直接下載壓縮檔案:
下載的檔案必須包含以下兩個檔案
device_tree.mld
device_tree.tcl
然後重新命名(注意此處版本號一定不能是其他的)
device-tree_v2_1_0.mld
device-tree_v2_1_0.tcl
新建一個repo的目錄,我將它放在SDK工程目錄下(其他路徑亦可,注意路徑不能有空格)我的是
C:\Users\dc\vivado\Test_Digilent_Linux\Test_Digilent_Linux.sdk\SDK\SDK_Export\device_tree_repo
這個路徑就是我們後面需要的<bsp repo>
再在其中建立多層子目錄bsp\device-tree_v0_00_x\data
將剛才的兩個檔案放進去,如下
"C:\Users\dc\vivado\Test_Digilent_Linux\Test_Digilent_Linux.sdk\SDK\SDK_Export\device_tree_repo\bsp\device-tree_v0_00_x\data\device-tree_v2_1_0.mld"
"C:\Users\dc\vivado\Test_Digilent_Linux\Test_Digilent_Linux.sdk\SDK\SDK_Export\device_tree_repo\bsp\device-tree_v0_00_x\data\device-tree_v2_1_0.tcl"
在SDK中操作點選選單: Xilinx Tools > Repositories
在Local Repositories中新增我們剛才的<bsp repo>路徑並點選OK
點選選單File > New > Board Support Package
如果前面沒有配置正確,出現的對話方塊的Board Support Package OS部分就只有standalone而沒有device-tree選項,這時候需要重頭檢查自己的配置,最好檢查前面檔案的路徑是否有空格,還有推薦用管理員許可權開啟SDK,當然最重要的是檢查檔案是否完全按照規則放置和命名(此處有慘痛教訓)。
如果配置正確,則出現如下的視窗
如果至此沒有問題,繼續
配置啟動引數(定義序列終端和系統映象位置等)和標準輸出
其中bootargs必須是
console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8M earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0
Console_device選擇ps7_uart_1
可以看出,我們使用串列埠ttyPS0(不是ttyS0)作為終端並配置波特率為115200,作業系統映象在ram中,並從0x80000啟動,ramdisk大小為8M(因為我們後面製作的根檔案系統是8M大小)等。注意裡面的“initrd=0x800000,8M”不能漏掉,否則啟動linux時會出現如下錯誤並卡死
啟動引數配置也可以參考前面提到的digilent-zed.dts中的bootargs一行。
我們在此配置的啟動引數會覆蓋掉linux核心中預設配置的digilent_zed_defconfig中的CONFIG_COMDLINE。
完成之後專案會在SDK中自動編譯。編譯過程中如果出現下面的錯誤
ERROR:EDK - C:\Users\dc\vivado\LinuxHw\LinuxHw.sdk\SDK\SDK_Export\device-tree_bsp_0\syste
m.mss line 5 - Cannot find MLD file device-tree_v2_1_0.mld for the os
device-tree 0.00.x
INFO:EDK - Directories Searched :
-
C:\Users\dc\vivado\LinuxHw\LinuxHw.sdk\SDK\SDK_Export\device-tree_bsp_0\bsp/devi
ce-tree_v0_00_x/data
-
C:\Users\dc\vivado\LinuxHw\LinuxHw.sdk\SDK\SDK_Export\device_tree\bsp/device-tre
e_v0_00_x/data
- C:\Xilinx\SDK\2013.4\sw\lib\bsp/device-tree_v0_00_x/data
- C:\Xilinx\SDK\2013.4\sw\XilinxProcessorIPLib\bsp/device-tree_v0_00_x/data
- C:\Xilinx\SDK\2013.4\sw\ThirdParty\bsp/device-tree_v0_00_x/data
INFO:EDK - Check the following for possible causes of not finding MLD:
- If OS_VER is specified in MSS, it must follow literal form X.YY.Z
- There is no OS with given name
- OS exists but not that version
- OS and version (directory) exist but no MLD is available
ERROR:EDK - Errors occured while creating Software System.
make: *** [ps7_cortexa9_0/lib/libxil.a] 錯誤 2
make: 由於錯誤目標“all”並未重新建立。
我在網上找了很久的答案,下面這個不符合我的情況
這個才是靠譜的解決方法:
意思是說,我們剛才下載的device-tree generator是新版本才會出現以上錯誤,要下載舊版本進行替換,下載地址
將前面的兩個檔案device-tree_v2_1_0.mld和device-tree_v2_1_0.tcl換成舊版本之後,clean一下project,再次自動編譯,編譯成功,會生成xilinx.dts,檔案在device-tree_bsp_0\ps7_cortexa9_0\libsrc\device-tree_v0_00_x下。
最後,後面會提到一個啟動錯誤,是由於devicetree檔案中預設生成的compatible不一致產生的,將下圖中的zynq-7000改成zynq-zed
為了不每次都修改生成的dts檔案,我們可以對
device_tree_repo\bsp\device-tree_v0_00_x\data中的device-tree_v2_1_0.tcl檔案進行修改,因為該檔案是生成dts檔案的tcl指令碼,由SDK呼叫,搜尋“7000”(只有一處)改成“zed”即可,下次我們就不用修改dts檔案了。
至此,我們的裝置樹xilinx.dts檔案也生成好了。