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裡新增和配置PS和PL部分基本的外設,或需要新增自定義的外設。
- 在Vivado裡生成頂層HDL檔案,並新增約束檔案。再編譯生成位元流檔案system.bit。
- 匯出到SDK軟體開發環境,在SDK環境裡可以編寫一些除錯軟體驗證硬體和軟件,結合位元流檔案單獨除錯ZYNQ系統
- 在SDK裡生成FSBL檔案。
- 在VMware虛擬機器裡生成u-boot.elf bootloader映象。
- 在SDK裡通過FSBL檔案, 位元流檔案system.bit和u-boot.elf檔案生成一個boot.bin檔案。
- 在VMware裡生成Linux的核心映象檔案zImage和Linux的檔案系統ramdisk。另外還需要對FPGA自定義的IP編寫驅動。
- 把boot.bin,zimage和ramdisk
一. 準備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"ELF檔案,將其重新命名為"u-boot.elf"。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-
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.gzfilesystem$ dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=1
gunzip解壓ramdisk.image.gz生成ramdisk.imagefilesystem$ 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, 同步檔案系統並解除安裝ramdiskfilesystem$ sync
filesystem$ umount rootfs
用gzip壓縮ramdisk.image,生成ramdisk.image.gzfilesystem$ gzip -9 ramdisk.image
用mkimage新增標頭檔案,生成新的uramdisk.image.gz供u-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,新增一個ZYNQ7的IP核。
點選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的配置檔案,即使是空的配置。