在Microzed上構建嵌入式linux系統(ubuntu16.04下)

July 19, 2016
作者:dengshuai_super
出處:http://blog.csdn.net/dengshuai_super/article/details/51958097
聲明:轉載請註明作者及出處。

下載所需文件:http://pan.baidu.com/s/1dEVhk1V


我們要生成四個文件:Linux啓動需要4個文件:
1. boot.bin
2. device_tree.dtb
3. uImage
4. uramdisk.image.gz

a1.生成boot.bin文件需要:(生成boot.bin時,下面三個文件順序不能錯。)

(1)FSBL:第一級啓動引導程序,選擇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程序。體系結構:api,arch(u-boot支持的cpu架構,子目錄arm使我們用到的),board(和已有開發板相關文件),common(u-boot命令行下支持的命令),disk,doc,drivers(u-boot支持的設備驅動程序),fs(支持的文件系統),include(頭文件,對各種硬件平臺支持的彙編文件,系統的配置文件和對文件系統支持的文件。configs/zynq_common.h是我們開發板相關的文件),lib(與體系結構相關的庫文件),net,tools(生成u-boot的工具,例如,mkimage,crc等,還包括Makefile和boards.cfg)
啓動過程參考:http://blog.csdn.net/xiabodan/article/details/23093111

a2.device_tree.dtb

devicetree.dtb:Linux系統設備樹文件,通過u-boot加載到內存。在運行時,構建系統硬件的設備樹信息傳遞給內核,進行系統的啓動運行。作爲u-boot和Linux內核之間的動態接口。設備樹的引入,減少內核對系統硬件的嚴重依賴,提高代碼重用。並且加速了Linux支持包的開發。這樣,使得單個內核鏡像能支持多個系統,通過降低硬件所帶來的需求變化和成本,降低對內核設計和編譯的要求。使用設備樹運行時配置的linux內核,它允許同一內核鏡像可以在不同的硬件配置上運行(Linux kernel that use device for run-time configuration which allows the same kernel image to run on different hardware configurations)
.dts是設備樹源文件的格式

a3.uImage

uImage:Linux內核鏡像,通過u-boot加載到內存。Linux源碼採用彙編語言和c語言編寫,瞭解內核源碼的整體分佈情況,有利於理解Linux如何組織各項功能的實現。arch(硬件體系結構,kernel,lib,mm,math-emu,boot), Documentation, drivers, fs, include, init, ipc(進程間通信), kernel, lib, mm, net, scripts, block, crypto, security, sound, usr.

a4.uramdisk.image.gz

uramdisk.image.gz:Linux文件系統,通過u-boot加載到內存。
文件系統是解決如何在存儲設備上存儲數據的一種方法,其中包括存儲佈局、文件命名、空間管理、安全控制等。Linux操作系統支持很多現代的流行文件系統,比如ext2、ext3和ramdisk。


1.構建交叉編譯環境

(1)在網上下載: 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”這個根據你的版本決定。
這個操作可以使用戶在root權限下使用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”這個根據你的版本決定。
這個操作可以使非root用戶使用arm-none-linux-gnueabi-
然後:
source /etc/bash.bashrc
立即生效

(5)arm-none-linux-gnueabi-gcc -v
打印出交叉編譯器版本信息,證明設置系統環境成功。


2.編譯U-Boot

(1)在/home/ds下建立新文件夾build(可以用mkdir build,也可以手動添加),cd 到build文件夾

(2)從網上下載“u-boot-xlnx-xilinx-v2015.1.zip”,解壓到build文件夾裏,並cd 到u-boot-xlnx-xilinx-v2015.1。(此時路徑爲“/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)用於製作最後啓動的Boot文件。
cp u-boot u-boot.elf //複製一下

然後參照:http://blog.csdn.net/xiabodan/article/details/23379645 或者陸佳華老師的《嵌入式系統軟硬件協同設計實戰指南》第九章,生成boot.bin文件。


