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

📄 main.c

📁 WINDOWS CE BSP用于SBC2440开发板
💻 C
📖 第 1 页 / 共 4 页
字号:
        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 + -