Windows下u-boot-2011.03在Mini2440移植详解(7)

来源:互联网 发布:plc三种编程语言 编辑:程序博客网 时间:2024/05/05 04:48

Nand Flash 启动 && Nor FlashNand Flash双启动

Nand Flash启动

参考网址: http://blog.csdn.net/canjiangsu/article/details/6162677

http://blog.chinaunix.net/uid-28335137-id-3721851.html

http://www.cnblogs.com/LoongEmbedded/archive/2010/11/18/1880379.html

http://www.crifan.com/switch_s3c2410_nandflash_k9f1208u0ak9f1208u0b_read_operation/

板子上的Nand Flash信息:K9F1208U0B:64MB,8位。1页包含512字节的main数据区和16字节的spare数据区。有4096块,每块32页,每页512+16个字节。

烧写到Nor flash的uboot代码可以直接在Norflash里运行,即所谓的XIP(eXecute In Place),那nand flash里的程序可以直接在nand flash里运行么?这个http://www.crifan.com/order_is_not_suitable_for_nand_flash_why_do_xip_execute_in_place/网址上说了,不是不可以在nand flash中运行程序,而是不适合。因此S3C2440A为了能够从Nand Flash引导程序,就采用了steppingstone模式。

S3C2440A关于Nand Flash控制器的说明:(摘自DataSheet Nand Flash控制器一节)

目前的NOR Flash 存储器价格较高,相对而言SDRAM和NAND Flash存储器更经济,这样促使了一些用户在NAND Flash中执行引导代码,在SDRAM中执行主代码。S3C2440A引导代码可以在外部NAND Flash存储器上执行。为了支持NAND Flash的BootLoader,S3C2440A配备了一个内置的SRAM缓冲器,叫做“Steppingstone”。引导启动时,NAND Flash存储器的开始4K字节将被加载到Steppingstone中并且执行加载到Steppingstone的引导代码。通常引导代码会复制NAND Flash的内容到SDRAM中。通过使用硬件ECC,有效地检查NAND Flash数据。在复制完成的基础上,将在SDRAM中执行主程序。

管脚说明:


下面是Mini2440的Nand Flash相关原理图:



所以硬件如果连接好了,那么也就固定了你所能连接Nand Flash的类型了。

关于K9F1208U0B Nand Flash部分操作:

K9F1208U0B是以页为单位进行读写,以block为单位进行擦除。我们知道K9F1208U0B它有4096块,每块32页,每页512+16个字节。4096*32*(512+16)=528Mbits。2^12=4096,2^5=32,2^10=1024>(512+16)。不算spare区,该nand flash的大小为4096*32*512Bytes=64MBytes。我们知道2^26=64Mbytes。即:要想读取该nand flash里的数据,至少需要26根寻址线。从该nand flash的手册中我们看到:


这里面只用到了25根寻址线,A8没有使用。那岂不是只能操作该flash 32Mbytes空间?而从该nand flash的命令集中发现,对一页512Bytes的操作分两部分,需要两个命令来进行,因此这里面虽然只有25根寻址线,却能寻址64Mbytes的内容。



s3c2440支持两种启动模式:NAND和非NAND(这里是nor flash)。

具体采用的方式取决于OM0、OM1两个引脚

OM[1:0所决定的启动方式

OM[1:0]=00时,处理器从NAND Flash启动

OM[1:0]=01时,处理器从16位宽度的ROM启动

OM[1:0]=10时,处理器从32位宽度的ROM启动。

OM[1:0]=11时,处理器从Test Mode启动。

 


从该Nand Flash数据手册上可知,第517个字节代表该块是否坏块,也就是OOB的第6个字节。如果是0xFF,代表是好块,如果不是0xFF,则是坏块。

 

在简单介绍完有关Nand Flash启动,也应该简要说一下如何从Nand Flash启动。

这和Nor Flash启动非常相似。刚上电时,2440自动将Nand Flash的前4kB复制到Steppingstone然后在Steppingstone运行,在Steppingstone实现SDRAM的初始化,拷贝后面的代码到SDRAM,之后的操作和Nor Flash无差别。Nand Flash前4kB的代码无需做ECC校验,这段代码的正确性由NandFlash厂家承诺。之后代码的ECC校验由开发人员自己实现。

 

修改相关文件:

1.      u-boot-2011.03\arch\arm\cpu\arm920t\start.S

2.      u-boot-2011.03\board\samsung\mini2440\nand_flash_read.c

3.      u-boot-2011.03\board\samsung\mini2440\Makefile

4.      u-boot-2011.03\arch\arm\cpu\arm920t\u-boot.lds

5.      u-boot-2011.03\include\configs\mini2440.h

 

nand_flash_read.c为新加的文件,用来读取Nand Flash程序到SDRAM,start.S用来实现调用nand_flash_read.c内的函数。mini2440.h用来定义环境变量存到哪个存储器里。从Nand Flash里启动,所以将环境变量存入到Nand Flash里。

比较重要的是前4kB的代码中不能有使用大于4kB之外的变量或函数,可以通过查看根目录下的u-boot-2011.03\System.map来确认。

 

如何将代码下载到Nand Flash里呢?在《增加Nand Flash的支持》一节中说明了。在调试状态下,只要用nand erase,tftp和nand write这3个命令就可以将目标文件写入到目的nand flash地址出。作者用的如下:

nand erase 0x00 0x4B000

tftp 0x30800000 u-boot.bin

nand write 0x30800000 0x00 0x48000

其实关于怎么去操作nand flash,上面贴出来的网址可以详细的看看。在这里其实已经实现了自动识别从nor还是nand启动,只是环境变量的保存都是在Nand Flash中。

 

本部分代码下载地址:360云盘http://yunpan.360.cn/,在《Uboot相关代码》文件夹里的《u-boot-2011.03_NandFlash启动.zip》文件。

《u-boot-2011.03源码无修改.tar.bz2》是从官网下的无修改代码

 


Nor FlashNand Flash双启动

在前面的过程中已经实现了自动从Nor 还是Nand 启动,只是环境变量的保存都是保存到了Nand Flash中。现在就实现从哪个存储器启动,环境变量就保存到哪个存储器里。主要参考了这个网址:

http://www.eefocus.com/ayayayaya/blog/10-10/196848_87e6f.html

这个网址http://blog.csdn.net/flytreeleft/article/details/6793126也可以看看。两个实现的方法不太一样。

修改相关文件:

1.      u-boot-2011.03\arch\arm\lib\board.c

2.      u-boot-2011.03\common\env_flash.c

3.      u-boot-2011.03\common\env_nand.c

 

为什么修改了board.c文件?

由于env_nand.c 文件里的env_init函数会在board.c文件的board_init_f函数里调用,这里面用到了是nand还是nor启动的标记,因此必须再调用env_init之前将标记赋值。

在board.c文件的board_init_r函数里为什么又将此标记赋值?

在这个版本的uboot代码中,board_init_f是没有重映射之前的函数,到了board_init_r就是重映射之后的函数了。重映射是在函数board_init_f之后,函数board_init_r之前做的。因此这个标记还必须再次赋值。

 

Note:

当然必须将宏CONFIG_ENV_IS_IN_NAND和CONFIG_ENV_IS_IN_FLASH都定义上,这一步在《Nand Flash 启动》一节中已经做过了。

编译后分别下载到nand和norflash中。启动如下图:

Nand Flash启动。


Nor Flash启动。


本部分代码下载地址:360云盘http://yunpan.360.cn/,在《Uboot相关代码》文件夹里的《u-boot-2011.03NorNand启动.zip》文件。

《u-boot-2011.03源码无修改.tar.bz2》是从官网下的无修改代码


至此,实现了Nor Flash和Nand Flash的双重启动。

关于是否能够正确引导Linux,还需进一步调试。
0 0