U-Boot 2024.01 移植实战:从 NXP EVK 到自定义板,5步完成核心适配
U-Boot 2024.01 移植实战从 NXP EVK 到自定义板的5步核心适配指南1. 移植前的准备工作在开始U-Boot移植之前我们需要做好充分的准备工作。首先需要明确的是U-Boot作为嵌入式系统的引导加载程序其移植工作直接关系到后续Linux内核能否正常启动。对于从NXP官方评估板(EVK)到自定义硬件的移植我们需要重点关注硬件差异部分。开发环境搭建是第一步。建议使用Ubuntu 20.04 LTS或更新版本作为开发主机并安装必要的工具链和依赖包sudo apt update sudo apt install -y build-essential git bison flex libssl-dev \ libncurses5-dev u-boot-tools device-tree-compiler gcc-arm-none-eabi对于NXP i.MX系列处理器推荐使用官方提供的交叉编译工具链。可以从NXP官网下载或使用以下命令安装wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz tar xvf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz export PATH$PATH:$(pwd)/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin获取U-Boot源码时建议直接从官方仓库获取最新稳定版本git clone https://source.denx.de/u-boot/u-boot.git cd u-boot git checkout v2024.01 -b custom_board2. 硬件差异分析与文件结构准备移植工作的核心在于处理自定义板与参考板之间的硬件差异。通常需要关注以下几个方面硬件模块常见差异点检查方法DDR内存容量、型号、时序参数原理图、芯片手册存储设备Flash类型、接口、分区原理图、芯片手册网络PHY型号、地址、接口类型原理图、寄存器配置电源管理PMIC型号、供电时序原理图、电压测量外设接口GPIO分配、时钟配置原理图、芯片手册创建板级支持文件是移植的关键步骤。以i.MX6ULL为例我们可以基于NXP的evk板创建自定义板的支持文件cp -r board/freescale/mx6ullevk/ board/freescale/custom_board cp include/configs/mx6ullevk.h include/configs/custom_board.h cp configs/mx6ull_14x14_evk_defconfig configs/custom_board_defconfig3. 关键配置文件的修改3.1 设备树文件适配设备树是描述硬件的重要文件需要根据实际硬件进行修改。主要修改点包括内存节点根据实际DDR配置调整大小和参数时钟配置确保各外设时钟频率正确外设节点使能/禁用不用的外设修改管脚复用// 示例修改内存配置 memory80000000 { device_type memory; reg 0x80000000 0x20000000; // 512MB DDR3 }; // 示例网络PHY配置 fec1 { pinctrl-names default; pinctrl-0 pinctrl_enet1; phy-mode rmii; phy-handle ethphy0; status okay; mdio { #address-cells 1; #size-cells 0; ethphy0: ethernet-phy1 { reg 1; clocks clks IMX6UL_CLK_ENET_REF; clock-names rmii-ref; }; }; };3.2 defconfig文件配置defconfig文件决定了U-Boot的编译选项。我们需要基于参考板的配置创建自定义板的配置make custom_board_defconfig make menuconfig在图形界面中需要特别注意以下选项CONFIG_TARGET_CUSTOM_BOARDyCONFIG_DEFAULT_DEVICE_TREEimx6ull-custom-board存储设备相关驱动MMC、NAND等网络相关驱动3.3 Kconfig系统修改为了使我们的自定义板出现在编译选项中需要修改Kconfig文件# 在arch/arm/mach-imx/mx6/Kconfig中添加 config TARGET_CUSTOM_BOARD bool Support custom board select MX6ULL select BOARD_LATE_INIT select DM select DM_THERMAL imply CMD_DM同时需要在同级Kconfig文件中添加source board/freescale/custom_board/Kconfig4. 硬件特定驱动适配4.1 DDR初始化代码修改DDR初始化是U-Boot最早执行的硬件初始化之一必须与硬件严格匹配。对于i.MX系列处理器DDR配置通常在板级目录下的plugin.S文件中/* 示例DDR3配置参数 */ .macro imx6ull_ddr3_settings ldr r0, IOMUXC_BASE_ADDR /* DDR控制器配置 */ ldr r1, 0x00080000 str r1, [r0, #0x5a0] /* DDR时序参数 */ ldr r1, 0x00000030 str r1, [r0, #0x5ac] /* 更多配置... */ .endm重要提示DDR参数必须参考芯片手册和内存芯片的规格书错误的配置可能导致系统无法启动或运行不稳定。4.2 网络驱动适配网络功能对于开发和调试非常重要。需要根据实际硬件修改网络驱动PHY地址在设备树和头文件中确认PHY地址复位电路正确配置复位GPIO和时序接口类型RMII/RGMII等// 示例网络复位GPIO配置 #define ENET1_RESET IMX_GPIO_NR(1, 9) #define ENET2_RESET IMX_GPIO_NR(1, 10) void setup_iomux_enet(void) { /* 配置网络复位引脚 */ gpio_request(ENET1_RESET, enet1_reset); gpio_direction_output(ENET1_RESET, 0); mdelay(10); gpio_set_value(ENET1_RESET, 1); mdelay(100); }5. 编译与验证完成所有修改后可以开始编译和验证make custom_board_defconfig make -j$(nproc)编译成功后会生成以下重要文件u-boot.bin原始的U-Boot二进制文件u-boot.imxi.MX专用格式包含IVT等头信息u-boot.srecMotorola S-record格式烧录与测试步骤将生成的镜像烧录到存储设备如SD卡的启动分区配置开发板从该存储设备启动通过串口观察启动日志检查各硬件初始化是否正常常见问题排查表现象可能原因解决方法无任何输出DDR配置错误检查DDR参数和电压卡在Starting kernel设备树不匹配检查内核和设备树兼容性网络无法工作PHY地址或复位问题检查设备树和硬件连接存储设备不识别接口配置错误检查管脚复用和驱动使能性能优化建议启用CONFIG_SKIP_LOWLEVEL_INIT跳过重复的低级初始化调整CONFIG_BOOTDELAY减少启动等待时间使用CONFIG_PREBOOT预置常用命令移植完成后建议保存所有修改并创建补丁文件方便后续维护git add . git commit -m Add support for custom board git format-patch -1通过以上五个关键步骤我们完成了从NXP EVK到自定义板的U-Boot移植工作。实际项目中可能会遇到更多特定硬件相关的问题需要结合芯片手册和硬件原理图进行针对性解决。

相关新闻