一、关于NAND FLASH的基本问题:
问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址?
答1.在DATA0~DATA7上既传输数据,又传输地址
当ALE为高电平时传输的是地址,
问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令怎么传入命令?
答2.在DATA0~DATA7上既传输数据,又传输地址,也传输命令
当ALE为高电平时传输的是地址,
当CLE为高电平时传输的是命令
当ALE和CLE都为低电平时传输的是数据
问3. 假设烧写NAND FLASH,把命令、地址、数据发给它之后,
NAND FLASH肯定不可能瞬间完成烧写的,怎么判断烧写完成?
答3. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙
问4. NAND Flash引脚描述?
答4. CLE:指令锁存使能 ALE:地址锁存使能 CE:芯片使能
RE: 读使能 WE:写使能 WP:写保护
R/B:就绪/忙
问5. 怎么操作NAND FLASH呢?
答5. 根据NAND FLASH的芯片手册,一般的过程是:
a. 发出命令
b. 发出地址
c. 发出数据/读数据
由于S3C2440内部存在NAND Flash的控制器,可以方便开发,省掉很多繁琐的操作比如说发命令,它需要经历“选中芯片”、“CLE设为高电平”、“在DATA0~DATA7上输出命令值”发出一个写脉冲”一系列操作才可以实现发命令,但是斗鱼S3c2440的内部NAND Flash的控制器的存在,只需要令寄存器“ NFCMMD=命令值”就可以实现。
6.用UBOOT来体验NAND FLASH的操作:
二、驱动程序框架
static int s3c_nand_init(void)
{
1.分配一个nand_chip结构体
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2. 设置nand_chip
s3c_nand->select_chip = s3c2440_select_chip;
s3c_nand->cmd_ctrl = s3c2440_cmd_ctrl;
s3c_nand->IO_ADDR_R = &s3c_nand_regs->nfdata;
s3c_nand->IO_ADDR_W = &s3c_nand_regs->nfdata;
s3c_nand->dev_ready = s3c2440_dev_ready;
s3c_nand->ecc.mode = NAND_ECC_SOFT; //ECC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3. 硬件相关的设置: 根据NAND FLASH的手册设置时间参数
3.1 设置 TACLS、TWRPH0、TWRPH1三个参数
3.2 取消片选 、使能NAND FLASH控制器
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4. 使用: nand_scan
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5. add_mtd_partitions
}
static void s3c_nand_exit(void)
{
}
以上需要用到的函数定义
static void s3c2440_select_chip(struct mtd_info *mtd, int chipnr)
{
if (chipnr == -1)
{
/* 取消选中: NFCONT[1]设为1 */
}
else
{
/* 选中: NFCONT[1]设为0 */
}
}
static void s3c2440_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
{
if (ctrl & NAND_CLE)
{