⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 SMDK2416_BSP
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 + -