ZYNQ Linux操作系统移植四个部分说明文档

一、组成
zynq上面移植linux操作系统包括四个部分,uboot,devicetree,kernel,ramdisk.
其中uboot类似于bios,负责对设备进行简单的初始化,devicetree以树的形式对zynq相连的硬件设备进行描述,kernel是加载的操作系统内核,ramdisk是操作系统启动之后挂载的文件系统。
二、启动过程
移植操作系统后zynq的启动过程如下,首先加载bootrom(zynq中自带,用户无法修改),然后执行fsbl(这个根据硬件在sdk中创建),然后执行uboot,uboot会将kernel、devicetree和ramdisk载入ddr,跳转到内核入口处执行,这样linux就启动了。
对bootrom、fsbl和uboot详细描述如下。
三、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文件
$ make
编译完成后文件夹下会出现u-boot文件,将其修改为u-boot.elf
四、devicetree设置
devicetree源文件可以从xilinx官方下载,地址:https://github.com/xilinx/device-tree-xlnx/releases
不同板子的devicetree可以根据xilinx sdk生成,操作过程如下。
1、在xilinx sdk中打开板子的zynq工程,在xilinx tools中添加devicetree的源文件地址
2、创建devicetree bsp文件
创建完成后得到文件如下
3、将dtsi,dts文件拷入linux系统下,使用dts工具制作devicetree.dtb文件
4、如果需要修改devicetree文件,可以通过dtc工具转换为可读文件dts
生成的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文件
解压后得到的文件如下
在文件系统中,如果需要添加用户自定义的shell脚本或可执行程序,可以放在/usr/bin目录下。如果要设置系统自启动项,可以在/etc/rc5.d中增加shell脚本。
这里进行了ip地址的配置
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文件夹内
七、常见驱动
1、i2c驱动
目前板子上都会用到i2c,首先需要知道i2c从设备的地址,如2/4/8这些.在devicetree中进行设置
在内核中添加1848的驱动
编译内核的时候加入该驱动,同时修改makefile和kconfig文件
这样在编译内核的时候就能看到将驱动编进内核的选项了。
编译完内核后,启动时就能看到1848的从设备
2、adc驱动
adc为zynq用来监测电压或电流的通道,目前zynq中集成了16个通道,首先需要在devicetree中设置启用的通道,图中启用的是0,1,8三个通道
内核中启用adc驱动
系统启动后就能看到输出了,这里输出的是温度值
实际温度还需要进行换算,结果如下
3、nor flash驱动
nor flahs驱动主要实现文件系统的挂载,这里不需要设置devicetree,只需要在内核中添加挂载文件系统的代码
上图中将nor falsh分为2个区,大小分别为32mb和64mb,需要注意的是nor flash的起始地址和容量大小设置
#definewindow_addr 0x80000000 //和vivado里面的emc起始地址一致
#definewindow_size 0x8000000 //nor flash大小
在makefile中将该驱动编译进内核即可
启动后就能看到挂载的文件系统了
4、外部中断驱动
当zynq接收来自外部的gpio中断时,需要使用uio机制及时响应中断,首先在devicetree中模拟出四个gpio设备
注意上面的中断号0x1e-0x21要与硬件实际相连的中断管脚一致。
同时在devicetree中启用uio机制
在编译内核时将uio驱动编译进内核
当操作系统启动完成后就能看到四个外部gpio设备产生的中断了
八、启动文件制作
如下图所示,在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加载地址匹配
制作完成后将boot.bin通过下载电缆烧入qspi flash中即可。


低压配电柜保养的标准和注意事项
人机界面报警信息的设置方法
电力系统储能规模大,为电池发展提供广阔市场
实现人工智能战略性遗忘的三个方法
光同步数字传输系统及视频传输的技术分析
ZYNQ Linux操作系统移植四个部分说明文档
自动木炉温控器的制作
三星的双模5G集成式芯片将改变市场的格局
榜单总金额4200万元!北京市面向全国开展车规级芯片揭榜挂帅
魅族18系列5G新机即将发布
5G究竟有什么用5G现在已经应用在什么项目上了
VR将成为前所未有的有前景的技术
ATMEL AT89S52 + RFM70怎样用于无线数据传输
国科微新一代E21C-Y系列固态硬盘产品全面上市
2020年一季度江苏省半导体产业发展运行分析报告
简易散热台制作 可用作胶枪架及烙铁架
华为P10消息再一次坐实, 华为P10Plus将实现曲面屏?
“双升级”从何处着力?5G被寄予广泛期待
Vishay新款高温NTC热敏电阻适合应用于汽车快速、高精度温度检测
亚马逊推出云计算专用芯片支持NVMe固态硬盘