当前位置: 代码迷 >> WinCE >> WINCE6.0设备唯一码的写入和读取(NAND FLASH),该怎么解决
  详细解决方案

WINCE6.0设备唯一码的写入和读取(NAND FLASH),该怎么解决

热度:199   发布时间:2016-04-28 12:08:16.0
WINCE6.0设备唯一码的写入和读取(NAND FLASH)
大家好,我们WINCE6.0设备采用的是SLC NAND FLASH,没有EEPROM,客户要求能够通过软件接口读取设备唯一码,对于FLASH来说,大家是如何实现这个功能的,把唯一码写在Flash哪个block比较合适,我们设备FLASH block规划是这样的:nboot+TOC+eboot+logo+MBR+NK+Flash Disk。麻烦大家分享一下,先谢谢了。
------解决方案--------------------
我们的是在eboot和logo中间加了一个cust data用于保存UUID的
------解决方案--------------------
重新格式化系统的过程如果可以自己控制,可以考虑不格式化某些块;或格式化之前读出某些块的内容,格式化完再写进去。
------解决方案--------------------
应用程序接口这方面比较简单,直接在FMD驱动中提供对应的接口就可以了。

引用:
...,而且如何提供接口给应用来读取UUID,请教了。

------解决方案--------------------
以前实现在应用程序中读写TOC也是用一样的方式。也有人logo也是直接在进入系统后用app修改了。
------解决方案--------------------
使用Nandflash,一般都是把唯一码放在指定的块中,升级的时候不对这些块操作。


写块操作导致系统异常?
确定写的块号正确吗?在写之前,能否正确读取该块?
------解决方案--------------------
引用:
BOOL WriteDeviceId(PBYTE pInBuf, DWORD nInBufSize)
{
UCHAR szSectorInfo[16] ={0};
 PSectorInfo     g_pSectorInfoBuf = (PSectorInfo)szSectorInfo;
FMD_GetInfo (&g_FlashInfo);

 RETAILMSG(TRUE, (TEXT("WriteDeviceId() 11111  \r\n")));

if (!ReadBlock(SYSTEM_INFO_BLOCK, NULL, g_pSectorInfoBuf))
{
RETAILMSG(1, (TEXT("WriteSYSTEM_INFO_BLOCK : failed to read block (0x%x).\r\n"), SYSTEM_INFO_BLOCK));
return FALSE;
}

if (!FMD_EraseBlock(SYSTEM_INFO_BLOCK))
{
RETAILMSG(1, (TEXT("WriteSYSTEM_INFO_BLOCK : failed to erase block (0x%x).\r\n"), SYSTEM_INFO_BLOCK));
return FALSE;
}
if (!WriteBlock(SYSTEM_INFO_BLOCK,szInBuf,g_pSectorInfoBuf ))
{
RETAILMSG(1, (TEXT("WriteSYSTEM_INFO_BLOCK: failed to write block (0x%x).\r\n"), SYSTEM_INFO_BLOCK));
return FALSE;
}

return TRUE; 
这是写ID的函数,但WriteBlock这里导致系统异常,不知道是什么原因?

写之前是否应该先擦除
------解决方案--------------------
可以读取SLC NAND FLASH的UUID,作为设备ID!
  相关解决方案