http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=823970&bbs_id=1000
我写三星K9G4G08U0A 4G NAND FLASH 存储器驱动时,发现读写(以page为单位),擦除(以block为单位)地址不好确定呀.. 网上有528byte/page NAND Flash的地址可表示为: “Block Address|Page Address in block|halfpage pointer|Column Address 地址传送顺序是Column Address,Page Address,Block Address。 由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。 例如,对于512Mbit x8的NAND flash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。 以NAND_ADDR为例: 第1步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上 而halfpage pointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写, 而真正的bit8的值是don't care的。 第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:9]传到I/O[7:0]上 第3步将NAND_ADDR[24:17]放到I/O上 第4步需要将NAND_ADDR[25]放到I/O上 因此,整个地址传递过程需要4步才能完成,即4-step addressing。 如果NAND Flash的容量是256Mbit以下,那么,block adress最高位只到bit24,因此寻址 只需要3步。 那么对2k大页面K9G4G08U0A 怎么确定任意一个page,block地址呢, 数据手册里说明用五个字节表示,前两个字节为Column Address, 后三个字节是Row Address,可是没有说明地址具体怎么分配? 请高手指点
------------------------------------
搜到这的这里。觉得之前对我有点帮助,所以才回来回复的。现在我基本明白了nand flash是如何读写的。回答你的问题:拿我这个是 samsung的nand flash 型号是K9K8G08U0A,大小是1G的,8bit的来说明。具体其datasheet你可以到网上下载。按照其说明,一共有
8,448Mbit(8,858,370,048 bit)=524,288 rows(pages) X 2,112x8 columns其中x8是因为这个是8bit的nand flash也就是一共524288行,2112列。
具体参数
1 Block = 64 Pages(128K + 4k) Byte
1 Page = (2K + 64)Bytes1 Block = (2K + 64)B x 64 Pages= (128K + 4K) Bytes1 Device = (2K+64)B x 64Pages x 8,192 Blocks= 8,448 Mbits
一个chip共512K Pages(=8,192 Blocks)
具体访问时的顺序:
I/O 0 1 2 3 4 5 6 71st Cycle A0 A1 A2 A3 A4 A5 A6 A7 Column Address2nd Cycle A8 A9 A10 A11 *L *L *L *L Column Address3rd Cycle A12 A13 A14 A15 A16 A17 A18 A19 Row Address4th Cycle A20 A21 A22 A23 A24 A25 A26 A27 Row Address5th Cycle A28 A29 A30 *L *L *L *L *L Row Address
所以,
对于page,和block的地址,就很好确定了。只需要在函数中将传入的参数要读/写的地址,函数中用page表示,除以页的大小pagesize,就是要访问的真正的页数了将地址除以block的大小,也就是要访问的block数了。
对于读写需要的是行和列的地址,也就是:行=page数列=0x00就可以找到对应的page,然后进行编程了。
每次送进去行和列之后,按照上面描述的,前两次传列地址,后三次传行地址就可以了。
说得很乱,没看懂的话,有空一起讨论 green-waste@163.com
---------------------------------------
上面的列写错了列地址=传入地址 & (pagesize-1)
代码中的例子,如col = from & (mtd->oobblock - 1);其中col是列地址from是传入的地址,从哪里开始读的地址mtd->oobblock 等于pagesize,比如我这个nand flash的页大小是2KB,2KB = 0x8000x800-1=0x7FF
详见:uboot源码中的 /drivers/nand/nand_base.c 中的nand_read_ecc()
其实列地址页就是页内的偏移量,页内地址
有空可以看看这个帖子:MTD原始设备与FLASH硬件驱动的对话http://www.cnitblog.com/luofuchong/archive/2007/09/04/32939.htmlhttp://www.cnitblog.com/luofuchong/archive/2007/08/31/32682.html