又到了周末,今天是2010年7月31日,很纠结。。。。。。因为串口接收大数据包丢失问题,还没有清晰的办法。

暂且放下它,还是把以前做过的比较有意思的东西重新整理下:

很多处理器,都支持大容量的NAND,拿三星6410处理器来讲,从资料上看,支持大容量8G NANDFLASH,也说明了需要加片选来控制,这次做的是2GNAND的支持,需要2个片选。OK ~~~~~~~硬件上,NANDFLASH上增加一路片选信号,增加一路R/B控制。

我这个是由2个8G08构成的2GNAND

软件上调整:

1, 让系统判断出NAND的容量大小:在初始化NAND的时候,读2个片选对应的NAND的ID,读出两个NAND的相关信息,然后把这些信息告诉系统

static DWORD ReadFlashID(void) { BYTE Mfg, Dev; int i; NF_nFCE_L(); // Deselect the flash chip. NF_CMD(CMD_READID); // Send flash ID read command. NF_ADDR(0); for (i=0; i<10; i++) { Mfg = NF_RDDATA_BYTE(); if (Mfg == 0xEC || Mfg == 0x98) break; } Dev = NF_RDDATA_BYTE(); NF_nFCE_H(); return ((DWORD)(Mfg<<8)+Dev); } //增加一个读片选2的函数 static DWORD ReadFlashID2(void) { BYTE Mfg, Dev; int i; NF_nFCE_L1(); // Deselect the flash chip. NF_CMD(CMD_READID); // Send flash ID read command. NF_ADDR(0); for (i=0; i<10; i++) { Mfg = NF_RDDATA_BYTE(); if (Mfg == 0xEC || Mfg == 0x98) break; } Dev = NF_RDDATA_BYTE(); NF_nFCE_H1(); return ((DWORD)(Mfg<<8)+Dev); }

NF_nFCE_L1()为增加的那个片选的控制。

2, 把第1步中得到的2GNAND的信息,重新赋给全局变量,即告诉系统新的NAND信息。

在NAND初始化函数中 添加对第2快NAND的初始化

//********************************初始化第2片NAND****************************************** RETAILMSG(1, (TEXT("init the secend nand/n"))); nMID = (UINT8)(nNandID2 >> 8); nDID = (UINT8)(nNandID2 & 0xff); RETAILMSG(1, (TEXT("[FMD:INF] FMD_Init() : Read ID = 0x%08x/n"), nNandID2)); for (nCnt = 0; astNandSpec[nCnt].nMID != 0; nCnt++) { if (nDID == astNandSpec[nCnt].nDID) { bNandExt = TRUE; break; } } if (!bNandExt) { RETAILMSG(1, (TEXT("[FMD:ERR] FMD_Init() : Unknown ID = 0x%08x/n"), nNandID)); return NULL; } int NUM_OF_BLOCKS2 = astNandSpec[nCnt].nNumOfBlks; int PAGES_PER_BLOCK2 = astNandSpec[nCnt].nPgsPerBlk; int SECTORS_PER_PAGE2 = astNandSpec[nCnt].nSctsPerPg; RETAILMSG(1, (TEXT("[FMD] FMD_Init() : NUM_OF_BLOCKS2 = %d/n"), NUM_OF_BLOCKS2)); RETAILMSG(1, (TEXT("[FMD] FMD_Init() : PAGES_PER_BLOCK2 = %d/n"), PAGES_PER_BLOCK2)); RETAILMSG(1, (TEXT("[FMD] FMD_Init() : SECTORS_PER_PAGE2 = %d/n"), SECTORS_PER_PAGE2)); RETAILMSG(1, (TEXT("[FMD] --FMD_Init()2/n"))); //相加 NUM_OF_BLOCKS = NUM_OF_BLOCKS1+NUM_OF_BLOCKS1; PAGES_PER_BLOCK = astNandSpec[nCnt].nPgsPerBlk; SECTORS_PER_PAGE = astNandSpec[nCnt].nSctsPerPg; RETAILMSG(1, (TEXT("[FMD] FMD_Init() : NUM_OF_BLOCKS = %d/n"), NUM_OF_BLOCKS)); RETAILMSG(1, (TEXT("[FMD] FMD_Init() : PAGES_PER_BLOCK = %d/n"), PAGES_PER_BLOCK)); RETAILMSG(1, (TEXT("[FMD] FMD_Init() : SECTORS_PER_PAGE = %d/n"), SECTORS_PER_PAGE)); return((PVOID)g_pNFConReg); }

3,增加读写操作中的地址转换:

例如现在第1个NAND的大小是8192个BLOCK,那么当我们想去读/写第16000个BLOCK进行操作的时候,我们要做个判断,让系统去操作第2片  NAND的第(16000-8192)个BLOCK。

接下来就是细心的完全驱动相关函数的修改;

由于NAND的驱动相关函数很多,我这个就不全贴出,思路是一样的,注意这个地址转换就可以了(加个判断就OK了),仅列举读NAND函数

BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors) { BOOL bRet; //RETAILMSG(1, (TEXT("[R:0x%08x] /n"), startSectorAddr)); #if (NAND_DEBUG) RETAILMSG(1, (TEXT("[FMD] ++FMD_ReadSector(0x%08x) /n"), startSectorAddr)); #endif #ifdef SYNC_OP EnterCriticalSection(&g_csNandFlash); #endif if ( IS_LB ) { if(8192*64<=startSectorAddr) { startSectorAddr=(startSectorAddr-8192*64);//转换为第2块NAND的地址,调用第2块NAND的函数 bRet = FMD_LB_ReadSector2(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE);//!!!! } else bRet = FMD_LB_ReadSector(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE); } else { if(8192*64<=startSectorAddr) { startSectorAddr=(startSectorAddr-8192*64);//转换为第2块NAND的地址,调用第2块NAND的函数 bRet = FMD_SB_ReadSector2(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE);//!!!! } else bRet = FMD_SB_ReadSector(startSectorAddr, pSectorBuff, pSectorInfoBuff, dwNumSectors, USE_NFCE); } #ifdef SYNC_OP LeaveCriticalSection(&g_csNandFlash); #endif #if (NAND_DEBUG) RETAILMSG(1, (TEXT("[FMD] --FMD_ReadSector()/n"))); #endif return bRet; }

这样编译后,重启,擦出/低格/高格信息:

Enter your selection: a All block(16384) Erase... LB######## Error Erasing block 1462! LB######## Error Erasing block 2011! LB######## Error Erasing block 5027! LB######## Error Erasing block 5687! LB######## Error Erasing block 8048! 2LB######## Error Erasing block 1005!//转换后的第2块NAND 2LB######## Error Erasing block 1366! 2LB######## Error Erasing block 3396! 2LB######## Error Erasing block 5239! 2LB######## Error Erasing block 7557! //低格 Reserving Blocks [0x0 - 0x5] ... ...reserve complete. Low-level format Blocks [0x6 - 0x3fff] ... LB######## Error Erasing block 1462! LB######## Error Erasing block 2011! LB######## Error Erasing block 5027! LB######## Error Erasing block 5687! LB######## Error Erasing block 8048! 2LB######## Error Erasing block 1005! 2LB######## Error Erasing block 1366! 2LB######## Error Erasing block 3396! 2LB######## Error Erasing block 5239! 2LB######## Error Erasing block 7557! ...erase complete. //高格 Enter LowLevelFormat [0x6, 0x3fff]. Erasing flash block(s) [0x6, 0x3fff] (please wait): EraseBlocks: found a bad block (0x5b6) - skipping... EraseBlocks: found a bad block (0x7db) - skipping... EraseBlocks: found a bad block (0x13a3) - skipping... EraseBlocks: found a bad block (0x1637) - skipping... EraseBlocks: found a bad block (0x1f70) - skipping... EraseBlocks: found a bad block (0x23ed) - skipping... EraseBlocks: found a bad block (0x2556) - skipping... EraseBlocks: found a bad block (0x2d44) - skipping... EraseBlocks: found a bad block (0x3477) - skipping... EraseBlocks: found a bad block (0x3d85) - skipping... Done. WriteMBR: MBR block = 0x6. Done.

这样就可以了,做的时间久了 ,可以有些细节会忘记了,但是思路就是这样,很简单。其他4G/8G如果需要片选,则也可以用这个思路做,只不过驱动可能代码又长了很多~呵呵

关于支持多个片选的大容量NANDFLASH简记相关推荐

  1. 驱动专题:第五章MTD及Flash驱动 2.Nandflash驱动

    一.MTD体系结构:Linux内核提供MTD子系统来建立FLASH针对Linux的统一.抽象接口.MTD将文件系统与底层的FLASH存储器进行隔离. 引入MTD后Linux系统中对FLASH的设备驱动 ...

  2. Nandflash 驱动移植

    前段时间,研究了一下4G的Nandflash驱动.手头上只有飞凌6410BSP自带的Nandflash驱动,该驱动不支持K9GAG08U0D(2G)和K9LBG08U0D(4G)的Nandflash. ...

  3. linux提高nand速度,linux-2.6.31.1内核支持Nand Flash

    linux-2.6.31.1支持Nand Flash 目的:使NandFlash驱动同时支持64M, 256M或更高容量的NandFlash 将linux内核解压在/opt目录下,修改内核源码文件,添 ...

  4. linux exfat设置权限,Linux支持exFAT和NTFS

    Linux系统默认可以自动识别到fat32格式的盘,但fat32支持的文件不能大于4G,所以只能将移动硬盘和U盘格式化为NTFS和exFAT这两种格式的,对于U盘最好格式化为exFAT,NTFS对U盘 ...

  5. linux安装在exfat分区,centos 安装exfat格式分区支持

    CentOS系列一直没有默认支持使用exfat格式的大容量U盘. 可以通过添加fuse-exfat模块来支持.根据网上资料,整理如下: 1.下载fuse-exfat支持软件: exfat支持是通过fu ...

  6. linux系统支持ntfs吗,Linux支持exFAT和NTFS

    Linux系统默认可以自动识别到fat32格式的盘,但fat32支持的文件不能大于4G,所以只能将移动硬盘和U盘格式化为NTFS和exFAT这两种格式的,对于U盘最好格式化为exFAT,NTFS对U盘 ...

  7. Linux支持exFAT和NTFS

    Linux系统默认可以自动识别到fat32格式的盘,但fat32支持的文件不能大于4G,所以只能将移动硬盘和U盘格式化为NTFS和exFAT这两种格式的,对于U盘最好格式化为exFAT,NTFS对U盘 ...

  8. exfat硬盘格式Linux是否支持,Linux支持exFAT和NTFS

    Linux系统默认可以自动识别到fat32格式的盘,但fat32支持的文件不能大于4G,所以只能将移动硬盘和U盘格式化为NTFS和exFAT这两种格式的,对于U盘最好格式化为exFAT,NTFS对U盘 ...

  9. linux u盘格式exfat,技术|在CentOS 6.4中支持exfat格式的U盘

    CentOS系列一直没有默认支持使用exfat格式的大容量U盘. 可以通过添加fuse-exfat模块来支持.根据网上资料,整理如下: 1.下载fuse-exfat支持软件: exfat支持是通过fu ...

最新文章

  1. 一文搞懂PointNet全家桶——强势的点云处理神经网络
  2. linux进程--fork详解(三)
  3. Hadoop前期准备--centos7
  4. 【SSH】禁用root远程、修改ssh端口
  5. SpringBoot 集成Web
  6. Model-View-Presenter模式之 Step by Step
  7. java引用 弱引用_了解Java弱引用
  8. php 登录安全认证,介绍几种常用的web安全认证方式
  9. 2019创客中国智能融合应用中小企业创新创业大赛启动
  10. 1.11 编程基础之二分查找 08 不重复地输出数 python
  11. GET和POST史上最全总结
  12. 外虚内实是什么意思_广东潮州“茶”文化浓厚,为什么“工夫茶”常被谬传“功夫茶”?...
  13. (7)Zynq AXI_GP接口介绍
  14. matlab int积分常数,matlab int 积分
  15. 万向区块链“汽车供应链物流服务平台”获评“2018金融区块链创新应用优秀案例”...
  16. Eclipse 使用与配置
  17. 前端实现点击下载图片
  18. java long 和long_java中Long和long的区别
  19. 深受程序员鄙视的外行语录!
  20. 第 3 章:安全风险管理概述

热门文章

  1. Ubuntu 息屏后无法唤醒
  2. php个税计算接口,拿走不谢:通过个税反算工资的公式(实用小工具)
  3. java word 分段符,word 分段符号
  4. ManyToManyField多对多关系(django Many-to-many relationships)
  5. linux查询网卡bdf信息,Linux获取pci设备的厂商号、设备号、class号
  6. Map集合循环遍历的几种方式
  7. 手机拍照或者相册获取图片总结
  8. java多态 作用_关于Java三大特性之多态的总结
  9. MjAyMDAzMDk=
  10. 企业内网远程桌面控制软件及解决方案