http://www.voidcn.com/article/p-fjfmzkvj-rz.html? (推荐,gooogleman)
作者:wogoyixikexie@gliet?2008-12-05
??????????昨晚看以前优龙的老4.2BSP的flash驱动,发现和我现在不能发现这个盘符的驱动有些差别。下面这个函数是flash驱动加载的时候要执行的,作用是检测flash有没有坏块。我发现我在新的flash驱动中犯了严重的错误。等下会在代码中说明。
- DWORD?FMD_GetBlockStatus(BLOCK_ID?blockID)
- {
- ????SECTOR_ADDR?Sector?=?(blockID?*?NAND_PAGE_CNT);
- ????SectorInfo?SI;
- ????DWORD?dwResult?=?0;
- ????
-
-
- //其实这个并不完整,因为这样会检测超出最大block数目正确的做法是
- //if(blockID<0x280||blockID>flash总block数目-1)//这样就不会越界了。
- ????if(blockID<0x280)
- ????????return?BLOCK_STATUS_BAD;
-
- ????if?(IsBlockBad(blockID))
- ????????return?BLOCK_STATUS_BAD;
-
- if?(!FMD_ReadSector(Sector,?NULL,?&SI,?1))?
- return?BLOCK_STATUS_UNKNOWN;
- if?(!(SI.bOEMReserved?&?OEM_BLOCK_READONLY))??
- ????????dwResult?|=?BLOCK_STATUS_READONLY;
- if?(!(SI.bOEMReserved?&?OEM_BLOCK_RESERVED))??
- ????????dwResult?|=?BLOCK_STATUS_RESERVED;
- return(dwResult);
- }
?
我还发现一些注册表的问题。
这是4.2可发现盘符的BSP的flash注册表部分
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDrv]
??"DriverPath"="Drivers//BuiltIn//FlashDrv"
??"DefaultFileSystem"="FATFS"
??"PartitionDriver"="mspart.dll"
??"AutoMount"=dword:1
??"AutoPart"=dword:1
??"AutoFormat"=dword:1
??"Folder"="nand?flash"
??"Name"="Microsoft?Flash?Disk"
??"BootPhase"=dword:0
??"Flags"=dword:1000
??"Ioctl"=dword:4
?
少了那几个东西,对于使用优龙的BIOS来说,是不能发现盘符的。
?
在这里重新回到优龙ADS bootloader的话题,我仔细看过,里面的确没有binfs以及FAT分区功能。
那经过上面注册表之后为什么就实现分区了呢?
?
——————查看CSDN老帖,有:
有几个问题求教,望高手们赐教: ??
? 1 ? 用CreatePartition函数会自动生成MBR和分区表吗? ??
? 2 ? 我用DeviceIoControl函数时,好象只能对某个分区进行读写。我想用CreateFile,第一个参数应该指定一个物理设备名,对于Nand ? Flash应该指定为什么字符串啊?
================================
是可以生成mbr,以及mbr里的partition ? table的。 ??
? ??
? 参见C:/WINCE420/PRIVATE/WINCEOS/COREOS/STORAGE/DOSPART/part.cpp代码
============================================================================================
C:/WINCE500/PRIVATE/WINCEOS/COREOS/STORAGE/DOSPART/helper.cpp(747):BOOL?WriteMBR(DriverState?*state,?SECTORNUM?snSectorNum,?SECTORNUM?snNumSectors,?BYTE?fileSysType,?BOOL?bCreateMBR)?
//重新创建MBR,这个不知道在哪里被调用了,但是可以解释优龙的问题。
/*****************************************************************************?
*??the?MBR?are?sorted?by?the?start?sector.?
*?
*??Input:??state?-?structure?for?this?store?
*??????????snSectorNum?-?start?sector?number?for?this?partition?
*??????????snNumSectors?-?number?of?sectors?in?this?partition?
*??????????fileSysType?-?partition?type?
*??????????bCreateMBR?-?TRUE?to?generate?a?new?MBR,?FALSE?to?add?to?the?
*??????????????????????existing?MBR?
*?
*??Output:?none?
*??Return:?TRUE?if?successfully?written,?FALSE?for?failures,?ERROR_DISK_FULL?
*??????????will?be?set?if?no?room?in?the?MBR?
*****************************************************************************/?
BOOL?WriteMBR(DriverState?*state,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px"> {?
????PBYTE??????buffer?=?NULL;?
????PPARTENTRY??tmpbuffer,?tmpbuffer1;?
????BOOL????????bResult;?
int????????i,?partIndex,?partNum?=?-1;?
????
if?(!bCreateMBR)?
????{?
????????bResult?=?ReadSectors?(state,?0,?1,?&buffer);?
if?(!bResult)?
????????????return?FALSE;?
for?(i?=?0,?partIndex?=?0,?tmpbuffer?=?(PPARTENTRY)(buffer?+?PARTTABLE_OFFSET);?i?<?4;?i++,?tmpbuffer++)?
????????{?
if?(tmpbuffer->Part_TotalSectors?==?0)?
????????????{?
????????????????partNum?=?i;?
????????????????break;?
????????????}?
????????????
????????????if?(snSectorNum?>?tmpbuffer->Part_StartSector)?
????????????????partIndex?=?i?+?1;?
????????}?
if?(partNum?==?-1)?
????????{?
????????????
????????????LocalFree(buffer);?
????????????SetLastError(ERROR_DISK_FULL);?
????????
if?(partIndex?!=?partNum)?
//?this?partition?needs?to?be?added?in?the?order?that?it?appears?on?the?disk?-?so?this?may?involve?
//??shifting?some?of?the?existing?partition?entries?to?open?up?the?partition?entry?where?this?belongs?
????????????tmpbuffer?=?(PPARTENTRY)(buffer?+?PARTTABLE_OFFSET?+?(partNum?*?sizeof(PARTENTRY)));?
????????????tmpbuffer1?=?(PPARTENTRY)(buffer?+?PARTTABLE_OFFSET?+?((partNum?-1)?*?sizeof(PARTENTRY)));?
for?(;?partNum?>?partIndex;?partNum--)?
????????????{?
????????????????memcpy(tmpbuffer,?tmpbuffer1,?sizeof(PARTENTRY));?
????????????????tmpbuffer--;?
????????????????tmpbuffer1--;?
????}?
else?
????{?
????????buffer?=?(PBYTE)LocalAlloc(LMEM_ZEROINIT,?state->diskInfo.di_bytes_per_sect);?
if?(!buffer)?
return?FALSE;?
//?add?header?and?trailer?info?to?the?MBR?
????????*(WORD?*)(buffer?+?BOOT_SIGNATURE)?=?BOOTSECTRAILSIGH;?
????????buffer[0]?=?0xE9;?
????????buffer[1]?=?0xfd;?
????????buffer[2]?=?0xff;?
????????partNum?=?0;?
????}?
????tmpbuffer?=?(PPARTENTRY)(buffer?+?PARTTABLE_OFFSET?+?partNum?*?(int)//?create?the?partition?entry?for?the?extended?partition?
????bResult?=?ConvertLBAtoCHS?(state,?snSectorNum,?&tmpbuffer->Part_FirstTrack,?&tmpbuffer->Part_FirstHead,?&tmpbuffer->Part_FirstSector);?
????tmpbuffer->Part_FileSystem?=?fileSysType;?
????tmpbuffer->Part_StartSector?=?(DWORD)snSectorNum;?
????tmpbuffer->Part_TotalSectors?=?(DWORD)snNumSectors;?
????bResult?=?WriteSectors(state,?buffer);?
????LocalFree(buffer);?
return?bResult;?
}?
如果eboot不格式化FAT分区,就要在flash驱动中把NK所占block标记为坏块。才行。?
但是如何让系统自动格式化位binfs我就不知道怎么搞了。这个不行的。因为当时已经存在NK了,不能再格式化了。?
哈哈,终于弄明白优龙为何不支持binfs了。?
哈哈,现在如果在ADS增加binfs格式化那么就好办了。
?
转载请标明:作者wogoyixikexie@gliet.桂林电子科技大学一系科协。如有错误,希望能够留言指出。