项目3:故障诊断 - 模拟常见问题与解决方法
本项目将指导您模拟和解决U-Boot启动过程中的两个常见问题:DDR初始化失败和环境变量损坏。通过实践这些故障场景,您将掌握U-Boot故障诊断的基本方法和技巧。
DDR(Double Data Rate)内存是嵌入式系统中关键组件,U-Boot在启动早期就需要初始化DDR控制器和内存。DDR初始化失败会导致系统无法继续启动,是最常见的启动故障之一。
我们可以通过修改U-Boot源代码来模拟DDR初始化失败:
在板级配置文件(如board/yourboard/yourboard.c)中,故意修改DDR初始化参数:
/* 原始正确的DDR配置 */
struct dram_timing_info my_ddr_timing = {
.ddrc = {
.ddrc_config = 0xa1080020,
.ddrc_timing1 = 0x00204a22,
.ddrc_timing2 = 0x0b0e1c0d,
// ... 其他参数
},
// ... 其他配置
};
/* 修改为错误的配置 */
struct dram_timing_info my_ddr_timing = {
.ddrc = {
.ddrc_config = 0xa1080020,
.ddrc_timing1 = 0x00204a22,
.ddrc_timing2 = 0x0b0e1c0d,
.ddrc_timing3 = 0x00020208, // 故意修改这个参数
// ... 其他参数
},
// ... 其他配置
};
编译并烧写修改后的U-Boot,启动时可能会看到:
U-Boot 2023.04 (Jun 12 2023 - 15:30:45 +0800) CPU: i.MX6ULL rev1.2 528 MHz (running at 396 MHz) CPU: Industrial temperature grade (-40C to 105C) at 45C Reset cause: POR Board: MYBOARD I2C: ready DRAM: Timing calibration failed DDR initialization failed! ### ERROR ### Please RESET the board ###
专业提示: 许多SoC厂商提供DDR配置工具(如NXP的DRAM Calculator),可以自动生成正确的DDR配置参数,大大简化DDR初始化工作。
U-Boot环境变量通常存储在以下位置之一:
环境变量以CRC32校验和进行保护,损坏时会自动恢复为默认值。
使用Flash编程工具直接修改环境变量区域:
# 假设环境变量位于NAND Flash偏移0x100000处 nand erase 0x100000 0x20000 # 擦除环境变量区域 nand write 0x82000000 0x100000 0x20000 # 写入随机数据
在U-Boot命令行中,使用setenv命令后立即复位:
=> setenv testvar this_is_a_test => reset # 在环境变量写入完成前复位
环境变量损坏时,U-Boot启动会显示:
U-Boot 2023.04 (Jun 12 2023 - 15:30:45 +0800)
CPU: i.MX6ULL rev1.2 528 MHz (running at 396 MHz)
DRAM: 256 MiB
*** Warning - bad CRC, using default environment
MMC: FSL_SDHC: 0
In: serial
Out: serial
Err: serial
Net: FEC0
Hit any key to stop autoboot: 0
=>
saveenv备份过环境变量printenv导出环境变量到文件高级技巧: 可以通过修改CONFIG_ENV_OFFSET_REDUND配置冗余环境变量存储区,当主环境损坏时自动使用备份环境。