1 NAND Flash
1.1 NAND Commands
read1:命令代码是00h/01h,分别读取上半页(A区)和下半页(B区)
read2:命令代码是50h,读取oob(C区)
第一个命令00h用来设置区域为0-255bytes的指针(A区)
第二个命令01h用来设置区域为256-511bytes的指针(B区)
第三个命令50h用来设置区域为512-527bytes的指针(C区)
nand flash一上电就进入read1 00h模式,所用page的528bytes数据会在12us内传输到数据寄存器。
1.2 BBT/BBM - Bad Block Management
BBT一般放在block 0,因为第一块由厂家保证一定是好的,小页512字节的Nand OOB的第6个字节(大页2K的OOB第1个字节)表示是不是坏块(0xff表示好块,0x00表示坏块);SPI Flash的第一块或者最后一块一定是好的。
Figure 1-1 Uboot的2种坏块管理方法对比
Figure 1-2 BBT/SBT映射示意图
1.3 NAND Flash三种接口 - Legacy/ONFI/Toggle DDR
Figure 1-3 NAND Flash三种接口对比
Figure 1-4 NAND Flash三种接口信号说明
1.4 SLC和MLC Nand使用的文件系统
SLC时代,与其一起成长的软件技术有YAFFS/YAFFS2,它是第一个专门为Nand设计的,并具有WL(Wear Leveling)和POR(Power off Recovery)功能的嵌入式文件系统;以及JFFS/JFFS2,建立可以挂载Nand Driver的MTD设备之上的日志文件系统。
随着容量的增加,MLC技术的到来,JFFS2的继往开来者UBIFS/UBI也随之到来,还有与其形成竞争关系的LogFS。
2 eMMC/SD
2.1 支持的频率种类(达到最大数据速率的前提是8根DATx)
Legacy SDR:26MHz,max_dtr - 26MB/s
HS SDR:High Speed Single Data Rate 52MHz,max_dtr - 52MB/s
HS DDR:High Speed Double Data Rate 104MHz,max_dtr - 104MB/s
HS200:High Speed 200MHz,max_dtr - 200MB/s
HS400:High Speed 400MHz,需要Data Strobe信号,max_dtr - 400MB/s
2.2 eMMC分区应用实例
Android手机系统中,各个分区的呈现形式如下:
- mmcblk0为eMMC的块设备
- mmcblk0boot0和mmcblk0boot1对应两个Boot Area Partitions
- mmcblk0rpmb则为RPMB Partition(Replay Protected Memory Block,具有安全特性的分区,猜想指纹数据就是放在这个分区)
- mmcblk0px为UDA(User Data Area)划分出来的SW Partitions
- 如果存在GPP(General Purpose Partitions),名称则为mmcblk0gp1、mmcblk0gp2、mmcblk0gp3、mmcblk0gp4
2.3 eMMC/SD初始化流程
1)配置时钟,慢速一般为400K,设置工作模式
2)发送CMD0,进入空闲态,该指令没有反馈
3)发送CMD8,如果有反应,CRC值与发送的值相同,说明该卡兼容SD2.0协议
4)发送CMD55+ACMD41,判断SD卡的上电是否正确,短反馈成功说明该卡为SD卡(短反馈第31位置1为HC卡),否则发送CMD0,有反应说明是MMC卡
5)发送CMD2,验证SD卡是否接入,长反馈CID(Card IDentification Register)
6)发送CMD3,读取SD卡的RCA(地址,Relative Card Address),短反馈
7)发送CMD9,读取CSD(Card Specific Data Register)寄存器获取卡的相关信息
8)发送CMD7,使能SD卡
9)配置高速时钟,准备数据传输,一般20M~25M
10)发送CMD55+ACMD51读取SCR(SD Card Configuration Register)寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽
11)SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽
12)发送CMD7,使能SD卡,使其进入传输状态,接着发送CMD16设置块大小(根据前面读取的CSD信息确定)
13) 把命令参数设置为0,再次发送CMD7,取消选中所有卡
Figure 2-1 SD卡的初始化和识别流程
2.4 FFU - Field Firmware Update
eMMC Firmware Upgrade
https://blog.csdn.net/jgw2008/article/details/52555279
emmc field firmware update
https://blog.csdn.net/u013531497/article/details/43114805
2.5 URLs
eMMC之分区管理、总线协议和工作模式(推荐)
https://blog.csdn.net/u010444107/article/details/78354541
3 SPI Flash之Top-Boot or Bottom-Boot
顶部和底部启动设备启动代码和定制数据的大小一般比标准块小很多,为了避免浪费宝贵的空间,很多Flash ROM把第一块或最后一块分割为更小的子块,例如8KB。这使你更好的控制这些块的内容。
依赖于启动代码在ROM中的所在位置,这些设备有两种风格:顶部启动和底部启动设备。这取决于CPU在重启动/加电后从哪里获取指令:不论是存储空间顶部(例如Intel)或者存储空间底部(例如Motorola)。一些Flash ROM可通过外部端脚来配置顶部或底部启动。
举例说明top和bottom的区别:
总结:Top boot类型的Flash的小块(block)放在高地址位上,而Bottom boot类型的flash的小块(block)起始位置为0x000000.
4 SSD
4.1 FTL - Flash Translation Layer
NAND FLASH均衡算法笔记
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26716973&id=4009646
5 URLs
UBOOT-2010-03在S3C2440上的移植<四>------------支持NANDFLASH
https://blog.csdn.net/eilianlau/article/details/6940571?locationNum=4&fps=1
Nand flash读写范围的问题
http://blog.sina.com.cn/s/blog_944790400101f8en.html
MTD(3)-- nand flash的erase,read,write接口函数代码分析
http://www.360doc.com/content/14/0110/17/13289331_344159877.shtml
NAND FLASH存储器的坏块管理
https://blog.csdn.net/lqrensn/article/details/5882038
支持ONFI和Toggle模式的NAND+Flash控制器设计
http://www.docin.com/p-1347018452.html
最好的分析:
nand flash驱动编写与移植
https://wenku.baidu.com/view/f4693ed3240c844769eaee09.html
6 Abbreviations
DQS:Data Query Strobe,时钟CLK是被用来指引命令和地址的传输;而数据阀门信号DQS则是用来指引数据应该被传输到哪里去。DQS是一个双向总线,也是由和时钟同样的频率来进行驱动。
ONFI:Open NAND Flash Interface,上电时异步模式,下指令切换到同步模式(有CLK信号)
P/E循环:Nand Flash编程/擦除次数
R/B#:Ready/Busy#
Nand Flash RBA:Reserve Block Area,预留块区
POR:Nand Flash Power off Recovery,掉电恢复
SAS:Serial Attached SCSI
SAM:SCSI Architecture Model
SPC:SCSI Primary Commands,基础指令集
SBC:SCSI Block Commands,特定设备指令集