1. 程式人生 > >ZYNQ學習之路1. Linux最小系統構建

ZYNQ學習之路1. Linux最小系統構建

開發環境window10, vivado 2017.1, ubuntu 16.04, Eclipse+cdt

硬體環境:米爾科技zturn board,zynq7z010

  本筆記詳細介紹了開發ZYNQ7000系列的基礎軟體系統構建,介紹了Vivado的使用以及IP核的配置,最後搭建能讓ZYNQ執行arm linux系統的軟體環境,在今後的開發過程中將在此基礎上進行。在完整搭建好本系統之後建議儲存為模板工程。

  首先簡單介紹一下ZYNQ開發linux的基本流程:ZYNQ的開發也是先硬體後軟體的方法。具體流程如下:

  • Vivado中新建工程,增加一個嵌入式的原始檔。
  • Vivado裡新增和配置PSPL部分基本的外設,或需要新增自定義的外設。
  • Vivado裡生成頂層HDL檔案,並新增約束檔案。再編譯生成位元流檔案system.bit
  • 匯出到SDK軟體開發環境,在SDK環境裡可以編寫一些除錯軟體驗證硬體和軟件,結合位元流檔案單獨除錯ZYNQ系統
  • SDK裡生成FSBL檔案。
  • VMware虛擬機器裡生成u-boot.elf bootloader映象。
  • SDK裡通過FSBL檔案, 位元流檔案system.bitu-boot.elf檔案生成一個boot.bin檔案。
  • VMware裡生成Linux的核心映象檔案zImageLinux的檔案系統ramdisk。另外還需要對FPGA自定義的IP編寫驅動。
  • boot.bin,zimageramdisk
    三個檔案放入到SD卡的FAT分割槽中,啟動開發板電源,Linux作業系統會從SD卡里啟動。

一. 準備Linux系統的核心、uboot、檔案系統、裝置樹等檔案

    1.1 編譯uboot

    在工作空間建立uboot目錄,進入uboot目錄,解壓uboot原始碼

<workdir>$ cd uboot
uboot$ tar -jxvf u-boot-xlnx.tar.bz2
uboot$ cd u-boot-xlnx

    編譯uboot:

u-boot-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- distclean
u-boot-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zturn_config
u-boot-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
編譯完成後,在當前目錄下會生成"u-boot"ELF檔案,將其重新命名為"u-boot.elf"

  1.2 編譯linux核心

在工作空間建立kernel目錄,進入kernel目錄,解壓核心原始碼:
<workdir>$ cd kernel
kernel$ tar -xvjf linux-xlnx.tar.bz2
kernel$ cd linux-xlnx
開始編譯
linux-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- distclean
linux-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zturn_defconfig
linux-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage
linux-xlnx$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- dtbs
編譯完成後,在arch/arm/boot目錄下生成uImage檔案,在/arch/arm/boot.dts/生成zynq_zturn.dtb檔案。

  1.3 製作randisk

在工作空間建立filesystem目錄,進入filesystem目錄,將uramdisk.image.gz拷貝至該目錄。
<workdir>$ cd filesystem
filesystem$ mkdir -p rootfs
去掉mkimage生成的64bytes檔案頭,生成新的ramdisk.image.gz
filesystem$ dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=1
gunzip解壓ramdisk.image.gz生成ramdisk.image
filesystem$ gunzip ramdisk.image.gz
ramdisk.image掛在在rootfs目錄
filesystem$ sudo mount -o loop,rw ramdisk.image rootfs
進入rootfs目錄,根據需要做修改。

  經筆者實驗發現,米爾科技的開發板Zturn board在直接使用光碟檔案時,乙太網不能正常執行,經除錯發現其ramdisk檔案系統中關於網路的配置檔案不完整,在ramdisk檔案目錄中,開啟/etc/network/interfaces檔案,發現其中沒有關於eth0的配置,因此新增網路配置如下:

auto eth0
iface eth0 inet dhcp
重新生成ramdisk, 同步檔案系統並解除安裝ramdisk
filesystem$ sync
filesystem$ umount rootfs
gzip壓縮ramdisk.image,生成ramdisk.image.gz
filesystem$ gzip -9 ramdisk.image
mkimage新增標頭檔案,生成新的uramdisk.image.gzu-boot使用。
filesystem$ mkimage -A arm -T ramdisk -C gzip -n Ramdisk -d ramdisk.image.gz uramdisk.image.gz

    至此,我們已經得到了u-boot.elf, uImage, devicetree.dtb, uramdisk.image.gz檔案。

二. 在Vivado中建立硬體系統

