📄 main.c
字号:
g_ImageType = IMAGE_TYPE_RAMIMAGE;
return TRUE;
}
// HACKHACK: get around MXIP images with funky addresses
g_ImageType = IMAGE_TYPE_RAMIMAGE|IMAGE_TYPE_BINFS; //thisway.diy, 2007.01.27
RETAILMSG(1, (TEXT("*** Downloading BIN image type ***\r\n")));
return TRUE;
}
/*
@func void | OEMMultiBINNotify | Called by blcommon to nofity the OEM code of the number, size, and location of one or more BIN regions,
this routine collects the information and uses it when temporarily caching a flash image in RAM prior to final storage.
@rdesc N/A.
@comm
@xref
*/
void OEMMultiBINNotify(const PMultiBINInfo pInfo)
{
BYTE nCount;
if (!pInfo || !pInfo->dwNumRegions)
{
EdbgOutputDebugString("WARNING: OEMMultiBINNotify: Invalid BIN region descriptor(s).\r\n");
return;
}
g_dwMinImageStart = pInfo->Region[0].dwRegionStart;
EdbgOutputDebugString("\r\nOEMMultiBINNotify: Download BIN file information:\r\n");
EdbgOutputDebugString("-----------------------------------------------------\r\n");
for (nCount = 0 ; nCount < pInfo->dwNumRegions ; nCount++)
{
EdbgOutputDebugString("[%d]: Base Address=0x%x Length=0x%x\r\n" ,
nCount, pInfo->Region[nCount].dwRegionStart, pInfo->Region[nCount].dwRegionLength);
if (pInfo->Region[nCount].dwRegionStart < g_dwMinImageStart)
{
g_dwMinImageStart = pInfo->Region[nCount].dwRegionStart;
if (g_dwMinImageStart == 0)
{
EdbgOutputDebugString("WARNING: OEMMultiBINNotify: Bad start address for region (%d).\r\n", nCount);
return;
}
}
}
memcpy((LPBYTE)&g_BINRegionInfo, (LPBYTE)pInfo, sizeof(MultiBINInfo));
EdbgOutputDebugString("-----------------------------------------------------\r\n");
}
BOOL OEMReportError(DWORD dwReason, DWORD dwReserved)
{
EdbgOutputDebugString("OEMReportError(%d, %d)\r\n", dwReason, dwReserved);
return TRUE;
}
/*
@func BOOL | OEMDebugInit | Function wrapper for OEMInitDebugSerial.
@rdesc TRUE = Success, FALSE = Failure.
@comm
@xref
*/
BOOL OEMDebugInit()
{
// Assign callback functions to be usec by blcommon.
//
g_pOEMReportError = OEMReportError;
g_pOEMVerifyMemory = OEMVerifyMemory; // Verify memory to be used by downloaded image...
g_pOEMMultiBINNotify = OEMMultiBINNotify; // Notified of all the BIN files to be downloaded...
OEMInitDebugSerial();
return TRUE;
}
/*
@func BOOL | LoadByUSBAuto |
@rdesc TRUE = user selected download image, FALSE = user selected launch stored image.
@comm
@xref
*/
static BOOLEAN AutoLoadByUSB( )
{
int KeySelect = 0;
BOOLEAN bDownload = TRUE;
// 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 ) {
RETAILMSG(1, (TEXT("ERROR: BootMonitor: boot media does not exist.\r\n")));
return FALSE;
} 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 = 0;
si.wReserved2 = 0;
RETAILMSG(1, (TEXT("Low-level format nand flash ...\r\n")));
RETAILMSG(1, (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);
}
RETAILMSG(1, (TEXT("...reserve complete.\r\n")));
RETAILMSG(1, (TEXT("Low-level format Blocks [0x%x - 0x%x] ...\r\n"), IMAGE_START_BLOCK, NUM_BLOCKS-1));
for (i = IMAGE_START_BLOCK; i < NUM_BLOCKS; i++) {
FMD_EraseBlock(i);
}
RETAILMSG(1, (TEXT("...erase complete.\r\n")));
}
/* configure to Program RAM image into Boot Media
*/
g_pBootCfg->ConfigFlags = (g_pBootCfg->ConfigFlags | TARGET_TYPE_NAND);
// format the boot media for BinFS
// N.B: this does not destroy our OEM reserved sections (TOC, bootloaders, etc)
if ( !g_bBootMediaExist ) {
RETAILMSG(1, (TEXT("ERROR: BootMonitor: boot media does not exist.\r\n")));
return FALSE;
}
// N.B: format offset by # of reserved blocks,
// decrease the ttl # blocks available by that amount.
RETAILMSG(1, (TEXT("Format nand flash for BinFS, please wait several minutes ...\r\n")));
if ( !BP_LowLevelFormat( g_dwImageStartBlock,
NUM_BLOCKS - g_dwImageStartBlock,
0) )
{
RETAILMSG(1, (TEXT("ERROR: BootMonitor: Low-level boot media format failed.\r\n")));
return FALSE;
}
bDownload = TRUE;
return(bDownload);
}
/*
@func BOOL | BootMonitor | Manages the bootloader monitor.
@rdesc TRUE = user selected download image, FALSE = user selected launch stored image.
@comm
@xref
*/
static BOOLEAN BootMonitor( )
{
int KeySelect = 0;
BOOLEAN bConfigChanged = FALSE;
BOOLEAN bDownload = TRUE;
while(1)
{
KeySelect = 0;
EdbgOutputDebugString ( "\r\nFriendlyARM Ethernet Boot Loader Configuration:\r\n");
EdbgOutputDebugString ( "---------------------------------------\r\n");
EdbgOutputDebugString ( "1) IP address: %s\r\n", inet_ntoa(g_pBootCfg->EdbgAddr.dwIP));
EdbgOutputDebugString ( " Subnet mask: %s\r\n", inet_ntoa(g_pBootCfg->SubnetMask));
EdbgOutputDebugString ( "2) Boot delay: %d seconds\r\n", g_pBootCfg->BootDelay);
EdbgOutputDebugString ( "3) DHCP: %s\r\n", (g_pBootCfg->ConfigFlags & CONFIG_FLAGS_DHCP) ? "ENABLED" : "DISABLED");
EdbgOutputDebugString ( "4) Reset TOC to default\r\n");
EdbgOutputDebugString ( "5) Startup image: %s\r\n", (g_pBootCfg->ConfigFlags & BOOT_TYPE_DIRECT) ? "LAUNCH EXISTING" : "DOWNLOAD NEW");
EdbgOutputDebugString ( "6) Program RAM image into Boot Media: %s\r\n", (g_pBootCfg->ConfigFlags & TARGET_TYPE_NAND) ? "ENABLED" : "DISABLED");
EdbgOutputDebugString ( "7) MAC address: %B:%B:%B:%B:%B:%B\r\n",
g_pBootCfg->EdbgAddr.wMAC[0] & 0x00FF, g_pBootCfg->EdbgAddr.wMAC[0] >> 8,
g_pBootCfg->EdbgAddr.wMAC[1] & 0x00FF, g_pBootCfg->EdbgAddr.wMAC[1] >> 8,
g_pBootCfg->EdbgAddr.wMAC[2] & 0x00FF, g_pBootCfg->EdbgAddr.wMAC[2] >> 8);
EdbgOutputDebugString ( "8) Kernel Debugger: %s\r\n", (g_pBootCfg->ConfigFlags & CONFIG_FLAGS_DEBUGGER) ? "ENABLED" : "DISABLED");
EdbgOutputDebugString ( "9) Format Boot Media for BinFS\r\n");
EdbgOutputDebugString ( "\r\n");
// N.B: we need this option here since BinFS is really a RAM image, where you "format" the media
// with an MBR. There is no way to parse the image to say it's ment to be BinFS enabled.
EdbgOutputDebugString ( "B) Support BinFS: %s\r\n", (g_pTOC->id[g_dwTocEntry].dwImageType & IMAGE_TYPE_BINFS) ? "ENABLED" : "DISABLED");
EdbgOutputDebugString ( "D) DOWNLOAD image now(Etherent)\r\n");
// EdbgOutputDebugString ( "E) Image descriptor Entry: %u \r\n", g_dwTocEntry);
EdbgOutputDebugString ( "F) Low-level FORMAT Boot Media\r\n");
EdbgOutputDebugString ( "L) LAUNCH existing Boot Media image\r\n");
EdbgOutputDebugString ( "R) Read Configuration \r\n");
EdbgOutputDebugString ( "U) DOWNLOAD image now(USB)\r\n");
EdbgOutputDebugString ( "W) Write Configuration Right Now\r\n");
EdbgOutputDebugString ( "X) DOWNLOAD image to boot media, then LAUNCH it off the media\r\n");
EdbgOutputDebugString ( "---------------------------------------\r\n");
EdbgOutputDebugString ( "\r\nEnter your selection: ");
while (! ( ( (KeySelect >= '0') && (KeySelect <= '9') ) ||
( (KeySelect == 'B') || (KeySelect == 'b') ) ||
( (KeySelect == 'E') || (KeySelect == 'e') ) ||
( (KeySelect == 'F') || (KeySelect == 'f') ) ||
( (KeySelect == 'D') || (KeySelect == 'd') ) ||
( (KeySelect == 'L') || (KeySelect == 'l') ) ||
( (KeySelect == 'R') || (KeySelect == 'r') ) ||
( (KeySelect == 'U') || (KeySelect == 'u') ) ||
( (KeySelect == 'W') || (KeySelect == 'w') ) ||
( (KeySelect == 'X') || (KeySelect == 'x') )
))
{
KeySelect = OEMReadDebugByte();
}
EdbgOutputDebugString ( "%c\r\n", KeySelect);
switch(KeySelect)
{
case '1': // Change IP/Subnet address.
if ( GetUserIPAddr(&g_pBootCfg->EdbgAddr, &g_pBootCfg->SubnetMask) ) {
g_pBootCfg->ConfigFlags &= ~CONFIG_FLAGS_DHCP; // clear DHCP flag
bConfigChanged = TRUE;
}
continue;
break;
case '2': // Change autoboot delay.
SetDelay(g_pBootCfg);
bConfigChanged = TRUE;
continue;
break;
case '3': // Toggle static/DHCP mode.
g_pBootCfg->ConfigFlags = (g_pBootCfg->ConfigFlags ^ CONFIG_FLAGS_DHCP);
bConfigChanged = TRUE;
continue;
break;
case '4': // Reset TOC configuration.
RETAILMSG(1, (TEXT("Resetting default TOC...\r\n")));
TOC_Init(DEFAULT_IMAGE_DESCRIPTOR, (IMAGE_TYPE_RAMIMAGE|IMAGE_TYPE_BINFS), 0, 0, 0);
if ( !TOC_Write() ) {
RETAILMSG(1, (TEXT("TOC_Write Failed!\r\n")));
}
RETAILMSG(1, (TEXT("...TOC complete\r\n")));
continue;
break;
case '5': // Toggle download/launch status.
g_pBootCfg->ConfigFlags = (g_pBootCfg->ConfigFlags ^ BOOT_TYPE_DIRECT);
bConfigChanged = TRUE;
break;
case '6': // Toggle boot media image store.
g_pBootCfg->ConfigFlags = (g_pBootCfg->ConfigFlags ^ TARGET_TYPE_NAND);
bConfigChanged = TRUE;
break;
case '7': // Configure MAC address.
SetCS8900MACAddress();
bConfigChanged = TRUE;
continue;
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 ) {
RETAILMSG(1, (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( g_dwImageStartBlock,
NUM_BLOCKS - g_dwImageStartBlock,
0) )
{
RETAILMSG(1, (TEXT("ERROR: BootMonitor: Low-level boot media format failed.\r\n")));
continue;
}
break;
case 'B':
case 'b':
g_pTOC->id[g_dwTocEntry].dwImageType = (g_pTOC->id[g_dwTocEntry].dwImageType ^ IMAGE_TYPE_BINFS);
g_ImageType = g_pTOC->id[g_dwTocEntry].dwImageType;
bConfigChanged = TRUE;
break;
case 'E':
case 'e':
// TODO
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 ) {
RETAILMSG(1, (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 = 0;
si.wReserved2 = 0;
RETAILMSG(1, (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);
}
RETAILMSG(1, (TEXT("...reserve complete.\r\n")));
RETAILMSG(1, (TEXT("Low-level format Blocks [0x%x - 0x%x] ...\r\n"), IMAGE_START_BLOCK, NUM_BLOCKS-1));
for (i = IMAGE_START_BLOCK; i < NUM_BLOCKS; i++) {
FMD_EraseBlock(i);
}
RETAILMSG(1, (TEXT("...erase complete.\r\n")));
} break;
case 'D': // Download? Yes.
case 'd':
bDownload = TRUE;
goto MENU_DONE;
case 'L': // Download? No.
case 'l':
bDownload = FALSE;
goto MENU_DONE;
case 'R':
case 'r':
TOC_Read();
continue;
// TODO
break;
case 'U': // Download? No.
case 'u':
g_bWaitForConnect = FALSE;
bConfigChanged = TRUE;
g_bUSBDownload = TRUE;
bDownload = TRUE;
goto MENU_DONE;
case 'W': // Configuration Write
case 'w':
if (!TOC_Write())
{
RETAILMSG(1, (TEXT("WARNING: MainMenu: Failed to store updated eboot configuration in flash.\r\n")));
}
else
{
RETAILMSG(1, (TEXT("Successfully Written\r\n")));
bConfigChanged = FALSE;
}
break;
case 'X': // Download to media, then launch that
case 'x':
bDownload = TRUE;
bConfigChanged = TRUE;
g_pBootCfg->ConfigFlags |= TARGET_TYPE_NAND | BOOT_TYPE_DIRECT;
goto MENU_DONE;
default:
break;
}
}
MENU_DONE:
// If eboot settings were changed by user, save them.
//
if (bConfigChanged && !TOC_Write( ) )
{
RETAILMSG(1, (TEXT("WARNING: BootMonitor: Failed to store updated eboot configuration in flash.\r\n")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -