当前位置:   article > 正文

zedboard移植linux内核,ZYNQ Linux操作系统移植说明文档

zynq 中kernel 指的是什么

一、组成

ZYNQ上面移植Linux操作系统包括四个部分,uboot,devicetree,kernel,ramdisk.

其中uboot类似于bios,负责对设备进行简单的初始化,devicetree以树的形式对zynq相连的硬件设备进行描述,kernel是加载的操作系统内核,ramdisk是操作系统启动之后挂载的文件系统。7045469b0c700cea60a0d682e70fb44e.png

二、启动过程

移植操作系统后zynq的启动过程如下,首先加载bootrom(zynq中自带,用户无法修改),然后执行fsbl(这个根据硬件在sdk中创建),然后执行uboot,uboot会将kernel、devicetree和ramdisk载入ddr,跳转到内核入口处执行,这样linux就启动了。ae76e926b307445a1fc1249efeaea056.png

对bootrom、fsbl和uboot详细描述如下。64224ed41b120992be09de25a015da4d.png

三、uboot设置

uboot可以从xilinx 官方github上面下载,地址是:

通常uboot不需要升级,目前使用的版本为xilinx 2015年底发布的版本2015.4.不过针对不同的模块uboot需要进行修改,主要修改下面几个地方。

1、参考时钟修改

地址位于arch\arm\cpu\armv7\zynq\clk.c

由于ZYNQ设计大多使用50M参考时钟,需要更改参考时钟

# define CONFIG_ZYNQ_PS_CLK_FREQ  33333333UL更改为

# define CONFIG_ZYNQ_PS_CLK_FREQ  50000000UL

2、串口配置修改

地址位于include\configs\zynq_zc70x.h

根据硬件串口情况进行配置

#define CONFIG_ZYNQ_SERIAL_UART1 使用串口1

#define CONFIG_ZYNQ_SERIAL_UART0 使用串口0

如果两个串口都启用,一起配置即可。

3、DDR配置修改

地址位于include\configs\zynq_zc70x.h

根据DDR实际大小地址修改配置参数

#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

根据硬件PHY地址进行配置,通常硬件会将PHY地址设置为0

#define CONFIG_ZYNQ_GEM_PHY_ADDR0   0

如果硬件启用了两个网卡,则需要设置两个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对应地址,如下。

"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启动时能访问的远程服务器地址,若采用TFTP加载,需要将本地电脑配置为该地址

7、启动延迟设置

地址位于include\configs\zynq_common.h

#define CONFIG_BOOTDELAY          7 /* -1 to Disable autoboot */

Uboot默认延迟7s再从QSPI flash中加载操作系统,如果设置为-1表明禁止自动加载

8、初始化设置

地址位于net\eth.c  和 arch\arm\lib\board.c

Uboot中需要对5396进行初始化,同时使用GPIO对PHY或NOR FLASH等进行复位,可以在eth.c中增加代码

void mygpio_init()

{    }

然后将Mygpio_init()加入到arch\arm\lib\board.c中

9、Uboot编译

修改完成后,可以使用下列命令编译产生uboot

进入u-boot文件夹

$ make distclean  //文件夹清理

$ make zynq_zc70x_config // 载入配置,通常使用zynq_zc70x.h文件e8d1279fc0c7ae2ed0e3f5d491edd853.png

$ make

编译完成后文件夹下会出现u-boot文件,将其修改为u-boot.elf28e9f8ce1bd61841a1b71f2b51e17d47.png

不同板子的devicetree可以根据xilinx sdk生成,操作过程如下。

1、在XILINX SDK中打开板子的ZYNQ工程,在xilinx tools中添加devicetree的源文件地址6fee2155f5945a2ace3a324a6e895aea.png

2、创建devicetree BSP文件bdfb43422a70bae7c1612323c146f7d8.png

创建完成后得到文件如下ea4be18790720643e8ab697c6cea5cf1.png

3、将dtsi,dts文件拷入linux系统下,使用dts工具制作devicetree.dtb文件f5762df9bbc391b6e59acb9bc81a7ee6.png

4、如果需要修改devicetree文件,可以通过dtc工具转换为可读文件dtsbca6c711bd72f7e656641218dbb50e93.png

生成的1.dts可打开,里面能看到zynq端的外设信息和启用情况。通常需要修改网卡配置,如下,下例中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 = ;

};

};

};

当对dts修改完成后,再次使用dtc工具编译产生devicetree.dtb即可

五、文件系统设置

文件系统一般随zynq开发板发布,可以从prebuit中找到文件系统的tar文件ccb5d0baf2b99208e8d65ca2a99aad6f.png

解压后得到的文件如下d26c47787d6aed02b826469f60111442.png

在文件系统中,如果需要添加用户自定义的shell脚本或可执行程序,可以放在/usr/bin目录下。如果要设置系统自启动项,可以在/etc/rc5.d中增加shell脚本。ccad4010d01cfdc936ba691829c46110.png

