Chinaunix首页 | 论坛 | 博客
  • 博客访问: 906717
  • 博文数量: 70
  • 博客积分: 1741
  • 博客等级: 上尉
  • 技术积分: 2476
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-05 14:46
个人简介

全志全系列芯片产品方案开发 A20/A33/A64/A40/A60/A83/A63/H3/H5/H6/H8

文章存档

2018年(1)

2012年(20)

2011年(49)

分类: LINUX

2012-09-13 23:49:35

在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的地址映射图:


根据前面的启动过程分析,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

阅读(5388) | 评论(0) | 转发(6) |
给主人留下些什么吧!~~