S3C6410和2440的NAND启动流程大体一样,也有一些区别。这篇文章主要目的是梳理下S3C6410 NAND启动流程,也给这几天的学习来个总结。
S3C6410主存的地址范围为 0x0000_0000~0x6FFF_FFFF。主存部分分成四个区域:引导镜像区,内部存储去,静态存储区和动态存储区。
引导镜像区的地址范围是从0x0000_0000~0x07FFF_FFFF,但是没有实际的映射内存,引导镜像区反映一个镜像,这个镜像指向内存的一部分区域或者静态存储区。引导镜像的开始地址是0x0000_0000。
内部存储区用于启动代码访问内部ROM和内部SRAM,也被称为Steppingstone。内部ROM地址范围为0x0800_0000~0x0bff_ffff,为只读,当内部ROM启动被选中时,该区域能映射到引导镜像区。内部RAM地址范围为0x0c00_0000~0x0fff_ffff,可读写,当NAND启动被选择时,能映射到引导镜像区。
(图中steppingstone 4K是错误的,不知道为什么,有的芯片资料说是4K,有的说是8K,我请教过别人都是说8K,并且在内部SRAM设置sp为8*1024程序能正常跑,说明8K没有超出范围)
启动流程:
给板子上电之后,硬件会将nand前8K代码拷贝到steppingstone中,steppingstone会映射到引导镜像区,代码从0x0地址开始执行。可以通过这段启动代码将uboot等加载进SDRAM,实现更多功能。
这里有个小问题困扰了很久,因为这点跟2440不同,就是为什么nand里8K拷贝进steppigstone后程序从0地址开始跑,而不是0x0c00_0000(steppingstone 地址0x0c00_0000),后来又看了芯片资料,steppingstone会映射到引导镜像区,引导镜像区在映射之前是不指向实际内存地址的。我做了个测试,当8K拷贝完后,我将PC指针分别指向0x0,和0x0c00_0000去执行,发现执行的代码是一样的。所以以0x0,和0x0c00_0000为起始地址的8K代码其实是一样的,都是指向物理地址为0x0c00_0000的这段代码。