Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

这篇具有很好参考价值的文章主要介绍了Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境

  1. hdf设计:vivado 2017.4套件
  2. 交叉编译环境: arm-linux-gnueabihf-
  3. 虚拟机Linux系统版本:ubuntu 16.04
  4. 开发板:ALINX AX7Z100 开发板(ZYNQ7100)

Zynq Linux系统启动流程

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

Linux移植流程和思路

不使用petalinux工具,尽管它提升了开发效率,能直接生成BOOT.BINimage.ub
但是这种方法既不利于学习移植过程,又不灵活,一旦有什么新的需要就得重新编译

嵌入式Linux系统移植主要由四大部分组成:

  1. 搭建交叉编译开发环境
  2. bootloader的选择和移植
  3. kernel的配置、编译、和移植
  4. 根文件系统的制作

整体的思路如图,即将比特流文件system.bitBOOT.BIN文件中分离出来,同时将fbsl镜像和u-boot镜像合成BOOT.bin文件
将内核镜像文件zImage、内核设备树system.dtb文件以及根文件系统rootfsimage.ub中分离出来
将SD卡格式化并划分为FAT32EXT4两个区,分别启动镜像和根文件系统

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

本文主要来移植 bootloader,最常用的是U-BOOT ,下面就让我们开始吧
目标:编译出 u-boot 镜像文件

SDK由hdf文件得到设备树文件

下载设备树源码

下载地址为:https://github.com/Xilinx/device-tree-xlnx/tags,我这里下载的是2017.4版本的

准备hdf文件

vivado里面设计,编译导出生成hdf文件

生成设备树文件

  1. 解压设备树源码,拷贝到SDK安装目录下
    Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)
    2.windows下打开SDK,工具栏 Xilinx–>Preferences 配置Repositories, New一个,添加刚才的设备树源码路径
    Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)
    3.新建BSP (File–>new–>Board Support Package),选择hdf文件,finish
    Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)
    4.生成device tree,finish,弹出一个BSP settings窗口,默认选项,然后OK
    Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)
    5.在device_tree_bsp_0目录下查看生成的设备树文件,红框内的文件后续还有用
    Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

U-BOOT的移植

下载u-boot源码

下载地址为:https://github.com/Xilinx/u-boot-xlnx/releases,我这里下载的是2017.4版本的

添加自己的板子

1.解压源码 tar -zxvf u-boot-xlnx-xilinx-v2017.4.tar.gz
2.拷贝上一节 device_tree_bsp_0 目录下查看生成的设备树文件到 /arch/arm/dts 目录下,并重命名 system-top.dtszynq-ax7z100.dts
3.修改设备树文件 zynq-ax7z100.dts ,根据板子和自己的需求配置
4.进入/include/configs目录下,拷贝一份zynq-common.h cp zynq-common.h ax7z100-common.h, 然后修改ax7z100-common.h

找到 Default environment 字样开始修改,这一步最为关键,也能更好地理解u-boot是如何启动内核过程的

理解CONFIG_EXTRA_ENV_SETTINGS宏

Default environment 下是CONFIG_EXTRA_ENV_SETTINGS宏,设置了u-boot是如何加载内核镜像,如何从SD卡、QSPI、USB启动的
由于我们是准备从SD卡启动u-boot,所以我们需要理解并修改sdboot
找到sdboot关键词,修改成如下内容

	"sdboot=if mmcinfo; then " \
			"run uenvboot; " \
			"echo Copying Linux from SD to RAM... && " \       
			"load mmc 0 ${bitstream_load_address} ${bitstream_image} && " \
			"fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && " \
			"load mmc 0 ${kernel_load_address} ${kernel_image} && " \
			"load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
			"bootz ${kernel_load_address} - ${devicetree_load_address}; " \
		"fi\0" \

第三行命令是打印字符串,可自行修改
第四行命令是从SD卡拷贝bitstream文件到内存
第五行命令是从内存中加载bitstream数据到FPGA
第六行命令是从SD卡拷贝内核镜像到内存
第七行命令是从SD卡拷贝设备树到内存
第八行命令是bootz启动内核

接下来我们需要设置这几个变量 ${},有一些是自动生成的,没有的话须要自行设置
网络环境也需要宏定义一下,否则会报错

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

5.进入/include/configs目录下,拷贝一份zynq_zc70x.h cp zynq_zc70x.h zynq_ax7z100.h
然后修改 zynq_ax7z100.h 中 #include <configs/zynq-common.h>#include <configs/ax7z100-common.h>
6.进入/arch/arm/dts ,修改Makefile,找到 dtb-$(CONFIG_ARCH_ZYNQ) 配置,增加 zynq-ax7z100.dtb,如图

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

