驱动之NAND Flash框架
总览
- 嵌入式linux学习目录
- 驱动之块设备-框架
- 驱动之NAND Flash框架
- 驱动之NAND Flash源码
- [驱动之NOR Flash](https://draapho.github.io/2018/01/26/1812-drv-nor/
- 驱动之网卡驱动
本文使用 linux-2.6.22.6 内核, 使用jz2440开发板.
NAND Flash 基础知识
NAND 和 NOR Flash的比较
NOR FLASH | NAND FLASH |
---|---|
接口时序同SRAM,易使用 | 地址/数据线复用,数据位较窄 |
读取速度较快 | 读取速度较慢 |
擦除速度慢,以64-128KB的块为单位 | 擦除速度快,以8-32KB的块为单位 |
写入速度慢 | 写入速度快 |
随机存取速度较快,支持XIP(eXecute In Place,芯片内执行),适用于代码存储。在嵌入式系统中,常用于存放引导程序、根文件系统等。 | 顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。在嵌入式系统中,常用于存放用户文件系统等。 |
单片容量较小,1-32MB | 单片容量较大,8-128MB,提高了单元密度 |
最大擦写次数10万次 | 最大擦写次数100万次 |
硬件接口和时序
看相关数据手册, 以jz2440v3开发板为例:
K9F2G08U0C.pdf
NAND Flash 数据手册S3C2440A_UserManual_Rev13.pdf
CPU 数据手册
NAND Flash的硬件引脚基本固定, 下面列出各个引脚的含义
缩写 | 英文原意 | 说明 |
---|---|---|
I/O | data Inputs/Outputs | 数据收发, 8bit或16bit |
CLE | Command Latch Enable | 传的是指令, 高电平有效 |
ALE | Address Latch Enable | 传的是地址, 高电平有效 |
_CE 或 nCE | Chip Enable | 片选信号, 低电平有效 |
_RE 或 nRE | Read Enable | 读数据, 低电平有效 |
_WE 或 nWE | Write Enable | 写数据, 低电平有效 |
R/_B 或 R/nB | Ready/Busy | 空闲/忙信号, 忙为低电平 |
查看三星S3C2440数据手册 NAND Flash Controller
章节可知, 已将nand flash的时序操作打包成了寄存器操作.
u-boot里面, 可以使用 md
mw
直接对memroy进行操作. 因此可在u-boot下面直接用指令来操作nand flash的时序
md
, Memory Display. 显示指定内存地址的内容..b
表Byte, 字节..w
表Word, 2字节..l
表Long, 4字节.mw
, Memory Write. 写入内容到指定内存地址..b
表Byte, 字节..w
表Word, 2字节..l
表Long, 4字节.
指令 | 物理操作 | S3C2440 寄存器操作 | u-boot 直接操作对应的寄存器地址 |
---|---|---|---|
片选 | _CE低 | NFCONT bit1=0 | md.l 读一下, mw.l 0x4E000004 回写bit1=0 |
发命令 | CLE高, ALE低, I/O命令值, _WE高变低 | NFCMMD=命令值 | mw.b 0x4E000008 命令值 |
发地址 | ALE高, CLE低, I/O地址值, _WE高变低 | NFADDR=地址值 | mw.b 0x4E00000C 地址值 |
发数据 | CLE低, ALE低, I/O数据值, _WE高变低 | NFDATA=数据值 | mw.b 0x4E000010 数据值 |
读数据 | CLE低, ALE低, _RE高变低, 取I/O值 | 数据值=NFDATA | md.b 0x4E000010 1 |
读写实验
# 开发板 uboot 命令行, 最好是从 NAND Flash 启动的uboot. |
NAND Flash 系统框架
// 由Linux系统启动时的打印信息, 可以抓取到 NAND FLASH 相关的初始化信息和分区信息. |
参考资料
Linux操作系统下 NAND FLASH驱动程序框架
Linux MTD子系统 _从模型分析到Flash驱动模板
LINUX NAND FLASH驱动程序框架分析
原创于 DRA&PHO