我們要生成四個(gè)文件:Linux啟動(dòng)需要4個(gè)文件:
1. boot.bin
2. device_tree.dtb
3. uImage
4. uramdisk.image.gz
a1.生成boot.bin文件需要:(生成boot.bin時(shí),下面三個(gè)文件順序不能錯(cuò)。)
(1)FSBL:第一級(jí)啟動(dòng)引導(dǎo)程序,選擇Zynq FSBL模版,生成zynq_fsbl_0.elf
(2)system.bit:硬件比特流(硬件工程文件,有的命名為zynq_system_wrapper.bit)
(3)u-boot:u-boot.elf。 Linux Bootloader。 u-boot是用于多種嵌入式CPU的bootloader程序。體系結(jié)構(gòu):api,arch(u-boot支持的cpu架構(gòu),子目錄arm使我們用到的),board(和已有開發(fā)板相關(guān)文件),common(u-boot命令行下支持的命令),disk,doc,drivers(u-boot支持的設(shè)備驅(qū)動(dòng)程序),fs(支持的文件系統(tǒng)),include(頭文件,對(duì)各種硬件平臺(tái)支持的匯編文件,系統(tǒng)的配置文件和對(duì)文件系統(tǒng)支持的文件。configs/zynq_common.h是我們開發(fā)板相關(guān)的文件),lib(與體系結(jié)構(gòu)相關(guān)的庫文件),net,tools(生成u-boot的工具,例如,mkimage,crc等,還包括Makefile和boards.cfg)
啟動(dòng)過程參考:
a2.device_tree.dtb
devicetree.dtb:Linux系統(tǒng)設(shè)備樹文件,通過u-boot加載到內(nèi)存。在運(yùn)行時(shí),構(gòu)建系統(tǒng)硬件的設(shè)備樹信息傳遞給內(nèi)核,進(jìn)行系統(tǒng)的啟動(dòng)運(yùn)行。作為u-boot和Linux內(nèi)核之間的動(dòng)態(tài)接口。設(shè)備樹的引入,減少內(nèi)核對(duì)系統(tǒng)硬件的嚴(yán)重依賴,提高代碼重用。并且加速了Linux支持包的開發(fā)。這樣,使得單個(gè)內(nèi)核鏡像能支持多個(gè)系統(tǒng),通過降低硬件所帶來的需求變化和成本,降低對(duì)內(nèi)核設(shè)計(jì)和編譯的要求。使用設(shè)備樹運(yùn)行時(shí)配置的linux內(nèi)核,它允許同一內(nèi)核鏡像可以在不同的硬件配置上運(yùn)行(Linux kernel that use device for run-time configuration which allows the same kernel image to run on different hardware configurations)。
.dts是設(shè)備樹源文件的格式
a3.uImage
uImage:Linux內(nèi)核鏡像,通過u-boot加載到內(nèi)存。Linux源碼采用匯編語言和C語言編寫,了解內(nèi)核源碼的整體分布情況,有利于理解Linux如何組織各項(xiàng)功能的實(shí)現(xiàn)。arch(硬件體系結(jié)構(gòu),kernel,lib,mm,math-emu,boot), Documentation, drivers, fs, include, init, ipc(進(jìn)程間通信), kernel, lib, mm, net, scripts, block, crypto, security, sound, usr.
a4.uramdisk.image.gz
uramdisk.image.gz:Linux文件系統(tǒng),通過u-boot加載到內(nèi)存。
文件系統(tǒng)是解決如何在存儲(chǔ)設(shè)備上存儲(chǔ)數(shù)據(jù)的一種方法,其中包括存儲(chǔ)布局、文件命名、空間管理、安全控制等。Linux操作系統(tǒng)支持很多現(xiàn)代的流行文件系統(tǒng),比如ext2、ext3和ramdisk。
1.構(gòu)建交叉編譯環(huán)境
(1)在網(wǎng)上下載: arm-2013.05-24-arm-none-linux-gnueabi-x86_64-linux-gnu.tar.bz2
(2)解壓縮。我直接解壓到/home/ds下,解壓后路徑“/home/ds/arm-2013.05”
(3)gedit /etc/environment
將PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
注釋掉(或直接改更改),添加
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ds/arm-2013.05/bin"
“/home/ds/arm-2013.05/bin”這個(gè)根據(jù)你的版本決定。
這個(gè)操作可以使用戶在root權(quán)限下使用arm-none-linux-gnueabi-
(4) gedit /etc/bash.bashrc
在最后添加:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ds/arm-2013.05/bin"
“/home/ds/arm-2013.05/bin”這個(gè)根據(jù)你的版本決定。
這個(gè)操作可以使非root用戶使用arm-none-linux-gnueabi-
然后:
source /etc/bash.bashrc
立即生效
(5)arm-none-linux-gnueabi-gcc -v
打印出交叉編譯器版本信息,證明設(shè)置系統(tǒng)環(huán)境成功。
2.編譯U-Boot
(1)在/home/ds下建立新文件夾build(可以用mkdir build,也可以手動(dòng)添加),cd 到build文件夾
(2)從網(wǎng)上下載“u-boot-xlnx-xilinx-v2015.1.zip”,解壓到build文件夾里,并cd 到u-boot-xlnx-xilinx-v2015.1。(此時(shí)路徑為“/home/ds/build/u-boot-xlnx-xilinx-v2015.1”)
(3)
sudo su
export CROSS_COMPILE=arm-none-linux-gnueabi-
make zynq_microzed_config
make//在根目錄生成了u-boot(an elf file),u-boot.bin,和u-boot.srec。其中u-boot(an elf file)用于制作最后啟動(dòng)的Boot文件。
cp u-boot u-boot.elf //復(fù)制一下
然后參照: 或者陸佳華老師的《嵌入式系統(tǒng)軟硬件協(xié)同設(shè)計(jì)實(shí)戰(zhàn)指南》第九章,生成boot.bin文件。
3.編譯uImage
(1)在網(wǎng)上下載:“ linux-xlnx-xilinx-v2015.1.zip”,解壓到build,cd 到 linux-xlnx-xilinx-v2015.1 里。
(2)
sudo su
sudo apt install u-boot-tools
sudo apt install libncurses5-dev//防止make menuconfig時(shí)缺少這個(gè)庫文件
(3)編譯出來的目標(biāo)是針對(duì)ARM體系結(jié)構(gòu)的。因?yàn)槭轻槍?duì)ARM體系結(jié)構(gòu),所以需要使用交叉編譯器。
export CROSS_COMPILE=arm-none-linux-gnueabi-
make ARCH=arm xilinx_zynq_defconfig
make ARCH=arm menuconfig
make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
(6)打印出:
Image Name: Linux-3.18.0-xilinx
Created: Tue Jul 19 16:00:07 2016
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3477600 Bytes = 3396.09 kB = 3.32 MB
Load Address: 00008000
Entry Point: 00008000
Image arch/arm/boot/uImage is ready
4.創(chuàng)建設(shè)備樹
(1)(注意這是linux-xlnx/arch/arm/boot/dts/目錄下存在的dts文件才可以生成dtb文件,以下以zedboard為例)在Linux源代碼目錄下(我的是“/home/ds/build/linux-xlnx-xilinx-v2015.1”), 編譯目標(biāo)為”dtbs”時(shí)會(huì)把所有的dts文件編譯成dtb文件,所有的dts文件和生成的dtb文件都位于linux-xlnx/arch/arm/boot/dts/目錄下
cd 到linux-xlnx-xilinx-v2015.1下
make ARCH=arm dtbs
zynq-zed.dtb是我們需要的文件,改名為devicetree.dtb
如果只想生成zynq-zed.dtb,在linux源代碼根目錄輸入以下命令即可
make ARCH=arm zynq-zed.dtb
或者用設(shè)備樹編譯器對(duì)dts文件進(jìn)行編譯生成:
apt-get install device-tree-compiler
cd /home/ds/build/linux-xlnx-xilinx-v2015.1/arch/arm/boot/dts
dtc -O dtb -I dts -o zynq-zed.dtb zynq-zed.dts
——但是里面沒有我們想要的zynq-microzed.dts文件,因此只能用別的方法,這里介紹是為了給用其他開發(fā)板的讀者帶來方便
(2)從步驟六可以下載到microzed_7010_7020_petalinux_SD_images ,里面有devicetree_microzed_2014_4.dts,可以生成。
也可以用Vivado創(chuàng)建一個(gè)Microzed的項(xiàng)目生成比特流后導(dǎo)入到SDK,F(xiàn)ile—>New—>Board Support Package—>Board Support Package OS : device-tree—>Finish命令—->在彈出的Setting對(duì)話框中,設(shè)置bootargs的Value值為:console=ttyPS0,115200 root= /dev/ram/ rw earlyprintk—>在console device的Value下拉菜單中選擇ps7_uart_1,單擊OK按鈕。(這里的bootargs參數(shù)是內(nèi)核的命令行參數(shù),在內(nèi)核啟動(dòng)階段,這些參數(shù)被傳遞給內(nèi)核。這里root= /dev/ram 指的是內(nèi)核從內(nèi)存啟動(dòng)文件系統(tǒng),U-boot將uramdisk.image.gz加載到內(nèi)存后將其內(nèi)存地址傳遞給內(nèi)核,內(nèi)核就知道該從什么地方運(yùn)行文件系統(tǒng)了。但是我們知道Zedboard上的內(nèi)存只有512M,況且uramdisk.image.gz最大只能到32M,那么當(dāng)在構(gòu)建較大的系統(tǒng)時(shí)該怎么辦呢?解決這一問題有兩種方法,第一個(gè)仍然使用uramdisk.image.gz作為文件系統(tǒng),然后將需要加載到用戶系統(tǒng)文件放到FAT分區(qū)中,當(dāng)操作系統(tǒng)啟動(dòng)后,將FAT分區(qū)掛載到系統(tǒng)中,然后進(jìn)行相應(yīng)的訪問。第二種方法則是將文件系統(tǒng)放到SD卡的EXT分區(qū)中就像第一章中啟動(dòng)linaro_ubuntu桌面系統(tǒng)一樣,這里唯一需要修改的是將這里的啟動(dòng)參數(shù)root=/dev/ram改為root=/dev/mmcblk0p2。)——>編譯結(jié)束后,device-tree_bsp_0/ps7_cotexa9_0/libsrc/device-tree_v0_00_x目錄下可以看到xilinx.dts文件生成。這里的xilinx.dts不是完美的,如果在Zedboard上使用還要根據(jù)實(shí)際的情況修改, 找到已經(jīng)修改好的xup_zed.dts,該文件對(duì)ethernet的mdio參數(shù)進(jìn)行修改。
cd ~/build/linux-xup
./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb xilinx.dts
當(dāng)然這個(gè)過程可逆,可以將一個(gè).dtb轉(zhuǎn)換成.dts
./scripts/dtc/dtc -I dtb -O dts -o xilinx.dts devicetree.dtb
或者將xilinx.dts 放入arch/arm/boot/dts 文件夾中,然后使用下面的命令生成devicetree.dtb。
make ARCH=arm xilinx.dtb
cp arch/arm/boot/dts/xilinx.dtb ./devicetree.dtb
5.生成uramdisk.image.gz
(1)在+and+Modify+a+Rootfs下載arm_ramdisk.image.gz(該網(wǎng)址也有過程)
(2)在build目錄中:mkdir filesys ,cd filesys, 把a(bǔ)rm_ramdisk.image.gz 放到filesys目錄中
(3)cp arm_ramdisk.image.gz ramdisk.image.gz
(4)gunzip ramdisk.image.gz
(5)mkdir file_tmp
(6)sudo mount ramdisk.image -o loop ./file_tmp/(或者sudo mount -o loop ramdisk.image file_tmp)
(7)此時(shí)文件系統(tǒng)已經(jīng)掛載到了film_tmp目錄中,你可以到film_tmp目錄中對(duì)文件系統(tǒng)進(jìn)行相應(yīng)的修改。修改完后將文件系統(tǒng)umount并重新壓縮即可。這里如果你要制作EXT文件系統(tǒng),則只需要將SD卡插到PC機(jī)中,并將file_tmp文件夾的內(nèi)容復(fù)制到SD卡的EXT分區(qū)中即可。
(8)sudo umount file_tmp/
(9)gzip ramdisk.image
(10)sudo apt-get install u-boot-tools
(11)mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz
輸出:
Image Name:
Created: Tue Jul 19 17:32:31 2016
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 5310073 Bytes = 5185.62 kB = 5.06 MB
Load Address: 00000000
Entry Point: 00000000
6.另一種途徑:直接下載
Open Source Linux Images
?
下載后,根據(jù)你板子的型號(hào)來選擇用7010的還是7020的。
也可以從我上傳的位置下載:
或者:
MicroZed Open Source Linux QSPI Image Tutorial:
Open Source Linux In System QSPI Programming Tutoria:
The MicroZed platform ships from the factory with an example Open Source Linux image stored in the Quad-SPI Flash boot medium. This tutorial builds upon the Zynq Linux SpeedWay training material and describes how to perform in system programming of QSPI Flash partitions to restore the factory default QSPI Flash contents.
評(píng)論
查看更多