7.进入configs目录下,拷贝一份配置文件
cp zynq_zc702_defconfig zynq_ax7z100_defconfig 设计参考Xilinx官方的zc702开发板,ax7z100是我的开发板名字
修改zynq_ax7z100_defconfig,主要修改项及说明如下

# 1. head file in "include/configs/zynq_ax7z100.h"
CONFIG_SYS_CONFIG_NAME="zynq_ax7z100"
# 2. u-boot start delay for 5s
CONFIG_BOOTDELAY=5
# 3. device tree file in arch/arm/dts/zynq-ax7z100.dts
CONFIG_DEFAULT_DEVICE_TREE="zynq-ax7z100"
# 4. u-boot start banner
CONFIG_IDENT_STRING="ALINX AX7Z100 by HAMMER"
# 5. boot command
CONFIG_BOOTCOMMAND="run default_bootcmd"
# 6. UART BASE ADDRESS
CONFIG_DEBUG_UART_BASE=0xe0000000

8.uboot支持图形界面配置,修改 /arch/arm/mach-zynq/Kconfig 文件 ,找到 config SYS_CONFIG_NAME ,修改如下

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

编译u-boot

新建一个脚本 zynq_uboot_gen.sh ,写入内容

#!/bin/bash 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_ax7z100_defconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
chmod +x zynq_uboot_gen.sh
./zynq_uboot_gen.sh

编译成功之后,会在u-boot源码根目录生成以下文件,其中 文件 u-boot 是我们所需要关注的

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

测试U-BOOT

准备hw文件夹

来自于Vivado工程SDK文件夹下的 xxx_wrapper_hw_platform_0 文件夹,将该文件夹复制到 u-boot 根目录下

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

准备tcl文件调试linux内核

u-boot 根目录下新建一个linux.tcl文件,,用来下载 fgpa 的 bitstream 文件和 uboot 的 elf 文件以启动linux内核
内容如下

connect 
source zynq7100_wrapper_hw_platform/ps7_init.tcl
targets -set -filter {name =~"APU*" && jtag_cable_name =~ "Digilent*"} -index 0
rst -system 
after 3000
targets -set -filter {jtag_cable_name =~ "Digilent*" && level==0} -index 1 
fpga -file zynq7100_wrapper_hw_platform/design_1_wrapper.bit
targets -set -filter {name =~"APU*" && jtag_cable_name =~ "Digilent*"} -index 0 
loadhw -hw zynq7100_wrapper_hw_platform/system.hdf -mem-ranges [list {0x40000000 0xbfffffff}] 
configparams force-mem-access 1
targets -set -filter {name =~"APU*" && jtag_cable_name =~ "Digilent*"} -index 0
ps7_init 
ps7_post_config
targets -set -nocase -filter {name =~ "ARM*#0"} 
dow u-boot
configparams force-mem-access 0
targets -set -nocase -filter {name =~ "ARM*#0"} 
con 

准备tcl文件调试u-boot

新建一个名为uboot.tcl的文件。当我们只是调试uboot,不启动内核的时候或没有使用 fpga 部分时启动内核的时候,可使用该文件,内容如下

connect 
source zynq7100_wrapper_hw_platform/ps7_init.tcl 
targets -set -filter {name =~"APU"} 
loadhw zynq7100_wrapper_hw_platform/system.hdf
stop 
ps7_init
targets -set -nocase -filter {name =~ "ARM*#0"} 
rst -processor 
dow u-boot 
con

下载u-boot测试

  1. 设置开发板启动模式为 JTAG,连接串口并打开串口软件
  2. 上电,ubuntu连接 JTAG 的 USB 接口
  3. 配置petalinux环境变量,输入命令 xsct uboot.tcl 下载u-boot文件调试

运行过程及结果

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)
成功下载u-boot到开发板 Successfully downloaded /home/hammer/work/u-boot/u-boot-xlnx-xilinx-v2017.4/u-boot

串口输出,没有内核所以就只有u-boot信息

Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)

第一行输出是zynq_ax7z100_defconfig文件中自定义的Banner ALINX AX7Z100 by HAMMER
第二行输出是设备树文件zynq-ax7z100.dts设置的model
其他对应 ax7z100-common.h 文件的修改项
然后我们可以输入命令printenv sdboot 查看 ax7z100-common.h 文件中设置的SD卡启动配置是否和我们设置的一致

成功启动了u-boot,移植完成!

资源文件下载

我已经将本文中涉及的相关文件上传至我的github仓库 https://github.com/Huge-Hammer/linux-system-porting/tree/main/u-boot
有需要自行下载,但仅供参考

结束语

