转自:http://blog.csdn.net/loongembedded/article/details/8956584
1. 刷系统异常现象
随着采用SLC NAND FLASH设备的大量使用,在测试和使用过程中发现,在刷系统时可能无法正常启动,一般是在连续刷系统30次之内,基本上会出现刷完系统启动的时候无法正常启动,异常信息如下:
HciManager::ThreadExecute() openDrivers\Builtin\Bcspdrv success
OpenConnection() portName=COM2:
[HSMMC1] Turn OFF the F/B delay control.
[HSMMC1] Setting for 1 bit mode , ClockRate = 100000 Hz
[HSMMC1] Turn OFF the F/B delay control.
ERR CMD:5 : If the card is not a SDIO, CMD5 does not work in reason.
ERR CMD:1 : If the card is not a MMC, CMD 1does not work in reason.
HCI_OpenConnection() 11111
Exception 'Data Abort' (4):Thread-Id=01950002(pth=87fa3aa4), Proc-Id=00400002(pprc=82d98308) 'NK.EXE',VM-active=00400002(pprc=82d98308) 'NK.EXE'
PC=c003b944(k.coredll.dll+0x0001b944)RA=c0324b34(cachefilt.dll+0x00004b34) SP=d00ffe00, BVA=000000ac
[SDBUS] SD Card Spec Version : 2.00
[SDBUS] SD/SDHC supports the high-speedmode.
[HSMMC1] Setting for 4 bit mode , ClockRate = 50000000 Hz
[HSMMC1] Turn OFF the F/B delay control.
HciManager::ThreadExecute() config PSconfig.psr success
BcspCommunication::CloseConnection()
HciManager::ThreadExecute() callbcspCommunication.OpenConnection() 111111
OpenConnection() portName=COM2:
HciManager::ThreadExecute() call bcspCommunication.OpenConnection()22222
KPD_Init
USB Serial Function Class Enabled :Serial_Class
PLUG_IST() main boardV2.0,usbPlugInNewStat=0
+OALIoCtlHalGetDeviceInfo(...)
OALIoCtlHalGetDeviceInfo():SPI_GETUUID
-OALIoCtlHalGetDeviceInfo(SPI = SPI_GETUUID,rc = 1)
UfnClientLib!UfnCheckPID: WARNING -- usingMS reference platform VID/PID 0x045e/0x00ce (not allowed in shipping platforms)
HW_USBClocks::D0
UfnPdd_IOControl()--->IOCTL_BUS_SET_POWER_STATElpceDevicePowerState=0
[DISP:ERR] Disp_initialize_output_interface(): Not Implemented Video Output Mode [1]
VDE_IOControl()IOCTL_SVE_FIMD_SET_OUTPUT_ENABLE
+BacklightPwrSrcChanged
LayMgr.cpp: Layout Manager successfullyinitialized to 2
MSIM: IM_ReadRegistry read KB 5
Exception 'Data Abort' (4): Thread-Id=04dd0006(pth=838c0354),Proc-Id=00400002(pprc=82d98308) 'NK.EXE', VM-active=049b0006(pprc=838b8ec4)'explorer.exe'
PC=c006e36c(k.coredll.dll+0x0004e36c)RA=c03224d0(cachefilt.dll+0x000024d0) SP=d411fb28, BVA=00000000
Exception 'Raised Exception' (-1): Thread-Id=04dd0006(pth=838c0354),Proc-Id=00400002(pprc=82d98308) 'NK.EXE', VM-active=049b0006(pprc=838b8ec4)'explorer.exe'
PC=c003bc08(k.coredll.dll+0x0001bc08)RA=8023a4c8(kernel.dll+0x000064c8) SP=d411f3b0, BVA=ffffffff
Exception 'Data Abort' (4): Thread-Id=04dd0006(pth=838c0354),Proc-Id=00400002(pprc=82d98308) 'NK.EXE', VM-active=049b0006(pprc=838b8ec4)'explorer.exe'
PC=c006e36c(k.coredll.dll+0x0004e36c)RA=c03224d0(cachefilt.dll+0x000024d0) SP=d411fb28, BVA=00000000
Exception 'Raised Exception' (-1): Thread-Id=04dd0006(pth=838c0354),Proc-Id=00400002(pprc=82d98308) 'NK.EXE', VM-active=049b0006(pprc=838b8ec4)'explorer.exe'
PC=c003bc08(k.coredll.dll+0x0001bc08)RA=8023a4c8(kernel.dll+0x000064c8) SP=d411f3b0, BVA=ffffffff
…..
2. 问题的排查
根据调试信息,发生'Data Abort'异常的地方恰好是下面的代码之间
result =bcspCommunication.OpenConnection(comPortName, flashChip ? baudrate :bootstrapBaudrate, defaultPacketSize, threadPriority, TRUE, !flashChip);
if (result == ERROR_SUCCESS && !flashChip)
{
IFDBG(DebugOut(DEBUG_MANAGER_INIT,TEXT("<HciManager::ThreadExecute> Bootstraping chip")));
if(GetFileAttributes(L"\\FlashDisk\\PSconfig.psr") == 0xFFFFFFFF)
{
MoveFile(L"\\Windows\\PSconfig.psr", L"\\Flash Disk\\PSconfig.psr");
SetFileAttributes(L"\\FlashDisk\\PSconfig.psr",FILE_ATTRIBUTE_NORMAL);
}
result= bccmd.ConfigureChip(TEXT("\\Flash Disk\\PSconfig.psr"));
此问题的各种排查情况如下:
⑴屏蔽掉对GetFileAttributes、MoveFile和SetFileAttributes这些API的调用,异常依旧会产生。
⑵因为这里调用了GetFileAttributes、MoveFile和SetFileAttributes等API,结合异常信息,怀疑是cachefilt.dll还没有加载起来就执行了这些调用引起的,就在platform.reg下面的注册表:
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NAND\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND\FATFS\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
都增加了"Order"=dword:1,确保在蓝牙驱动加载之前加载cachefilt.dll,但异常还是会出现。
⑶在platform.reg中增加下面的注册表项:
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NAND]
"DriverPath"="Drivers\\BuiltIn\\NAND"
"LoadFlags"=dword:1 ; load synchronously
"BootPhase"=dword:0
"MountAsBootable"=dword:1 ; for Hive-based registry
"Flags"=dword:1000
增加之后连续刷系统55次没有发现异常,应该是解决了此问题,但是之前把Flash disk盘符不能成功映射为U盘。一个很奇怪的现象,就是把FLASH相关注册表的NAND改为NANDFLASH(包括这部分的注册表信息)就解决了刷系统启动异常问题和Flash Disk分区不能成功映射为U盘问题,如果是NAND或是FLASH就不行,现在还不知道为什么会这样,因为查找了整个BSP包,都没有说限制一定要用NANDFLASH,知道的朋友,还望分享一下。
3. 问题的解决
为了解决这个问题及解决过程中发现Flash disk盘符不能成功映射为U盘的问题,先把问题解决前后的注册表信息贴出来。
问题解决前:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NAND]
"Prefix"="DSK"
"Dll"="smflash.dll"
"Order"=dword:0
"Index"=dword:3
"Profile"="NAND"
"Ioctl"=dword:4
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
"Flags"=dword:1000
;[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NAND]
;"DriverPath"="Drivers\\BuiltIn\\NAND"
;"LoadFlags"=dword:1 ; load synchronously
;"BootPhase"=dword:0
;"MountAsBootable"=dword:1 ; for Hive-based registry
;"Flags"=dword:1000
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"Name"="MicrosoftFlash Disk"
"AutoPart"=dword:1
"AutoFormat"=dword:1
"AutoMount"=dword:1
"BootPhase"=dword:0
"Flags"=dword:1000
;"Folder"="HIVE1"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND\BINFS]
"MountHidden"=dword:1
"MountAsROM"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND\FATFS]
;"FormatExfat"=dword:1
"FormatFAT"=dword:1
"Flags"=dword:14 ; deprecated inCE6.0 (0x4 : FATFS_DISABLE_AUTOSCAN, 0x10 : FATFS_ENABLE_BACKUP_FAT)
"DisableAutoScan"=dword:1
"CheckForFormat"=dword:1
"EnableWriteBack"=dword:1
"AutoFormat"=dword:1
"MountAsRoot"=dword:1 ; for ROM-only file system
"MountAsBootable"=dword:1 ; for Hive-based registry
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NAND\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND\FATFS\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND\PART01]
"Name"="Microsoft FlashDisk1"
"Folder"="SysDisk"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NAND\PART02]
"Name"="Microsoft FlashDisk2"
"Folder"="FlashDisk"
问题解决之后的注册表信息:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFLASH]
"Prefix"="DSK"
"Dll"="smflash.dll"
"Index"=dword:3
"Order"=dword:0
"Profile"="NANDFLASH"
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
IF IMGHIVEREG
"Flags"=dword:00001000
ENDIF ;IMGHIVEREG
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"Name"="Microsoft Flash Disk"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\BINFS]
"MountHidden"=dword:1
"MountAsROM"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NANDFLASH]
"DriverPath"="Drivers\\BuiltIn\\NANDFLASH"
;LoadFlags 0x01 == load synchronously
"LoadFlags"=dword:1
"BootPhase"=dword:0
IF IMGHIVEREG
"MountAsBootable"=dword:1
ENDIF ;IMGHIVEREG
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\FATFS]
"Flags"=dword:14
;"Folder"="ResidentFlash"
"FormatExfat"=dword:1
"CheckForFormat"=dword:1
"EnableWriteBack"=dword:1
"MountAsRoot"=dword:1; for ROM-only file system
IFIMGHIVEREG
"MountAsBootable"=dword:1 ; for Hive-based registry
ENDIF IMGHIVEREG
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NANDFLASH\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\FATFS\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\PART01]
"Name"="Microsoft FlashDisk1"
"Folder"="SysDisk"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\PART02]
"Name"="Microsoft FlashDisk2"
"Folder"="FlashDisk"