首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

关于s3c2440从nand flash的困惑

2013-01-19 
关于s3c2440从nand flash的疑惑我知道2440从nand flash启动的时候会先由硬件把前4K的代码搬到片内的sram中

关于s3c2440从nand flash的疑惑
我知道2440从nand flash启动的时候会先由硬件把前4K的代码搬到片内的sram中去,然后从片内的sram开始运行,再把nand flash中的程序搬到外部sdram里面去,然后程序由内部sram跳到外部sdram去执行,这里我就有个疑惑,把程序从nand flash搬到外部sdram的时候,已经搬到内部sram的那4K还要搬吗?
还有一个问题,也是我最想问的问题,程序从nand flash搬到外部sdram后,中断向量表应该有两份吧,一份在片内sram(地址0x00000000)的起始地址处,一份在片外的sdram中(地址0x30000000),当发生中断的时候,PC会跳到地址0处,如果已经初始化了MMU的话,程序会跳到映射后的地址,也就是0x30000000处,这样的话,中断程序理所当然可以正常执行。但是,如果没有开MMU的话,程序跳到物理地址的0x00000000处,这里也有一份中断向量表啊,应该也能够正常的跳到中断函数去执行啊,可是为什么事实不行呢?手册上有说这4K的sram在启动后可以用作其他用途,但是我没有用啊,那内容应该还是原来的内容,那为什么不能正常跳到中断函数里去呢?问题在哪里?小弟用的是天嵌的开发板,前几天刚到手的。
[解决办法]
嗯,认真看了一下你的描述。

先说第一个问题吧:
从u-boot-2012.10源码中我开发板的情况来看是没有复制前4K的内容的,注意下面函数的第二个参数。
板配置文件中的宏定义:
#define CONFIG_SYS_NAND_U_BOOT_OFFS(4 * 1024)
加载nand中的u-boot到dram的加载函数的声明。
//函数声明
static int nand_load(struct mtd_info *mtd, unsigned int offs,
     unsigned int uboot_size, uchar *dst)
//加载nand中的u-boot到dram的加载函数调用
nand_load(&nand_info, CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
  (uchar *)CONFIG_SYS_NAND_U_BOOT_DST);

这是u-boot关于nand起动的通常情况。但具体的要看你开发板对于这个功能的实现,以及对于u-boot镜像的构造情况。

通常的nand起动的镜像是由根目录下的u-boot和nand_spl下的u-boot-spl这两部分的所构成的。从根目录makefile中的目标可以看出这个过程:
$(obj)u-boot-nand.bin:nand_spl $(obj)u-boot.bin
cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin

还是那句话,这是通常情况…………

第二种情况,前面说了一点,我开发板运行于SRAM的4K代码是没有中断向量的也没有中断处理程序。至于开MMU,后我开发板的地址映射是0x0 - 0xA000000的虚拟地址和实地址是一一映射,所以有点糊涂了,脑袋一时转不过了……^_^

热点排行