1.FLASH 芯片资料
|
文件: |
K9K8G08U0A.rar |
大小: |
912KB |
下载: |
下载 | |
2. 一些网页 做参考资料 了解NAND FLASH基础知识
|
文件: |
linux nand flash 驱动网页.rar |
大小: |
1654KB |
下载: |
下载 | |
驱动移植思路整理
1.首先按照 硬件原理图及CPLD 程序 修改了 /linux/driver/mtd/nand/pxa270x_nand.c 文件中的相关内容
2.内核启动过程中 可识别FLASH ID ,扫描NAND FLASH 后检验坏块时出错,它误将所有 块标记为坏块
所以怀疑驱动有问题 向 /linux/driver/mtd/nand/nand_base.c nand_bbt.c中添加打印信息。
后发现2.6系统支持 2K大页面 的 nand flash 可正确识别 块大小 ,页大小
------this->chipsize is 1073741824 整块FLASH 大小1G
- this->chipsize = nand_flash_ids[i].chipsize << 20 1024M----
-------mtd->oobblock is 2048 页大小2K
-------mtd->oobsize is 64 oob 大小64 BYTE
-------mtd->erasesize is 131072 块大小 128 K (擦NAND FLASH时 每次至少擦一块,
所以也叫 erasesize)
------- busw is 0 位宽8-bit
-----------mtd->oobblock >521 ??? 2048
----222-------mtd->oobblock >521 ??? 2048
------if oobblock > 512 ,we use nand_command_lp 识别到是大页面的FLASH 用 nand_command_lp 函数 每次
写两个列Column(页)地址,三个 行ROW 地址
NAND device: Manufacturer ID: 0xec, Chip ID: 0xd3 (Samsung NAND FLASH 1GiB 3,3V
8-bit)
FLASH ID 信息
Scanning device for bad blocks
扫描坏块
Bad eraseblock 1 at 0x00020000
Bad eraseblock 2 at 0x00040000
Bad eraseblock 3 at 0x00060000
3.查看 坏块辨识 程序 ,发现 程序 在oob 第一个字节 读出一个数 看是否为 0xff ,不是的话则标记为坏块。 因此 怀疑 读写流程,读写时序 有问题
4. 关于读写流程: 通过打印信息发现 读写流程 与芯片手册中(17,18页) 相符
后在 驱动中添加一段 测试程序 发现擦除 ,读写 流程 均 没问题。
nand flash 写操作前 需先进行擦除操作,否则读出的数据不准确
5. 关于读写时序:
经不断测试发现 是NAND FLASH 读时序出现问题
给flash 发完读 命令后 应有 20us 延时,再去读 数据 。否则读出的数据是不对的
它会读出你写的那个命令 0x30 详见数据手册 P40
根据芯片手册时序 又修改了一处 也在nand_command_lp中 对于写操作 在编程确认命令
和读状态 寄存器操作 之间加了 200us 延时
详见数据手册 P24 P31
系统启动检测FLASH 时不会在将所有的 块 识别为 坏块了
6.如果直接挂载 mount -t jffs2 /dev/mtdblock4 /mnt/nand
但是系统挂载后 显示FLASH已用100%,还是无法正常使用
文件系统格式不对
挂载失败 ,
[root@Intel /]#mount -t ext3 /dev/mtdblock5 /mnt/nand/
mount: Mounting /dev/mtdblock5 on /mnt/nand/ failed: Invalid argument
应先对其 格式化 :mkfs.ext3 /dev/mtdblock5
挂载 mount -t ext3 /dev/mtdblock5 /mnt/yaffs/
什么是oob
其中,512B(或2048B)用于存放数据,16B(64B)用于存放其他信息(包括:块好坏的标记、块的逻辑地址、页内数据的ECC校验和等)。NAND设备的随机读取得效率很低,一般以页为单位进行读操作。系统在每次读一页后会计算其校验和,并和存储在页内的冗余的16B(64 B)内的校验和做比较,以此来判断读出的数据是否正确。
大块和小块NAND FLASH都有与页大小相同的页寄存器,用于数据缓存。当读数据时,先从NAND FLASH内存单元把数据读到页寄存器,外部通过访问NAND FLASH I/O端口获得页寄存器中数据(地址自动累加);当写数据时,外部通过NAND FLASH I/O端口输入的数据首先缓存在页寄存器,写命令发出后才写入到内存单元中。
阅读(1606) | 评论(0) | 转发(0) |