0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子设计 来源:Felven的博客 作者:Felven的博客 2020-12-14 14:59 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

o4YBAF9uELeAVxYlAACA6TM13kY883.png

对bootrom、fsbl和uboot详细描述如下。

o4YBAF9uELuABxXtAAQSHlX-gg8443.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文件

pIYBAF9uEL6AMFBQAALA61J4tLc224.png

$ make

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

pIYBAF9uEMGAVTaHAAEUBK1PLhE618.png

四、devicetree设置
devicetree源文件可以从xilinx官方下载,地址:https://github.com/Xilinx/device-tree-xlnx/releases

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

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

o4YBAF9uEMKAd6XkAAD_9qCZ7T0945.png

2、创建devicetree BSP文件

o4YBAF9uEMWAa6t6AAGDcllJTKE440.png

创建完成后得到文件如下

pIYBAF9uEMiACjpUAAJ1w0Kz-40516.png

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

o4YBAF9uEMqAG0PrAACzS2-9Wm4844.png

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

pIYBAF9uEMyAFFBeAAD4aKdvEPw344.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文件

o4YBAF9uENGAdTbqAANeO7N49Ds478.png

解压后得到的文件如下

o4YBAF9uENKAaN0UAAB4NNelZFk463.png

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

pIYBAF9uENSAcBMKAAEaKMBjqkE746.png

这里进行了IP地址的配置

o4YBAF9uENeAbdCcAAImwuHNbn0338.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文件夹内

pIYBAF9uENmAV0RkAACFVqGhqHM345.png

七、常见驱动
1、I2C驱动
目前板子上都会用到I2C,首先需要知道I2C从设备的地址,如2/4/8这些.在devicetree中进行设置

pIYBAF9uENuAGShtAAFJWxUxz6M774.png

在内核中添加1848的驱动

o4YBAF9uEN2AFbyuAADO0KtUlZM540.png

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

pIYBAF9uEN-AKuG6AAGcZ2UjQwE993.png

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

pIYBAF9uEOGAXXKOAAEK6FT4Fow752.png


o4YBAF9uEOOAQ4COAACr1JAXrW0025.png

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

pIYBAF9uEOWAZDR_AAGCWbxSXJY608.png

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

o4YBAF9uEOeAdkVvAACePOBUXc0956.png

内核中启用ADC驱动

o4YBAF9uEOqALkYuAALM8Wgyf4A920.png


pIYBAF9uEO6AXrTEAAMBiRFhPxo365.png


o4YBAF9uEPGAaSz7AANXI02i7CY601.png

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

o4YBAF9uEPaAHSDgAAQdG9ZhonQ882.png


pIYBAF9uEPiAd_iDAAGNdVMKyk4343.png

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

o4YBAF9uEPyAMSGCAANgyEvE1UQ029.png

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

pIYBAF9uEP-AAG3pAAH3lfykgbw288.png

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

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

#defineWINDOW_SIZE 0x8000000 //nor flash大小

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

o4YBAF9uEQGAOZtOAACRtPBXfVg765.png

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

pIYBAF9uEQOAGBC4AAG4TWrQZhs322.png

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

o4YBAF9uEQaADY5IAAJODkPcmHg981.png

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

同时在devicetree中启用UIO机制

o4YBAF9uEQeAHuLQAACje5Q-BBs547.png

在编译内核时将UIO驱动编译进内核

pIYBAF9uEQmAXjB-AAESSskar1E386.png

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

pIYBAF9uEQ6ANu9GAAQIdcAuZOA931.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加载地址匹配

pIYBAF9uEROALacYAAS3fSaHpCI455.png


pIYBAF9uERaAU2V8AANG7gbqJ-g675.png


