VOID BLMenu() { UINT32 ud, delay; WCHAR key = 0; // First let user break to menu OALLog(L"Hit space to enter LPC32XX bootloader menu.\n\r"); delay = OALGetTickCount() + (g_bootCfg.boot_to * 1000); ud = OALGetTickCount() - 1; while (delay > OALGetTickCount()) { if (ud <= OALGetTickCount()) { OALLog(L"."); ud = OALGetTickCount() + 1000; } key = OALBLMenuReadKey(FALSE); if (key == L' ') break; } OALLog(L"\r\n"); if (key == L' ') { OALBLMenuShow(&g_menuRoot); } }
VOID SetOPPmode(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UINT32 i; UINT32 len = AM35x_OPP_NUM; OPP_MODE_MENU * pOppMenu = oppModeMenu; UNREFERENCED_PARAMETER(pMenu); OALBLMenuHeader(L"Select OPP Mode"); for (i=0; i<len; i++) { OALLog(L" [%d] %s\r\n", i+1 , pOppMenu[i].oppModeName); } OALLog(L" [0] Exit and Continue\r\n"); OALLog(L"\r\n Selection (actual [%s]): ", pOppMenu[g_bootCfg.opp_mode].oppModeName); // Get key do { key = OALBLMenuReadKey(TRUE); } while (key < L'0' || key > L'0' + i); OALLog(L"%c\r\n", key); // If user select exit don't change device if (key == L'0') return; g_bootCfg.opp_mode = (key - L'0' -1); }
VOID SetKitlMode(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UNREFERENCED_PARAMETER(pMenu); if ((g_bootCfg.kitlFlags & OAL_KITL_FLAGS_POLL) != 0) { OALLog(L" Set KITL to interrupt mode [y/-]: "); } else { OALLog(L" Set KITL to polled mode [y/-]: "); } // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); if (key == L'y' || key == L'Y') { if ((g_bootCfg.kitlFlags & OAL_KITL_FLAGS_POLL) != 0) { g_bootCfg.kitlFlags &= ~OAL_KITL_FLAGS_POLL; OALLog(L" KITL set to interrupt mode\r\n"); } else { g_bootCfg.kitlFlags |= OAL_KITL_FLAGS_POLL; OALLog(L" KITL set to polled mode\r\n"); } } }
VOID EnableFlashNK(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UNREFERENCED_PARAMETER(pMenu); if (g_bootCfg.flashNKFlags & ENABLE_FLASH_NK) { OALLog(L" Disable Flashing NK.bin [y/-]: "); } else { OALLog(L" Enable Flashing NK.bin [y/-]: "); } // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); if (key == L'y' || key == L'Y') { if (g_bootCfg.flashNKFlags & ENABLE_FLASH_NK) { g_bootCfg.flashNKFlags &= ~ENABLE_FLASH_NK; OALLog(L" Flashing NK.bin is disabled\r\n"); } else { g_bootCfg.flashNKFlags |= ENABLE_FLASH_NK; OALLog(L" Flashing NK.bin is enabled\r\n"); } } }
VOID SetKitlType( OAL_BLMENU_ITEM *pMenu ) { WCHAR key; UNREFERENCED_PARAMETER(pMenu); if ((g_bootCfg.kitlFlags & OAL_KITL_FLAGS_PASSIVE) != 0) { OALLog(L" Set KITL to active mode [y/-]: "); } else { OALLog(L" Set KITL to passive mode [y/-]: "); } // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); if (key == L'y' || key == L'Y') { if ((g_bootCfg.kitlFlags & OAL_KITL_FLAGS_PASSIVE) != 0) { g_bootCfg.kitlFlags &= ~OAL_KITL_FLAGS_PASSIVE; OALLog(L" KITL set to active mode\r\n"); } else { g_bootCfg.kitlFlags |= OAL_KITL_FLAGS_PASSIVE; OALLog(L" KITL set to passive mode\r\n"); } } }
VOID SetRetailMsgMode(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UNREFERENCED_PARAMETER(pMenu); if (g_bootCfg.oalFlags & BOOT_CFG_OAL_FLAGS_RETAILMSG_ENABLE) { OALLog(L" Disable OAL Retail Messages [y/-]: "); } else { OALLog(L" Enable OAL Retail Messages [y/-]: "); } // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); if (key == L'y' || key == L'Y') { if (g_bootCfg.oalFlags & BOOT_CFG_OAL_FLAGS_RETAILMSG_ENABLE) { g_bootCfg.oalFlags &= ~BOOT_CFG_OAL_FLAGS_RETAILMSG_ENABLE; OALLog(L" OAL Retail Messages disabled\r\n"); } else { g_bootCfg.oalFlags |= BOOT_CFG_OAL_FLAGS_RETAILMSG_ENABLE; OALLog(L" OAL Retail Messages enabled\r\n"); } } }
VOID SetDisplayResolution(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UINT32 i; UNREFERENCED_PARAMETER(pMenu); OALBLMenuHeader(L"Select Display Resolution"); for (i=0; i<OMAP_RES_INVALID; i++) { OALLog(L" [%d] %s\r\n", i+1 , dispResMenu[i].resName); } OALLog(L" [0] Exit and Continue\r\n"); OALLog(L"\r\n Selection (actual %s): ", dispResMenu[g_bootCfg.displayRes].resName); // Get key do { key = OALBLMenuReadKey(TRUE); } while (key < L'0' || key > L'0' + i); OALLog(L"%c\r\n", key); // If user select exit don't change device if (key == L'0') return; g_bootCfg.displayRes = (key - L'0' - 1); }
VOID SaveSettings(OAL_BLMENU_ITEM *pMenu) { WCHAR key; OALLog(L" Do you want save current settings [-/y]? "); // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); // Depending on result if (key != L'y' && key != L'Y') goto cleanUp; if (BLWriteBootCfg(&g_bootCfg)) { OALLog(L" Current settings has been saved\r\n"); } else { OALLog(L"ERROR: Settings save failed!\r\n"); } cleanUp: return; }
VOID ShowNetworkSettings(OAL_BLMENU_ITEM *pMenu) { BOOL fValidExtMacAddr; UINT16 mac[3]; UNREFERENCED_PARAMETER(pMenu); memset(mac,0xFF,sizeof(mac)); LAN911XGetMacAddress(OALPAtoUA((DWORD) BSP_LAN9311_REGS_PA),mac); if (((mac[0]== 0xFFFF) && (mac[1] == 0xFFFF) && (mac[2] == 0xFFFF)) || ((mac[0]== 0x0) && (mac[1] == 0x0) && (mac[2] == 0x0))) { fValidExtMacAddr = FALSE; } else { fValidExtMacAddr = TRUE; } OALLog(L"\r\n Network:\r\n"); OALLog( L" KITL state: %s\r\n", (g_bootCfg.kitlFlags & OAL_KITL_FLAGS_ENABLED) ? L"enabled" : L"disabled" ); OALLog( L" KITL type: %s\r\n", (g_bootCfg.kitlFlags & OAL_KITL_FLAGS_PASSIVE) ? L"passive" : L"active" ); OALLog( L" KITL mode: %s\r\n", (g_bootCfg.kitlFlags & OAL_KITL_FLAGS_POLL) ? L"polled" : L"interrupt" ); OALLog( L" DHCP: %s\r\n", (g_bootCfg.kitlFlags & OAL_KITL_FLAGS_DHCP) ? L"enabled" : L"disabled" ); OALLog(L" IP address: %s\r\n", OALKitlIPtoString(g_bootCfg.ipAddress)); OALLog(L" IP mask: %s\r\n", OALKitlIPtoString(g_bootCfg.ipMask)); OALLog(L" IP router: %s\r\n", OALKitlIPtoString(g_bootCfg.ipRoute)); OALLog(L" Internal Eth MAC Addr: %s\r\n", OALKitlMACtoString(g_bootCfg.mac)); OALLog(L" External Eth MAC Addr: %s\r\n", fValidExtMacAddr ? OALKitlMACtoString(mac) : L"Not programmed"); OALLog( L" VMINI: %s\r\n", (g_bootCfg.kitlFlags & OAL_KITL_FLAGS_VMINI) ? L"enabled" : L"disabled" ); OALLog(L" Note: USBFN RNDIS MAC Addr cannot be changed.\r\n"); OALBLMenuReadKey(TRUE); }
//------------------------------------------------------------------------------ VOID ChangeBaud(OAL_BLMENU_ITEM *pMenu) { WCHAR key; BOOL bu = FALSE; while (bu == FALSE) { OALLog(L" 1: 115.2K\r\n"); OALLog(L" 2: 57600\r\n"); OALLog(L" 3: 38400\r\n"); OALLog(L" 4: 19200\r\n"); OALLog(L" 5: 9600\r\n"); OALLog(L"Select a new baud rate: "); key = OALBLMenuReadKey(TRUE); OALLog(L"\r\n"); switch (key) { case '1': g_bootCfg.baudRate = 115200; bu = TRUE; break; case '2': g_bootCfg.baudRate = 57600; bu = TRUE; break; case '3': g_bootCfg.baudRate = 38400; bu = TRUE; break; case '4': g_bootCfg.baudRate = 19200; bu = TRUE; break; case '5': g_bootCfg.baudRate = 9600; bu = TRUE; break; default: break; } } sport_update_rate(g_bootCfg.baudRate); }
VOID OALBLMenuEnable(OAL_BLMENU_ITEM *pMenu) { LPCWSTR title = pMenu->pParam1; UINT32 *pFlags = pMenu->pParam2; UINT32 mask = (UINT32)pMenu->pParam3; BOOL flag; WCHAR key; // First check input parameter if (title == NULL || pFlags == NULL) { OALMSG(OAL_ERROR, (L"ERROR: OALBLMenuEnable: Invalid parameter\r\n")); goto cleanUp; } if (mask == 0) mask = 0xFFFF; flag = (*pFlags & mask) != 0; OALLog( L" %s %s (actually %s) [y/-]: ", flag ? L"Disable" : L"Enable", title, flag ? L"enabled" : L"disabled" ); // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); if (key == L'y' || key == L'Y') { flag = !flag; OALLog(L" %s %s\r\n", title, flag ? L"enabled" : L"disabled"); } else { OALLog( L" %s stays %s\r\n", title, flag ? L"enabled" : L"disabled" ); } // Save value if (flag) { *pFlags |= mask; } else { *pFlags &= ~mask; } cleanUp:; }
VOID FormatFlash(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UNREFERENCED_PARAMETER(pMenu); OALLog(L" Do you want to format unreserved blocks [-/y]? "); // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); // Depending on result if (key != L'y' && key != L'Y') goto cleanUp; BLConfigureFlashPartitions(TRUE); cleanUp: return; }
VOID OALBLMenuShow(OAL_BLMENU_ITEM *pMenu) { LPCWSTR title = pMenu->pParam1; OAL_BLMENU_ITEM *aMenu = pMenu->pParam2, *pItem; WCHAR key; while (TRUE) { OALBLMenuHeader(L"%s", title); // Print menu items for (pItem = aMenu; pItem->key != 0; pItem++) { OALLog(L" [%c] %s\r\n", pItem->key, pItem->text); } OALLog(L"\r\n Selection: "); while (TRUE) { // Get key key = OALBLMenuReadKey(TRUE); // Look for key in menu for (pItem = aMenu; pItem->key != 0; pItem++) { if (pItem->key == key) break; } // If we find it, break loop if (pItem->key != 0) break; } // Print out selection character OALLog(L"%c\r\n", key); // When action is NULL return back to parent menu if (pItem->pfnAction == NULL) break; // Else call menu action pItem->pfnAction(pItem); } }
VOID OALBLMenuActivate(UINT32 delay, OAL_BLMENU_ITEM *pMenu) { UINT32 time; WCHAR key = 0; // First let user break to menu while (delay > 0 && key != L' ') { OALLog(L"Hit space to enter configuration menu %d...\r\n", delay); time = OALGetTickCount(); while ((OALGetTickCount() - time) < 1000) { if ((key = OALBLMenuReadKey(FALSE)) == L' ') break; } delay--; } if (key == L' ') { #ifdef OAL_BLMENU_PCI OALPCIConfig(0, 0, 0, 0, 0, 0, NULL); #endif OALBLMenuShow(pMenu); } }
static VOID SetECCType(OAL_BLMENU_ITEM *pMenu) { WCHAR key; UNREFERENCED_PARAMETER(pMenu); OALLog(L" This command is used to temporarily changing ECC mode in NK.bin, it is for test purpose only! \r\n"); OALLog(L" Select ECC mode [0(Hamming 1bit)/1(BCH 4bit)/2(BCH 8bit)]: "); // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); if (key == L'0' || key == L'1' || key == L'2') { g_bootCfg.ECCtype = (UCHAR)(key - '0'); } else { g_bootCfg.ECCtype = 0; OALLog(L" Invalid ECC mode, set ECC mode as Hamming 1bit\r\n"); } g_ecctype = g_bootCfg.ECCtype; }
UINT32 OALBLMenuReadLine(LPWSTR szBuffer, size_t CharCount) { UINT32 count; WCHAR key; count = 0; while (count < CharCount) { key = OALBLMenuReadKey(TRUE); if (key == L'\r' || key == L'\n') { OALLog(L"\r\n"); break; } if (key == L'\b' && count > 0) { OALLog(L"\b \b"); count--; } else if (key >= L' ' && key < 128 && count < (CharCount - 1)) { szBuffer[count++] = key; OALLog(L"%c", key); } } szBuffer[count] = '\0'; return count; }
VOID BLMenu(BOOL bForced) { UINT32 time, delay = 5; WCHAR key = 0; BSP_ARGS *pArgs = OALCAtoUA(IMAGE_SHARE_ARGS_CA); // First let user break to menu while (!bForced && (delay > 0 && key != L' ')) { OALLog(L"Hit space to enter configuration menu %d...\r\n", delay); time = OALGetTickCount(); while ((OALGetTickCount() - time) < 1000) { if ((key = OALBLMenuReadKey(FALSE)) == L' ') break; } delay--; } if ((bForced == TRUE) || (key == L' ')) { OALBLMenuShow(&g_menuRoot); // Invalidate arguments to force them to be reinitialized // with new config data generated by the boot menu pArgs->header.signature = 0; } }
VOID OALBLMenuSelectDevice(OAL_BLMENU_ITEM *pMenu) { LPCWSTR title = pMenu->pParam1; DEVICE_LOCATION *pDevLoc = pMenu->pParam2; OAL_KITL_DEVICE *aDevices = pMenu->pParam3, *pDevice; DEVICE_LOCATION devLoc[OAL_MENU_MAX_DEVICES]; UINT32 i; WCHAR key; // First check input parameters if (title == NULL || pDevLoc == NULL || aDevices == NULL) { OALMSG(OAL_ERROR, ( L"ERROR: OALBLMenuSelectDevice: Invalid parameters\r\n" )); goto cleanUp; } OALBLMenuHeader(L"Select %s Device", title); i = 0; pDevice = aDevices; while (pDevice->name != NULL && i < OAL_MENU_MAX_DEVICES) { switch (pDevice->ifcType) { case Internal: devLoc[i].IfcType = pDevice->ifcType; devLoc[i].BusNumber = 0; devLoc[i].LogicalLoc = pDevice->id; devLoc[i].PhysicalLoc = 0; OALLog( L" [%d] %s\r\n", i + 1, OALKitlDeviceName(&devLoc[i], aDevices) ); i++; pDevice++; break; #ifdef OAL_BLMENU_PCI case PCIBus: { OAL_PCI_LOCATION pciLoc; pciLoc.logicalLoc = 0; while (i < OAL_MENU_MAX_DEVICES) { if (!OALPCIFindNextId(0, pDevice->id, &pciLoc)) break; devLoc[i].IfcType = pDevice->ifcType; devLoc[i].BusNumber = 0; devLoc[i].LogicalLoc = pciLoc.logicalLoc; devLoc[i].PhysicalLoc = 0; OALLog( L" [%d] %s\r\n", i + 1, OALKitlDeviceName(&devLoc[i], aDevices) ); i++; } pDevice++; } break; #endif default: pDevice++; break; } } OALLog(L" [0] Exit and Continue\r\n"); OALLog( L"\r\n Selection (actual %s): ", OALKitlDeviceName(pDevLoc, aDevices) ); do { key = OALBLMenuReadKey(TRUE); } while (key < L'0' || key > L'0' + i); OALLog(L"%c\r\n", key); // If user select exit don't change device if (key == L'0') goto cleanUp; memcpy(pDevLoc, &devLoc[key - L'0' - 1], sizeof(DEVICE_LOCATION)); OALLog( L" %s device set to %s\r\n", title, OALKitlDeviceName(pDevLoc, aDevices) ); cleanUp:; }
VOID EraseFlash(OAL_BLMENU_ITEM *pMenu) { WCHAR key; HANDLE hFMD = NULL; PCI_REG_INFO regInfo; FlashInfo flashInfo; BLOCK_ID block; UINT32 status; UNREFERENCED_PARAMETER(pMenu); OALLog(L" Do you want to erase unreserved blocks [-/y]? "); // Get key key = OALBLMenuReadKey(TRUE); OALLog(L"%c\r\n", key); // Depending on result if (key != L'y' && key != L'Y') goto cleanUp; // 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; } // First offset given block = 0; while (block < flashInfo.dwNumBlocks) { // If block is bad, we have to offset it status = FMD_GetBlockStatus(block); // Skip bad blocks if ((status & BLOCK_STATUS_BAD) != 0) { OALLog(L" Skip bad block %d\r\n", block); block++; continue; } // Skip reserved blocks if ((status & BLOCK_STATUS_RESERVED) != 0) { OALLog(L" Skip reserved block %d\r\n", block); block++; continue; } // Erase block if (!FMD_EraseBlock(block)) { OALLog(L" Oops, can't erase block %d - mark as bad\r\n", block); FMD_SetBlockStatus(block, BLOCK_STATUS_BAD); } block++; } OALLog(L" Done\r\n"); // Block until a keypress OALBLMenuReadKey(TRUE); 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; }