本文仅仅为了分享经验,并无其他目的。如果发现侵权,请联系我删除相应内容。
参考文章:
https://www.cnblogs.com/lifexy/p/7701181.html
https://blog.csdn.net/qqliyunpeng/article/details/51180276
自行分析MTD层,请看https://www.cnblogs.com/lifexy/p/7701181.html
nand手册
CE片选,低电平有效
控制器
NFCONF设置寄存器,设置时间
NFCONT 控制寄存器,CE在这
NFMECCD 设置ECC
NFSTAT
1.分配一个nand_chip结构体
1.1如何设置s3c_nand_regs这个结构体
struct 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 ;
};
方法:直接看2440手册。寄存器上写的很详细
2.设置nand_chip
第2大点都是跟nand控制器相关的设置,与具体硬件无关
2.1应该为此结构体提供哪些函数??
看看nand_scan函数调用到nand_chip哪些函数。
其实就是片选,发命令,发地址,发数据,读数据,判断状态的功能
2.2片选
看原理图,片选引脚是nFCE。NFCONT 控制寄存器,CE在这。nand手册,CE片选,低电平有效
2.3发命令
区别仅仅是data送到的的寄存器不一样
2.4读写的I/O地址
2.5判断状态
一看就知道跟nfstat 寄存器相关,2440手册,nfstat 的第0位
RnB (Read-only) [0] The status of RnB input pin.
0: NAND Flash memory busy
1: NAND Flash memory ready to operate
3.硬件相关的设置
围绕nand控制器的寄存器,将一些硬件相关的参数设置好
3.1使能nand的时钟
3.2搞清楚HCLK。看启动信息就行。HCLK 为 是 100MHz, 则 HCLK 的周期是 1/100MHz = 10ns
3.3
NFCONF 寄存器
3.3.1TACLS[13:12]
CLE & ALE duration setting value (0~3) 翻译:发出CLE/ALE之后多长时间才发出nWE信号
然后查表。
Duration = tcls -twp,查 时间表 得到 15ns -15ns = 0ns
Duration = HCLK x TACLS, 所以 TACLS设为0
3.3.2
TWRPH0 的时间是 twp ,查 时间表 得到 15ns
TWRPH0 的时间是 twp ,查 时间表 得到 15ns
根据寄存器中描述的计算公式:Duration = HCLK x ( TWRPH0 + 1 ) => 15ns = 10ns x (TWRPH0 + 1) => TWRPH0 = 0.5 ,
由于他的取值范围是 (0~7) ,并且,时间表中的时间是最小能识别的时间,那我们取TWRPH0 = 1
3.3.3
TWRPH1 duration setting value (0~7)
Duration = HCLK x ( TWRPH1 + 1 )
TWRPH1 的时间是 tclh = 5ns
根据寄存器中描述的计算公式:Duration = HCLK x ( TWRPH1 + 1 ) => 5ns = 10ns x (TWRPH1 + 1) => TWRPH1 = 0 即能满足
3.3.4BusWidth (R/W) 8位
This bit is determined by GPG15 pin status during reset
and wake-up from sleep mode.
After reset, the GPG15 can be used as general I/O port or
External interrupt.
This bit can be changed by software.
翻译:
此位由复位期间的GPG15引脚状态决定。
从睡眠模式醒来。
复位后,GPG15可以用作通用I/O端口或
外部中断。
这个比特可以通过软件来改变。
看原理图,EINT21为高电平,EINT22为高电平,EINT23为低电平。
GPG13和 EINT21是同一信号。
GPG14和EINT22是同一信号。
GPG15和EINT23是同一信号。
所以BusWidth相当于被设位0
3.4NFCONT寄存器
3.4.1
Reg_nCE
During boot time, it is controlled automatically.
This value is only valid while MODE bit is 1
翻译:
在启动期间,它是自动控制的。
此值仅在模式位为1时有效。
取消片选
3.4.2
MODE 使能nand控制器
4.使用nand_scan
4.1分配并设置mtd结构体
4.2调用and_scan
5.调用add_mtd_partitions
6.使用MTD-utils调试
6.1修改makefile,编译工具
得到众多命令。如擦除,写,读
6.2调试nand flash
法一:擦除--写入文件系统---读出--跟原来文件系统对比二进制码(同样适用于norflash)
法二:擦除(全为1)---写入---dump出来,看是不是全为1