2.1 新建一個空白vivado工程,選擇ZYNQ7010對應的晶片型號,點選左側的Create Block Design,新增一個ZYNQ7IP核。

        點選Run Block Automation, 彈出的對話方塊直接點OK,雙擊ZYNQ IP核,配置引數。

    2.2 Peripheral I/O Pins配置

        Bank 1選擇LVCMOS 1.8V

        勾選Quad SPI Flash

        勾選Ethernet 0 以及展開目錄下的MDIO,點選右側Enet0, 配置其使用PS的MIO16~27, MDIO選擇PS的MIO52,53,注意這兩個選項不手動選擇對應的引腳則使用EMIO。


        勾選USB0,使用PS的MIO28~39。

        勾選SD0,使用PS的MIO40~45,展開SD0目錄,使用選擇Card Detect為MIO46, write Protect為MIO47.


        勾選UART1, 使用PS的MIO48, 49.

        勾選TTC0, 使用EMIO。

        勾選GPIO MIO,不用選擇展開的選項。

        最後所有的配置如下圖所示


    2.3 MIO Configurateion:

        展開Memory Interfaces->Quad SPI Flash->Single SS 4-bit IO, 設定所有的引腳速度為"fast", MIO1選擇disable;


        展開I/O Peripherals所有專案,設定所有的引腳速度mdc和mdio為slow,其他為fast,所有引腳上拉設定為disable:


        展開USB0選項,設定所有引腳速度為fast,上拉選disable:


        展開SD0選項,設定如下:


        展開GPIO,設定如下:


    2.4 Clock Configuration,配置時鐘頻率如下圖所示:


    2.5 DDR Configuration

        根據原理圖,選擇memory part為MT41K256M16 RE-125


    2.6  編譯硬體系統

        右鍵選擇原理圖檔案(Source選項中), 選擇generate output products...,接著Run Synthesis, 綜合完成後點選Run Implementation,編譯完成後點選Generate Bitstream,匯出硬體設計File->Export->eexport hardware, 然後啟動SDK設計軟體:File->Launch SDK.

        在本次專案中並沒有新增FPGA部分的設計程式碼,所有在整個流程沒有關於FPGA的引腳約束,模擬等操作,這一部分將在後續介紹。

三. 在SDK中驗證硬體設計並製作SD卡啟動檔案

    3.1 在SDK中新建應用程式,以Hello world為模板。


        在Launch SDK之後,SDK軟體一般會自動建立一個硬體平臺(<project_hw_platform_0>),如果是在多次匯出硬體設計過程中生成了多個platform_x檔案,建議刪除所有platform檔案,重新匯出。

        在生成的bsp工程上右鍵點選,Board Support Package Settings->Overview->standalone, 設定stdin和stdout為ps7_uart_1,因為在硬體設計中我們選擇的是使用串列埠1作為終端串列埠輸出,SDK在預設時時使用uart0, 因此如果在SDK中使用printf或xil_printf沒有看到輸出,則需要檢查此處的設定。


    3.2 連線模擬器,串列埠終端,電源,首先燒寫FPGA程式(.bit檔案), 然後執行helloworld工程,在終端上可以看到列印了一行hello world字元,說明基本硬體沒有什麼大問題。

    3.3 建立FSBL

        FSBL是first stage boot loader的簡稱,它是ZYNQ啟動第一階段載入的程式,固化在晶片內的BOOT ROM首先載入FSBL程式,FSBL載入u-boot, uboot載入Linux。因此要執行Linux系統必須要製作FSBL。

    新建應用程式,選擇以Zynq FSBL為模板工程。


        不用修改fsbl工程,直接編譯生成的這個工程。

        右鍵選擇fsbl工程,選擇Create Boot Image, 在Boot image partitions中已經添加了fsbl.elf, design_1_wrapper.bit,點選Add選擇前面準備好的u-boot.elf檔案,將三個檔案一起生成BOOT.bin檔案。

    

    3.3 啟動Linux系統

        SD卡需要時FAT32格式,如果不是請格式化,將以上所有生成的檔案放在SD卡的根目錄下,如下圖所示:


        其中7z010.bit檔案是有desig_1_wrapper.bit改名而來,如果不改需要在fsbl工程中去修改載入的.bit檔案的名稱,所以建議所有的工程生成後都重新命名為7z010.bit,將SD卡插入開發板,上電啟動。


        事實上在本次設計中我們並沒有設計關於FPGA部分的原始檔,為什麼還是要7z010.bit檔案呢?在u-boot啟動過程中如果沒有檢測到FPGA的配置檔案u-boot將不啟動Linux核心,所有無論有沒有FPGA的設計都需要一個FPGA的配置檔案,即使是空的配置。