o4YBAF9uERuADv8pAAPaaMcltz0247.png

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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    218010
  • 操作系统
    +关注

    关注

    37

    文章

    7329

    浏览量

    128651
  • Zynq
    +关注

    关注

    10

    文章

    625

    浏览量

    49243
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是嵌入式操作系统

    要理解嵌入式操作系统(Embedded Operating System,简称 RTOS/EOS),我们可以从本质定义→核心区别→实际作用→典型特征→嵌入式开发场景适配,五维度来拆解, 一
    发表于 12-09 10:33

    单片机的操作系统

    Linux网络协议栈和文件系统(如JFFS2),但实时性较弱,需外扩存储器。 ‌ ‌ VxWorks ‌:高效实时操作系统,广泛应用于通信、军事等领域,支持自定义硬件模块。 ‌ 其他选择 ‌ Keil
    发表于 11-14 06:18

    移植蜂鸟需要在Linux环境下吗?

    《手把手教你设计CPU》书上运行Verilog仿真测试那章说为了重现仿真环境,最好在Linux环境下。不知道移植蜂鸟是否需要在Linux环境下,直接在Windows操作系统可否
    发表于 11-10 07:42

    Jtti Linux操作系统最常见的10大优势

    Linux操作系统的十大优势 Linux操作系统作为一种开源、自由的系统,已经广泛应用于个人计算机、服务器、嵌入式设备等多个领域。它的多样化
    的头像 发表于 11-06 15:32 129次阅读

    求助,关于stellar studio环境配置后无法编译例程的问题求解

    已经是按照说明文档进行编译器环境配置,但是还是会报错,问题大概可能是文件系统操作错误,无法访问打开文件,看样子像系统问题,但是其他同学有和我系统
    发表于 06-16 08:08

    stellar studio按照说明文档进行编译器环境配置,为什么会报错?

    已经是按照说明文档进行编译器环境配置,但是还是会报错,问题大概可能是文件系统操作错误,无法访问打开文件,看样子像系统问题,但是其他同学有和我系统
    发表于 06-12 07:49

    求助,关于stellar studio环境配置后无法编译例程的问题求解

    已经是按照说明文档进行编译器环境配置,但是还是会报错,问题大概可能是文件系统操作错误,无法访问打开文件,看样子像系统问题,但是其他同学有和我系统
    发表于 06-11 06:27

    PLC产品故障问题测试的四个部分

    ,必须对故障问题进行系统化测试。本文将详细介绍PLC产品故障问题测试的四个关键部分,帮助技术人员快速定位和解决问题。 一、硬件测试 硬件测试是PLC故障诊断的首要环节,主要针对PLC设备的物理部件进行检查。首先,需要检查电源模块
    的头像 发表于 05-11 17:00 1160次阅读
    PLC产品故障问题测试的<b class='flag-5'>四个</b><b class='flag-5'>部分</b>

    在cypress 3014进行多种分辨率刷新率切换的操作,是否可行?

    我想在cypress 3014进行多种分辨率刷新率切换的操作,不知道是否可行,有无相关demo或者说明文档可提供
    发表于 05-09 08:25

    从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

    启动卡,SD启动卡的制作方法,可以参考《领航者ZYNQ之嵌入式Linux开发指南》第六章Petalinux设计流程实战中的制作SD启动卡小节。这里不再赘述!将上一节编译得到的四个镜像文件拷贝到SD启动
    发表于 03-20 16:48

    鸿道Intewell操作系统Linux实时拓展方案

    鸿道Intewell操作系统是科东软件自主研发的新型工业实时操作系统,历经30多年研发积累,采用业界领先的微内核架构,具备高实时、高安全及强扩展的特性,是目前国内唯一通过汽车、工业控制、医疗仪器、轨道交通项功能安全认证的
    的头像 发表于 02-27 10:08 624次阅读
    鸿道Intewell<b class='flag-5'>操作系统</b>的<b class='flag-5'>Linux</b>实时拓展方案

    服务器数据恢复—linux操作系统云服务器数据恢复案例

    某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上
    的头像 发表于 02-10 18:00 619次阅读
    服务器数据恢复—<b class='flag-5'>linux</b><b class='flag-5'>操作系统</b>云服务器数据恢复案例

    【「鸿蒙操作系统设计原理与架构」阅读体验】-前章阅读有感

    有关文档介绍也是比较繁杂,而本书从一整体的系统性的角度描述了鸿蒙操作系统,从第1章读到第4章的整个感觉浑然天成,特别是在 HarmonyOS LiteOS_M 内核
    发表于 01-31 11:33

    云服务器选择什么操作系统好?

    云服务器选择什么操作系统好?选择云服务器操作系统需考虑业务需求、兼容性、安全性、易用性及成本。Linux系统如CentOS、Ubuntu和Debian因稳定、免费且社区支持强大而受欢迎
    的头像 发表于 01-21 10:56 746次阅读

    deepin操作系统介绍

    希望从自己的能力和对桌面操作系统的理解,能给 Linux 的用户与开发者更多的选择。我们也相信 deepin 能够得到更多用户的认可与喜爱,成为开源世界的最佳选择。  一、 deepin 操作系统 先说
    的头像 发表于 12-23 09:08 3233次阅读
    deepin<b class='flag-5'>操作系统</b>介绍