关于Uboot的NOR boot 或NAND boot问题---基于TQ2440

关于Uboot的NOR boot 或NAND boot问题---基于TQ2440(转载)
好久没动开发板了,终于把研考完了,可以安心的做自己的实验了,但发现放下手头关于tq2440的实验两个多月,发现生疏了许多,许多问题都要想一下才能记起来是什么原理,真得抓紧时间好好弄了。

又从uboot开始弄,以前移植了uboot1.3.1,由于太多匆忙,没有过多的注重细节,今天发现了一个以前忽略的问题,就是开发板自己判断是从何种flash介质启动的问题,首先说一下为什么要判断是哪种flash介质启动,因为这样就没有必要区分nor boot还是nand boot的bin文件了,bin文件烧到nor和nand都可以正常启动开发板。

在网上看了下别人关于nor boot或nand boot 的文章,发现Tekkaman Ninja写的文章非常好,很值得推荐,附上地址,以便以后查找:http://blog.chinaunix.net/u1/34474/showart.php?id=2085212

下面来分析下天嵌公司的uboot,据Tekkaman Ninja说,天嵌的uboot是从openJTAG的uboot 借鉴过来的,这个我们姑且不管他。贴下天嵌TQ2440的uboot中关于启动判断的代码:

int bBootFrmNORFlash(void)
{
volatile unsigned int *pdw = (volatile unsigned int *)0;
unsigned int dwVal;

dwVal = *pdw;
*pdw = 0x12345678;
if (*pdw != 0x12345678)
{
return 1;
}
else
{
*pdw = dwVal;
return 0;
}
}

这段代码的思想是这样的,无论是从NOR Flash还是从NAND Flash启动,地址0处为指令"b Reset", 机器码为0xEA00000B,对于从NAND Flash启动的情况,其开始4KB的代码会复制到CPU内部4K内存中,对于从NOR Flash启动的情况,NOR Flash的开始地址即为0。对于NOR Flash,必须通过一定的命令序列才能写数据,所以可以根据这点差别来分辨是从NAND Flash还是NOR Flash启动:向地址0写入一个数据,然后读出来,如果没有改变的话就是NOR Flash。

我们在深入的分析下,首先看下nand boot 和nor boot 时物理地址分配情况:




从NAND闪存启动U-BOOT的设计思路

如果s3c2440被配置成从NAND闪存启动,上电后,s3c2440的NAND闪存控制器会自动把NAND闪存 中的前4K数据搬移到内部RAM中, 并把0x00000000设置为内部RAM的起始地址, CPU从内部RAM的0x00000000位置开始启动。因此要把最核心的启动程序放在NAND闪存的前4K中。

当nor boot时,0x0000_0000是nor flash的起始地址,用语句*pdw = 0x12345678; 向0x0000_0000处写0x12345678,是没用的,因为对于NOR Flash,必须通过一定的命令序列才能写数据,所以*pdw中存的数据仍然是"b Reset",但当nand flash启动时,cpu内部的4KBbootSRAM被映射到0x0000_0000开始的地址处,norflash这时无效了,这时用语句*pdw = 0x12345678; 向0x0000_0000处写0x12345678时,0x12345678会被写入,因为这是对内存的操作,不需要指令序列等,所以一旦发现写入和读出 的数据一致时,则可判断是nand boot,这时一定要把0x0000_0000处的数据还原,用*pdw = dwVal; 这句。

明天看看,得重新移植uboot了,好好研究研究,uboot很高深啊!!

http://blog.sina.com.cn/s/blog_52009a100100hcv1.html

你可能感兴趣的:(关于Uboot的NOR boot 或NAND boot问题---基于TQ2440)