設(shè)備樹用于硬件和軟件之間的信息交互,也就是將ZedBoard的硬件信息傳遞給linux內(nèi)核,避免在linux內(nèi)核中硬編碼而影響在其他平臺(tái)上的可移植性。設(shè)備樹一般以兩種文件格式存在,一個(gè)是dts文件,也就是文本文件,便于閱讀,另外一種是dtb文件,是二進(jìn)制格式,是dts使用dtc編譯器編譯而來,由uboot展開并傳遞給linux內(nèi)核。設(shè)備樹的文件格式可以參考 和
如果你已經(jīng)下載了最開始提到的linux-digilent內(nèi)核源碼,你可以在arch/arm/boot/dts/目錄中找到digilent-zed.dts文件。這個(gè)dts文件包含比較豐富的硬件結(jié)構(gòu),但是不適合我們前面配置的最小系統(tǒng)。所以,我們需要自己來創(chuàng)建一個(gè)適合我們自己平臺(tái)的dts文件。但這并不意味著我們需要使用文本編輯器從頭按照繁瑣的格式來編寫。參考Xilinx Wiki上的一篇教程 +Device+Tree+Blob ,我們可以輕松創(chuàng)建需要的設(shè)備樹。
首先下載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
下載方式二:直接下載壓縮文件:
https://github.com/Xilinx/device-tree
https://github.com/Xilinx/device-tree-xlnx/releases
下載的文件必須包含以下兩個(gè)文件
device_tree.mld
device_tree.tcl
然后重命名(注意此處版本號(hào)一定不能是其他的)
device-tree_v2_1_0.mld
device-tree_v2_1_0.tcl
新建一個(gè)repo的目錄,我將它放在SDK工程目錄下(其他路徑亦可,注意路徑不能有空格)我的是
C:UsersdcvivadoTest_Digilent_LinuxTest_Digilent_Linux.sdkSDKSDK_Exportdevice_tree_repo
這個(gè)路徑就是我們后面需要的
再在其中創(chuàng)建多層子目錄bspdevice-tree_v0_00_xdata
將剛才的兩個(gè)文件放進(jìn)去,如下
"C:UsersdcvivadoTest_Digilent_LinuxTest_Digilent_Linux.sdkSDKSDK_Exportdevice_tree_repospdevice-tree_v0_00_xdatadevice-tree_v2_1_0.mld"
在SDK中操作點(diǎn)擊菜單: Xilinx Tools > Repositories
在Local Repositories中添加我們剛才的路徑并點(diǎn)擊OK
點(diǎn)擊菜單File > New > Board Support Package
如果前面沒有配置正確,出現(xiàn)的對(duì)話框的Board Support Package OS部分就只有standalone而沒有device-tree選項(xiàng),這時(shí)候需要重頭檢查自己的配置,最好檢查前面文件的路徑是否有空格,還有推薦用管理員權(quán)限打開SDK,當(dāng)然最重要的是檢查文件是否完全按照規(guī)則放置和命名(此處有慘痛教訓(xùn))。
如果配置正確,則出現(xiàn)如下的窗口
如果至此沒有問題,繼續(xù)
配置啟動(dòng)參數(shù)(定義串行終端和系統(tǒng)鏡像位置等)和標(biāo)準(zhǔn)輸出
其中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,操作系統(tǒng)鏡像在ram中,并從0x80000啟動(dòng),ramdisk大小為8M(因?yàn)槲覀兒竺嬷谱鞯母募到y(tǒng)是8M大?。┑?。注意里面的“initrd=0x800000,8M”不能漏掉,否則啟動(dòng)linux時(shí)會(huì)出現(xiàn)如下錯(cuò)誤并卡死
啟動(dòng)參數(shù)配置也可以參考前面提到的digilent-zed.dts中的bootargs一行。
我們?cè)诖伺渲玫膯?dòng)參數(shù)會(huì)覆蓋掉linux內(nèi)核中默認(rèn)配置的digilent_zed_defconfig中的CONFIG_COMDLINE。
完成之后項(xiàng)目會(huì)在SDK中自動(dòng)編譯。編譯過程中如果出現(xiàn)下面的錯(cuò)誤
ERROR:EDK - C:UsersdcvivadoLinuxHwLinuxHw.sdkSDKSDK_Exportdevice-tree_bsp_0syste
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:UsersdcvivadoLinuxHwLinuxHw.sdkSDKSDK_Exportdevice-tree_bsp_0sp/devi
ce-tree_v0_00_x/data
-
C:UsersdcvivadoLinuxHwLinuxHw.sdkSDKSDK_Exportdevice_treesp/device-tre
e_v0_00_x/data
- C:XilinxSDK2013.4swlibsp/device-tree_v0_00_x/data
- C:XilinxSDK2013.4swXilinxProcessorIPLibsp/device-tree_v0_00_x/data
- C:XilinxSDK2013.4swThirdPartysp/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] 錯(cuò)誤 2
make: 由于錯(cuò)誤目標(biāo)“all”并未重新創(chuàng)建。
我在網(wǎng)上找了很久的答案,下面這個(gè)不符合我的情況
這個(gè)才是靠譜的解決方法:
意思是說,我們剛才下載的device-tree generator是新版本才會(huì)出現(xiàn)以上錯(cuò)誤,要下載舊版本進(jìn)行替換,下載地址
將前面的兩個(gè)文件device-tree_v2_1_0.mld和device-tree_v2_1_0.tcl換成舊版本之后,clean一下project,再次自動(dòng)編譯,編譯成功,會(huì)生成xilinx.dts,文件在device-tree_bsp_0ps7_cortexa9_0libsrcdevice-tree_v0_00_x下。
最后,后面會(huì)提到一個(gè)啟動(dòng)錯(cuò)誤,是由于devicetree文件中默認(rèn)生成的compatible不一致產(chǎn)生的,將下圖中的zynq-7000改成zynq-zed
為了不每次都修改生成的dts文件,我們可以對(duì)
device_tree_repospdevice-tree_v0_00_xdata中的device-tree_v2_1_0.tcl文件進(jìn)行修改,因?yàn)樵撐募巧蒬ts文件的tcl腳本,由SDK調(diào)用,搜索“7000”(只有一處)改成“zed”即可,下次我們就不用修改dts文件了。
至此,我們的設(shè)備樹xilinx.dts文件也生成好了。
評(píng)論