一、組成
ZYNQ上面移植Linux操作系統(tǒng)包括四個部分,uboot,devicetree,kernel,ramdisk.
其中uboot類似于bios,負(fù)責(zé)對設(shè)備進(jìn)行簡單的初始化,devicetree以樹的形式對zynq相連的硬件設(shè)備進(jìn)行描述,kernel是加載的操作系統(tǒng)內(nèi)核,ramdisk是操作系統(tǒng)啟動之后掛載的文件系統(tǒng)。
二、啟動過程
移植操作系統(tǒng)后zynq的啟動過程如下,首先加載bootrom(zynq中自帶,用戶無法修改),然后執(zhí)行fsbl(這個根據(jù)硬件在sdk中創(chuàng)建),然后執(zhí)行uboot,uboot會將kernel、devicetree和ramdisk載入ddr,跳轉(zhuǎn)到內(nèi)核入口處執(zhí)行,這樣linux就啟動了。

對bootrom、fsbl和uboot詳細(xì)描述如下。

三、uboot設(shè)置
uboot可以從xilinx 官方github上面下載,地址是:
通常uboot不需要升級,目前使用的版本為xilinx 2015年底發(fā)布的版本2015.4.不過針對不同的模塊uboot需要進(jìn)行修改,主要修改下面幾個地方。
1、參考時鐘修改
地址位于arch/arm/cpu/armv7/zynq/clk.c
由于ZYNQ設(shè)計大多使用50M參考時鐘,需要更改參考時鐘
# define CONFIG_ZYNQ_PS_CLK_FREQ 33333333UL更改為
# define CONFIG_ZYNQ_PS_CLK_FREQ 50000000UL
2、串口配置修改
地址位于include/configs/zynq_zc70x.h
根據(jù)硬件串口情況進(jìn)行配置
#define CONFIG_ZYNQ_SERIAL_UART1 使用串口1
#define CONFIG_ZYNQ_SERIAL_UART0 使用串口0
如果兩個串口都啟用,一起配置即可。
3、DDR配置修改
地址位于include/configs/zynq_zc70x.h
根據(jù)DDR實際大小地址修改配置參數(shù)
#define CONFIG_SYS_SDRAM_SIZE (1024 * 1024 * 1024) 1GB DDR
#define CONFIG_SYS_SDRAM_SIZE (512 * 1024 * 1024) 512MB DDR
4、PHY地址配置
地址位于include/configs/zynq_zc70x.h
根據(jù)硬件PHY地址進(jìn)行配置,通常硬件會將PHY地址設(shè)置為0
#define CONFIG_ZYNQ_GEM_PHY_ADDR0 0
如果硬件啟用了兩個網(wǎng)卡,則需要設(shè)置兩個PHY的地址
#define CONFIG_ZYNQ_GEM0
#define CONFIG_ZYNQ_GEM_PHY_ADDR0 1
#define CONFIG_ZYNQ_GEM1
#define CONFIG_ZYNQ_GEM_PHY_ADDR1 18
5、啟動方式配置
地址位于include/configs/zynq_common.h
如果使用QSPI flash方式啟動,需要配置QSPI FLASH對應(yīng)地址,如下。
"sf probe 0 0 0 && " /
"sf read 0x3000000 0x400000 ${kernel_size} && " /
"sf read 0x2A00000 0x900000 ${devicetree_size} && " /
"echo Copying ramdisk... && " /
"sf read 0x2000000 0x920000 ${ramdisk_size} && " /
"bootm 0x3000000 0x2000000 0x2A00000/0" /
6、IP地址配置
地址位于include/configs/zynq_common.h
#define CONFIG_IPADDR 192.168.100.12 //uboot啟動時板子的IP地址
#define CONFIG_SERVERIP 192.168.100.6 //uboot啟動時能訪問的遠(yuǎn)程服務(wù)器地址,若采用TFTP加載,需要將本地電腦配置為該地址
7、啟動延遲設(shè)置
地址位于include/configs/zynq_common.h
#define CONFIG_BOOTDELAY 7 /* -1 to Disable autoboot */
Uboot默認(rèn)延遲7s再從QSPI flash中加載操作系統(tǒng),如果設(shè)置為-1表明禁止自動加載
8、初始化設(shè)置
地址位于net/eth.c 和 arch/arm/lib/board.c
Uboot中需要對5396進(jìn)行初始化,同時使用GPIO對PHY或NOR FLASH等進(jìn)行復(fù)位,可以在eth.c中增加代碼
void mygpio_init()
{ }
然后將Mygpio_init()加入到arch/arm/lib/board.c中
9、Uboot編譯
修改完成后,可以使用下列命令編譯產(chǎn)生uboot
進(jìn)入u-boot文件夾
$ make distclean //文件夾清理
$ make zynq_zc70x_config // 載入配置,通常使用zynq_zc70x.h文件

