type
date
slug
category
icon
password
一、获取新旧版uboot二、移植2.1 移植头文件2.2 移植配置文件2.3 单板目录和文件2.4 添加 Kconfig 信息2.5 添加设备树2.6 设备树插件移植2.7 编译与烧录三、定制单板3.1 添加头文件3.2 新建配置文件(configs)3.3 添加单板目录和文件3.4 添加Kconfig信息3.5 添加设备树3.6 编译
一、获取新旧版uboot
从官方https://ftp.denx.de/pub/u-boot/ 或 ftp://ftp.denx.de/pub/u-boot/下载好最新的源码进行适配。以u-boot-2021.10-rc4.tar.bz2为例:
获取旧版uboot,这里以野火 ebf_v2020_10_imx分支的uboot为例:
二、移植
2.1 移植头文件
mx6ullfire.h 头文件里包含了uboot的环境参数和一些配置信息。
2.2 移植配置文件
emmc版本的配置文件为 mx6ull_fire_mmc_defconfig
nand版本的配置文件为 mx6ull_fire_nand_defconfig
将以上两版本的配置文件都复制到新版本uboot。
下图对比官方开发板 mx6ull_14x14_evk_defconfig和野火mx6ull_fire_mmc_defconfig配置差异


第一处,修改目标板名称,与下面两处对应:
- 一个是单板目录中的Kconfig配置文件;
- 二是mx6架构下Kconfig配置文件。
第二处,修改设备树名称,需与uboot设备树对应;
第三处,配置头部信息的,指向的是板子目录的 cfg 文件。
2.3 单板目录和文件
单板目录mx6ullfire的结构
- mx6ullfire.c :里写了一些uboot启动代码和我们对板子引脚读取的代码。
- board_early_init_f → 设置串口服复用,boot启动终端使用 setup_iomux_uart
- board_init → 设置boot参数地址boot parameters/ 设置Fast Ethernet 控制器setup_fec/ 设置nand访问接口setup_gpmi_nand
- board_late_init
- plugin.S :用汇编写的设置ddr和时钟,一般不需要更改。
- Makefile :里面修改C文件编译后的o文件,有多少个就写多少个o文件,注意与c文件名字相同。
- Kconfig :U-Boot编译配置选项文件,定义了编译时需要配置哪些选项用于生成适用于该开发板的U-Boot程序。
- imximage.cfg :NXP特有的文件,默认已添加头部信息。
以上命令是U-Boot启动时加载插件的命令。其中board/freescale/mx6ullfire/plugin.bin 是插件的二进制文件路径,0x00907000 是插件的加载地址。可以用于扩展U-Boot功能。
2.4 添加 Kconfig 信息
修改文件目录为:
arch/arm/mach-imx/mx6/Kconfig
,在这个文件中添加我们的板子信息方便Makefile识别编译。- 【添加板卡支持】在上述
Kconfig
下config TARGET_MX6ULL_14X14_EVK
配置下面添加如下代码:
- 【添加配置选项】在上述
Kconfig
文件中的source “board/freescale/mx6ullevk/Kconfig”
下添加如下代码

2.5 添加设备树
- 修改Makefile文件
设备树的名字,参考
config
里的CONFIG_DEFAULT_DEVICE_TREE=”imx6ull-fire-mmc”
, 如果是nand版本则是”imx6ull-fire-nand”
。在 dtb-$(CONFIG_MX6ULL) += 下面添加设备树
- 复制一份设备树源码到新版本的uboot。
- 修改板卡soc文件
修改文件目录为:
arch/arm/mach-imx/mx6/soc.c
在soc.c文件开头加上
在soc.c文件末尾加上
以上是一个获取板级信息的函数,该函数使用了SoC内部的OTP存储器,读取存储在OTP中的唯一设备标识符UID,并将其保存到Linux内核启动参数中的struct
tag_serialnr
结构体中,使其成为内核启动参数之一。2.6 设备树插件移植
- 设备树插件配置
- dtfile.c 用于实现uboot命令dtfile。该命令用于在uboot中加载并解析设备树文件,并将其显示输出或保存到指定的文件中。
- dtoverlay.h 用于定义设备树相关的数据结构和函数声明。
- ramblockdev.h 用于定义RAM块设备。

- UID配置
- init.h 用于声明uboot启动过程中的初始化函数和数据结构。
- board_r.c 包含一些通用的板级初始化函数和一些通用的工具函数,可以用于不同的硬件平台。
- dtoverlay 提供了设备树覆盖的功能,通过加载这些覆盖文件,可以在U-Boot运行时动态地修改设备树。

2.7 编译与烧录
三、定制单板
3.1 添加头文件
复制一份 include/configs/mx6ullfire.h 更名为
include/configs/mx6ull_name.h
更改
- PHYS_SDRAM_SIZE :设置了SDRAM的内存大小
- CONFIG_SYS_MALLOC_LEN :为malloc内存池大小,这里设置为16MB
- CONFIG_MXC_UART_BASE :这里使用串口1,基地址为 UART1_BASE, UART1_BASE 定义在文件arch/arm/include/asm/arch-mx6/imx-regs.h 中, imx-regs.h 是 I.MX6ULL 寄存器描述文件,根据imx-regs.h 可得到 UART1_BASE 的值如下:
- CONFIG_SYS_FSL_ESDHC_ADDR:宏CONFIG_SYS_FSL_ESDHC_ADDR为 EMMC 所使用接口的寄存器基地址,也就是 USDHC2 的基地址
- CONFIG_EXTRA_ENV_SETTINGS : 通过条件编译来设置宏 CONFIG_EXTRA_ENV_SETTINGS,宏CONFIG_EXTRA_ENV_SETTINGS 也是设置一些环境变量,此宏会设置bootargs这个环境变量
- CONFIG_BOOTCOMMAND:设置宏 CONFIG_BOOTCOMMAND,此宏就是设置环境变量bootcmd的值。
- CONFIG_SYS_LOAD_ADDR:表示 linux kernel 在DRAM中的加载地址,也就是 linux kernel 在 DRAM 中的存储首地址,CONFIG_LOADADDR=0X80800000
- CONFIG_SYS_HZ:宏 CONFIG_SYS_HZ 为系统时钟频率,这里为 1000Hz。
- PHYS_SDRAM:为 I.MX6ULL 的 DRAM 控制器 MMDC0 所管辖的 DRAM 范围起始地址,也就是 0X80000000
- CONFIG_SYS_SDRAM_BASE:为 DRAM 的起始地址。
- CONFIG_SYS_INIT_RAM_ADDR:为 I.MX6ULL 内部 IRAM 的起始地址(也就是 OCRAM 的起始地址),为 0X00900000
- CONFIG_SYS_INIT_RAM_SIZE:为 I.MX6ULL 内部 IRAM 的大小(OCRAM的大小),为 0X00040000=128KB
- CONFIG_SYS_INIT_SP_OFFSET和CONFIG_SYS_INIT_SP_ADDR:CONFIG_SYS_INIT_SP_OFFSET 和 CONFIG_SYS_INIT_SP_ADDR 与初始 SP 有关,第一个为初始 SP 偏移,第二个为初始 SP 地址
- CONFIG_MMCROOT :设置进入 linux 系统的根文件系统所在的分区,这里设置为”/dev/mmcblk1p2”,也就是 EMMC 设备的第 2 个分区。第 0 个分区保存 uboot,第 1 个分区保存 linux 镜像和设备树,第 2 个分区为 Linux 系统的根文件系统
- CONFIG_FEC_ENET_DEV:指定 uboot 所使用的网口, I.MX6ULL 有两个网口,为 0 的时候使用 ENET1,为 1 的时候使用 ENET2
- CONFIG_VIDEO:用于开启 LCD,CONFIG_VIDEO_LOGO 使能 LOGO 显示, CONFIG_CMD_BMP 使能 BMP 图片显示指令。这样就可以在 uboot 中显示图片了,一般用于显示 logo。
关于 mx6ull_name_emmc.h 就讲解到这里,其中以 CONFIG_CMD 开头的宏都是用于使能相应命令的,其他的以 CONFIG 开头的宏都是完成一些配置功能的。以后会频繁的和mx6ull_name_emmc.h 这个文件打交道。
3.2 新建配置文件(configs)
- 复制
mx6ull_fire_mmc_defconfig
,然后重命名为mx6ull_name_mmc_defconfig
;
- 更改
CONFIG_SYS_EXTRA_OPTION
3.3 添加单板目录和文件
I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录。复制该目录下 mx6ullfire,将其重命名为 mx6ull_name。
修改 mx6ull_name文件夹下,更改mx6ullfire.c名称
将mx6ull_name.c里面的mx6ullfire.h头文件修改为mx6ull_name.h
mx6ull_name单板目录文件结构如下:
- mx6ull_name.c :里写了一些uboot启动代码和我们对板子引脚读取的代码
- plugin.S :用汇编写的设置ddr和时钟,一般不需要更改
- Makefile :里面修改C文件编译后的o文件,有多少个就写多少个o文件,注意与c文件名字相同
将Makefile里面的mx6ullfire.o修改为mx6ull_name.o
修改 Kconfig
修改 imximage.cfg (只修改一处)
3.4 添加Kconfig信息
添加我们的板子信息方便Makefile识别编译
- 【添加板卡支持】在上述Kconfig下config TARGET_MX6ULL_14X14_EVK配置下面添加如下代码:
- 【添加配置选项】在上述Kconfig文件中的source “board/freescale/mx6ullevk/Kconfig”下添加如下代码
3.5 添加设备树
- 修改Makefile文件
设备树的名字,参考config里的CONFIG_DEFAULT_DEVICE_TREE=”imx6ull-name-mmc”, 如果是nand版本则是”imx6ull-fire-nand”。
在 dtb-$(CONFIG_MX6ULL) += 下面添加设备树
- 复制一份设备树源码到新版本的uboot。
3.6 编译
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/linux_uboot
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!