三、NAND flash驱动解读
以前由于做移植多一些,那些工作很简单(现在看来),从来都不用去关心驱动里面到底怎么实现的,这几次面试才发现真的是学的太浅了,似乎我还在学习仰泳而那些牛人基本都属于潜水级的了,潜的不知有多深。我对照着开发板所带的NAND flash驱动和k9f1208的芯片资料把这些代码通读了一遍,终于明白了NAND flash的读写过程是如何实现的了。我所参考的驱动是mizi公司为三星芯片所写的,我看看了,大概和官方2.4.18内核的nand.c差不多。
在 s3c2410处理器中有专门的NAND flash控制器,他们位于SFR区,具体可以参看s3c2410用户手册。以下的这些代码均可以在vivi或者kernel里面找到,文中会标明程序出自何处。在vivi中,有关NAND flash的驱动都在driver/mtd/nand/下,该目录中包含的源文件:smc_core.c是NAND flash的主要驱动。
NAND flash 芯片定义了一个很长的结构,这个结构中包含了操作NAND flash的函数和一些必要的变量(include/mtd/nand.h)。
struct nand_chip {
#ifdef CONFIG_MTD_NANDY /* =y */
void (*hwcontrol)(int cmd);
void (*write_cmd)(u_char val);
void (*write_addr)(u_char val);
u_char (*read_data)(void);
void (*write_data)(u_char val);
void (*wait_for_ready)(void);
int page_shift;
u_char *data_buf;
u_char *data_cache;
int cache_page;
struct nand_smc_dev *dev;
u_char spare[SMC_OOB_SIZE];
#else /* CONFIG_MTD_NANDY */
……
#ifdef CONFIG_MTD_NAND_ECC
u_char ecc_code_buf[6];
u_char reserved[2];
#endif
#endif /* CONFIG_MTD_NANDY */
};
纵观对NAND flash的各种操作(read、write、erase),无外乎如下几种操作:
1.选择flash nand_select()
2.发送命令 nand_command()
3.进行相应操作 read,write……
4.反选NAND flash nand_deselect()
下面是以上四步的实现代码:
1、选择NAND flash
#define nand_select() this->hwcontrol(NAND_CTL_SETNCE);
nand_command(mtd, NAND_CMD_RESET, -1, -1);
udelay (10);
hwcontrol(NAND_CTL_SETNCE) 的作用是设置2410的NAND FLASH CONFIGURATION (NFCONF) REGISTER的NAND Flash Memory chip enable位为0,这位寄存器在自动重启后就被系统自动清零。如果要访问NAND flash的内存,这位必须置1。
nand_command(mtd, NAND_CMD_RESET, -1, -1);向flash发送命令,此命令为reset,即为重置NAND flash。
然后是10us的延迟,给flash个反应时间。
2、发送命令
Nand_command()同样在smc_core.c中实现。NAND flash的命令有如下几种:
命令 命令值 描述
NAND_CMD_READ0 0 读操作
NAND_CMD_READ1 1 读操作
NAND_CMD_PAGEPROG 0x10 页编程操作
NAND_CMD_READOOB 0x50 读写OOB
NAND_CMD_ERASE1 0x60 读写操作
NAND_CMD_STATUS 0x70 读取状态
NAND_CMD_STATUS_MULTI 0x71 读取状态
NAND_CMD_SEQIN 0x80 写操作
NAND_CMD_READID 0x90 读Flash ID号
NAND_CMD_ERASE2 0xd0 擦写操作
NAND_CMD_RESET oxff 复位操作
按照程序的注释,可以将该函数的实现分为如下几步:
1、Begin command latch cycle
实现代码:
this->hwcontrol(NAND_CTL_SETCLE);
this->hwcontrol(NAND_CTL_DAT_OUT);
找到第二条语句的定义,发现什么都么做,不解!!希望达人解答。我猜想可能是一个数据读出的使能操作,允许数据读出。
Command Latch Enable(CLE) and Address Latch Enable(ALE) are used to multiplex command and address respectively, via the I/O pins. The CLE input controls the path activation for commands sent to the command register. When active high, commands are latched into the command register through the I/O ports on the rising edge of the nWE signal. 看了这段英文相信对第一条语句的作用已经十分清楚了,他就是用来控制向命令寄存(COMMAND SET (NFCMD) REGISTER)发送命令的。
2、 Write out the command to the device
这部分对于不同的命令来说,操作的步骤也不太相同,如果为写操作,那么还有根据flash不同的容量决定操作步骤,具体可以参看代码。如果为其他命令,那么就是简单的一行:
this->write_cmd (command);
将命令直接想到命令寄存器(NFCMD[7:0])中。
3、 Set ALE and clear CLE to start address cycle & Serially input address
1中已经提到了ALE和CLE的作用,现在开始发送地址。
实现代码:
this->hwcontrol(NAND_CTL_CLRCLE); // clear the command latch enable
this->hwcontrol(NAND_CTL_SETALE); // set the address latch enable
然后按位操作,是用函数write_addr()将地址写到NAND FLASH ADDRESS SET (NFADDR) REGISTER中。
4、 Latch in address
实现代码:
this->hwcontrol(NAND_CTL_CLRALE);
this->hwcontrol(NAND_CTL_DAT_IN);
地址发送完毕,清楚ALE。
5、 Pause for 15us
我使用的VIVI中,使用udelay (15)延时15us,但这个时间会因NAND Flash的不同而不同。
三、运行Operating
根据函数的不同,操作部分会不一样,但是主要的是对NAND FLASH DATA (NFDATA) REGISTER的操作,或写(编程)或者读。通过读或写函数的参数来返回或传递读出的值或写入的值。写得操作通常比较麻烦,他要将写到flash的内容重新读出后进行ECC校验,如果数据正确则在重新真正的写(编程),如果错误,则将数据写入flash的另一个块。读和写都是以页为单位进行操作。而擦除则以块为单位,三个周期发送完地址。擦除完毕后同样需要进行检察以确定是否擦除成功。
四、取消选择NAND设备(De-select the NAND device)
实现代码:
#define nand_deselect() this->hwcontrol(NAND_CTL_CLRNCE);
反选flash吧,不知这样叫正确与否,跟select the NAND device相反,亦即使用完后将使能flash位清0,代码是NFCONF位于0x4e00_0000的位置(NFCONF |= NFCONF_nFCE_HIGH;),有兴趣的可以读读代码,看看这是怎么实现的,我的感觉就是关于寄存器的清置读起来都比较晕。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
![TechTarget微信公众号二维码](/wp-content/uploads/res/images/spriteimg/ttweixin.jpg)
TechTarget
官方微博
![TechTarget中国官方微博二维码](/wp-content/uploads/res/images/spriteimg/ttweibo.jpg)
TechTarget中国
作者
相关推荐
-
Pure Storage推出ObjectEngine备份设备
闪存存储先驱Pure Storage公司开始进入云备份领域,让客户可对亚马逊云计算服务(AWS)上的数据进行重 […]
-
Microsoft Azure存储团队想要更简单的闪存设备
通过参与开放计算项目(Open Compute Project),这个云计算巨头正在联手其他供应商打造“定制S […]
-
NetApp闪存产品深入云、边缘和物联网
新的NetApp闪存存储开始瞄准Docker环境和对象存储,而原本这些技术主要依靠旋转磁盘。 在NetApp […]
-
销毁SSD和保护数据的关键步骤
SSD技术正在迅速发展。随着价格下降,速度和容量继续增长,SSD在存储市场获得更强的立足点。尽管它们有着较长的 […]