📄 nand.c
字号:
dwBlockStatus = FMD_GetBlockStatus(dwBlock);
if(!(dwBlockStatus & BLOCK_STATUS_UNKNOWN) && !(dwBlockStatus & BLOCK_STATUS_BAD))
{
dwStartSectorAddr = dwBlock * g_FlashInfo.wSectorsPerBlock;
dwCount = dwNumSectors > g_FlashInfo.wSectorsPerBlock? g_FlashInfo.wSectorsPerBlock : dwNumSectors;
if(FMD_ReadSector((SECTOR_ADDR)dwStartSectorAddr,
(LPBYTE)dwDestAddress, NULL,
dwCount) != TRUE)
{
OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to read EBOOT image.\r\n")));
fErr = TRUE;
break;
}
else
{
dwNumSectors -= dwCount;
dwDestAddress += dwCount * g_FlashInfo.wDataBytesPerSector;
if(dwNumSectors == 0)
break;
}
}
else
OALMSG(OAL_INFO, (TEXT("block %d bad.\r\n"), dwBlock));
dwBlock++;
};
if(fErr == FALSE)
{
OALMSG(OAL_INFO, (TEXT("INFO: EBOOT image at %X.\r\n"), EBOOT_FCACHE_START));
DisplayMem(EBOOT_FCACHE_START, NAND_EBOOT_IMAGE_SIZE, 0x100);
}
}
else
OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
break;
case '7':
if(g_fNandExists == TRUE)
{
if(FMD_ReadSector((SECTOR_ADDR)0,
(LPBYTE)EBOOT_FCACHE_START, NULL,
NAND_IMAGE_NUM_SECTOR(NAND_LOADER_IMAGE_SIZE, g_FlashInfo.wDataBytesPerSector)) != TRUE)
{
OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to read NAND Loader image.\r\n")));
}
else
{
OALMSG(OAL_INFO, (TEXT("INFO: NAND Loader image at %X.\r\n"), EBOOT_FCACHE_START));
DisplayMem(EBOOT_FCACHE_START, NAND_LOADER_IMAGE_SIZE, 0x100);
}
}
else
OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
break;
case '8':
if(g_fNandExists == TRUE)
{
DWORD dwBlock;
do
{
OALMSG(1, (TEXT("Enter bad block number(1-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
dwBlock = GetBlockNumberInput();
if(dwBlock >= 1 && dwBlock < g_FlashInfo.dwNumBlocks)
{
if(FMD_SetBlockStatus(dwBlock, BLOCK_STATUS_BAD) != TRUE)
OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to set block %d bad.\r\n"), dwBlock));
else
OALMSG(OAL_INFO, (TEXT("INFO: block %d set as bad.\r\n"), dwBlock));
}
} while(dwBlock != -1);
}
else
OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
break;
case '9':
if(g_fNandExists == TRUE)
{
DWORD dwBlock;
DWORD dwStartBlock;
DWORD dwEndBlock;
while(1)
{
OALMSG(1, (TEXT("Enter erase start block number(0-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
dwBlock = GetBlockNumberInput();
if(dwBlock != -1 && dwBlock >= 0 && dwBlock < g_FlashInfo.dwNumBlocks)
{
dwStartBlock = dwBlock;
break;
}
};
while(1)
{
OALMSG(1, (TEXT("Enter erase end block number(%d-%d): "), dwStartBlock, (g_FlashInfo.dwNumBlocks - 1)));
dwBlock = GetBlockNumberInput();
if(dwBlock < 0 || dwBlock > g_FlashInfo.dwNumBlocks || dwBlock < dwStartBlock)
{
OALMSG(1, (TEXT("Invalid block number %d\r\n"), dwBlock));
continue;
}
else
{
dwEndBlock = dwBlock;
break;
}
};
while(dwStartBlock <= dwEndBlock)
{
if(FMD_EraseBlock(dwStartBlock) != TRUE)
OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to erase block %d.\r\n"), dwStartBlock));
else
OALMSG(1, (TEXT("INFO: block %d erased.\r\n"), dwStartBlock));
dwStartBlock++;
}
}
else
OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
break;
//zhongtao@
case 'A':
case 'a':
if(g_fNandExists == TRUE)
{
DWORD dwBlock;
do
{
OALMSG(1, (TEXT("Enter fill block number(1-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
dwBlock = GetBlockNumberInput();
if(dwBlock >= 1 && dwBlock < g_FlashInfo.dwNumBlocks)
{
if(FMD_WriteSector(dwBlock*g_FlashInfo.wSectorsPerBlock, (LPBYTE)0x88000000, (PSectorInfo)NULL, 1) != TRUE)
OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to fill data block %d.\r\n"), dwBlock));
else
OALMSG(OAL_INFO, (TEXT("INFO: block %d fill data from 0x88000000.\r\n"), dwBlock));
}
} while(dwBlock != -1);
}
else
OALMSG(OAL_INFO, (TEXT("INFO: NAND device non existent.\r\n")));
break;
case 'D':
case 'd':
if(g_fNandExists == TRUE)
{
DWORD dwSector;
DWORD dwMaxSector;
DWORD *pImage = (DWORD *)EBOOT_FCACHE_START;
dwMaxSector = g_FlashInfo.dwNumBlocks * g_FlashInfo.wSectorsPerBlock - 1;
while(1)
{
DEBUGMSG(1, (TEXT("Enter start sector number(0-%d): "), dwMaxSector));
dwSector = GetUserInputNumber();
if(dwSector != -1 && dwSector >= 0 && dwSector < dwMaxSector)
{
break;
}
};
//while(dwSector <= dwMaxSector)
{
if(FMD_ReadSector((SECTOR_ADDR)dwSector, (LPBYTE)pImage, NULL, 1) != TRUE)
{
OALMSG(OAL_ERROR, (TEXT("ERROR: Failed to read EBOOT image.\r\n")));
}
else
{
OALMSG(OAL_INFO, (TEXT("INFO: sector 0x%X data\r\n"), dwSector));
DisplayMem((DWORD)pImage, g_FlashInfo.wDataBytesPerSector, 0x100);
}
dwSector++;
pImage += g_FlashInfo.wDataBytesPerSector / sizeof(DWORD);
}
}
else
DEBUGMSG(1, (TEXT("WARNING: NAND device not present.\r\n")));
break;
case 'S':
case 's':
if(g_fNandExists == TRUE)
{
DWORD dwBlock;
DWORD dwStatus;
do
{
DEBUGMSG(1, (TEXT("Enter block number(1-%d): "), (g_FlashInfo.dwNumBlocks - 1)));
dwBlock = GetUserInputNumber();
if(dwBlock >= 1 && dwBlock < g_FlashInfo.dwNumBlocks)
{
dwStatus = FMD_GetBlockStatus(dwBlock);
DEBUGMSG(1, (TEXT("status(%#x)\r\n"), dwStatus));
}
} while(dwBlock != -1);
}
else
DEBUGMSG(1, (TEXT("WARNING: NAND device not present.\r\n")));
break;
case 'I':
case 'i':
EdbgOutputDebugString("NAND flash information:\r\n");
EdbgOutputDebugString("Number of blocks: %d\r\n", g_FlashInfo.dwNumBlocks);
EdbgOutputDebugString("Sectors per block: %d\r\n", g_FlashInfo.wSectorsPerBlock);
EdbgOutputDebugString("Sector size: %d\r\n", g_FlashInfo.wDataBytesPerSector);
EdbgOutputDebugString("Data port width: %d\r\n", g_FlashWidth);
break;
case 'Z':
case 'z':
memset((void*)(EBOOT_FCACHE_START+EBOOT_IMAGE_SIZE), 0, EBOOT_IMAGE_SIZE);
break;
case 'R':
case 'r':
{
extern BOOL CS8900ReadEEPROM(UINT16, UINT16*);
UINT16 data;
DWORD addr;
do
{
DEBUGMSG(1, (TEXT("Enter EEPROM Addr(0-63): ")));
addr = GetUserInputNumber();
if((addr <= 63) && CS8900ReadEEPROM((UINT16)addr, &data)){
DEBUGMSG(1, (TEXT("%#x\r\n"), data));
}
} while(addr != -1);
}
break;
case 'P':
case 'p':
{
extern BOOL CS8900WriteEEPROM(UINT16, UINT16);
BOOL b = TRUE;
int i;
for(i = 0; i<=63; i++){
b = b && CS8900WriteEEPROM(i, 0xFFFF);
}
DEBUGMSG(1, (TEXT("%s\r\n"), b? L"success": L"fail"));
}
break;
//zhongtao#
#endif
case 'N':
case 'n':
g_BINRegionInfo.dwNumRegions = 1;
g_BINRegionInfo.Region[0].dwRegionLength = EBOOT_IMAGE_SIZE;
g_BINRegionInfo.Region[0].dwRegionStart = EBOOT_RAM_IMAGE_START;
g_BINRegionInfo.Region[0].szFileName[0] = '\0';
WriteNandLoaderRegionToNand(NULL);
break;
case 'E':
case 'e':
g_BINRegionInfo.dwNumRegions = 1;
g_BINRegionInfo.Region[0].dwRegionLength = EBOOT_IMAGE_SIZE;
g_BINRegionInfo.Region[0].dwRegionStart = EBOOT_RAM_IMAGE_START;
g_BINRegionInfo.Region[0].szFileName[0] = '\0';
WriteEBootRegionToNand(NULL);
break;
case 'K':
case 'k':
g_BINRegionInfo.dwNumRegions = 1;
g_BINRegionInfo.Region[0].dwRegionLength = 63*1024*1024;
g_BINRegionInfo.Region[0].dwRegionStart = IMAGE_WINCE_CODE_RAM_CA_START;
g_BINRegionInfo.Region[0].szFileName[0] = '\0';
WriteOSRegionsToNand(pBootCfg);
break;
case 'b':
case 'B':
// Return To Main Menu.
bExitMenu = TRUE;
break;
default:
break;
}
} while(bExitMenu == FALSE);
return bImageExists;
}
//-----------------------------------------------------------------------------
// PRIVATE FUNCTIONS
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------**
//
// FUNCTION: GetKernelExtPointer
//
// DESCRIPTION: Used to locate the kernel region's extension area.
//
// PARAMETERS:
// dwRegionStart - start of region
// dwRegionLength - size of region
//
// RETURNS:
// Pointer to kernel's extension area. NULL if failure.
//-----------------------------------------------------------------------------
static PVOID GetKernelExtPointer(DWORD dwRegionStart, DWORD dwRegionLength)
{
DWORD dwCacheAddress = 0;
ROMHDR *pROMHeader;
DWORD dwNumModules = 0;
TOCentry *pTOC;
OALMSG(OAL_FUNC, (TEXT("GetKernelExtPointer+\r\n")));
if (dwRegionStart == 0 || dwRegionLength == 0)
{
OALMSG(OAL_ERROR, (TEXT("ERROR: dwRegionStart:%X dwRegionLength:%X\r\n"),
dwRegionStart, dwRegionLength));
return(NULL);
}
if (*(LPDWORD)OEMMapMemAddr(dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET) != ROM_SIGNATURE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -