Lazy loaded image
🥳嵌入式 Linux开发
Uboot 的移植
Words 2558Read Time 7 min
2024-12-4
2024-12-4
type
date
slug
category
icon
password

一、获取新旧版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配置差异
notion image
notion image
第一处,修改目标板名称,与下面两处对应:
  • 一个是单板目录中的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识别编译
    1. 【添加板卡支持】在上述 Kconfigconfig TARGET_MX6ULL_14X14_EVK配置下面添加如下代码:
      1. 【添加配置选项】在上述Kconfig文件中的source “board/freescale/mx6ullevk/Kconfig”下添加如下代码
        1. notion image

      2.5 添加设备树

      1. 修改Makefile文件
        1. 设备树的名字,参考config里的CONFIG_DEFAULT_DEVICE_TREE=”imx6ull-fire-mmc”, 如果是nand版本则是”imx6ull-fire-nand”
          在 dtb-$(CONFIG_MX6ULL) += 下面添加设备树
      1. 复制一份设备树源码到新版本的uboot。
        1. 修改板卡soc文件
          1. 修改文件目录为:arch/arm/mach-imx/mx6/soc.c
            在soc.c文件开头加上
            在soc.c文件末尾加上
            以上是一个获取板级信息的函数,该函数使用了SoC内部的OTP存储器,读取存储在OTP中的唯一设备标识符UID,并将其保存到Linux内核启动参数中的struct tag_serialnr结构体中,使其成为内核启动参数之一。

        2.6 设备树插件移植

        1. 设备树插件配置
            • dtfile.c 用于实现uboot命令dtfile。该命令用于在uboot中加载并解析设备树文件,并将其显示输出或保存到指定的文件中。
            • dtoverlay.h 用于定义设备树相关的数据结构和函数声明。
            • ramblockdev.h 用于定义RAM块设备。
            notion image
        1. UID配置
            • init.h 用于声明uboot启动过程中的初始化函数和数据结构。
            • board_r.c 包含一些通用的板级初始化函数和一些通用的工具函数,可以用于不同的硬件平台。
            • dtoverlay 提供了设备树覆盖的功能,通过加载这些覆盖文件,可以在U-Boot运行时动态地修改设备树。
            notion image

        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)

            1. 复制 mx6ull_fire_mmc_defconfig,然后重命名为mx6ull_name_mmc_defconfig
            1. 更改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识别编译
            1. 【添加板卡支持】在上述Kconfig下config TARGET_MX6ULL_14X14_EVK配置下面添加如下代码:
              1. 【添加配置选项】在上述Kconfig文件中的source “board/freescale/mx6ullevk/Kconfig”下添加如下代码

                3.5 添加设备树

                1. 修改Makefile文件
                  1. 设备树的名字,参考config里的CONFIG_DEFAULT_DEVICE_TREE=”imx6ull-name-mmc”, 如果是nand版本则是”imx6ull-fire-nand”。
                    在 dtb-$(CONFIG_MX6ULL) += 下面添加设备树
                1. 复制一份设备树源码到新版本的uboot。

                  3.6 编译

                   
                  上一篇
                  Buildroot根文件系统的构建
                  下一篇
                  烧写整个系统或更新部分系统

                  Comments
                  Loading...