uboot如何检测XC2440是从Nand或Nor启动

时间:2023-12-29 20:48:38

转:http://blog.chinaunix.net/uid-22030783-id-3347621.html

在XC2440开发板上做uboot从nandflash启动时,需要检测硬件启动方式,启动方式是由硬件OM管脚决定的,软件无法检测硬件电平状态,但可以根据CPU的启动特性来检测。
通过深入研究2440的启动方式,总结了几点:
如果将S3C2440配置成从NANDFLASH启动(将开发板的启动开关拔到nand端,此时OM0管脚拉低)S3C2440的Nand控制器会自动把Nandflash中的前4K代码数据搬到内部SRAM中(地址为0x40000000),同时还把这块SRAM地址映射到了0x00000000地址。CPU从0x00000000位置开始运行程序。
如果将S3C2440配置成从Norflash启动(将开发的启动开关拔到nor端,此时OM0管脚拉高),0x00000000就是norflash实际的起始地址,norflash中的程序就从这里开始运行,不涉及到数据拷贝和地址映射
看S3C2440的地址映射图:
uboot如何检测XC2440是从Nand或Nor启动
根据前面的启动过程分析,nand启动时,地址0x00000000为SRAM映射的地址;nor启动时,地址0x00000000为norflash的实际起始地址。向norflash中写数据需要特定的命令时序,而向内存中写数据可以直接向内存地址赋值。
根据这两个特性,我们可以这样检测,代码如下:
  1. int check_flashboot_mode(void)
  2. {
  3. volatile unsigned int *pdw = (volatile unsigned int *)0;
  4. unsigned int dwVal;
  5. dwVal = *pdw;
  6. *pdw = 0x12345678;
  7. if (*pdw != 0x12345678)
  8. {
  9. return 1;
  10. }
  11. else
  12. {
  13. *pdw = dwVal;
  14. return 0;
  15. }
  16. }
用volatile声明一个寄存器变量*pdw指向的是0地址。向0地址处写一串数据,比如0x12345678,*pdw = 0x12345678,接着再从0地址中把数据读回来。
因为nor启动时,0地址是norflash的起始址,而向norflash写数据需要特定的命令时序,所以直接给地址赋值是不起做用的,所以读回来的数据还是norflash中原有的数据,这样通过*pdw != 0x12345678判断,此时为nor启动。
而在nand启动时,0地址是内存的地址映射,可以用直接赋值的方法向内存中写入数据,接着从0地址读回来的数据变为0x12345678,和之前写入的数据相等,此时就为nand启动,在操作完后,要将数据还原 *pdw = dwVal