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; } }
//------------------------------------------------------------------------------ // // Function: OEMLaunch // // This function is the last one called by the boot framework and it is // responsible for to launching the image. // VOID OEMLaunch( ULONG start, ULONG size, ULONG launch, const ROMHDR *pRomHeader ) { BSP_ARGS *pArgs = OALCAtoUA(IMAGE_SHARE_ARGS_CA); UNREFERENCED_PARAMETER(size); UNREFERENCED_PARAMETER(pRomHeader); OALMSG(OAL_FUNC, ( L"+OEMLaunch(0x%08x, 0x%08x, 0x%08x, 0x%08x - %d/%d)\r\n", start, size, launch, pRomHeader, g_eboot.bootDeviceType, g_eboot.type )); // Depending on protocol there can be some action required switch (g_eboot.bootDeviceType) { #if BUILDING_EBOOT_SD case BOOT_SDCARD_TYPE: switch (g_eboot.type) { #if 0 /* case DOWNLOAD_TYPE_FLASHRAM: if (BLFlashDownload(&g_bootCfg, g_kitlDevices) != BL_JUMP) { OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: " L"Image load from flash memory failed\r\n" )); goto cleanUp; } launch = g_eboot.launchAddress; break; */ #endif case DOWNLOAD_TYPE_RAM: launch = (UINT32)OEMMapMemAddr(start, launch); break; case DOWNLOAD_TYPE_FLASHNAND: if (BLFlashDownload(&g_bootCfg, g_kitlDevices) != BL_JUMP) { OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: " L"Image load from flash memory failed\r\n" )); goto cleanUp; } launch = g_eboot.launchAddress; break; #if 0 /* case DOWNLOAD_TYPE_EBOOT: case DOWNLOAD_TYPE_XLDR: OALMSG(OAL_INFO, (L"INFO: " L"XLDR/EBOOT/IPL downloaded, spin forever\r\n" )); while (TRUE); break; */ #endif default: OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: Unknown download type, spin forever\r\n")); for(;;); break; } break; #endif case OAL_KITL_TYPE_ETH: BLEthConfig(pArgs); switch (g_eboot.type) { case DOWNLOAD_TYPE_FLASHNAND: case DOWNLOAD_TYPE_FLASHNOR: if (BLFlashDownload(&g_bootCfg, g_kitlDevices) != BL_JUMP) { OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: " L"Image load from flash memory failed\r\n" )); goto cleanUp; } launch = g_eboot.launchAddress; break; case DOWNLOAD_TYPE_RAM: launch = (UINT32)OEMMapMemAddr(start, launch); break; case DOWNLOAD_TYPE_EBOOT: case DOWNLOAD_TYPE_XLDR: OALMSG(OAL_INFO, (L"INFO: " L"XLDR/EBOOT/IPL downloaded, spin forever\r\n" )); for(;;); break; case DOWNLOAD_TYPE_LOGO: OALMSG(OAL_INFO, (L"INFO: " L"Splashcreen logo downloaded, spin forever\r\n" )); for(;;); break; default: OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: Unknown download type, spin forever\r\n")); for(;;); break; } break; default: launch = g_eboot.launchAddress; break; } #ifndef BSP_NO_NAND_IN_SDBOOT if ((g_bootCfg.flashNKFlags & ENABLE_FLASH_NK) && /* if loading from NAND then do not need to flash NAND again */ (g_eboot.bootDeviceType != OAL_KITL_TYPE_FLASH) && (start != (IMAGE_WINCE_CODE_CA + NAND_ROMOFFSET)) && (start != (IMAGE_WINCE_CODE_CA + NOR_ROMOFFSET))) { if( !WriteFlashNK(start, size)) OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: " L"Flash NK.bin failed, start=%x\r\n", start )); } #endif // Check if we get launch address if (launch == (UINT32)INVALID_HANDLE_VALUE) { OALMSG(OAL_ERROR, (L"ERROR: OEMLaunch: " L"Unknown image launch address, spin forever\r\n" )); for(;;); } // Print message, flush caches and jump to image OALLog( L"Launch Windows CE image by jumping to 0x%08x...\r\n\r\n", launch ); OEMDeinitDebugSerial(); OEMPlatformDeinit(); JumpTo(OALVAtoPA((UCHAR*)launch)); cleanUp: return; }
//------------------------------------------------------------------------------ // // Function: OEMPreDownload // // This function is called before downloading an image. There is place // where user can be asked about device setup. // ULONG OEMPreDownload( ) { ULONG rc = (ULONG) BL_ERROR; BSP_ARGS *pArgs = OALCAtoUA(IMAGE_SHARE_ARGS_CA); BOOL bForceBootMenu; OMAP_PRCM_GLOBAL_PRM_REGS * pPrmGlobal = OALPAtoUA(OMAP_PRCM_GLOBAL_PRM_REGS_PA); ULONG dwTemp; UINT32 *pStatusControlAddr = OALPAtoUA(OMAP_STATUS_CONTROL_REGS_PA); UINT32 dwSysBootCfg; OALLog(L"INFO: Predownload....\r\n"); // We need to support multi bin notify g_pOEMMultiBINNotify = OEMMultiBinNotify; // Ensure bootloader blocks are marked as reserved BLReserveBootBlocks(); // Read saved configration if (BLReadBootCfg(&g_bootCfg) && (g_bootCfg.signature == BOOT_CFG_SIGNATURE) && (g_bootCfg.version == BOOT_CFG_VERSION)) { OALLog(L"INFO: Boot configuration found\r\n"); } else { OALLog(L"WARN: Boot config wasn't found, using defaults\r\n"); memset(&g_bootCfg, 0, sizeof(g_bootCfg)); memcpy(&g_bootCfg.mac,DefaultMacAddress,sizeof(g_bootCfg.mac)); g_bootCfg.signature = BOOT_CFG_SIGNATURE; g_bootCfg.version = BOOT_CFG_VERSION; g_bootCfg.oalFlags = 0; g_bootCfg.flashNKFlags = 0; g_bootCfg.ECCtype = (UCHAR)dwEbootECCtype; // To make it easier to select USB or EBOOT from menus when booting from SD card, // preset the kitlFlags. This has no effect if booting from SD card. g_bootCfg.kitlFlags = OAL_KITL_FLAGS_DHCP|OAL_KITL_FLAGS_ENABLED; g_bootCfg.kitlFlags |= OAL_KITL_FLAGS_VMINI; g_bootCfg.kitlFlags |= OAL_KITL_FLAGS_EXTNAME; g_bootCfg.displayRes = OMAP_LCD_DEFAULT; // select default boot device based on boot select switch setting dwSysBootCfg = INREG32(pStatusControlAddr); OALLog(L"INFO: SW4 boot setting: 0x%02x\r\n", dwSysBootCfg & 0x3f); switch (dwSysBootCfg & 0x3f) { case 0x24: case 0x26: case 0x3b: // 1st boot device is USB g_bootCfg.bootDevLoc.LogicalLoc = OMAP_USBHS_REGS_PA; g_bootCfg.kitlDevLoc.LogicalLoc = OMAP_USBHS_REGS_PA; break; case 0x06: case 0x12: case 0x18: // 1st boot device is MMC1 (SD Card Boot) g_bootCfg.bootDevLoc.LogicalLoc = OMAP_MMCHS1_REGS_PA; break; case 0x01: case 0x0c: case 0x15: case 0x1b: // 1st boot device is NAND g_bootCfg.bootDevLoc.LogicalLoc = BSP_NAND_REGS_PA + 0x20; break; case 0x00: case 0x02: case 0x04: case 0x10: case 0x16: // 1st boot device is ONENAND g_bootCfg.bootDevLoc.LogicalLoc = BSP_ONENAND_REGS_PA + 0x20; break; default: // UART, Ethernet Boot g_bootCfg.bootDevLoc.LogicalLoc = OMAP_MMCHS1_REGS_PA; g_bootCfg.kitlDevLoc.LogicalLoc = BSP_LAN9115_REGS_PA; break; } //fourier g_bootCfg.bootDevLoc.LogicalLoc = OMAP_MMCHS1_REGS_PA; if (g_bootCfg.kitlDevLoc.LogicalLoc == 0) { g_bootCfg.kitlDevLoc.LogicalLoc = BSP_LAN9115_REGS_PA; }; g_bootCfg.deviceID = 0; g_bootCfg.osPartitionSize = IMAGE_WINCE_CODE_SIZE; wcscpy(g_bootCfg.filename, L"nk.bin"); } // Initialize flash partitions if needed BLConfigureFlashPartitions(FALSE); // Initialize ARGS structure if ((pArgs->header.signature != OAL_ARGS_SIGNATURE) || (pArgs->header.oalVersion != OAL_ARGS_VERSION) || (pArgs->header.bspVersion != BSP_ARGS_VERSION)) { memset(pArgs, 0, IMAGE_SHARE_ARGS_SIZE); } // Save reset type dwTemp = INREG32(&pPrmGlobal->PRM_RSTST); if (dwTemp & (GLOBALWARM_RST /* actually SW reset */ | EXTERNALWARM_RST)) { pArgs->coldBoot = FALSE; } else { pArgs->coldBoot = TRUE; OALLog(L"\r\n>>> Forcing cold boot (non-persistent registry and other data will be wiped) <<< \r\n"); } // Don't force the boot menu, use default action unless user breaks // into menu bForceBootMenu = FALSE; g_bootCfg.flashNKFlags = 0; retryBootMenu: // Call configuration menu BLMenu(bForceBootMenu); // Update ARGS structure if necessary if ((pArgs->header.signature != OAL_ARGS_SIGNATURE) || (pArgs->header.oalVersion != OAL_ARGS_VERSION) || (pArgs->header.bspVersion != BSP_ARGS_VERSION)) { pArgs->header.signature = OAL_ARGS_SIGNATURE; pArgs->header.oalVersion = OAL_ARGS_VERSION; pArgs->header.bspVersion = BSP_ARGS_VERSION; pArgs->kitl.flags = g_bootCfg.kitlFlags; pArgs->kitl.devLoc = g_bootCfg.kitlDevLoc; pArgs->kitl.ipAddress = g_bootCfg.ipAddress; pArgs->kitl.ipMask = g_bootCfg.ipMask; pArgs->kitl.ipRoute = g_bootCfg.ipRoute; memcpy(pArgs->kitl.mac,g_bootCfg.mac,sizeof(pArgs->kitl.mac)); pArgs->updateMode = FALSE; pArgs->deviceID = g_bootCfg.deviceID; pArgs->oalFlags = g_bootCfg.oalFlags; pArgs->dispRes = g_bootCfg.displayRes; pArgs->ECCtype = g_bootCfg.ECCtype; memcpy(pArgs->DevicePrefix, gDevice_prefix, sizeof(pArgs->DevicePrefix)); } // Initialize display BLShowLogo(); // Image download depends on protocol g_eboot.bootDeviceType = OALKitlDeviceType( &g_bootCfg.bootDevLoc, g_bootDevices ); switch (g_eboot.bootDeviceType) { case BOOT_SDCARD_TYPE: rc = BLSDCardDownload(g_bootCfg.filename); break; case OAL_KITL_TYPE_FLASH: rc = BLFlashDownload(&g_bootCfg, g_bootDevices); break; case OAL_KITL_TYPE_ETH: rc = BLEthDownload(&g_bootCfg, g_bootDevices); break; } if (rc == BL_ERROR) { // No automatic mode now, force the boot menu to appear bForceBootMenu = TRUE; goto retryBootMenu; } return rc; }