2440 6.0BSP移植过程之nand flash驱动
//-----------------------------------------------------------------------------------------------------------
// 作者:wogoyixikexie@gliet
//论坛账号:gooogleman (经常在CSDN出没)
// 版权:桂林电子科技大学一系科协wogoyixikexie@gliet
// 平台:wince5.0 2440 5.0 BSP
// 发布日期:2009年6月18日
// 最后修改:
// 注意事项:未经作者同意,不得在转载的时候擅自修改、删除文章的任何部分
//-----------------------------------------------------------------------------------------------------------
作者:wogoyixikexie@gliet(注意转载请标明原创作者)
下面是nand flash驱动, 我想配置成TFAT格式,但是启动的时候产生了异常,wince6.0 顺利启动了系统,可是flash盘符没有出现。
; HIVE BOOT SECTION
IF BSP_NONANDFS !
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH]
;"DefaultFileSystem"="BINFS"
"DefaultFileSystem"="FATFS"
"AutoPart"=dword:1
"AutoMount"=dword:1
"AutoFormat"=dword:1 ;because didn't use eboot
"PartitionDriver"="mspart.dll"
"Name"="Microsoft Flash Disk"
"Folder"="NandFlash"
"BootPhase"=dword:0
"Flags"=dword:1000 ; copy from yl2440 5.0BSP
; Keep FATFS from trying to shadow \Windows
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\FATFS]
"Flags"=dword:14
"FormatTfat"=dword:1
"CheckForFormat"=dword:1
;---copy from yl2440 5.0BSP
;"FriendlyName"="FAT FileSystem"
;"Dll"="fatfsd.dll"
;"Flags"=dword:00280014
;"Paging"=dword:1
;"CacheSize"=dword:0
;"EnableCacheWarm"=dword:0
;"EnableCache"=dword:1
;"MountFlags"=dword:2
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SMFLASH]
"Prefix"="DSK"
"Dll"="smflash.dll"
"Index"=dword:1
"Order"=dword:0
"Profile"="SMFLASH"
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
"Flags"=dword:00000014 ;FATFS_TFAT_ALWAYS|FATFS_FORCE_TFAT
"MountFlags"=dword:0
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
"DriverPath"="Drivers\\BuiltIn\\SMFLASH"
"LoadFlags"=dword:1 ;load synchronously
;"LoadFlags"=dword:1
;"BootPhase"=dword:0
"MountFlags"=dword:11
"BootPhase"=dword:1
"Flags"=dword:1000
ENDIF ; BSP_NONANDFS
; END HIVE BOOT SECTION
启动时候的异常
Windows CE Kernel for ARM (Thumb Enabled) Built on Nov 24 2008 at 14:58:01
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
Exception 'Prefetch Abort' (3): Thread-Id=005c0002(pth=98ccb264), Proc-Id=00400002(pprc=809b8308) 'NK.EXE', VM-active=00400002(pprc=809b8308) 'NK.EXE'
PC=00000000(???+0x00000000) RA=c0662ad0(smflash.dll+0x00002ad0) SP=d00bf0f8, BVA=00000000
Exception 'Raised Exception' (-1): Thread-Id=005c0002(pth=98ccb264), Proc-Id=00400002(pprc=809b8308) 'NK.EXE', VM-active=00400002(pprc=809b8308) 'NK.EXE'
PC=c0038ddc(k.coredll.dll+0x00018ddc) RA=802384c8(kernel.dll+0x000064c8) SP=d00be974, BVA=ffffffff
什么原因造成的呢? 这个真的很难判断。
后来找到了驱动开发网zhengshijie牛人给的答案
我想你肯定会遇到这个问题,
最终系统生成,下载运行,产生异常,指示是smflash.dll->falmain.cpp
FMD.pInit((LPTSTR)dwContext,NULL,NULL)
查看falmain.cpp代码,知道它要调用GetFMDInterface()
FMD_OEMIoControl (IOCTL_FMD_GET_INTERFACE, NULL, 0, (PBYTE)&FMD, sizeof(FMDInterface), NULL)
即要求我的fmd.cpp->FMD_OEMIoControl提供对IOCTL_FMD_GET_INTERFACE的处理,
修改fmd.cpp
BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
switch(dwIoControlCode)
{
case IOCTL_FMD_GET_INTERFACE:
{
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:
break;
}
return(TRUE);
}
通过看wince600/private/winceos/drivers/msflash/src/falmain.cpp->
DSK_Init()->GetFMDInterface(pDevice);
FMD_OEMIoControl (IOCTL_FMD_GET_INTERFACE, NULL, 0, (PBYTE)&FMD, sizeof(FMDInterface), NULL)
要么实现IOCTL_FMD_GET_INTERFACE的操作,要么FMD_OEMIoControl()函数返回FALSE;
试试先。
哈哈,果然可以了!
Windows CE Kernel for ARM (Thumb Enabled) Built on Nov 24 2008 at 14:58:01
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
FMD: ReadID (Mfg=ec, Dev=dc)
FMD_Init: finished successful
IsBlockBad(C9E): TRUE
IsBlockBad(C9E): TRUE
HW_USBClocks::D0
s3c2440disp: display instance '<NULL>', num monitors 1