UBoot初始化DDR解析:内存地址范围与配置

需积分: 9 1 下载量 2 浏览量 更新于2024-08-05 收藏 7KB TXT 举报
"uboot第一阶段初始化DDR的详细解析" 在深入探讨UBOOT的第一阶段时,我们关注的是如何初始化DDR(Double Data Rate)内存。DDR是嵌入式系统中常用的高速RAM类型,对于启动过程至关重要。在UBOOT的源代码中,这个过程由函数`mem_ctrl_asm_init`执行,它位于`uboot/cpu/s5pc11x/s5pc110/cpu_init.S`文件内。此函数与裸机初始化DDR的代码非常相似,实际上,很多裸机项目中的DDR初始化代码就是直接或间接地从这里借鉴的。 DDR的配置值对它的正确工作至关重要。在裸机环境中,我们可能会遇到一个配置值,如`DMC0_MEMCONFIG_0`,被设置为0x20E01323,而在UBOOT中,这个值变成了0x30F01313。这个差异会导致DDR映射的内存地址范围发生改变。在裸机环境下,DMC0的256MB内存地址范围为0x20000000-0x2FFFFFFF,而在UBOOT中,则变为0x30000000-0x3FFFFFFF。这种变化表明,尽管DDR的实际容量没有变,但其在系统地址空间中的位置已经移动。 这种调整的原因在于,S5PC110 SoC允许在20000000到3FFFFFFF的地址范围内配置256MB的内存,而不仅仅局限于2开头的地址。因此,UBOOT选择了一个3开头的地址,确保了更大的可用物理地址范围:0x30000000-0x4FFFFFFF,总计512MB,其中30000000-3FFFFFFF对应DMC0,40000000-4FFFFFFF对应DMC1。 为了适应不同的系统时钟配置,内存的配置值在`x210_sd.h`文件的438至468行之间定义,并且使用条件编译进行管理。这意味着,无论客户的具体时钟需求如何,都可以找到适合的内存配置。 UBOOT的第一阶段还涉及栈的设置。在DDR初始化之前,程序运行在SRAM中,因此在`start.S`的284-287行中首次设置了栈。然而,随着DDR的初始化完成,栈需要迁移到DDR中,所以在`start.S`的297-299行进行了第二次设置,将栈地址设定为0x33E00000,这个地址位于UBOOT的地址空间内。 UBOOT的第一阶段包含了DDR的初始化和栈的迁移,这些操作确保了系统在加载后续代码和执行过程中能够正确地使用DDR内存和栈空间,从而为系统的稳定运行奠定了基础。理解这些细节对于进行UBOOT的移植、优化或故障排查至关重要。