我的MINI2440上有一个256M的nand flash,后面我们需要从nand启动u-boot,然后引导加载内核,再挂载根文件系统,这里先对其做一个较为细致的认识。主要是硬件管脚定义,控制方式,处理器的控制寄存器对其做一个了解,因为现在市面上nand的用途比较广泛,数码相机,mp3都要使用,进入正题。
一.nand flash datasheeet
在移植好的u-boot下输入nand info会出现下面的信息:
Device 0: NAND 256MiB 3,3V 8-bit, sector size 128 KiB
这说明nand大小为256M,工作电压3.3v,数据总线为8位,扇区大小为128K。首先我们要明确,nand flash的读写原理。我们找找mini2440的原理图,以及nand flash的datasheet来简略分析下。这里我推荐一个datasheet的网站,叫easydatasheet,一般我需要看一个芯片手册都在里面下载。我们板子上的nand型号为:K9F2G08UOC-SCB0。
这里我们有两个地方是要看的,首先是features,也就是第四页,翻译过来如下:
电压:
3.3v的设备,工作范围在2.7~3.6之间
组织(Organization):
存储单元阵列:(256M + 8M) x 8bit
数据寄存器:(2K + 64) x 8bit
自动编程和擦除:
页面编程:(2K + 64)Byte
块擦除:(128K + 4K)Byte
页面读取操作:
页大小:(2K + 64)Byte
随机读:40μs(Max.)
串行读:25ns(Min.)
快速写周期时间:
页编程时间:250μs(Typ.)
块擦除时间:2ms(Typ.)
I/O口命令/地址/数据复用
硬件数据保护:
在电源转换时锁住编程/擦除操作
ECC校验要求:
1bit / 528bytes,命令驱动操作
总结一下上面部分,nand大小为256M,一页大小为2k,一块大小为128k,也就是一块包含64个页,一共256M,也就是有2048个块,256M需要多少28位来传送,但是只有8个I/O,所以要分多次传送,分几次呢?按照datasheet,要分五次。下面是网上找的存储结构图,我下载的datasheet里面没有这个图,但是交代了要分五次,每次怎么传,传的什么东西,都有介绍:
接着datasheet给出了各个引脚描述,在第8页的pin description,结合mini2440开发板的pcb 原理图,可以整理如下。
这里的引脚定义做了个表格如下:
信号编号 |
信号名称 |
信号功能描述 |
29-44 |
I/O0-I/O7 |
数据输入输出口,地址和数据总线(复用) |
7 |
R/B |
Read/busy output忙或者已准备 |
9 |
CE |
片选信号 |
16 |
CLE |
命令锁存,用在写操作时锁存写命令 |
17 |
ALE |
地址/数据锁存,在写时用来锁存地址或者数据 |
18 |
WE |
写有效使能,表示当前在写操作 |
8 |
RE |
读有效使能,表示当前正在读操作 |
6 |
SE |
悬空未知 |
13,16 |
VSS |
公共接地端 |
19 |
WP |
写保护,这里连接VDD表示允许正常读写 |
12,37 |
VCC |
器件工作电压输入端 |
再下面,第9页,一开始给出了一段描述,叫production introduction,也就是产品介绍,主要讲了使用了8位复用I/O是为了降低引脚,方便升级,然后各个指令需要几个周期,引脚的电平在读写时高低有何要求,写地址、数据、命令时,CE、WE信号必须为低电平,它们在 WE信号的上升沿被锁存。命令锁存使能信号CLE和地址锁存使能信号ALE用来区别IO引脚上传输的是命令还是地址,这个都可以自己去阅读。
下面给出了各个控制命令写入命令寄存器的格式:
所以我们会看到这些宏定义:
#defineCMD_READ1 0x00 //页读命令周期1
#defineCMD_READ2 0x30 //页读命令周期2
#defineCMD_READID 0x90 //读ID命令
#defineCMD_WRITE1 0x80 //页写命令周期1
#defineCMD_WRITE2 0x10 //页写命令周期2
#defineCMD_ERASE1 0x60 //块擦除命令周期1
#defineCMD_ERASE2 0xd0 //块擦除命令周期2
#defineCMD_STATUS 0x70 //读状态命令
#defineCMD_RESET 0xff //复位
#defineCMD_RANDOMREAD1 0x05 //随机读命令周期1
#defineCMD_RANDOMREAD2 0xE0 //随机读命令周期2
#defineCMD_RANDOMWRITE 0x85 //随机写命令
再下面,在第11页,给出了各个模式的时候,控制引脚的电平状态:
在后面给出了时序图,读写校验等的流程图,这里不多做赘述了。
二.S3C2440 and flash控制寄存器
S3c2440的nand flash控制器主要有以下6个,下表列出了其名称,作用,地址。
寄存器名称 |
地址 |
作用 |
NFCONF:配置寄存器 |
0x4E000000 |
设置NAND Flash的时序参数,设置数据位宽,设置是否支持其他大小的页等 |
NFCONT:控制寄存器 |
0x4E000004 |
使能NAND Flash控制器、使能控制引脚信号nCE、初始化ECC,锁定NAND Flash等功能 |
NFCMD:命令寄存器 |
0x4E000008 |
发送Flash操作命令 |
NFADDR:地址寄存器 |
0x4E00000C |
向Flash发送地址信号 |
NFDATA:数据寄存器 |
0x4E000010 |
读写此寄存器启动对NAND Flash的读写数据操作 |
NFSTAT:状态寄存器 |
0x4E000020 |
0:busy,1:ready |
一般,对于控制器来说,nand相当于一个外围设备,就像我们操作lcd一样,其实有点像,步骤大多都是配置,给命令,给地址,检测状态,读写数据,over。这里对nand flash的操作步骤总结如下:
第一步:设置NFCONF配置NAND Flash。
第一步:向NFCMD寄存器写入命令。
第三步:向NFADDR寄存器写入地址。
第四步:通过寄存器NFSTAT检测NAND Flash的状态。
第五步:通过NFDATA读写数据,并进行校验。
下面附上读操作的时序图,以及流程图,操作nand就是根据这两个图来进行细致的步骤,后面我们会用得到。
这篇帖子就分析到这里吧,有不正确的地方还请指出,大家共同进步。