本文的主要任务是实现JZ2440开发板板载的型号为K9F2G08U0A的容量为256MB、位宽为8位的NAND FLASH驱动程序的开发。
一、前期准备
开发板:JZ2440(ARM9)
内核版本:Linux-3.4.10
NAND FLASH : K9F2G08U0A( 256MB 8bit 3.3V)
重新配置内核,去掉已有的NAND FLASH的驱动程序。
二、K9F2G08U0A大简单介绍
K9F2G08U0A三星电子设计的NAND FLASH类型的存储半导体,它的大小为256MB,位宽为8bit,支持ECC坏块检测机制。
1、原理图布局和基本引脚定义
各个引脚的具体定义:
LDATA0~LDATA7:数据、地址、命令传输引脚,具体传输什么类型数据由ALE、CLE决定
RnB :状态判断引脚,用它来判断flash是处于忙碌还是就绪状态
CLE :命令锁存信号,为高电平时数据线上发送命令
nFCE:片选信号,为低电平表示选中
ALE:地址锁存引脚,为高电平时数据线上发送地址
nFWE:写信号,为低电平时表示在数据线上写入
nFRE:读信号,为低电平时表示从数据线上读取数据
2、存储单元基本布局
从上图可以看出,该NAND flash是按页来存储数据的,每一页的大小是2KB + 64Bytes,其中前面2KB是用来存放真正的数据的,后面的64Bytes数据作为ECC用来检测该页数据是否有效;每一个块包括64页数据。
三、驱动程序的实现
1、编写一个nand flash的驱动程序大致有如下步骤:
a、分配一个nand_chip的结构体变量
b、设置这个结构体的变量
c、执行硬件相关的操作
d、使用这个结构体变量,并添加设备分区
2、具体实现
2.1 基本工作,实现如下:
/* 定义一个结构体来描述s3c2440 nand 控制器的寄存器 */
struct yl_s3c_nand_regs {
unsigned long nfconf ;
unsigned long nfcont ;
unsigned long nfcmd ;
unsigned long nfaddr ;
unsigned long nfdata ;
unsigned long nfeccd0 ;
unsigned long nfeccd1 ;
unsigned long nfeccd ;
unsigned long nfstat ;
unsigned long nfestat0;
unsigned long nfestat1;
unsigned long nfmecc0 ;
unsigned long nfmecc1 ;
unsigned long nfsecc ;
unsigned long nfsblk ;
unsigned long nfeblk ;
};
/* 定义一个结构体方便对nand驱动的操作 */
struct yl_nand_mtd{