作者: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;
-
-
-
-
-
- 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)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- BOOL WriteMBR(DriverState *state, SECTORNUM snSectorNum,
- SECTORNUM snNumSectors, BYTE fileSysType, BOOL bCreateMBR)
- {
- 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);
- return FALSE;
- }
-
- if (partIndex != partNum)
- {
-
-
-
-
- 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;
-
- *(WORD *)(buffer + BOOT_SIGNATURE) = BOOTSECTRAILSIGH;
- buffer[0] = 0xE9;
- buffer[1] = 0xfd;
- buffer[2] = 0xff;
- partNum = 0;
- }
- tmpbuffer = (PPARTENTRY)(buffer + PARTTABLE_OFFSET +
- partNum * (int)sizeof(PARTENTRY));
-
- 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 = ConvertLBAtoCHS (state,
- tmpbuffer->Part_StartSector + tmpbuffer->Part_TotalSectors -1,
- &tmpbuffer->Part_LastTrack, &tmpbuffer->Part_LastHead,
- &tmpbuffer->Part_LastSector);
- bResult = WriteSectors(state, 0, 1, buffer);
- LocalFree(buffer);
- return bResult;
- }
如果eboot不格式化FAT分区,就要在flash驱动中把NK所占block标记为坏块。才行。
但是如何让系统自动格式化位binfs我就不知道怎么搞了。这个不行的。因为当时已经
存在NK了,不能再格式化了。
哈哈,终于弄明白优龙为何不支持binfs了。
哈哈,现在如果在ADS增加binfs格式化那么就好办了。