uboot1.1.4与NAND FLASH(k9f2g08u0a)

    k9f2g08u0a(NAND FLASH)一页大小虽为2KB+64B,但却占用了4KB地址空间.(也就是 实际写入/读取NAND的地址=程序中给定地址/2,这里程序中给定地址就是写到s3c2440的nand地址寄存器的值,实际写入/读取NAND的地址是指:将NAND看作一个只有有效数据(不包括spare区)的连续存储体)
举个例子:假设内存0x32000000开始有2KB数据,要将其写入到NAND(k9f2g08u0a)的第2页(按页号从0开始):
则认为 实际写入NAND的地址=3*2048=6144=0x1800,但在程序中我们给NAND的地址应该为=2*0x1800=0x3000,这样才能将这2KB写入NAND的第2页.

    在uboot1.1.4中的NAND驱动,是按照 实际写入/读取NAND的地址=程序中给定地址,假设内核启动代码中有这样几行:
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00080000 : "u-boot"
0x00080000-0x00280000 : "kernel"
0x00280000-0x10000000 : "yaffs"
那么我用uboot的命令nand read将内核(由内核启动信息看到内核在NAND中地址为0x00080000-0x00280000)从NAND读到内存时,就应该这么读nand read 0x32000000 0x100000 0x200000
其中0x32000000是指读到内存中的首地址,0x100000是内核在NAND中首地址(这个地址可以理解为程序中给定地址)=2*0x80000,0x200000为读取数据大小.
也就是说内核启动信息中给定的0x00000000,0x00080000,0x00280000,0x10000000是指实际写入/读取NAND的地址.

    用nand write写同理.

    因为uboot1.1.4中nand在1 block中连续写/读页时换页是通过page++实现的,所以只要给定正确的起始地址,在起始地址所在的这1 block中不会产生上述错误的页起始地址.但是因为每次最多通过page++机制写/读1 block的数据,在需要写/读紧接着的下1 block时,nand_rw函数通过start  += n来改变block起始地址,如果之前读了一整块(1 block),那么这里的n指的是1 block大小,即0x20000,由上面可以看出start  += n会得到错误的下一块的起始地址,应改为start  += 2*n.

    k9f2g08u0a的spare区数据写/读和uboot1.1.4中spare区数据写/读写区别较大,就不写了.

你可能感兴趣的:(c,Flash,存储)