Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481562
  • 博文数量: 93
  • 博客积分: 1431
  • 博客等级: 上尉
  • 技术积分: 1006
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 10:30
文章分类

全部博文(93)

文章存档

2011年(20)

2010年(2)

2009年(71)

我的朋友

分类: LINUX

2009-04-07 15:38:44

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端口输入的数据首先缓存在页寄存器,写命令发出后才写入到内存单元中。
 
 
 
阅读(1574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~