📄 main.c
字号:
break;
case '2': // Toggle static/DHCP mode.
pBootCfg->ConfigFlags = (pBootCfg->ConfigFlags ^ CONFIG_FLAGS_DHCP);
bConfigChanged = TRUE;
break;
case '3': // Change autoboot delay.
SetDelay(pBootCfg);
bConfigChanged = TRUE;
break;
case '4': // Reset the bootloader configuration to defaults.
OALMSG(TRUE, (TEXT("Resetting default TOC...\r\n")));
TOC_Init(DEFAULT_IMAGE_DESCRIPTOR, (IMAGE_TYPE_RAMIMAGE|IMAGE_TYPE_BINFS), 0, 0, 0);
if ( !TOC_Write() ) {
OALMSG(OAL_WARN, (TEXT("TOC_Write Failed!\r\n")));
}
OALMSG(TRUE, (TEXT("...TOC complete\r\n")));
break;
case '5': // Toggle download/launch status.
pBootCfg->ConfigFlags = (pBootCfg->ConfigFlags ^ BOOT_TYPE_DIRECT);
bConfigChanged = TRUE;
break;
case '6': // Toggle image storage to Smart Media.
pBootCfg->ConfigFlags = (pBootCfg->ConfigFlags ^ TARGET_TYPE_NAND);
bConfigChanged = TRUE;
break;
case '7': // Configure Crystal CS8900 MAC address.
SetCS8900MACAddress(pBootCfg);
bConfigChanged = TRUE;
break;
case '8': // Toggle KD
g_pBootCfg->ConfigFlags = (g_pBootCfg->ConfigFlags ^ CONFIG_FLAGS_DEBUGGER);
g_bWaitForConnect = (g_pBootCfg->ConfigFlags & CONFIG_FLAGS_DEBUGGER) ? TRUE : FALSE;
bConfigChanged = TRUE;
continue;
break;
case '9':
// format the boot media for BinFS
// N.B: this does not destroy our OEM reserved sections (TOC, bootloaders, etc)
if ( !g_bBootMediaExist ) {
OALMSG(OAL_ERROR, (TEXT("ERROR: BootMonitor: boot media does not exist.\r\n")));
continue;
}
// N.B: format offset by # of reserved blocks,
// decrease the ttl # blocks available by that amount.
if ( !BP_LowLevelFormat( IMAGE_START_BLOCK,
wNUM_BLOCKS - IMAGE_START_BLOCK,
FORMAT_SKIP_BLOCK_CHECK) )
{
OALMSG(OAL_ERROR, (TEXT("ERROR: BootMonitor: Low-level boot media format failed.\r\n")));
continue;
}
break;
case 'A':
case 'a':
{
DWORD i;
OALMSG(TRUE, (TEXT("All block(%d) Erase...\r\n"), wNUM_BLOCKS));
for (i = 0; i < wNUM_BLOCKS; i++) {
FMD_EraseBlock(i);
}
}
break;
case 'B':
case 'b':
// low-level format
// N.B: this erases images, BinFs, FATFS, user data, etc.
// However, we don't format Bootloaders & TOC bolcks; use JTAG for this.
if ( !g_bBootMediaExist ) {
OALMSG(OAL_ERROR, (TEXT("ERROR: BootMonitor: boot media does not exist.\r\n")));
continue;
} else {
DWORD i;
SectorInfo si;
// to keep bootpart off of our reserved blocks we must mark it as bad, reserved & read-only
si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
si.bBadBlock = BADBLOCKMARK;
// si.bBadBlock = 0xff;
si.dwReserved1 = 0xffffffff;
si.wReserved2 = 0xffff;
OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] ...\r\n"), 0, IMAGE_START_BLOCK-1));
for (i = 0; i < IMAGE_START_SECTOR; i++) {
FMD_WriteSector(i, NULL, &si, 1);
}
OALMSG(TRUE, (TEXT("...reserve complete.\r\n")));
} break;
case 'D': // Download? Yes.
case 'd':
bDownload = TRUE;
goto MENU_DONE;
case 'E':
case 'e':
// low-level format
// N.B: this erases images, BinFs, FATFS, user data, etc.
// However, we don't format Bootloaders & TOC bolcks; use JTAG for this.
if ( !g_bBootMediaExist ) {
OALMSG(OAL_ERROR, (TEXT("ERROR: BootMonitor: boot media does not exist.\r\n")));
continue;
} else {
UINT32 i;
OALMSG(TRUE, (TEXT("Low-level format Blocks [0x%x - 0x%x] ...\r\n"), 0, IMAGE_START_BLOCK-1));
for (i = NBOOT_BLOCK; i < (NBOOT_BLOCK+NBOOT_BLOCK_SIZE); i++) {
FMD_EraseBlock(i);
}
for (i = EBOOT_BLOCK; i < (EBOOT_BLOCK+EBOOT_BLOCK_SIZE); i++) {
FMD_EraseBlock(i);
}
OALMSG(TRUE, (TEXT("...erase complete.\r\n")));
} break;
case 'F':
case 'f':
// low-level format
// N.B: this erases images, BinFs, FATFS, user data, etc.
// However, we don't format Bootloaders & TOC bolcks; use JTAG for this.
if ( !g_bBootMediaExist ) {
OALMSG(OAL_ERROR, (TEXT("ERROR: BootMonitor: boot media does not exist.\r\n")));
continue;
} else {
DWORD i;
SectorInfo si;
// to keep bootpart off of our reserved blocks we must mark it as bad, reserved & read-only
si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
si.bBadBlock = BADBLOCKMARK;
si.dwReserved1 = 0xffffffff;
si.wReserved2 = 0xffff;
OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] ...\r\n"), 0, IMAGE_START_BLOCK-1));
for (i = 64; i < IMAGE_START_SECTOR; i++) {
FMD_WriteSector(i, NULL, &si, 1);
}
OALMSG(TRUE, (TEXT("...reserve complete.\r\n")));
OALMSG(TRUE, (TEXT("Low-level format Blocks [0x%x - 0x%x] ...\r\n"), IMAGE_START_BLOCK, wNUM_BLOCKS-1));
for (i = IMAGE_START_BLOCK; i < wNUM_BLOCKS; i++) {
if ( (FMD_GetBlockStatus(i) & (DWORD)(BLOCK_STATUS_RESERVED|BLOCK_STATUS_BAD)) == (DWORD)BLOCK_STATUS_BAD )
{
OALMSG(TRUE, (TEXT("Real Bad Block found (0x%x)\r\n"), i));
continue;
}
if ( TRUE != FMD_EraseBlock(i) )
{
OALMSG(TRUE, (TEXT("Erase failed. Mark to Bad block (0x%x)\r\n"), i));
si.bOEMReserved = 0xff;
si.bBadBlock = BADBLOCKMARK;
si.dwReserved1 = 0xffffffff;
si.wReserved2 = 0xffff;
FMD_WriteSector(i*PAGES_PER_BLOCK, NULL, &si, 1);
FMD_WriteSector(i*PAGES_PER_BLOCK+1, NULL, &si, 1);
}
}
OALMSG(TRUE, (TEXT("...erase complete.\r\n")));
} break;
case 'L': // Download? No.
case 'l':
bDownload = FALSE;
goto MENU_DONE;
case 'N':
case 'n':
{
#define READ_LB_NAND_M_SIZE 2048
#define READ_LB_NAND_S_SIZE 64
#define READ_SB_NAND_M_SIZE 512
#define READ_SB_NAND_S_SIZE 16
UINT8 pMBuf[READ_LB_NAND_M_SIZE], pSBuf[READ_LB_NAND_S_SIZE];
UINT32 rslt;
UINT32 nMainloop, nSpareloop;
rslt = SetBlockPage();
OALMSG(TRUE, (TEXT("\r\n rlst : 0x%x\r\n"), rslt));
memset(pMBuf, 0xff, READ_LB_NAND_M_SIZE);
memset(pSBuf, 0xff, READ_LB_NAND_S_SIZE);
if (IS_LB)
{
nMainloop = READ_LB_NAND_M_SIZE;
nSpareloop = READ_LB_NAND_S_SIZE;
RAW_LB_ReadPage(rslt, pMBuf, pSBuf);
}
else
{
nMainloop = READ_SB_NAND_M_SIZE;
nSpareloop = READ_SB_NAND_S_SIZE;
RAW_SB_ReadPage(rslt, pMBuf, pSBuf);
}
PrintPageData(nMainloop, nSpareloop, pMBuf, pSBuf);
}
break;
#if EBOOT_NAND_DBG
case 'O':
case 'o':
{
UINT32 rslt;
rslt = SetBlockPage();
OALMSG(TRUE, (TEXT("\r\n rlst : 0x%x\r\n"), rslt));
FMD_EraseBlock(SECTOR_TO_BLOCK(rslt));
OALMSG(TRUE, (TEXT("block %d is erased.\r\n"), SECTOR_TO_BLOCK(rslt)));
}
break;
case 'P': // write data to NAND
case 'p':
{
#define READ_NAND_M_SIZE 2048
#define READ_NAND_S_SIZE 64
UINT32 rslt;
UINT8 pMBuf[READ_NAND_M_SIZE], pSBuf[READ_NAND_S_SIZE];
rslt = SetBlockPage();
OALMSG(TRUE, (TEXT("\r\n rlst : 0x%x\r\n"), rslt));
memcpy(pMBuf, prayer16bpp, READ_NAND_M_SIZE);
memcpy(pSBuf, prayer16bpp, READ_NAND_S_SIZE);
FMD_LB_WriteSector(rslt, pMBuf, (PSectorInfo)pSBuf, 1, 0);
//FMD_LB_WriteSector(rslt, NULL, pSBuf, 1, 0);
PrintPageData(READ_NAND_M_SIZE, READ_NAND_S_SIZE, pMBuf, pSBuf);
}
break;
case 'Q': // read data from NAND
case 'q':
{
#define READ_NAND_M_SIZE 2048
#define READ_NAND_S_SIZE 64
UINT32 rslt;
UINT8 pMBuf[READ_NAND_M_SIZE], pSBuf[READ_NAND_S_SIZE];
rslt = SetBlockPage();
OALMSG(TRUE, (TEXT("\r\n rlst : 0x%x\r\n"), rslt));
memcpy(pMBuf, 0x0, READ_NAND_M_SIZE);
memcpy(pSBuf, 0x0, READ_NAND_S_SIZE);
FMD_LB_ReadSector(rslt, pMBuf, (PSectorInfo)pSBuf, 1, 0); // for 1sector
//FMD_LB_ReadSector(rslt, NULL, pSBuf, 1, 0); // for 1sector
PrintPageData(READ_NAND_M_SIZE, READ_NAND_S_SIZE, pMBuf, pSBuf);
}
break;
#endif
case 'R':
case 'r':
TOC_Read();
TOC_Print();
break;
case 'U': // Download? No.
case 'u':
//bConfigChanged = TRUE;
g_bUSBDownload = TRUE;
bDownload = TRUE;
goto MENU_DONE;
#ifdef _EBOOT_SLEEP_
case 'S':
case 's':
OALMSG(OAL_WARN, (TEXT("Now go into Sleep Mode!!\r\n\n")));
OEMPowerOff();
#endif
case 'W': // Configuration Write
case 'w':
if (!TOC_Write())
{
OALMSG(OAL_WARN, (TEXT("WARNING: MainMenu: Failed to store updated eboot configuration in flash.\r\n")));
}
else
{
OALMSG(OAL_INFO, (TEXT("Successfully Written\r\n")));
bConfigChanged = FALSE;
}
break;
default:
break;
}
}
MENU_DONE:
// If eboot settings were changed by user, save them to flash.
//
if (bConfigChanged && !TOC_Write())
{
OALMSG(OAL_WARN, (TEXT("WARNING: MainMenu: Failed to store updated bootloader configuration to flash.\r\n")));
}
return(bDownload);
}
/*
@func BOOL | OEMPlatformInit | Initialize the Samsung SMD2450 platform hardware.
@rdesc TRUE = Success, FALSE = Failure.
@comm
@xref
*/
BOOL OEMPlatformInit(void)
{
ULONG BootDelay;
UINT8 KeySelect;
UINT32 dwStartTime, dwPrevTime, dwCurrTime;
BOOLEAN bResult = FALSE;
FlashInfo flashInfo;
OALMSG(OAL_FUNC, (TEXT("+OEMPlatformInit.\r\n")));
EdbgOutputDebugString("Microsoft Windows CE Bootloader for the Samsung SMDK2450 Version %d.%d Built %s\r\n\r\n",
EBOOT_VERSION_MAJOR, EBOOT_VERSION_MINOR, __DATE__);
// Initialize the display.
//
RETAILMSG(1,(TEXT("InitDisplay\n")));
InitDisplay();
// Initialize the BSP args structure.
//
memset(pBSPArgs, 0, sizeof(BSP_ARGS));
pBSPArgs->header.signature = OAL_ARGS_SIGNATURE;
pBSPArgs->header.oalVersion = OAL_ARGS_VERSION;
pBSPArgs->header.bspVersion = BSP_ARGS_VERSION;
pBSPArgs->kitl.flags = OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_VMINI;
pBSPArgs->kitl.devLoc.IfcType = Internal;
pBSPArgs->kitl.devLoc.BusNumber = 0;
pBSPArgs->kitl.devLoc.LogicalLoc = BSP_BASE_REG_PA_CS8900A_IOBASE;
// For USB Download functon
//
if (!InitUSB())
{
DEBUGMSG(1, (TEXT("OEMPlatformInit: Failed to initialize USB.\r\n")));
return(FALSE);
}
#ifdef _EBOOT_SLEEP_
if (!InitPowerButton())
{
DEBUGMSG(1, (TEXT("OEMPlatformInit: Failed to initialize Power Button.\r\n")));
return(FALSE);
}
#endif
Isr_Init();
// Try to initialize the boot media block driver and BinFS partition.
//
///*
OALMSG(TRUE, (TEXT("BP_Init\r\n")));
if ( !BP_Init((LPBYTE)BINFS_RAM_START, BINFS_RAM_LENGTH, NULL, NULL, NULL) )
{
OALMSG(OAL_WARN, (TEXT("WARNING: OEMPlatformInit failed to initialize Boot Media.\r\n")));
g_bBootMediaExist = FALSE;
}
else
g_bBootMediaExist = TRUE;
// Get flash info
if (!FMD_GetInfo(&flashInfo)) {
OALMSG(OAL_ERROR, (L"ERROR: BLFlashDownload: "
L"FMD_GetInfo call failed\r\n"
));
}
wNUM_BLOCKS = flashInfo.dwNumBlocks;
RETAILMSG(1, (TEXT("wNUM_BLOCKS : %d(0x%x) \r\n"), wNUM_BLOCKS, wNUM_BLOCKS));
stDeviceInfo = GetNandInfo();
// Try to retrieve TOC (and Boot config) from boot media
//
if ( !TOC_Read( ) )
{
// use default settings
TOC_Init(DEFAULT_IMAGE_DESCRIPTOR, (IMAGE_TYPE_RAMIMAGE), 0, 0, 0);
}
// Display boot message - user can halt the autoboot by pressing any key on the serial terminal emulator.
//
BootDelay = g_pBootCfg->BootDelay;
if (g_pBootCfg->ConfigFlags & BOOT_TYPE_DIRECT)
{
OALMSG(TRUE, (TEXT("Press [ENTER] to launch image stored on boot media, or [SPACE] to enter boot monitor.\r\n")));
OALMSG(TRUE, (TEXT("\r\nInitiating image launch in %d seconds. "),BootDelay--));
}
else
{
OALMSG(TRUE, (TEXT("Press [ENTER] to download image stored on boot media, or [SPACE] to enter boot monitor.\r\n")));
OALMSG(TRUE, (TEXT("\r\nInitiating image download in %d seconds. "),BootDelay--));
}
dwStartTime = OEMEthGetSecs();
dwPrevTime = dwStartTime;
dwCurrTime = dwStartTime;
KeySelect = 0;
// Allow the user to break into the bootloader menu.
//
while((dwCurrTime - dwStartTime) < g_pBootCfg->BootDelay)
{
KeySelect = OEMReadDebugByte();
if ((KeySelect == 0x20) || (KeySelect == 0x0d))
break;
dwCurrTime = OEMEthGetSecs();
if (dwCurrTime > dwPrevTime)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -