在U-Boot中为新的硬件平台添加支持是移植工作的核心部分。以下是详细的步骤和注意事项:
board/目录下创建供应商和板级目录
mkdir -p board/vendor/board_name
Kconfig - 板级配置选项MAINTAINERS - 维护者信息Makefile - 构建规则
if TARGET_VENDOR_BOARD_NAME
config SYS_BOARD
default "board_name"
config SYS_VENDOR
default "vendor"
config SYS_CONFIG_NAME
default "vendor_board_name"
endif
#
# (C) Copyright 2023 Vendor Name
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-y += board.o
obj-y += lowlevel_init.o
在board.c中实现关键的板级初始化函数:
#include <common.h>
#include <dm.h>
#include <init.h>
int board_init(void)
{
/* 硬件初始化代码 */
return 0;
}
int dram_init(void)
{
/* DRAM初始化 */
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
return 0;
}
创建include/configs/vendor_board_name.h文件,包含板级特定的配置:
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Configuration settings for the Vendor Board Name.
*/
#ifndef __VENDOR_BOARD_NAME_H
#define __VENDOR_BOARD_NAME_H
#define CONFIG_SYS_SDRAM_BASE 0x80000000
#define CONFIG_SYS_INIT_SP_ADDR 0x80200000
/* 环境变量设置 */
#define CONFIG_EXTRA_ENV_SETTINGS \
"bootcmd=run distro_bootcmd\0"
#endif /* __VENDOR_BOARD_NAME_H */
在arch/<arch>/Kconfig中添加对新板的支持:
config TARGET_VENDOR_BOARD_NAME
bool "Vendor Board Name"
select CPU_<your_cpu>
help
Support for Vendor Board Name
设备树是现代U-Boot和Linux内核中描述硬件配置的标准方式。以下是设备树适配的关键步骤:
arch/<arch>/dts/目录下创建vendor-board-name.dts文件
// SPDX-License-Identifier: GPL-2.0+
/*
* Device Tree Source for Vendor Board Name
*/
/dts-v1/;
#include "<soc_base>.dtsi"
#include "<common_pin_settings>.dtsi"
/ {
model = "Vendor Board Name";
compatible = "vendor,board-name", "soc-vendor,soc-name";
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x20000000>;
};
};
&serial0 {
status = "okay";
};
| 元素 | 描述 | 示例 |
|---|---|---|
| compatible | 定义与驱动匹配的字符串 | "vendor,board-name", "soc-vendor,soc-name" |
| memory节点 | 定义系统内存布局 | reg = <0x80000000 0x20000000>; |
| status | 启用或禁用设备 | "okay" 或 "disabled" |
| aliases | 设备别名 | serial0 = &uart0; |
在arch/<arch>/dts/Makefile中添加:
dtb-$(CONFIG_TARGET_VENDOR_BOARD_NAME) += vendor-board-name.dtb
在板级配置头文件中定义:
#define CONFIG_DEFAULT_DEVICE_TREE "vendor-board-name"
fdt print命令查看加载的设备树fdt list查看特定节点fdt set临时修改设备树属性| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 串口无法工作 | 时钟或引脚配置错误 | 检查时钟频率和引脚复用设置 |
| 内存检测失败 | 内存大小或基址错误 | 验证内存控制器配置 |
| 驱动无法加载 | compatible字符串不匹配 | 检查驱动和设备树中的字符串 |