3.編譯uImage

(1)在網上下載:“ 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時缺少這個庫文件

(3)編譯出來的目標是針對ARM體系結構的。因爲是針對ARM體系結構,所以需要使用交叉編譯器。
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.創建設備樹

(1)(注意這是linux-xlnx/arch/arm/boot/dts/目錄下存在的dts文件纔可以生成dtb文件,以下以zedboard爲例)在Linux源代碼目錄下(我的是“/home/ds/build/linux-xlnx-xilinx-v2015.1”), 編譯目標爲”dtbs”時會把所有的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

或者用設備樹編譯器對dts文件進行編譯生成:
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文件,因此只能用別的方法,這裏介紹是爲了給用其他開發板的讀者帶來方便

(2)從步驟六可以下載到microzed_7010_7020_petalinux_SD_images ,裏面有devicetree_microzed_2014_4.dts,可以生成。
也可以用Vivado創建一個Microzed的項目生成比特流後導入到SDK,File—>New—>Board Support Package—>Board Support Package OS : device-tree—>Finish命令—->在彈出的Setting對話框中,設置bootargs的Value值爲:console=ttyPS0,115200 root= /dev/ram/ rw earlyprintk—>在console device的Value下拉菜單中選擇ps7_uart_1,單擊OK按鈕。(這裏的bootargs參數是內核的命令行參數,在內核啓動階段,這些參數被傳遞給內核。這裏root= /dev/ram 指的是內核從內存啓動文件系統,U-boot將uramdisk.image.gz加載到內存後將其內存地址傳遞給內核,內核就知道該從什麼地方運行文件系統了。但是我們知道Zedboard上的內存只有512M,況且uramdisk.image.gz最大隻能到32M,那麼當在構建較大的系統時該怎麼辦呢?解決這一問題有兩種方法,第一個仍然使用uramdisk.image.gz作爲文件系統,然後將需要加載到用戶系統文件放到FAT分區中,當操作系統啓動後,將FAT分區掛載到系統中,然後進行相應的訪問。第二種方法則是將文件系統放到SD卡的EXT分區中就像第一章中啓動linaro_ubuntu桌面系統一樣,這裏唯一需要修改的是將這裏的啓動參數root=/dev/ram改爲root=/dev/mmcblk0p2。)——>編譯結束後,device-tree_bsp_0/ps7_cotexa9_0/libsrc/device-tree_v0_00_x目錄下可以看到xilinx.dts文件生成。這裏的xilinx.dts不是完美的,如果在Zedboard上使用還要根據實際的情況修改,http://github.com/xupsh/configs_patch.git 找到已經修改好的xup_zed.dts,該文件對ethernet的mdio參數進行修改。
cd ~/build/linux-xup
./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb xilinx.dts
當然這個過程可逆,可以將一個.dtb轉換成.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)在http://www.wiki.xilinx.com/Build+and+Modify+a+Rootfs下載arm_ramdisk.image.gz(該網址也有過程)
(2)在build目錄中:mkdir filesys ,cd filesys, 把arm_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)此時文件系統已經掛載到了film_tmp目錄中,你可以到film_tmp目錄中對文件系統進行相應的修改。修改完後將文件系統umount並重新壓縮即可。這裏如果你要製作EXT文件系統,則只需要將SD卡插到PC機中,並將file_tmp文件夾的內容複製到SD卡的EXT分區中即可。
(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

這裏寫圖片描述

下載後,根據你板子的型號來選擇用7010的還是7020的。
也可以從我上傳的位置下載:
http://pan.baidu.com/s/1i50ho4d
或者:
http://download.csdn.net/detail/dengshuai_super/9581778

MicroZed Open Source Linux QSPI Image Tutorial:
http://pan.baidu.com/s/1geVdnrH

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.
http://pan.baidu.com/s/1qXE5PTU

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章