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、交叉編譯環境搭建,見之前的記錄:Zynq7000開發系列-4(新:Xilinx交叉編譯環境搭建)

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: axi_dynclk@43c00000 {
            #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: gpio@41200000 {
            #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: dma@43000000 {
            #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>;
            dma-channel@43000000 {
                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: v_tc@43c10000 {
            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等,下一篇文章再續。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM