由于地址只能在 I/O[7:0]上传递,因此,必须采用移位的方式进行。例如,对于 512Mbitx8
的 NANDflash,地址范围是 0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效
的。以 NAND_ADDR 为例:
第 1 步是传递 columnaddress,就是 NAND_ADDR[7:0],不需移位即可传递到 I/O[7:0]
上,而 halfpagepointer 即 A8 是由操作指令决定的,即指令决定在哪个 halfpage 上进行读写,
而真正的 A8 的值是不需程序员关心的。
第 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-stepaddressing。如果 NANDFlash 的
容量是 32MB(256Mbit)以下,那么,blockadress 最高位只到 bit24,因此寻址只需要 3 步。
下面,就 x16 的 NANDflash 器件稍微进行一下说明。由于一个 page 的 mainarea 的容量
为 256word,仍相当于 512byte。但是,这个时候没有所谓的 1sthalfpage 和 2ndhalfpage 之分
了,所以,bit8 就变得没有意义了,也就是这个时候 A8 完全不用管,地址传递仍然和 x8
器件相同。除了,这一点之外,x16 的 NAND 使用方法和 x8 的使用方法完全相同。
三、NANDflash 驱动解读
以前由于做移植多一些,那些工作很简单(现在看来),从来都不用去关心驱动里面到底
怎么实现的,这几次面试才发现真的是学的太浅了,似乎我还在学习仰泳而那些牛人基本都
属于潜水级的了,潜的不知有多深。我对照着开发板所带的 NANDflash 驱动和 k9f1208 的
芯片资料把这些代码通读了一遍,终于明白了 NANDflash 的读写过程是如何实现的了。我
所参考的驱动是 mizi 公司为三星芯片所写的,我看看了,大概和官方 2.4.18 内核的 nand.c
差不多。
在 s3c2410 处理器中有专门的 NANDflash 控制器,他们位于 SFR 区,具体可以参看
s3c2410 用户手册。以下的这些代码均可以在 vivi 或者 kernel 里面找到,文中会标明程序出
自何处。在 vivi 中,有关 NANDflash 的驱动都在 driver/mtd/nand/下,该目录中包含的源文
件:smc_core.c 是 NANDflash 的主要驱动。
NANDflash 芯片定义了一个很长的结构,这个结构中包含了操作 NANDflash 的函数和
一些必要的变量(include/mtd/nand.h)。
structnand_chip{
评论0
最新资源