4. 添加自定义板级支持

任务说明

在U-Boot源码中为一块自定义开发板(以 myboard 为例)添加板级支持,包含两个核心部分:创建板级目录(存放板级初始化代码)和添加板级配置文件(myboard_defconfig)。完成后,U-Boot能够识别该板卡并完成编译。

环境与依赖

  • U-Boot源码(本文以 v2023.04 为例,其他版本结构类似)
  • 交叉编译工具链(如 arm-linux-gnueabihf-),并已加入 PATH
  • Linux主机环境

实现步骤

1. 创建板级目录结构

在 board/ 下创建厂商目录和板卡目录,并添加必要的 Kconfig 和 MAINTAINERS 文件:

cd <u-boot源码根目录>
mkdir -p board/myboard/myboard
touch board/myboard/myboard/Kconfig
touch board/myboard/myboard/MAINTAINERS
touch board/myboard/myboard/Makefile

2. 添加板级初始化代码

创建 myboard.c,实现最基本的板级初始化(仅包含必要的空实现,保证链接通过):

// board/myboard/myboard/myboard.c
#include <common.h>
#include <init.h>

int board_init(void)
{
    /* 板级初始化:此处可添加GPIO、时钟等硬件初始化 */
    return 0;
}

int board_late_init(void)
{
    /* 板级后期初始化(可选) */
    return 0;
}

int dram_init(void)
{
    /* 若未使用固定DDR配置,需在此处设置gd->ram_size */
    gd->ram_size = PHYS_SDRAM_SIZE;
    return 0;
}

3. 编写板级目录的Kconfig与Makefile

# board/myboard/myboard/Kconfig
if TARGET_MYBOARD

config SYS_BOARD
    default "myboard"

config SYS_VENDOR
    default "myboard"

config SYS_CONFIG_NAME
    default "myboard"

endif
# board/myboard/myboard/Makefile
obj-y += myboard.o

4. 在顶层Kconfig中关联新板卡

编辑 arch/arm/mach-*/Kconfig(以 arch/arm/mach-sunxi 为例,实际根据你的CPU架构选择对应目录),添加:

source "board/myboard/myboard/Kconfig"

5. 添加板级配置文件

创建 configs/myboard_defconfig:

CONFIG_ARM=y
CONFIG_ARCH_MYBOARD=y          # 若架构未定义需在arch/arm/mach-*/Kconfig中补充
CONFIG_TARGET_MYBOARD=y
CONFIG_SYS_TEXT_BASE=0x80000000
# 根据实际硬件配置DDR大小(单位:字节)
CONFIG_SYS_SDRAM_SIZE=0x20000000
# 其他必要配置(串口、网络等按需添加)

6. 编译验证

make myboard_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)

验证方法与通过标准

  • 编译通过:执行上述命令后无报错,生成 u-boot.bin 即表示板级支持添加成功。
  • 配置生效:运行 make myboard_defconfig 后,执行 grep CONFIG_TARGET_MYBOARD .config 应输出 CONFIG_TARGET_MYBOARD=y。
  • 目录结构完整:确认 board/myboard/myboard/ 下存在 Kconfig、Makefile、myboard.c 三个文件,且 configs/myboard_defconfig 存在。

若编译时提示找不到 CONFIG_ARCH_MYBOARD,需在 arch/arm/mach-*/Kconfig 中补充对应的架构选择项(参考同目录下其他板卡的写法)。