代码编织梦想

ZYNQ BOOT.bin 的制作方法

参考地址:(防丢失)
ZYNQ之uboot,kernel,设备树,文件系统生成。
[dts]Device Tree机制

1、FSBL.elf :SDK生成的FSBL(first stage boot loader)
2、your_design.bit :用户设计文件
3、u-boot.elf : (Linux boot loader)
4、uImage :Linux内核映像文件
5、devicetree.dtb :命名为devicetree.dtb的设备树文件,依赖于ZYNQ
6、uramdisk.image.gz :
7、合成Boot.bin

1、FSBL.elf

导出设备信息并Launch SDK, 新建FSBL工程并编译,生成FSBL

ZYNQ之uboot,kernel,设备树,文件系统生成。

下载文件名称: https://github.com/Xilinx

u-boot-xlnx-xilinx-v2016.4.zip
2016.4-zed-release.tar.xz

device-tree-xlnx-xilinx-v2016.4.zip

arm_ramdisk.image.gz

一、环境搭建

请参考博客:https://blog.csdn.net/flyingforever_wl/article/details/8097059

环境搭建好后在.bashrc 中设置环境变量:

export ARCH=arm
  export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
  export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH

二、编译u-boot

1). 将下载好的u-boot-xlnx-xilinx-v2016.4.zip 解压 unzip u-boot-xlnx-xilinx-v2016.4.zip

修改DDR的大小:

许多教程里面是Vivado2016.2之前的版本,修改DDR的方法为修改include/configs/zynq_zed.h文件
 在这里插入图片描述
 Vivado2016.4里zynq_zed.h 中没有找到这该宏定义,于是去翻github,发现vivado2016.2中才把此宏定义删除的,转为由dts文件定义,如下图

在这里插入图片描述

刚开始以为是在devicetree.dtb中修改即可,发现修改后并不生效,尝试多次终于发现在u-boot文件夹中也有个dts文件夹,其中有zynq-zed.dts文件中定义了设备树。

因此此处需要修改的是uboot文件夹中arch/arm/dts/zynq-zed.dts 中DDR设备树的定义大小,如下图
在这里插入图片描述
 至此,DDR的大小修改完成

注意:uboot中arch/arm/dts/zynq-zed.dts文件最好跟生成devicetree.dtb的设备树文件保持一致

2). 进入解压目录,生成编译脚本:make zynq_zed_config

3). make -j8

4) mv u-boot u-boot.elf

注意:此处一定要将u-boot转换成u-boot.elf后在生成烧写文件

二、编译kernel uImage :Linux内核映像文件

1). 解压kernel文件linux-xlnx-xilinx-v2016.4.zip: unzip linux-xlnx-xilinx-v2016.4.zip

2). make xilinx_zynq_defconfig

3). make UIMAGE_LOADADDR=0x8000 uImage -j8

编译完成后生成的uImage在arch/arm/boot目录下

三、devicetree.dtb生成

1). devicetree的生成依赖于FPGA工程中ZYNQ的配置,方法请参考:http://blog.chinaaet.com/cuter521/p/5100001052

2). 我的bootargs设置是:
  在这里插入图片描述
其中QSPI部分的描述根据uboot中arch/arm/dts/zynq-zed.dts中对QSPI的描述进行修改,因为我最终是要用到QSPI FLASH启动因此需要对QSPI FLASH进行分区设置

修改好dts文件后,将pl.dtsi skeleton.dtsi system.dts zynq-7000.dtsi文件拷贝到ubuntu下:
  在这里插入图片描述
  使用命令生成devicetree.dtb文件:dtc -I dts -O dtb -o devicetree.dtb system.dts

四、uramdisk修改官方根文件系统

1). 解压压缩包: gunzip arm_ramdisk.image.gz

2). chmod u+rwx arm_ramdisk.image

3). 创建目录并挂载ramdisk:mkdir file_system; mount arm_ramdisk.image file_system

4). 修改file_system内容,由于我们未使用到sd卡,因此将/etc/fstab中的最后两行删除掉:
在这里插入图片描述
5). 完成修改后umount file_system

6). 压缩文件系统:gzip arm_ramdisk.image

7). mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk.image.gz

如果要修改意见生成好的uramdisk.image.gz,需要反向生成ramdisk.image再进行上述的操作,uramdisk.image.gz–>ramdisk.image步骤如下:

1). sudo dd if=./uramdisk.image.gz of=./ramdisk.image.gz skip=16 bs=4

参考链接:http://www.wiki.xilinx.com/Build%20and%20Modify%20a%20Rootfs

7、合成Boot.bin

1).SDK软件中Xilinx Tools 下Create Boot Image

加载各种文件,设置offset,make

附上环境搭建及编译过程中遇到的一些错误及解决办法:

U-boot编译时出现错误fatal error:openssl/evp.h: No such file or derectory 解决:apt-get install libssl-dev

问题:dtc:command not found
  解决:apt-get install device-tree-compiler
  问题:fatal error curses.h no such file or directory
  解决:apt-get install libncurses5-dev

u-boot 启动后找不到网络

