SPI-NAND linux驱动相关记录(1)flash规格书相关
这篇介绍nand flash(SLC)的一般规格制程,规格书上的信息点等等。
制程规格
单片的slc的flash虽然规格制程基本都没有太大区别,但是不同于nor flash的ONFI标准,nand flash没有明文规定的统一标准,所以这些细微的差异可能会导致一些兼容性问题,会让市面上的flash不一定都能在你的pcb上使用。
常见的slc的颗粒的总容量是1、2、4GB的
规格组合page size+oob size:2048/4096 + 64/128/256
部分flash有两个plane,或者多个die。(概念解释见后文)
擦写次数一般是8-10W次。
其余属性如频率,pin脚规格,温度等等就不赘述。
pin脚规格
nand flash的pin脚有几种规格,不同规格的pin num不同,但是实际起作用的pin都是相同的,这里以8pin做例子说明。
vcc和vss:就是VCC和GND
CS#:chip select的简写,平常没有信息交互的时候是一直拉高的状态,如果这个pin被拉低了,那么deivce才可以和IC之间通信。换言之CS#拉低时激活device。
SCK:提供clk。
WP#:Write Protect,写保护,如果拉低,那么flash上被设定为保护起来的区块将不可被写入。在device没有被激活时处于input状态,在四线read的时候由host保证其高电平。
HOLD#:在cs拉低期间,device和host信息交互的时候,此pin需要保持高电平,若其电位为低,那么就会让整个波形传输“HOLD住”,即在HOLD期间的信号为无效信号,再次拉高继续传输。同样在四线read的时候需要有host保持高电平。
IO0123:数据传输的pin。
Memory Mapping
一般的flash的存储结构如下图。
plane和die:
有的flash是由两个plane组成的,flash上的奇数block为第一个plane,偶数block则放在另一个plane上,这样做的好处是flash可以沿用单plane的设计,只需要在addr上增加一位plane sel即可。
结构图如下
以上的两个结构叫做一个chip,linux driver的标准接口就是以chip为单位来管理flash的。一般的flash只有一个chip,但是有的flash是多个相同的chip组合起来的,这时候就把chip称为die。多chip的flash在driver里面是通过多个chip结构体单位来管理的。
CMD规格,即特定的传输协议
nand flash和其余设备通信是通过cmd来完成的。
flash通过识别接收到的特定cmd类型来辨别当前动作并作出对应的反应。
如图,即是一般的nand flash的cmd的规格。
此处说一下怎么看,以reset举例:
此cmd的规格即是,先发送FF,然后发0byte的addr(也就是不发)dummy和data,因为reset只需要传递reset这个信息,不需要地址和数据交互。device收到了FF这个cmd,就会自己执行复位动作。
其余的cmd同理,IC端需要遵从此规格发出对应的波形来“指挥”device完成相关读写擦除操作。
具体波形
上面的表是所有cmd的总览,不能看出每个pin上的具体信号。
规格书上会把每一个cmd的实际波形画出来。这里以6Bh的这个cmd做例子说明。
如图,CS# pin拉低,有效波形开始,先在IO0上依次传输cmd,3个dummy bits,12bit的addr,然后等待1个dummy byte后,device开始在IO 0123上“吐”数据给host。
注:此图上的addr有一个plane sel bit,这就是上文提到的two plane的flash,在下发addr的时候需要指定plane。
至于实际地址换算之后在哪个block,需要由host端完成。
比如,我们看到的地址是第二个block,地址是0x20000-0x40000,但是对device来说,这个地址是第二个plane的第一个block,地址是0x0-0x20000。所以下发的addr应该是plane sel置1,地址为转换后,在第二个plane上的地址,即0x0-0x20000。
FEATURE兼容性
每个flash都有自己的特性,比如,需要单独设定才能使用四线传输(qual enable QE)。
这些特性设定可以通过读写flash上的固定寄存器来设定。这里不一一解释,如果需要调试驱动来兼容flash才需要关注,并且硬件不同,驱动实现也不同,所以这里仅做大致介绍,不说具体实现。
A0h是块保护,用来设定哪些块允许访问,哪些不被允许。需要结合块保护的表格看,简单说下就是通过一个flash厂商预先提供的对应表(也在spec上查的到),查阅表格,看你需要保护的block应该设定哪些bit。
B0h是配置,标黄的ecc_en为flash自带的硬件加解密。同时上文提到的QE也是配置的其中之一。
C0h是状态,用来反馈flash状态的,比如OIP,operation in program,动作正在执行,检测到OIP被置位,那就说明flash还正在做操作,则driver不能下发下一个cmd。
其余补充:
1.写保护,部分表格如下,对应上图A0h的BP。
2.硬件写保护:
A0h设定写保护后,需要将bit0设定为0,这样在WP# pin信号拉低的时候,flash将会处于写保护状态。
3.OTP:
每片chip有10个page是OTP的,OTP操作为先设定feature为OTP模式,然后写入数据,不同flash的流程不同。需要细看spec说明。