$ make
編譯完成后文件夾下會出現(xiàn)u-boot文件,將其修改為u-boot.elf

四、devicetree設(shè)置
devicetree源文件可以從xilinx官方下載,地址:https://github.com/Xilinx/device-tree-xlnx/releases
不同板子的devicetree可以根據(jù)xilinx sdk生成,操作過程如下。
1、在XILINX SDK中打開板子的ZYNQ工程,在xilinx tools中添加devicetree的源文件地址

2、創(chuàng)建devicetree BSP文件

創(chuàng)建完成后得到文件如下

3、將dtsi,dts文件拷入linux系統(tǒng)下,使用dts工具制作devicetree.dtb文件

4、如果需要修改devicetree文件,可以通過dtc工具轉(zhuǎn)換為可讀文件dts

生成的1.dts可打開,里面能看到zynq端的外設(shè)信息和啟用情況。通常需要修改網(wǎng)卡配置,如下,下例中phy地址為0
ethernet@e000b000 {
compatible = "xlnx,ps7-ethernet-1.00.a";
reg = ;
status = "okay";
interrupt-parent = ;
interrupts = ;
clocks = ;
clock-names = "ref_clk", "aper_clk";
#address-cells = ;
#size-cells = ;
enet-reset = ;
local-mac-address = [00 0a 35 00 00 00];
phy-mode = "rgmii";
phy-handle = ;
xlnx,eth-mode = ;
xlnx,has-mdio = ;
xlnx,ptp-enet-clock = ;
mdio {
#address-cells = ;
#size-cells = ;
phy@0 {
compatible = "marvell,88e1111";
device_type = "ethernet-phy";
reg = ;
linux,phandle = ;
phandle = ;
};
};
};
當(dāng)對dts修改完成后,再次使用dtc工具編譯產(chǎn)生devicetree.dtb即可
五、文件系統(tǒng)設(shè)置
文件系統(tǒng)一般隨zynq開發(fā)板發(fā)布,可以從prebuit中找到文件系統(tǒng)的tar文件

解壓后得到的文件如下

在文件系統(tǒng)中,如果需要添加用戶自定義的shell腳本或可執(zhí)行程序,可以放在/usr/bin目錄下。如果要設(shè)置系統(tǒng)自啟動項,可以在/etc/rc5.d中增加shell腳本。

這里進(jìn)行了IP地址的配置

1、文件系統(tǒng)制作
當(dāng)修改完rootfs后,可以通過下面命令制作uramdisk文件系統(tǒng)
$sh -c 'cd rootfs/ && find . | cpio -H newc -o' | gzip -9 > new_initramfs.cpio.gz
$mkimage -A arm -T ramdisk -C gzip -d new_initramfs.cpio.gz uramdisk.image.gz
執(zhí)行完畢將會得到uramdisk.image.gz
六、內(nèi)核配置
內(nèi)核可以從xilinx官方git下載,地址:
目前l(fā)inux內(nèi)核中已經(jīng)集成了常見的驅(qū)動,驅(qū)動源碼位于drivers文件夾下。針對內(nèi)核的修改位于 arch/arm/configs/xilinx_zynq_defconfig文件中,該文件中定義了內(nèi)核所包含的驅(qū)動程序。
1、調(diào)試輸出打印
在xilinx_zynq_defconfig中,需要根據(jù)硬件設(shè)計正確配置串口打印。
CONFIG_DEBUG_LL=y
CONFIG_DEBUG_ZYNQ_UART0=y //使用串口0打印輸出
CONFIG_EARLY_PRINTK=y
2、內(nèi)核編譯
修改完xilinx_zynq_defconfig后,可以使用下面命令編譯內(nèi)核
$sudo //編譯內(nèi)核需要運行在root權(quán)限下
$make distclean //清理文件
$make ARCH=arm xilinx_zynq_defconfig //讀取內(nèi)核配置信息,即xilinx_zynq_defconfig中的內(nèi)容
$make ARCH=arm menuconfig //進(jìn)入內(nèi)核菜單進(jìn)行可視化配置,如果xilinx_zynq_defconfig中對內(nèi)核配置準(zhǔn)確時,該步驟可以省略
$make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage -j4 //編譯產(chǎn)生uImage
產(chǎn)生的文件位于arch/arm/boot文件夾內(nèi)