这里进行了IP地址的配置71bd6bff972fbab3e3ff93b1abd478ce.png

1、文件系统制作

当修改完rootfs后,可以通过下面命令制作uramdisk文件系统

$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

执行完毕将会得到uramdisk.image.gz

六、内核配置

内核可以从xilinx官方git下载,地址:

目前linux内核中已经集成了常见的驱动,驱动源码位于drivers文件夹下。针对内核的修改位于 arch\arm\configs\xilinx_zynq_defconfig文件中,该文件中定义了内核所包含的驱动程序。

1、调试输出打印

在xilinx_zynq_defconfig中,需要根据硬件设计正确配置串口打印。

CONFIG_DEBUG_LL=y

CONFIG_DEBUG_ZYNQ_UART0=y //使用串口0打印输出

CONFIG_EARLY_PRINTK=y

2、内核编译

修改完xilinx_zynq_defconfig后,可以使用下面命令编译内核

$sudo //编译内核需要运行在root权限下

$make distclean //清理文件

$make ARCH=arm xilinx_zynq_defconfig //读取内核配置信息,即xilinx_zynq_defconfig中的内容

$make ARCH=arm menuconfig //进入内核菜单进行可视化配置,如果xilinx_zynq_defconfig中对内核配置准确时,该步骤可以省略

$make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage -j4 //编译产生uImage

产生的文件位于arch\arm\boot文件夹内eadd3b48bd22782511b69067365d797a.png

七、常见驱动

1、I2C驱动

目前板子上都会用到I2C,首先需要知道I2C从设备的地址,如2\4\8这些.在devicetree中进行设置5ca960828bffbcad62d5d7f141b81c26.png

在内核中添加1848的驱动41cd3cde6bf127b6bb00c7f1041556ce.png

编译内核的时候加入该驱动,同时修改makefile和kconfig文件370534621f4230bedc8847dce152ab1d.png

这样在编译内核的时候就能看到将驱动编进内核的选项了。2a9580f307fb98622a984a298d89a4e2.png

6dc7ad1b4ef1dc11c7acdb93915452f4.png

编译完内核后,启动时就能看到1848的从设备d106c76df25145bec84982b32fa427ba.png

2、ADC驱动

ADC为ZYNQ用来监测电压或电流的通道,目前ZYNQ中集成了16个通道,首先需要在devicetree中设置启用的通道,图中启用的是0,1,8三个通道37f3a303f43773a1a402472885d1017a.png

内核中启用ADC驱动16717de746bb92a7ea54f32b10514fcf.png

7fdb5472fbd18c9f6f22f995c8dbafbd.png

9ce1c065c407aef49e42f1d8064e4415.png

系统启动后就能看到输出了,这里输出的是温度值8db32d56e8f7522cf48a631ef1eb55fb.png

faf0dfef3fd50776c2e9437af92cfe1b.png

实际温度还需要进行换算,结果如下b40aea05a3044d4e1f02763636e5fd06.png

3、NOR FLASH驱动

NOR FLAHS驱动主要实现文件系统的挂载,这里不需要设置devicetree,只需要在内核中添加挂载文件系统的代码135948adacd861f2ccd51997b5422e2a.png

上图中将NOR FALSH分为2个区,大小分别为32MB和64MB,需要注意的是NOR FLASH的起始地址和容量大小设置

#defineWINDOW_ADDR 0x80000000 //和vivado里面的emc起始地址一致

#defineWINDOW_SIZE 0x8000000 //nor flash大小

在makefile中将该驱动编译进内核即可fd674460351eb4b87745554a7c0aae97.png

启动后就能看到挂载的文件系统了a19331c759006805d1e9b6833dcbd5a3.png

4、外部中断驱动

当zynq接收来自外部的GPIO中断时,需要使用UIO机制及时响应中断,首先在devicetree中模拟出四个GPIO设备1550b96817d6d310078fb9c83145c67c.png

注意上面的中断号0x1e-0x21要与硬件实际相连的中断管脚一致。

同时在devicetree中启用UIO机制a65ecee60d6ead1e13d7c7a3b1895ec4.png

在编译内核时将UIO驱动编译进内核650402dadf785796a2d490f82e4303be.png

当操作系统启动完成后就能看到四个外部GPIO设备产生的中断了372ae9adcb8b50b7eda41b0e7c79fa0e.png

八、启动文件制作

如下图所示,在SDK中创建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加载地址匹配f8341ea52c3050e64454e07afee788de.png

438e762cb56647cd31ad0458bc5f613f.png

803ab2d57c8a2e53519b89b5f399c263.png

制作完成后将boot.bin通过下载电缆烧入QSPI FLASH中即可。

文章来源:Felven的博客

*本文由作者授权转发,如需转载请联系作者本人

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/81736
推荐阅读
相关标签
  

闽ICP备14008679号