asp12
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分478分
  • 威望107点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
阅读:2411回复:8

关于2k page flash fmd driver 问题

楼主#
更多 发布于:2008-12-22 10:38
 刚才看了"支持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 就不用了?

不知道谁了解,能否解释下,谢了
asp12
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分478分
  • 威望107点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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 ? 还是我没看到隐射的地方?
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
板凳#
发布于:2009-01-01 02:50
Re:关于2k page flash fmd&#160;&#160;driver 问题
我不知道zheng兄实现的驱动一次读取的是2k还是512.但无论如何,我想, 不会存在“剩余的1536 byte 就不用了”。 这样的浪费太不合理了。

我所了解:2k的nand一个page=2048, 但不代表一次必须读取2048.   0x30命令可以指定数据开始位置,读取512即可停止。-- 在我所用的驱动是这么实现的。

无论如何, 在上层, 一个扇区总是512大小。 在驱动之上的所有层, 无需关注这些转换,是‘透明’的。 所以不需要分析fal的转换。(fal的转换并不是size的转换,是物理扇区到逻辑扇区的转换)
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
地板#
发布于:2009-01-01 03:43
Re:关于2k page flash fmd&#160;&#160;driver 问题
sector size=2048不太合理,我上传一个支持各种nand的驱动,希望对你有帮助。
附件名称/大小 下载次数 最后更新
Smartmedia.rar (22KB)  58 2009-01-01 03:43
asp12
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分478分
  • 威望107点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-01-06 17:28
谢谢斑竹亲自回复,我再看下代码
asp12
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分478分
  • 威望107点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
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的代码我没看,
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
6楼#
发布于:2009-01-07 00:38
Re:关于2k page flash fmd&#160;&#160;driver 问题
1 block = 64 pages = 256 sectors
1 pages = 4 sectors

你说的是单个fat分区,那么对于其他(binfs)分区呢? mbr的读写呢?
我觉得不应该2048,很不nice,除非你浪费2048-512,直接把一个page=一个sector。
如果2048的话, 就相当于让上层来处理1page=4sector的逻辑---改动量太大,没有可能性。
对上层而言,读取mbr就是ReadSector(0);就是512.
---
个人看法。
lStoneCN
驱动牛犊
驱动牛犊
  • 注册日期2004-08-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分334分
  • 威望321点
  • 贡献值1点
  • 好评度28点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2009-08-10 11:26
Re:Re:关于2k page flash fmd&#160;&#160;driver 问题
用zhengshijie的方法做了nboot,用这个驱动好像写入有点问题:
TOC_Write ERROR: SectorInfo verify failed: 0 3 0 0
出问题的代码:
    if ( 0 != memcmp(&si, &si2, sizeof(si)) ) {
        EdbgOutputDebugString("TOC_Write ERROR: SectorInfo verify failed: %x %x %x %x\r\n",
            si.dwReserved1, si.bOEMReserved, si.bBadBlock, si.wReserved2);
        return FALSE;
    }
好像是SectorInfo 没有写入?high帮忙看一下什么原因引起的问题?

引用第3楼high于2009-01-01 03:43发表的 Re:关于2k page flash fmd  driver 问题 :
sector size=2048不太合理,我上传一个支持各种nand的驱动,希望对你有帮助。
寻zigbee/CC2430高手合作!
lStoneCN
驱动牛犊
驱动牛犊
  • 注册日期2004-08-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分334分
  • 威望321点
  • 贡献值1点
  • 好评度28点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2009-08-13 18:39
搞定了2K page的nand驱动了。
不过现在拿到的k9f8g08好像是4K page的nand ,有没有弟兄搞过?
寻zigbee/CC2430高手合作!
游客

返回顶部