三星的系列NandFlash有什么区别?K9F1G08/2G08/4G08/8G08.他们都是大块(2KB每页)的NAND FLASH?他们的驱动可以完全公用?还是不同芯片驱动要进行不同的修改?

xqhrs232 2009-02-10 08:37:22
加精
三星的系列NandFlash有什么区别?K9F1G08/K9F2G08/K9F4G08/K9F8G08.他们都是大块(2KB每页)的NAND FLASH?他们的驱动可以完全公用?还是不同芯片驱动要进行不同的修改?
...全文
8602 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frog1228 2012-01-06
  • 打赏
  • 举报
回复
好长。。。
Devin_la 2010-08-30
  • 打赏
  • 举报
回复
ding qi
tzy_sky 2010-08-24
  • 打赏
  • 举报
回复
原先使用K9F1G08U0A 所以功能正常,由于K9F1G08U0A已升级为K9F1G08U0C 可以完全替代,但更换成这个型号的芯片后 在电脑上能打开U盘 并存放东西进去, 再次上电后发现之前保存的东西已经打不开,有时在电脑上文件的图标都显示不出来,能显示出来的文件打开也是乱码。 这个问题一直找不到原因 ,快急死我了,向大侠们求救!
西山锈码 2010-07-29
  • 打赏
  • 举报
回复
走过,路过.....
macklau 2010-03-01
  • 打赏
  • 举报
回复
不太清楚,学习中!!!!!!!!!!!!!!
Great_Bug 2009-12-26
  • 打赏
  • 举报
回复
学习.....
JNU_kinke 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gooogleman 的回复:]
我今年都没有机会6410了。
[/Quote]

我们也打算今年用的,也没机会了,呵呵
xqhrs232 2009-03-28
  • 打赏
  • 举报
回复
xqhrs232 2009-02-25
  • 打赏
  • 举报
回复
今天试了一下,还是不行。估计真还得修改什么地方才能真正支持大块的NAND FLASH。
xqhrs232 2009-02-20
  • 打赏
  • 举报
回复


//CE上层对下层的NAND FLASH接口的包装调用!!!-----OAK/DRIVERS/BLOCK/MSFLASH/FMDWRAPPERPDD/fmdwrapperpdd.cpp
VOID FmdWrapperPdd::GetFmdInterface()
{
m_FmdInterface.cbSize = sizeof(FMDInterface);

// Query FMD intrface from the FMD
//
m_FmdInterface.pOEMIoControl = FMD_OEMIoControl;

if (!FMD_OEMIoControl (IOCTL_FMD_GET_INTERFACE,
NULL, 0,
(PBYTE)&m_FmdInterface, sizeof(FMDInterface),
NULL))
{
// FMD does not support IOCTL_FMD_GET_INTERFACE, so build the FMDInterface
// structure using the legacy FMD functions
//
m_FmdInterface.pInit = FMD_Init;
m_FmdInterface.pDeInit = FMD_Deinit;
m_FmdInterface.pGetInfo = FMD_GetInfo;
m_FmdInterface.pGetBlockStatus = FMD_GetBlockStatus;
m_FmdInterface.pSetBlockStatus = FMD_SetBlockStatus;
m_FmdInterface.pReadSector = FMD_ReadSector;
m_FmdInterface.pWriteSector = FMD_WriteSector;
m_FmdInterface.pEraseBlock = FMD_EraseBlock;
m_FmdInterface.pPowerUp = FMD_PowerUp;
m_FmdInterface.pPowerDown = FMD_PowerDown;
}

// Query hook library in case any FMD functions need to be shimmed
//
m_FmdHookHandle = FMDHOOK_HookInterface(&m_FmdInterface);
}


//NAND FLASH对应的操作接口函数导出操作!!!------在 ++FMD_Init()被执行之前调用!!!

BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
switch(dwIoControlCode)
{
case IOCTL_FMD_GET_INTERFACE:
{
RETAILMSG(1, (TEXT("[FMD] FMD_OEMIoControl() : IOCTL_FMD_GET_INTERFACE\r\n")));

if (!pOutBuf || nOutBufSize < sizeof(FMDInterface))
{
DEBUGMSG(1, (TEXT("FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACE bad parameter(s).\r\n")));
return(FALSE);
}

PFMDInterface pInterface = (PFMDInterface)pOutBuf;

pInterface->cbSize = sizeof(FMDInterface);
pInterface->pInit = FMD_Init;
pInterface->pDeInit = FMD_Deinit;
pInterface->pGetInfo = FMD_GetInfo;
pInterface->pGetInfoEx = NULL; //FMD_GetInfoEx;
pInterface->pGetBlockStatus = FMD_GetBlockStatus;
pInterface->pSetBlockStatus = FMD_SetBlockStatus;
pInterface->pReadSector = FMD_ReadSector;
pInterface->pWriteSector = FMD_WriteSector;
pInterface->pEraseBlock = FMD_EraseBlock;
pInterface->pPowerUp = FMD_PowerUp;
pInterface->pPowerDown = FMD_PowerDown;
pInterface->pGetPhysSectorAddr = NULL;

break;
}



.............................


default:
RETAILMSG(1, (TEXT("[FMD:ERR] FMD_OEMIoControl() : Unknown IOCTL (0x%08x)\r\n"), dwIoControlCode));
return FALSE;
}

