U-Boot 系统基础入门

第七章:移植前的准备工作

移植前的准备工作

在进行U-Boot移植之前,充分的准备工作是成功的关键。本章将详细介绍移植前需要完成的两项核心准备工作:硬件手册阅读和关键外设初始化。

1

硬件手册阅读

硬件手册是嵌入式开发的圣经,在开始移植工作前,必须深入理解目标硬件的架构和特性。主要需要阅读的文档包括:

1

Datasheet(数据手册)

数据手册包含芯片的基本信息、引脚定义、电气特性和封装信息等。重点关注:

  • 芯片的引脚功能定义(特别是启动配置引脚)
  • 电源管理相关参数
  • 工作温度范围
  • 封装尺寸和引脚布局
2

Reference Manual(参考手册)

参考手册详细描述了芯片的内部架构、寄存器定义和功能模块。需要特别关注:

  • 内存映射(Memory Map)
  • 启动流程(Boot Sequence)
  • 时钟系统架构
  • 外设控制器寄存器定义
  • 中断控制器配置

提示: 现代SoC的参考手册通常非常庞大(1000+页),建议先阅读与启动和基本外设相关的章节,其他功能可以后续按需查阅。

2

关键外设初始化

在U-Boot移植过程中,有几个关键外设必须在早期初始化阶段正确配置,否则系统将无法正常工作。这些外设包括:

1. 时钟系统初始化

现代SoC通常有复杂的时钟树结构,需要按照特定顺序配置:

// 典型时钟初始化流程示例
1. 使能内部RC振荡器作为初始时钟源
2. 配置PLL锁相环参数(倍频系数、分频系数等)
3. 等待PLL锁定
4. 切换系统时钟源到PLL输出
5. 配置各外设时钟分频器
                

注意: 错误的时钟配置可能导致芯片无法运行或外设工作异常。务必参考手册中的时钟树图和配置时序要求。

2. DDR内存控制器初始化

DDR初始化是移植过程中最复杂的部分之一,需要:

  • 了解DDR芯片的型号和参数(容量、位宽、时序等)
  • 正确配置DDR控制器参数(时序参数、PHY设置等)
  • 执行DDR训练(Training)流程(某些平台需要)
// DDR初始化关键步骤示例
1. 配置DDR控制器时钟
2. 设置DDR PHY参数
3. 配置内存时序参数(tRCD, tRP, tRAS, tRFC等)
4. 设置内存大小和地址映射
5. 执行DDR校准(如需要)
6. 使能DDR控制器
                

3. 串口控制器初始化

串口是调试的重要工具,需要尽早初始化:

  • 配置正确的波特率(通常先使用较低波特率如115200)
  • 设置数据位、停止位和校验位
  • 确保时钟源已正确配置
  • 验证TX/RX引脚复用配置
// 串口初始化示例
void uart_init(void)
{
    // 1. 使能串口时钟
    setbits_le32(&clock_regs->uart_clk_reg, UART_CLK_EN);
    
    // 2. 配置引脚复用为UART功能
    writel(UART_PINMUX_VAL, &iomux_regs->uart_tx_pin);
    writel(UART_PINMUX_VAL, &iomux_regs->uart_rx_pin);
    
    // 3. 配置波特率(假设输入时钟为24MHz)
    writel(DIV_ROUND(24000000, 16 * 115200), &uart_regs->baud_div);
    
    // 4. 配置数据格式(8N1)
    writel(UART_LCR_8N1, &uart_regs->line_control);
    
    // 5. 使能UART
    writel(UART_ENABLE, &uart_regs->control);
}
                

调试技巧: 在早期移植阶段,可以在汇编代码中添加简单的串口输出功能(通过直接操作寄存器),以便在C环境尚未完全初始化时就能获取调试信息。

准备工作检查清单

在开始实际移植工作前,请确认已完成以下准备工作:

  • ✅ 获取并阅读目标芯片的Datasheet和Reference Manual
  • ✅ 理解芯片的启动流程和内存映射
  • ✅ 准备开发板的原理图(特别是启动配置引脚连接)
  • ✅ 确认调试工具可用(JTAG/SWD调试器、串口工具等)
  • ✅ 搭建好交叉编译环境
  • ✅ 选择合适的基础U-Boot版本(通常选择与目标芯片相近的已有移植版本)