U-Boot 系统基础入门 - 移植步骤详解

1. 添加新板级支持(board/<vendor>/<board>)

在U-Boot中为新的硬件平台添加支持是移植工作的核心部分。以下是详细的步骤和注意事项:

1.1 创建板级目录结构

board/
└── vendor/
└── board_name/
├── Kconfig
├── MAINTAINERS
├── Makefile
├── board.c
├── board.h
└── ...其他必要文件
board/目录下创建供应商和板级目录
            mkdir -p board/vendor/board_name
        
创建必要的板级配置文件

1.2 编写板级Kconfig文件

            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
        

1.3 编写板级Makefile

            #
            # (C) Copyright 2023 Vendor Name
            #
            # SPDX-License-Identifier:     GPL-2.0+
            #

            obj-y += board.o
            obj-y += lowlevel_init.o
        

1.4 实现板级初始化代码

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;
            }
        
注意: 选择一个相似的参考板作为基础可以大大简化移植工作。查找使用相同SoC或类似硬件的现有板级支持。

1.5 配置系统头文件

创建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 */
        

1.6 更新顶层Kconfig

arch/<arch>/Kconfig中添加对新板的支持:

            config TARGET_VENDOR_BOARD_NAME
                bool "Vendor Board Name"
                select CPU_<your_cpu>
                help
                  Support for Vendor Board Name
        

2. 设备树(Device Tree)的适配与修改

设备树是现代U-Boot和Linux内核中描述硬件配置的标准方式。以下是设备树适配的关键步骤:

2.1 创建设备树源文件

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";
            };
        

2.2 设备树关键元素详解

元素 描述 示例
compatible 定义与驱动匹配的字符串 "vendor,board-name", "soc-vendor,soc-name"
memory节点 定义系统内存布局 reg = <0x80000000 0x20000000>;
status 启用或禁用设备 "okay" 或 "disabled"
aliases 设备别名 serial0 = &uart0;

2.3 设备树编译与包含

更新Makefile以包含新设备树

arch/<arch>/dts/Makefile中添加:

            dtb-$(CONFIG_TARGET_VENDOR_BOARD_NAME) += vendor-board-name.dtb
        
配置U-Boot使用正确的设备树

在板级配置头文件中定义:

            #define CONFIG_DEFAULT_DEVICE_TREE "vendor-board-name"
        

2.4 设备树调试技巧

警告: 设备树中的内存区域和寄存器地址必须与硬件手册完全一致,错误的配置可能导致系统崩溃。

2.5 常见设备树适配问题

问题 可能原因 解决方案
串口无法工作 时钟或引脚配置错误 检查时钟频率和引脚复用设置
内存检测失败 内存大小或基址错误 验证内存控制器配置
驱动无法加载 compatible字符串不匹配 检查驱动和设备树中的字符串
最佳实践: 从参考板的设备树开始修改,逐步添加或修改所需的部分,而不是从头开始创建。