return TRUE;
}

xqhrs232 2009-02-20
  • 打赏
  • 举报
回复
//在FMD_Init( )函数里面执行下面的操作------nCnt为在static FlashDevSpec astNandSpec[]数组里面找到的对应ID序号
NUM_OF_BLOCKS = astNandSpec[nCnt].nNumOfBlks;
PAGES_PER_BLOCK = astNandSpec[nCnt].nPgsPerBlk;
SECTORS_PER_PAGE = astNandSpec[nCnt].nSctsPerPg;



//define in NandFlash/FMD/nand.h-------stDeviceInfo = GetNandInfo();-----在OEMPlatformInit( )函数里面#define NUM_OF_BLOCKS (stDeviceInfo.nNumOfBlks)
#define PAGES_PER_BLOCK (stDeviceInfo.nPagesPerBlk)
#define SECTORS_PER_PAGE (stDeviceInfo.nSctsPerPage)

#undef SECTOR_SIZE
#define SECTOR_SIZE (512)
#define NAND_SECTOR_SIZE (SECTOR_SIZE*SECTORS_PER_PAGE)

#define IS_LB (SECTORS_PER_PAGE == 4)

//define in NandFlash/FMD/fmd.cpp
BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
BOOL bRet;

//RETAILMSG(1, (TEXT("[R:0x%08x] \r\n"), startSectorAddr));
#if (NAND_DEBUG)
RETAILMSG(1, (TEXT("[FMD] ++FMD_ReadSector(0x%08x) \r\n"), startSectorAddr));
#endif

#ifdef SYNC_OP
EnterCriticalSection(&g_csNandFlash);
#endif

