这几天看了友善之臂的vboot的代码和s3c2440的一些spc。vboot代码中有几个地址一致让我很迷惑。
* 当vboot将arm初始化ok,nand flash也初始化ok后,它就从0x60000地址开发拷贝长度0x500000长度的linux kernel了。这个0x60000我查了下,按照arm地址空间看它应该在bank0的位置,但是系统从nand启动之后,0x00000000-0x08000000地址只有4K的arm内置sdram空间(0x00000000-0x00001000)有效,根本无法寻址到0x60000的地址。所以让我很郁闷。
最终结合下面的文章的讲解,和我以前用到过2M的nand flash的经验总结出:
nandflash一般无法直接挂在到arm的地址总线上,它是通过一个nand flash controller来控制的,数据的读取与存储都是通过它来完成。所以nand的地址空间与arm的地址空间是分开的。上面的0x60000地址是nand flash 中的地址,与arm的地址空间无关。
以下摘录至:http://fanwenjie.ok.blog.163.com/blog/static/124663205201163110549711/
S3C2440 开发板这个系统中,这三种存储芯片的地址是如何分配的呢?
首先看下图:
这是 S3C2440 的存储器地址分配图,SDARM 只能接在 BANK6 或 BANK7.从分析 SDRAM 接线的文章里的 SDRAM 接线图可以看到,SDRAM 接的是 ngcs6,
也就是接在 BANK6,因为选择的SDRAM 是 2 片 32Mbyte,总容量是64Mbyte,所以 SDRAM 的地址范围是0x3000 0000 --- 0x33ff ffff。
S3C2440 的 OM0,OM1 脚决定系统启动模式:
TQ2440开发板的 NOR FLASH 是 16bit 数据位宽,选择从NOR FLASH启动,所以 OM0 接 VDD,OM1 接 VSS,从分析 NOR FLASH 接线的文章里的接线图可以看到,NOR FLASH接的是ngcs0,也就是接在 BANK0.因为选择的 NOR FLASH是2Mbyte,所以NOR FLASH的地址范围是 0x0000 0000 --- 0x001f ffff。上电时,程序会从Norflash中启动,ARM 直接取 Norflash中的指令运行。最后来看 NAND FLASH,NAND FLASH 以页为单位读写,要先命令,再给地址,才能读到 NAND 的数据。NAND FLASH是接在 NAND FLASH 控制器上而不是系统总线上,所以没有在 8 个 BANK 中分配地址。如果 S3C2440 被配置成从 Nand Flash 启动, S3C2440 的Nand Flash 控制器有一个特殊的功能,在S3C2440 上电后,Nand Flash 控制器会自动的把Nand Flash 上的前 4K数据搬移到 4K内部SRAM 中,系统会从起始地址是 0x0000 0000 的内部 SRAM启动。 程序员需要完成的工作,是把最核心的启动程序放在 Nand Flash 的前 4K中,也就是说,你需要编写一个长度小于 4K的引导程序,作用是将主程序拷贝到 SDRAM 中运行。
由于Nand Flash控制器从Nand Flash中搬移到内部RAM的代码是有限的,所以在启动代码的前 4K里,我们必须完成 S3C2440 的核心配置以及把启动代码(U-BOOT)剩余部分搬到 RAM 中运行,至于将 2440 当做单片机玩裸跑程序的时候,就不要做这样的事情,当代码小于 4K的时候,只要下到nand flash中就会被搬运到内部 RAM 中执行了。 不管是从 NOR FLASH 启动还是从 NAND FLASH 启动, ARM都是从 0x0000 0000 地址开始执行的。