在內(nèi)核中添加1848的驅(qū)動

編譯內(nèi)核的時候加入該驅(qū)動,同時修改makefile和kconfig文件

這樣在編譯內(nèi)核的時候就能看到將驅(qū)動編進(jìn)內(nèi)核的選項了。


編譯完內(nèi)核后,啟動時就能看到1848的從設(shè)備


內(nèi)核中啟用ADC驅(qū)動



系統(tǒng)啟動后就能看到輸出了,這里輸出的是溫度值


實際溫度還需要進(jìn)行換算,結(jié)果如下

3、NOR FLASH驅(qū)動
NOR FLAHS驅(qū)動主要實現(xiàn)文件系統(tǒng)的掛載,這里不需要設(shè)置devicetree,只需要在內(nèi)核中添加掛載文件系統(tǒng)的代碼

上圖中將NOR FALSH分為2個區(qū),大小分別為32MB和64MB,需要注意的是NOR FLASH的起始地址和容量大小設(shè)置
#defineWINDOW_ADDR 0x80000000 //和vivado里面的emc起始地址一致
#defineWINDOW_SIZE 0x8000000 //nor flash大小
在makefile中將該驅(qū)動編譯進(jìn)內(nèi)核即可

啟動后就能看到掛載的文件系統(tǒng)了

4、外部中斷驅(qū)動
當(dāng)zynq接收來自外部的GPIO中斷時,需要使用UIO機制及時響應(yīng)中斷,首先在devicetree中模擬出四個GPIO設(shè)備

注意上面的中斷號0x1e-0x21要與硬件實際相連的中斷管腳一致。
同時在devicetree中啟用UIO機制

在編譯內(nèi)核時將UIO驅(qū)動編譯進(jìn)內(nèi)核

當(dāng)操作系統(tǒng)啟動完成后就能看到四個外部GPIO設(shè)備產(chǎn)生的中斷了

八、啟動文件制作
如下圖所示,在SDK中創(chuàng)建boot.bin需要包含下面五個文件
Fsbl.elf
Zynq_top.bin
u-boot.elf
uImage
devicetree.dtb
uramdisk.image.gz
制作過程中需要正確配置uimage,devicetree.dtb,uramdisk.image.gz的地址,讓其與u-boot中從QSPI flash加載地址匹配



制作完成后將boot.bin通過下載電纜燒入QSPI FLASH中即可。
編輯:hfy
-
Linux
+關(guān)注
關(guān)注
88文章
11763瀏覽量
219091 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7402瀏覽量
129343 -
Zynq
+關(guān)注
關(guān)注
10文章
630瀏覽量
49468
發(fā)布評論請先 登錄
操作系統(tǒng)體系結(jié)構(gòu)
操作系統(tǒng)運行機制
Linux 已夠強,國產(chǎn)操作系統(tǒng)為何仍要堅持?
什么是嵌入式操作系統(tǒng)?
單片機的操作系統(tǒng)
移植蜂鳥需要在Linux環(huán)境下嗎?
Jtti Linux操作系統(tǒng)最常見的10大優(yōu)勢
華為工程師總結(jié)Linux筆記
求助,關(guān)于stellar studio環(huán)境配置后無法編譯例程的問題求解
stellar studio按照說明文檔進(jìn)行編譯器環(huán)境配置,為什么會報錯?
求助,關(guān)于stellar studio環(huán)境配置后無法編譯例程的問題求解
鴻道Intewell操作系統(tǒng):人形機器人底層操作系統(tǒng)
PLC產(chǎn)品故障問題測試的四個部分
ZYNQ Linux操作系統(tǒng)移植四個部分說明文檔
評論