if ( IS_LB )
{
bRet = FMD_LB_ReadSector(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()\r\n")));
#endif

return bRet;
}

xqhrs232 2009-02-19
  • 打赏
  • 举报
回复
//几个相关函数的调用关系为::
EBOOT里面的OEMPlatformInit( )----调用---1.BP_Init( )----调用-----A.FMD_Init( )++++B.FMD_GetInfo( )
2.FMD_GetInfo( )
3.GetNandInfo( )


1。其中NBOOT会自己去读NAND FLASH的ID号,大块就把g_bLargeBlock标志置为TRUE,如果是真了,NAND_ReadPage( )读扇区的操作就有附加工作要做,大块了,操作的次数就要多


2。EBOOT里面已经在OEMPlatformInit( )函数里面用BP_Init( )函数对所外接的NAND FLASH进行了必要的初始化,所以他可以直接调用BP_XXX( )和FMD_XXX( )系列函数了,并且不会出错

3。NK里面加载了NAND FLASH的驱动,所以调用FMD_XXX( )系列函数进行文件的读/写也不会有问题了


整个工作流程应该就是这样的!!!-----我的BSP是6400的,2440就不清楚了!

xqhrs232 2009-02-19
  • 打赏
  • 举报
回复



static FlashDevSpec astNandSpec[] = {
/*************************************************************************/
/* nMID, nDID, */
/* nNumOfBlks */
/* nPgsPerBlk */
/* nSctsPerPg */
/* nNumOfPlanes */
/* nBlksInRsv */
/* nBadPos */
/* nLsnPos */
/* nECCPos */
/* nBWidth */
/* nTrTime */
/* nTwTime */
/* nTeTime */
/* nTfTime*/
/*************************************************************************/
/* 8Gbit DDP NAND Flash */
{ 0xEC, 0xD3, 8192, 64, 4, 2,160, 0, 2, 8, BW_X08, 50, 350, 2000, 50}, //K9G8G08





/* 4Gbit DDP NAND Flash */
{ 0xEC, 0xAC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
{ 0xEC, 0xDC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0xBC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0xCC, 4096, 64, 4, 2, 80, 0, 2, 8, BW_X16, 50, 350, 2000, 50},




/* 2Gbit NAND Flash */
{ 0xEC, 0xAA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
{ 0xEC, 0xDA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0xBA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0xCA, 2048, 64, 4, 1, 40, 0, 2, 8, BW_X16, 50, 350, 2000, 50},




/* 2Gbit DDP NAND Flash */
{ 0xEC, 0xDA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
{ 0xEC, 0xAA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0xBA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0xCA, 2048, 64, 4, 2, 40, 0, 2, 8, BW_X16, 50, 350, 2000, 50},




/*1Gbit NAND Flash */
{ 0xEC, 0xA1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X08, 50, 350, 2000, 50}, //K9F1G08
{ 0xEC, 0xF1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0xB1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0xC1, 1024, 64, 4, 1, 20, 0, 2, 8, BW_X16, 50, 350, 2000, 50},




/* 1Gbit NAND Flash */
{ 0xEC, 0x79, 8192, 32, 1, 4,120, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
{ 0xEC, 0x78, 8192, 32, 1, 4,120, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0x74, 8192, 32, 1, 4,120,11, 0, 6, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0x72, 8192, 32, 1, 4,120,11, 0, 6, BW_X16, 50, 350, 2000, 50},




/* 512Mbit NAND Flash */
{ 0xEC, 0x76, 4096, 32, 1, 4, 70, 5, 0, 6, BW_X08, 50, 350, 2000, 50}, //K9F1208
{ 0xEC, 0x36, 4096, 32, 1, 4, 70, 5, 0, 6, BW_X08, 50, 350, 2000, 50},




/* 512Mbit XP Card */
{ 0x98, 0x76, 4096, 32, 1, 4, 70, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
{ 0x98, 0x79, 4096, 32, 1, 4, 70, 5, 0, 6, BW_X08, 50, 350, 2000, 50},



//{ 0xEC, 0x56, 4096, 32, 1, 4, 70,11, 0, 6, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0x46, 4096, 32, 1, 4, 70,11, 0, 6, BW_X16, 50, 350, 2000, 50},
/* 256Mbit NAND Flash */
{ 0xEC, 0x75, 2048, 32, 1, 1, 35, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
{ 0xEC, 0x35, 2048, 32, 1, 1, 35, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0x55, 2048, 32, 1, 1, 35,11, 0, 6, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0x45, 2048, 32, 1, 1, 35,11, 0, 6, BW_X16, 50, 350, 2000, 50},



/* 128Mbit NAND Flash */
{ 0xEC, 0x73, 1024, 32, 1, 1, 20, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
{ 0xEC, 0x33, 1024, 32, 1, 1, 20, 5, 0, 6, BW_X08, 50, 350, 2000, 50},
//{ 0xEC, 0x53, 1024, 32, 1, 1, 20,11, 0, 6, BW_X16, 50, 350, 2000, 50},
//{ 0xEC, 0x43, 1024, 32, 1, 1, 20,11, 0, 6, BW_X16, 50, 350, 2000, 50},

{ 0x00, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};


xqhrs232 2009-02-19
  • 打赏
  • 举报
回复
今天把代码好好看了下,算是明白了一些.那个存储NAND FLASH消息的数据结构static FlashDevSpec astNandSpec[]在 BSP/SRC/COMMON/NandFlash/FMD/cfnand.h文件里面.FMD_Init( )的时候会根据读到的Make ID+Device ID去查这个数据结构表的,查到了对应的配置参数就有了,都不需要人为去控制修改什么代码,大小块的识别,读ID号就可以判断的,所以不管接什么NandFlash,程序会自动识别,自动调用对应的驱动,不要人参与的,我的6400应该是这样的!!!
xqhrs232 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 xuweiyue 的回复:]
引用 39 楼 xqhrs232 的回复:
我的EMAIL-------xqhrs232@yahoo.com.cn.谢谢37楼

嗯 我发给你了
[/Quote]

收到了,谢谢了!
xuweiyue 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 xqhrs232 的回复:]
我的EMAIL-------xqhrs232@yahoo.com.cn.谢谢37楼
[/Quote]
嗯 我发给你了
thunderccx 2009-02-19
  • 打赏
  • 举报
回复
不错,顶!
我们公司用K9F1208,nand flash性价比确实比较高。但经常读写的数据我们用电池+RAM的方式。
xumercury 2009-02-19
  • 打赏
  • 举报
回复
看手册吧。。找供应商要手册。对比下他们的这几个参数
Maker ID,Device ID,tRP, tWP, tWB,tWH, tRH
xqhrs232 2009-02-19
  • 打赏
  • 举报
回复
我的EMAIL-------xqhrs232@yahoo.com.cn.谢谢37楼
xqhrs232 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 xuweiyue 的回复:]
引用 36 楼 wdw1600 的回复:
引用 33 楼 xqhrs232 的回复:

引用 32 楼 xuweiyue 的回复:
现在用的是K9F1G08,用微软的那个FMD.cpp修改就可以了;K9F2G08和K9F1G08的驱动架构一样,就是地址大小修改一下而已


是不是要修改很多地方?

只需要修改reserved block的大小就是了,就是那个结构体的第二个成员值


改的内容很少啊,你要的话我直接发给你,你留个邮箱。
[/Quote]

好啊
加载更多回复(37)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