写这篇文章的初衷是不想用petalinux编译u-boot并且想自定义自己的板子,综合了很多教程写的,可能存在错误,还望大家批评指正

我是爱学习的诸葛铁锤,下期见,see you!文章来源地址https://www.toymoban.com/news/detail-466376.html

到了这里,关于Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 新唐NUC980使用记录(5.10.y内核):u-boot & linux & rootfs 编译与烧录测试(基于SD1位置SD卡)

    从去年(2022)开始新塘官方的NUC980 5.10.y内核的项目开始展开,这篇文章将测试在NUC980上使用5.10.y内核。 这篇文章中内容均在下面的开发板上进行测试: 《新唐NUC980使用记录:自制开发板(基于NUC980DK61YC)》 对于NUC980芯片本身的一些内容可以参考: 《新唐NUC980使用记录:基

    2024年02月03日
    浏览(59)
  • 【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

    RV1126 是 Rockchip 推出的一款编解码芯片,CPU 为 4 核 ARM Cortex-A7 32 位,专用于面向人工智能的机械视觉领域,支持 4K 编解码,支持 8 路 1080P 同时进行编解码,内置 2.0TOPS的 NPU。像这种专用芯片,芯片厂商都会给出芯片的 SDK 包进行二次开发,用它来开发有很多好处,比如:不用

    2024年02月02日
    浏览(47)
  • 基于全志A33开发板linux系统移植学习记录(Boot0)

    第一章 Boot0基于ARMGCC的编译与修改 入行快两年,希望通过学习系统移植巩固下相关的知识,目标板使用基于全志A33 的astar-parrot开发板,开始本来想着使用Boot0来加载uboot,但后期发现为了代码统一和便捷性,最终还是选择了SPL作为跳板,但Boot0流程相对清晰,所以将对其做的

    2023年04月08日
    浏览(45)
  • 基于RK3588的嵌入式linux系统开发(二)——uboot源码移植及编译

            由于官方的SDK占用空间较大(大约20GB左右),需要联系相关供应商提供,且官方的SDK通过各种脚本文件进行集成编译,难以理解系统开发的详细过程。本章介绍直接从官方Github网站下载源码进行移植,进行uboot移植及编译,具体内容如下所述: 1.进入官方的github网

    2024年01月16日
    浏览(56)
  • Linux系统移植二:生成fsbl引导文件并制作BOOT.bin(非petalinux版)

    对于ZYNQ而言,在引导过程中,先运行FSBL来设置PS,然后运行U-Boot用于加载Linux内核映像并引导Linux Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版) 一文中已成功生成了u-boot文件 然后将u-boot文件重命名为u-boot.elf mv u-boot u-boot.elf 备用 生成BOOT.BIN文件还需要fs

    2023年04月09日
    浏览(31)
  • 正点原子嵌入式linux驱动开发——U-boot图形化配置及其原理

    经过之前对uboot的学习可以知道: uboot可以通过stm32mp15_trusted_defconfig来配置,或者通过文件stm32mp1.h来配置uboot 。还有 另外一种配置uboot的方法,就是图形化配置 ,以前的uboot是不支持图形化配置,只有Linux内核才支持图形化配置。不过不知道从什么时候开始,uboot也 支持图形

    2024年02月07日
    浏览(41)
  • 【LINUX】查看自己系统环境、编译器环境

    1.查看自己系统环境         在Linux系统上,使用 uname -a 命令可以获取关于系统内核和操作系统的详细信息。这个命令会显示出当前系统的内核版本、主机名、操作系统类型、处理器架构等信息。在终端中执行以下命令即可查看输出: 输出可能会类似于以下内容:  当在

    2024年02月07日
    浏览(42)
  • 飞腾E2000从eMMC或SD启动U-boot和系统

    本文讲解了,如何设置uboot环境变量和编译linux内核,实现将uboot和系统同时放置到SD卡或eMMC后,从SD或者eMMC启动uboot,引导系统启动的过程。 同时使用E2000Q-demo,演示了从SD卡启动和从eMMC启动的过程。                    1、制作MMC(eMMC/SD卡)启动镜像文件 1.1、重新编译u

    2024年02月11日
    浏览(93)
  • [RK-Linux] RK3399使用RK开源SPL,修改U-Boot为FIT打包方式,裁剪trust分区

    RK3399平台根据前级Loader代码是否开源,目前有两套启动方式: TPL 相当于 ddr bin,SPL 相当于 miniloader。TPL+SPL 的组合实现了跟 RK 闭源 ddr.bin+miniloader 一致的功能,可相互替换。 FIT(flattened image tree)是U-Boot支持的一种新固件类型的引导方案,支持任意多个image打包和校验。FIT 使

    2024年01月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包