阅读:2411回复:8
关于2k page flash fmd driver 问题
刚才看了"支持2K大页面NAND FLASH驱动"
的源码,有点疑问: 对与2k page flash: BOOL FMD_GetInfo(PFlashInfo pFlashInfo) { if (!pFlashInfo) return(FALSE); pFlashInfo->flashType = NAND; pFlashInfo->wDataBytesPerSector = NAND_PAGE_SIZE; pFlashInfo->dwNumBlocks = NAND_BLOCK_CNT; pFlashInfo->wSectorsPerBlock = NAND_PAGE_CNT; pFlashInfo->dwBytesPerBlock = (pFlashInfo->wSectorsPerBlock * pFlashInfo->wDataBytesPerSector); return(TRUE); } 这里pFlashInfo->wSectorsPerBlock = NAND_PAGE_CNT ,是64,而 nand flash page size 是 2048, disk 请求下来的sector 是512 , 如果disk 请求读一个sector 就512 ,那对应到flash 就是2048 ,是不是剩余的1536 byte 就不用了? 不知道谁了解,能否解释下,谢了 |
|
沙发#
发布于:2008-12-22 11:12
因为我看了下ce60 ,fal 的代码,没看到zheng 说的那个fal 层存在在隐射
BOOL CalculateLogicalRange(PFlashRegion pRegion) { DWORD dwBlockID; DWORD dwNumLogicalBlocks = 0; for (dwBlockID = pRegion->dwStartPhysBlock; dwBlockID < pRegion->dwStartPhysBlock + pRegion->dwNumPhysBlocks; dwBlockID++) { DWORD dwStatus = FMD.pGetBlockStatus (dwBlockID); if (!(dwStatus & (BLOCK_STATUS_RESERVED | BLOCK_STATUS_BAD))) /* 其实就是把reserved and bad block 去掉得到*/ { dwNumLogicalBlocks++; } } if (dwNumLogicalBlocks <= pRegion->dwCompactBlocks) { ReportError((TEXT("FLASHDRV.DLL:CalculateLogicalRange() - Invalid number of logical blocks %d\r\n"), dwNumLogicalBlocks)); return FALSE; } // Account for compaction blocks dwNumLogicalBlocks -= pRegion->dwCompactBlocks; pRegion->dwNumLogicalBlocks = dwNumLogicalBlocks; return TRUE; } 然后下面 BOOL Fal::StartupFAL(PFlashRegion pRegion) { //----- 1. Cache size properties of the FLASH media ----- m_dwSectorsPerBlock = pRegion->dwSectorsPerBlock; m_pRegion = pRegion; m_dwNumLogSectors = pRegion->dwNumLogicalBlocks * m_dwSectorsPerBlock; m_dwSectorsPerBlock 就是 get flash info 取到的page count =64, pRegion->dwNumLogicalBlocks 就是前面物理块去掉保留和坏块得到的logic 块数 就是说logic sec nums per block 和 physical sector nums per block ,没做512 到2048的隐射 ,只是去掉了保留块,坏块, 如果没有保留块和坏块,那么他们一样? 不知道到ce60给的fal 代码也只适合512 page flash ? 还是我没看到隐射的地方? |
|
板凳#
发布于:2009-01-01 02:50
Re:关于2k page flash fmd  driver 问题
我不知道zheng兄实现的驱动一次读取的是2k还是512.但无论如何,我想, 不会存在“剩余的1536 byte 就不用了”。 这样的浪费太不合理了。我所了解:2k的nand一个page=2048, 但不代表一次必须读取2048. 0x30命令可以指定数据开始位置,读取512即可停止。-- 在我所用的驱动是这么实现的。 无论如何, 在上层, 一个扇区总是512大小。 在驱动之上的所有层, 无需关注这些转换,是‘透明’的。 所以不需要分析fal的转换。(fal的转换并不是size的转换,是物理扇区到逻辑扇区的转换) |
|
地板#
发布于:2009-01-01 03:43
Re:关于2k page flash fmd  driver 问题
sector size=2048不太合理,我上传一个支持各种nand的驱动,希望对你有帮助。 |
|
|
地下室#
发布于:2009-01-06 17:28
谢谢斑竹亲自回复,我再看下代码
|
|
5楼#
发布于:2009-01-06 19:08
斑竹 在你的鼓励下,我又大体看了下fatfsd的代码
可能是这样的: fatfsd 在mount disk 前,如果第1次它回format disk 'partion,然后再mount,mount时要去读partion 第1个sector ,该sector 包含sector size,该size 就是format 时写到partion pbp 区的,再写之前它有get disk info ,我们如果告诉它2048,那么一个 fat sector 就是2048, 所以5.0下,不需要隐射什么 fat secotr 512 到 nand secotr 2048 什么 至于 4.2的代码我没看, |
|
6楼#
发布于:2009-01-07 00:38
Re:关于2k page flash fmd  driver 问题
1 block = 64 pages = 256 sectors1 pages = 4 sectors 你说的是单个fat分区,那么对于其他(binfs)分区呢? mbr的读写呢? 我觉得不应该2048,很不nice,除非你浪费2048-512,直接把一个page=一个sector。 如果2048的话, 就相当于让上层来处理1page=4sector的逻辑---改动量太大,没有可能性。 对上层而言,读取mbr就是ReadSector(0);就是512. --- 个人看法。 |
|
8楼#
发布于:2009-08-13 18:39
搞定了2K page的nand驱动了。
不过现在拿到的k9f8g08好像是4K page的nand ,有没有弟兄搞过? |
|
|