VOID SetDeviceID( OAL_BLMENU_ITEM *pMenu ) { WCHAR szInputLine[16]; UNREFERENCED_PARAMETER(pMenu); OALLog( L" Current Device ID: %d\r\n", g_bootCfg.deviceID ); OALLog(L"\r\n New Device ID: "); if (OALBLMenuReadLine(szInputLine, dimof(szInputLine)) == 0) { goto cleanUp; } // Get device ID g_bootCfg.deviceID = OALStringToUINT32(szInputLine); cleanUp: return; }
VOID SetBadBlock(OAL_BLMENU_ITEM *pMenu) { HANDLE hFMD = NULL; PCI_REG_INFO regInfo; FlashInfo flashInfo; BLOCK_ID blockId; WCHAR szInputLine[16]; UNREFERENCED_PARAMETER(pMenu); // Open FMD regInfo.MemBase.Reg[0] = g_ulFlashBase; hFMD = FMD_Init(NULL, ®Info, NULL); if (hFMD == NULL) { OALLog(L" Oops, can't open FMD driver\r\n"); goto cleanUp; } if (!FMD_GetInfo(&flashInfo)) { OALLog(L" Oops, can't get flash geometry info\r\n"); goto cleanUp; } OALLog(L"\r\n Block Number: "); if (OALBLMenuReadLine(szInputLine, dimof(szInputLine)) == 0) { goto cleanUp; } // Get sector number blockId = OALStringToUINT32(szInputLine); // Check sector number if (blockId >= flashInfo.dwNumBlocks) { OALLog(L" Oops, too big block number\r\n"); goto cleanUp; } FMD_SetBlockStatus(blockId, BLOCK_STATUS_BAD); OALLog(L"\r\n Done\r\n"); cleanUp: if (hFMD != NULL) { FMD_Deinit(hFMD); } return; }
VOID DumpFlash(OAL_BLMENU_ITEM *pMenu) { HANDLE hFMD = NULL; PCI_REG_INFO regInfo; FlashInfo flashInfo; SectorInfo sectorInfo; SECTOR_ADDR sector; WCHAR szInputLine[16]; UINT8 buffer[2048], pOob[64]; UINT32 i, j; UNREFERENCED_PARAMETER(pMenu); // Open FMD regInfo.MemBase.Reg[0] = g_ulFlashBase; hFMD = FMD_Init(NULL, ®Info, NULL); if (hFMD == NULL) { OALLog(L" Oops, can't open FMD driver\r\n"); goto cleanUp; } if (!FMD_GetInfo(&flashInfo)) { OALLog(L" Oops, can't get flash geometry info\r\n"); goto cleanUp; } if (flashInfo.wDataBytesPerSector > sizeof(buffer)) { OALLog(L" Oops, sector size larger than my buffer\r\n"); goto cleanUp; } for(;;) { OALLog(L"\r\n Sector Number: "); if (OALBLMenuReadLine(szInputLine, dimof(szInputLine)) == 0) { break; } // Get sector number sector = OALStringToUINT32(szInputLine); // Check sector number if (sector > flashInfo.dwNumBlocks * flashInfo.wSectorsPerBlock) { OALLog(L" Oops, too big sector number\r\n"); continue; } if (!FMD_ReadSector(sector, buffer, §orInfo, 1)) { OALLog(L" Oops, sector read failed\r\n"); continue; } OALLog( L"\r\nSector %d (sector %d in block %d)\r\n", sector, sector%flashInfo.wSectorsPerBlock, sector/flashInfo.wSectorsPerBlock ); OALLog( L"Reserved1: %08x OEMReserved: %02x Bad: %02x Reserved2: %04x\r\n", sectorInfo.dwReserved1, sectorInfo.bOEMReserved, sectorInfo.bBadBlock, sectorInfo.wReserved2 ); for (i = 0; i < flashInfo.wDataBytesPerSector; i += 16) { OALLog(L"%04x ", i); for (j = i; j < i + 16 && j < flashInfo.wDataBytesPerSector; j++) { OALLog(L" %02x", buffer[j]); } OALLog(L" "); for (j = i; j < i + 16 && j < flashInfo.wDataBytesPerSector; j++) { if (buffer[j] >= ' ' && buffer[j] < 127) { OALLog(L"%c", buffer[j]); } else { OALLog(L"."); } } OALLog(L"\r\n"); } //dump OOB data if (!FMD_ReadSectorOOB(sector, pOob)) { OALLog(L" Oops, sector read failed\r\n"); continue; } for (i = 0; i < 64; i += 16) { OALLog(L"%04x ", i); for (j = i; j < i + 16 && j < 64; j++) { OALLog(L" %02x", pOob[j]); } OALLog(L"\r\n"); } } cleanUp: if (hFMD != NULL) { FMD_Deinit(hFMD); } return; }
VOID ReserveBlock(OAL_BLMENU_ITEM *pMenu) { WCHAR key; HANDLE hFMD = NULL; PCI_REG_INFO regInfo; FlashInfo flashInfo; BLOCK_ID firstblock, lastblock=0; WCHAR szInputLine[16]; UINT32 status; UNREFERENCED_PARAMETER(pMenu); OALLog(L"\r\n First Block Number: "); if (OALBLMenuReadLine(szInputLine, dimof(szInputLine)) == 0) { goto cleanUp; } // Get block number firstblock = OALStringToUINT32(szInputLine); OALLog(L"\r\n Last Block Number: "); if (OALBLMenuReadLine(szInputLine, dimof(szInputLine)) != 0) { // Get block number lastblock = OALStringToUINT32(szInputLine); } if (lastblock < firstblock) { lastblock=firstblock; } // Open FMD regInfo.MemBase.Reg[0] = g_ulFlashBase; hFMD = FMD_Init(NULL, ®Info, NULL); if (hFMD == NULL) { OALLog(L" Oops, can't open FMD driver\r\n"); goto cleanUp; } if (!FMD_GetInfo(&flashInfo)) { OALLog(L" Oops, can't get flash geometry info\r\n"); goto cleanUp; } if (lastblock >= flashInfo.dwNumBlocks) { OALLog(L" Oops, too big block number\r\n"); goto cleanUp; } OALLog(L" Do you want mark as reserved block %d-%d [-/y]? ", firstblock, lastblock); // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); // Depending on result if (key != L'y' && key != L'Y') { goto cleanUp; } while (firstblock<=lastblock) { // If block is bad, we have to offset it status = FMD_GetBlockStatus(firstblock); // Skip bad blocks if ((status & BLOCK_STATUS_BAD) != 0) { OALLog(L" Skip bad block %d\r\n", firstblock); // NOTE - this will cause a smaller number of blocks to actually be reserved... firstblock++; continue; } // Skip already reserved blocks if ((status & BLOCK_STATUS_RESERVED) != 0) { OALLog(L" Skip reserved block %d\r\n", firstblock); firstblock++; continue; } // Mark block as read-only & reserved if (!FMD_SetBlockStatus(firstblock, BLOCK_STATUS_READONLY|BLOCK_STATUS_RESERVED)) { OALLog(L" Oops, can't mark block %d - as reserved\r\n", firstblock); } firstblock++; OALLog(L"."); } OALLog(L" Done\r\n"); cleanUp: if (hFMD != NULL) FMD_Deinit(hFMD); return; }