第七章:移植前的准备工作
在进行U-Boot移植之前,充分的准备工作是成功的关键。本章将详细介绍移植前需要完成的两项核心准备工作:硬件手册阅读和关键外设初始化。
硬件手册是嵌入式开发的圣经,在开始移植工作前,必须深入理解目标硬件的架构和特性。主要需要阅读的文档包括:
数据手册包含芯片的基本信息、引脚定义、电气特性和封装信息等。重点关注:
参考手册详细描述了芯片的内部架构、寄存器定义和功能模块。需要特别关注:
提示: 现代SoC的参考手册通常非常庞大(1000+页),建议先阅读与启动和基本外设相关的章节,其他功能可以后续按需查阅。
在U-Boot移植过程中,有几个关键外设必须在早期初始化阶段正确配置,否则系统将无法正常工作。这些外设包括:
现代SoC通常有复杂的时钟树结构,需要按照特定顺序配置:
// 典型时钟初始化流程示例
1. 使能内部RC振荡器作为初始时钟源
2. 配置PLL锁相环参数(倍频系数、分频系数等)
3. 等待PLL锁定
4. 切换系统时钟源到PLL输出
5. 配置各外设时钟分频器
注意: 错误的时钟配置可能导致芯片无法运行或外设工作异常。务必参考手册中的时钟树图和配置时序要求。
DDR初始化是移植过程中最复杂的部分之一,需要:
// DDR初始化关键步骤示例
1. 配置DDR控制器时钟
2. 设置DDR PHY参数
3. 配置内存时序参数(tRCD, tRP, tRAS, tRFC等)
4. 设置内存大小和地址映射
5. 执行DDR校准(如需要)
6. 使能DDR控制器
串口是调试的重要工具,需要尽早初始化:
// 串口初始化示例
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环境尚未完全初始化时就能获取调试信息。
在开始实际移植工作前,请确认已完成以下准备工作: