一、組成
ZYNQ上面移植Linux操作系統(tǒng)包括四個(gè)部分,uboot,devicetree,kernel,ramdisk.
其中uboot類似于bios,負(fù)責(zé)對(duì)設(shè)備進(jìn)行簡(jiǎn)單的初始化,devicetree以樹(shù)的形式對(duì)zynq相連的硬件設(shè)備進(jìn)行描述,kernel是加載的操作系統(tǒng)內(nèi)核,ramdisk是操作系統(tǒng)啟動(dòng)之后掛載的文件系統(tǒng)。
二、啟動(dòng)過(guò)程
移植操作系統(tǒng)后zynq的啟動(dòng)過(guò)程如下,首先加載bootrom(zynq中自帶,用戶無(wú)法修改),然后執(zhí)行fsbl(這個(gè)根據(jù)硬件在sdk中創(chuàng)建),然后執(zhí)行uboot,uboot會(huì)將kernel、devicetree和ramdisk載入ddr,跳轉(zhuǎn)到內(nèi)核入口處執(zhí)行,這樣linux就啟動(dòng)了。
對(duì)bootrom、fsbl和uboot詳細(xì)描述如下。
三、uboot設(shè)置
uboot可以從xilinx 官方github上面下載,地址是:
通常uboot不需要升級(jí),目前使用的版本為xilinx 2015年底發(fā)布的版本2015.4.不過(guò)針對(duì)不同的模塊uboot需要進(jìn)行修改,主要修改下面幾個(gè)地方。
1、參考時(shí)鐘修改
地址位于arch/arm/cpu/armv7/zynq/clk.c
由于ZYNQ設(shè)計(jì)大多使用50M參考時(shí)鐘,需要更改參考時(shí)鐘
# 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
如果兩個(gè)串口都啟用,一起配置即可。
3、DDR配置修改
地址位于include/configs/zynq_zc70x.h
根據(jù)DDR實(shí)際大小地址修改配置參數(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)行配置,通常硬件會(huì)將PHY地址設(shè)置為0
#define CONFIG_ZYNQ_GEM_PHY_ADDR0 0
如果硬件啟用了兩個(gè)網(wǎng)卡,則需要設(shè)置兩個(gè)PHY的地址
#define CONFIG_ZYNQ_GEM0
#define CONFIG_ZYNQ_GEM_PHY_ADDR0 1
#define CONFIG_ZYNQ_GEM1
#define CONFIG_ZYNQ_GEM_PHY_ADDR1 18
5、啟動(dòng)方式配置
地址位于include/configs/zynq_common.h
如果使用QSPI flash方式啟動(dòng),需要配置QSPI FLASH對(duì)應(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啟動(dòng)時(shí)板子的IP地址
#define CONFIG_SERVERIP 192.168.100.6 //uboot啟動(dòng)時(shí)能訪問(wèn)的遠(yuǎn)程服務(wù)器地址,若采用TFTP加載,需要將本地電腦配置為該地址
7、啟動(dòng)延遲設(shè)置
地址位于include/configs/zynq_common.h
#define CONFIG_BOOTDELAY 7 /* -1 to Disable autoboot */
Uboot默認(rèn)延遲7s再?gòu)腝SPI flash中加載操作系統(tǒng),如果設(shè)置為-1表明禁止自動(dòng)加載
8、初始化設(shè)置
地址位于net/eth.c 和 arch/arm/lib/board.c
Uboot中需要對(duì)5396進(jìn)行初始化,同時(shí)使用GPIO對(duì)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
編譯完成后文件夾下會(huì)出現(xiàn)u-boot文件,將其修改為u-boot.elf
四、devicetree設(shè)置
devicetree源文件可以從xilinx官方下載,地址:https://github.com/Xilinx/device-tree-xlnx/releases
不同板子的devicetree可以根據(jù)xilinx sdk生成,操作過(guò)程如下。
1、在XILINX SDK中打開(kāi)板子的ZYNQ工程,在xilinx tools中添加devicetree的源文件地址
2、創(chuàng)建devicetree BSP文件
創(chuàng)建完成后得到文件如下
3、將dtsi,dts文件拷入linux系統(tǒng)下,使用dts工具制作devicetree.dtb文件
4、如果需要修改devicetree文件,可以通過(guò)dtc工具轉(zhuǎn)換為可讀文件dts
生成的1.dts可打開(kāi),里面能看到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)對(duì)dts修改完成后,再次使用dtc工具編譯產(chǎn)生devicetree.dtb即可
五、文件系統(tǒng)設(shè)置
文件系統(tǒng)一般隨zynq開(kāi)發(fā)板發(fā)布,可以從prebuit中找到文件系統(tǒng)的tar文件
解壓后得到的文件如下
在文件系統(tǒng)中,如果需要添加用戶自定義的shell腳本或可執(zhí)行程序,可以放在/usr/bin目錄下。如果要設(shè)置系統(tǒng)自啟動(dòng)項(xiàng),可以在/etc/rc5.d中增加shell腳本。
這里進(jìn)行了IP地址的配置
1、文件系統(tǒng)制作
當(dāng)修改完rootfs后,可以通過(guò)下面命令制作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í)行完畢將會(huì)得到uramdisk.image.gz
六、內(nèi)核配置
內(nèi)核可以從xilinx官方git下載,地址:
目前l(fā)inux內(nèi)核中已經(jīng)集成了常見(jiàn)的驅(qū)動(dòng),驅(qū)動(dòng)源碼位于drivers文件夾下。針對(duì)內(nèi)核的修改位于 arch/arm/configs/xilinx_zynq_defconfig文件中,該文件中定義了內(nèi)核所包含的驅(qū)動(dòng)程序。
1、調(diào)試輸出打印
在xilinx_zynq_defconfig中,需要根據(jù)硬件設(shè)計(jì)正確配置串口打印。
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)核需要運(yùn)行在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中對(duì)內(nèi)核配置準(zhǔn)確時(shí),該步驟可以省略
$make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage -j4 //編譯產(chǎn)生uImage
產(chǎn)生的文件位于arch/arm/boot文件夾內(nèi)
七、常見(jiàn)驅(qū)動(dòng)
1、I2C驅(qū)動(dòng)
目前板子上都會(huì)用到I2C,首先需要知道I2C從設(shè)備的地址,如2/4/8這些.在devicetree中進(jìn)行設(shè)置
在內(nèi)核中添加1848的驅(qū)動(dòng)
編譯內(nèi)核的時(shí)候加入該驅(qū)動(dòng),同時(shí)修改makefile和kconfig文件
這樣在編譯內(nèi)核的時(shí)候就能看到將驅(qū)動(dòng)編進(jìn)內(nèi)核的選項(xiàng)了。
編譯完內(nèi)核后,啟動(dòng)時(shí)就能看到1848的從設(shè)備
2、ADC驅(qū)動(dòng)
ADC為ZYNQ用來(lái)監(jiān)測(cè)電壓或電流的通道,目前ZYNQ中集成了16個(gè)通道,首先需要在devicetree中設(shè)置啟用的通道,圖中啟用的是0,1,8三個(gè)通道
內(nèi)核中啟用ADC驅(qū)動(dòng)
系統(tǒng)啟動(dòng)后就能看到輸出了,這里輸出的是溫度值
實(shí)際溫度還需要進(jìn)行換算,結(jié)果如下
3、NOR FLASH驅(qū)動(dòng)
NOR FLAHS驅(qū)動(dòng)主要實(shí)現(xiàn)文件系統(tǒng)的掛載,這里不需要設(shè)置devicetree,只需要在內(nèi)核中添加掛載文件系統(tǒng)的代碼
上圖中將NOR FALSH分為2個(gè)區(qū),大小分別為32MB和64MB,需要注意的是NOR FLASH的起始地址和容量大小設(shè)置
#defineWINDOW_ADDR 0x80000000 //和vivado里面的emc起始地址一致
#defineWINDOW_SIZE 0x8000000 //nor flash大小
在makefile中將該驅(qū)動(dòng)編譯進(jìn)內(nèi)核即可
啟動(dòng)后就能看到掛載的文件系統(tǒng)了
4、外部中斷驅(qū)動(dòng)
當(dāng)zynq接收來(lái)自外部的GPIO中斷時(shí),需要使用UIO機(jī)制及時(shí)響應(yīng)中斷,首先在devicetree中模擬出四個(gè)GPIO設(shè)備
注意上面的中斷號(hào)0x1e-0x21要與硬件實(shí)際相連的中斷管腳一致。
同時(shí)在devicetree中啟用UIO機(jī)制
在編譯內(nèi)核時(shí)將UIO驅(qū)動(dòng)編譯進(jìn)內(nèi)核
當(dāng)操作系統(tǒng)啟動(dòng)完成后就能看到四個(gè)外部GPIO設(shè)備產(chǎn)生的中斷了
八、啟動(dòng)文件制作
如下圖所示,在SDK中創(chuàng)建boot.bin需要包含下面五個(gè)文件
Fsbl.elf
Zynq_top.bin
u-boot.elf
uImage
devicetree.dtb
uramdisk.image.gz
制作過(guò)程中需要正確配置uimage,devicetree.dtb,uramdisk.image.gz的地址,讓其與u-boot中從QSPI flash加載地址匹配
制作完成后將boot.bin通過(guò)下載電纜燒入QSPI FLASH中即可。
編輯:hfy
-
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209970 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6862瀏覽量
123507 -
Zynq
+關(guān)注
關(guān)注
10文章
610瀏覽量
47228
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論