问题在于vivado配置ZYNQ的时候,选中的eth没有选择对应的MDIO。
  解决方法:在vivado中选中MDIO后重新编译生成bit文件,重新导出hardware,重新产生FSBL。
  不能直接生成FSBL,需要重新生成hardware文件后重新生成FSBL

内核编译:

错误: “mkimage” Command not found
  解决: apt-get install u-boot-tools

内核启动时出现错误

Copying Linux from QSPI flash to RAM…

SF: Unsupported flash IDs: manuf 00, jedec 0000, ext_jedec 0000
  Failed to initialize SPI flash at 0:0 (error -93)

是由于内核启动命令中sf probe 0 0 0 &&这句参数不对,应该修改为sf probe 0 &&

在uboot目录下./include/configs/zynq-common.h文件中修改

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/Holdrenminbi/article/details/106013469

【海思篇】【Hi3516DV300】十七、创建swap分区-爱代码爱编程

目的:创建swap分区 默认关闭 Swap的total是0,所以hi3516dv300默认是没有swap分区; ~ # free total used free shared buffers cached Mem: 122040 9536 112

linux挂载硬盘步骤(简单易用,直接上手,无废话)-爱代码爱编程

1.查看硬盘挂载情况 fdisk -l 2.查看当前分区情况 df -l 发现新硬盘没有分区 3.给新硬盘添加新分区 fdisk /dev/vdb 按照下面步骤依次输入指令 4.分区完成,查询所有设备的文件系统类型 blkid 发现新分区并没有文件系统类型(type为文件系统具体类型,有ext3,ext4,xfs,iso

liunx中如何安装jdk-爱代码爱编程

liunx中如何安装jdk 操作系统(使用的是虚拟机):Centos7 64位 需要的工具:FileZilla 1.下载jdk 下载的地址为:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 2.通过工具FileZilla将压缩文件上传到liunx的/usr/

shell脚本学习——随机数、嵌套循环、shift位移、expect自动应答、推送公钥-爱代码爱编程

一、随机数 echo $RANDOM 默认产生0~32767随机整数 echo $[$RANDOM%2] 产生0~1之间的随机数 echo $[$RANDOM%3] 产生0~2之间的随机数 echo $[$RANDOM%4] 产生0~3之间的随机数 echo $[$RANDOM%10] 产生0~9之间的随机数 echo $[$RANDOM%9

文件编码格式转换 dos2unix unix2dos-爱代码爱编程

Task: Convert DOS file to UNIX format Type the following command to convert file called myfile.txt:$ dos2unix myfile.txt However above command will not make a backup of original

haproxy的部署 - 七层负载均衡-爱代码爱编程

实验环境: 物理机 用于测试访问 172.25.254.67 haproxy服务器 172.25.254.1 后端 server2 172.25.254.2 后端 server3 172.25.254.3 haproxy的部署 rhel 7.6的系统中有自带的haproxy,我们也可以去官网下载:https://www.haproxy.org/ y

Linux4.19-通过IDT获取sys_call_table实现系统调用劫持-爱代码爱编程

疫情影响不能回临港海大,在家无聊搞Linux系列(二) 上一篇博客写了如何获取IDT地址,这里将接着上一篇博客继续写,如果还不清楚如何获取IDT可以看一下我的上一篇博客:Linux4.19-获取IDT地址:https://blog.csdn.net/qq_41208289/article/details/106012230 这里再次声明一下,博主的系统

windows下的Handle句柄和Linux下的Fd文件标示符-爱代码爱编程

在操作系统层面上,文件操作也有类似于FILE的一个概念,在Linux里,这叫做文件描述符(File Descriptor),而在Windows里,叫做句柄(Handle)(以下在没有歧义的时候统称为句柄)。用户通过某个函数打开文件以获得句柄,此 后用户操纵文件皆通过该句柄进行。 总之每个进程自己都会维护自己的信息,下面举一个实际的例子,在Linux中,值

Linux4.19-获取IDT地址-爱代码爱编程

疫情影响不能回临港海大,在家无聊搞Linux系列(一) 目前Linux4.19获取IDT的方法和之前几个版本相同,网上也已经有了很多帖子写了方法,如果已经掌握的朋友可以直接看我的下一篇博客:Linux4.19-通过IDT获取sys_call_table实现系统调用劫持:https://blog.csdn.net/qq_41208289/article/d

设备驱动程序简介【转】-爱代码爱编程

(转自:https://www.cnblogs.com/microxiami/p/11254081.html) 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的。Linux内核由大量复杂的代码组成,设备驱动程序可以作为进入Linux内核世界大门的切入口。   设备驱动程

内核通用链表-双向循环链表-爱代码爱编程

参考文档:https://blog.csdn.net/liebao_han/article/details/53956609?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&depth_1-utm_source=distribute

【读书笔记】Linux内核设计与实现--进程地址空间-爱代码爱编程

文章目录 1.地址空间2.内存描述符--mm_struct2.1 分配内存描述符--copy_mm()2.2 撤销内存描述符--exit_mm->mmput->mmdrop->free_mm->kmem_cache_free2.3 mm_struct 与内核线程3.虚拟内存区域--vm_area_struct3.1 VMA