Zynq7000開發系列-7(在Zybo上執行Linaro桌面系統
Zynq7000開發系列-7(在Zybo上執行Linaro桌面系統)
目標板:Zybo(7Z010)
主機作業系統:Ubuntu 14.04.5 LTS 64bit
交叉編譯鏈: arm-xilinx-linux-gnueabi- [gcc version 4.9.2 (Sourcery CodeBench Lite 2015.05-17)]
Linaro系統:linaro-precise-ubuntu-desktop-20120923-436.tar.gz
〇、準備工作
1、交叉編譯環境搭建,見之前的記錄:
2、環境變數設定
gedit /etc/bash.bashrc 在檔案底部新增: export ARCH=arm export CROSS_COMPILE=arm-xilinx-linux-gnueabi-gcc
重啟終端後生效。(後續編譯命令中即可省略對ARCH、CROSS_COMPILE的指定)
一、硬體平臺搭建
[目標檔案:硬體平臺綜合生成的位元流檔案system_warpper.bit、SDK建立的FSBL執行檔案fsbl.elf、SDK/ubuntu建立的裝置樹檔案system.dts/devicetree.dtb]
1、硬體平臺綜合生成的位元流檔案system_warpper.bit
1)安裝Vivado 2015.4,參考:Zynq7000開發系列-1(Vivado HLx 2016.4下載及安裝)
2)安裝zybo板級檔案,參考:Installing Vivado Board Files for Digilent Boards
3)建立硬體工程,如下各圖(見註釋):
#1 建立名為my_linux_bd的硬體工程
#2 建立名為system的block design頂層檔案,新增zynq系統IP,匯入zybo板級配置檔案,並做必要修改
#3 新增必要的vivado-library(開源IP核[ axi_dynclk_v1_0、rgb2dvi ]及介面[ tmds_v1_0 ])
(在工程資料夾內建立名為repo的資料夾,repo資料夾內建立if、ip資料夾,拷貝介面檔案tmds_v1_0到if資料夾內,拷貝IP核axi_dynclk_v1_0、rgb2dvi到ip資料夾內,並按下圖操作)
(開源vivado-library下載:https://github.com/Digilent/vivado-library)
#4 新增IP核:axi_dynclk_v1_0、rgb2dvi、gpio、vdma、vtc、stream2video等IP核,並作佈線如下圖所示
(佈線方法:先手動連線時鐘訊號線FCLK_CLK0、FCLK_CLK1,然後點選上方的綠色自動佈線選項)
其中,關鍵IP核配置如下:
##1 vdma
##2 vtc
##3 axis_subset_converter
##4 stream2video
##5 rgb2dvi
##6 gpio
##7 圖中兩個常量IP均為一位,數值為1,其一使converter不重置,其二使HDMI_OEN輸出為高電平,指示當前hdmi為輸出模式
#5 點選“validate design”,驗證沒有錯誤後,新增引腳約束檔案,修改自ZYBO_Master.xdc
## This file is a general .xdc for the ZYBO Rev B board ## To use it in a project: ## - uncomment the lines corresponding to used pins ## - rename the used signals according to the project ##Audio Codec/external EEPROM IIC bus #IO_L13P_T2_MRCC_34 set_property PACKAGE_PIN N18 [get_ports iic_0_scl_io] set_property IOSTANDARD LVCMOS33 [get_ports iic_0_scl_io] #IO_L23P_T3_34 set_property PACKAGE_PIN N17 [get_ports iic_0_sda_io] set_property IOSTANDARD LVCMOS33 [get_ports iic_0_sda_io] ##HDMI Signals #IO_L13N_T2_MRCC_35 set_property IOSTANDARD TMDS_33 [get_ports TMDS_clk_n] #IO_L13P_T2_MRCC_35 set_property PACKAGE_PIN H16 [get_ports TMDS_clk_p] set_property IOSTANDARD TMDS_33 [get_ports TMDS_clk_p] #IO_L4N_T0_35 set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[0]}] #IO_L4P_T0_35 set_property PACKAGE_PIN D19 [get_ports {TMDS_data_p[0]}] set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_p[0]}] #IO_L1N_T0_AD0N_35 set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[1]}] #IO_L1P_T0_AD0P_35 set_property PACKAGE_PIN C20 [get_ports {TMDS_data_p[1]}] set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_p[1]}] #IO_L2N_T0_AD8N_35 set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[2]}] #IO_L2P_T0_AD8P_35 set_property PACKAGE_PIN B19 [get_ports {TMDS_data_p[2]}] set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_p[2]}] #IO_L5P_T0_AD9P_35 set_property PACKAGE_PIN E18 [get_ports {hdmi_hpd_tri_i[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_hpd_tri_i[0]}] ##IO_L6N_T0_VREF_35 set_property PACKAGE_PIN F17 [get_ports {HDMI_OEN[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {HDMI_OEN[0]}] #IO_L16P_T2_35 set_property PACKAGE_PIN G17 [get_ports hdmi_ddc_scl_io] set_property IOSTANDARD LVCMOS33 [get_ports hdmi_ddc_scl_io] #IO_L16N_T2_35 set_property PACKAGE_PIN G18 [get_ports hdmi_ddc_sda_io] set_property IOSTANDARD LVCMOS33 [get_ports hdmi_ddc_sda_io]
#6 點選“generate bitstream”,等待生成位元流檔案
2、SDK建立的FSBL執行檔案fsbl.elf
略。
3、SDK/ubuntu建立的裝置樹檔案system.dts/devicetree.dtb
1)下載device_tree配置檔案,連結:https://github.com/Xilinx/device-tree-xlnx/releases(注意下載的版本與vivado版本匹配)
2)SDK新增device_tree配置檔案
Xilinx Tools -> Repositories -> New
3)SDK建立device_tree工程,生成dts檔案
File -> New -> Board Support Package
4)bootagrs引數設定
(e.g. console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1)
5)[重要] 根據相關硬體做出修改,如下:
#1 新增usb驅動配置
在pl.dtsi檔案中最後一個分號“ } ; ”前新增:
/*add for usb0*/ usb_phy_0: usb_phy { compatible = "usb-nop-xceiv"; #phy-cells = <0x0>; };
並在zynq-7000.dtsi檔案中,usb0標籤的最後一個分號“ } ; ”前新增:
usb-phy = <&usb_phy_0>;//add for usb0
#2 新增hdmi驅動配置
在pl.dtsi檔案中,amba_pl標籤內作如下修改:
amba_pl: amba_pl { #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; ranges ; axi_dynclk_0: [email protected] { #clock-cells = <0x0>;//add compatible = "digilent,axi-dynclk";//change reg = <0x43c00000 0x10000>; xlnx,s00-axi-addr-width = <0x5>; xlnx,s00-axi-data-width = <0x20>; clocks = <&clkc 0xf>;//add, 0xf不能刪掉 }; axi_gpio_hdmi: [email protected] { #gpio-cells = <2>; compatible = "xlnx,xps-gpio-1.00.a"; gpio-controller ; interrupt-parent = <&intc>; interrupts = <0 29 4>; reg = <0x41200000 0x10000>; xlnx,all-inputs = <0x1>; xlnx,all-inputs-2 = <0x0>; xlnx,all-outputs = <0x0>; xlnx,all-outputs-2 = <0x0>; xlnx,dout-default = <0x00000000>; xlnx,dout-default-2 = <0x00000000>; xlnx,gpio-width = <0x1>; xlnx,gpio2-width = <0x20>; xlnx,interrupt-present = <0x1>; xlnx,is-dual = <0x0>; xlnx,tri-default = <0xFFFFFFFF>; xlnx,tri-default-2 = <0xFFFFFFFF>; }; axi_vdma_0: [email protected] { #dma-cells = <1>; compatible = "xlnx,axi-vdma-1.00.a"; interrupt-parent = <&intc>; interrupts = <0 30 4>; reg = <0x43000000 0x10000>; //xlnx,flush-fsync = <0x1>;//change xlnx,num-fstores = <0x1>; [email protected] { compatible = "xlnx,axi-vdma-mm2s-channel"; interrupts = <0 30 4>; clocks = <&clkc>;//add clock-names = "axis";//add xlnx,datawidth = <0x20>; xlnx,device-id = <0x0>; }; }; v_tc_0: [email protected] { compatible = "xlnx,v-tc-5.01.a";//change interrupt-parent = <&intc>; interrupts = <0 31 4>; reg = <0x43c10000 0x10000>; xlnx,det-achroma-en = <0x0>; xlnx,det-avideo-en = <0x1>; xlnx,det-fieldid-en = <0x0>; xlnx,det-hblank-en = <0x1>; xlnx,det-hsync-en = <0x1>; xlnx,det-vblank-en = <0x1>; xlnx,det-vsync-en = <0x1>; xlnx,detect-en = <0x0>; xlnx,fsync-hstart0 = <0x0>; xlnx,fsync-hstart1 = <0x0>; xlnx,fsync-hstart10 = <0x0>; xlnx,fsync-hstart11 = <0x0>; xlnx,fsync-hstart12 = <0x0>; xlnx,fsync-hstart13 = <0x0>; xlnx,fsync-hstart14 = <0x0>; xlnx,fsync-hstart15 = <0x0>; xlnx,fsync-hstart2 = <0x0>; xlnx,fsync-hstart3 = <0x0>; xlnx,fsync-hstart4 = <0x0>; xlnx,fsync-hstart5 = <0x0>; xlnx,fsync-hstart6 = <0x0>; xlnx,fsync-hstart7 = <0x0>; xlnx,fsync-hstart8 = <0x0>; xlnx,fsync-hstart9 = <0x0>; xlnx,fsync-vstart0 = <0x0>; xlnx,fsync-vstart1 = <0x0>; xlnx,fsync-vstart10 = <0x0>; xlnx,fsync-vstart11 = <0x0>; xlnx,fsync-vstart12 = <0x0>; xlnx,fsync-vstart13 = <0x0>; xlnx,fsync-vstart14 = <0x0>; xlnx,fsync-vstart15 = <0x0>; xlnx,fsync-vstart2 = <0x0>; xlnx,fsync-vstart3 = <0x0>; xlnx,fsync-vstart4 = <0x0>; xlnx,fsync-vstart5 = <0x0>; xlnx,fsync-vstart6 = <0x0>; xlnx,fsync-vstart7 = <0x0>; xlnx,fsync-vstart8 = <0x0>; xlnx,fsync-vstart9 = <0x0>; xlnx,gen-achroma-en = <0x0>; xlnx,gen-achroma-polarity = <0x1>; xlnx,gen-auto-switch = <0x0>; xlnx,gen-avideo-en = <0x1>; xlnx,gen-avideo-polarity = <0x1>; xlnx,gen-cparity = <0x0>; xlnx,gen-f0-vblank-hend = <0x500>; xlnx,gen-f0-vblank-hstart = <0x500>; xlnx,gen-f0-vframe-size = <0x2ee>; xlnx,gen-f0-vsync-hend = <0x500>; xlnx,gen-f0-vsync-hstart = <0x500>; xlnx,gen-f0-vsync-vend = <0x2d9>; xlnx,gen-f0-vsync-vstart = <0x2d4>; xlnx,gen-f1-vblank-hend = <0x500>; xlnx,gen-f1-vblank-hstart = <0x500>; xlnx,gen-f1-vframe-size = <0x2ee>; xlnx,gen-f1-vsync-hend = <0x500>; xlnx,gen-f1-vsync-hstart = <0x500>; xlnx,gen-f1-vsync-vend = <0x2d9>; xlnx,gen-f1-vsync-vstart = <0x2d4>; xlnx,gen-fieldid-en = <0x0>; xlnx,gen-fieldid-polarity = <0x1>; xlnx,gen-hactive-size = <0x500>; xlnx,gen-hblank-en = <0x1>; xlnx,gen-hblank-polarity = <0x1>; xlnx,gen-hframe-size = <0x672>; xlnx,gen-hsync-en = <0x1>; xlnx,gen-hsync-end = <0x596>; xlnx,gen-hsync-polarity = <0x1>; xlnx,gen-hsync-start = <0x56e>; xlnx,gen-interlaced = <0x0>; xlnx,gen-vactive-size = <0x2d0>; xlnx,gen-vblank-en = <0x1>; xlnx,gen-vblank-polarity = <0x1>; xlnx,gen-video-format = <0x2>; xlnx,gen-vsync-en = <0x1>; xlnx,gen-vsync-polarity = <0x1>; xlnx,generate-en = <0x1>; xlnx,has-axi4-lite = <0x1>; xlnx,has-intc-if = <0x0>; xlnx,interlace-en = <0x0>; xlnx,max-lines = <0x1000>; xlnx,max-pixels = <0x1000>; xlnx,num-fsyncs = <0x1>; xlnx,sync-en = <0x0>; }; /*add for vga_hdmi_encoder*/ digilent_encoder_0: digilent_encoder { compatible = "dglnt,drm-encoder"; dglnt,edid-i2c = <&i2c1>; }; /*add for drm*/ xilinx_drm_0: xilinx_drm { compatible = "xlnx,drm"; xlnx,vtc = <&v_tc_0>; xlnx,connector-type = "HDMIA"; xlnx,encoder-slave = <&digilent_encoder_0>; clocks = <&axi_dynclk_0>; dglnt,edid-i2c = <&i2c1>; planes { xlnx,pixel-format = "xrgb8888"; plane0 { dmas = <&axi_vdma_0 0>;//0不能刪掉 dma-names = "dma"; }; }; }; };
6)修改後,工程會重新編譯,複製device_tree_dsp_0整個資料夾到ubuntu系統下,執行以下命令生成裝置樹檔案devicetree.dtb
cd device_tree_dsp_0 dtc -I dts -O dtb ./system.dts -o devicetree.dtb
(前提:安裝dtc工具,或從Linux kernel原始碼中拷貝dtc執行檔案出來)
(安裝命令:sudo apt-get install device-tree-compile)
二、軟體平臺搭建
[目標檔案:啟動載入程式u-boot.elf、Linux核心檔案uImage、檔案系統linaro]
[待續...]
官方教程連結:
ZYBOt Guide [Reference.Digilentinc]
https://reference.digilentinc.com/learn/programmable-logic/tutorials/zybo-zybot-guide/start
Zybot - Getting Started Guide and Source Code: 8 Steps
http://www.instructables.com/id/Zybot-Getting-Started-Guide/
搭建好了硬體平臺、Linaro軟體桌面系統,下一步便是開發應用程式(用到Qt與OpenCV),然後交叉編譯後移植到Linaro系統中執行。但此時又發生了一個重大問題:交叉編譯後的應用程式不能執行,涉及到Linaro系統編譯時所用的編譯器版本問題、2012年後Linaro系統載入程式的路徑及名稱問題,以至於需要重灌交叉編譯鏈、重新交叉編譯Qt與OpenCV等,下一篇文章再續。
版權宣告:本文為博主原創文章,未經博主允許不得轉載。
分類: 嵌入式開發
0
0
« 上一篇:舊版本linaro-ubuntu更改軟體源
» 下一篇:深度學習環境搭建(Ubuntu16.04+GTX1080Ti+CUDA8.0+Cudnn6.0+TensorFlow+Caffe2(Pytorch))