?? menu.c
字號:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2004-2007, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
//
// File: menu.c
//
// Menu routines for the ethernet bootloader.
//
//------------------------------------------------------------------------------
#include <bsp.h>
#include "loader.h"
//-----------------------------------------------------------------------------
// External Functions
extern void ResetDefaultBootCFG(BOOT_CFG *pBootCFG);
extern BOOL StoreBootCFG(BOOT_CFG *BootCFG);
extern BOOL NANDFormatNK(void);
extern BOOL NANDFormatAll(void);
extern void SetMAC(BOOT_CFG *pBootCFG);
extern void CvtMAC(USHORT MacAddr [ 3 ], char * pszDottedD);
extern void SetBootMe(BOOT_CFG *pBootCFG);
extern void SetDelay(BOOT_CFG *pBootCFG);
//-----------------------------------------------------------------------------
// External Variables
extern BSP_ARGS *g_pBSPArgs;
extern BOOT_CFG g_BootCFG;
extern BOOL g_DownloadImage;
extern UINT32 EthDevice; // To determine if Ethernet has been initailized for download/KITL usage
//-----------------------------------------------------------------------------
// Defines
//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
// Local Variables
//------------------------------------------------------------------------------
// Local Functions
//
static void SetIP(BOOT_CFG *pBootCFG);
static void SetMask(BOOT_CFG *pBootCFG);
//------------------------------------------------------------------------------
//
// Function: BLMenu
//
// Provides boot loader menu interface.
//
// Parameters:
// None.
//
// Returns:
// TRUE indicates success. FALSE indicates failure.
//
//------------------------------------------------------------------------------
BOOL BLMenu()
{
UINT32 AutoBootDelay = 0;
BOOLEAN bCFGChanged = FALSE;
UINT32 StartTime, CurrTime, PrevTime;
UINT32 Selection;
// If mac address has not been programmed, immediately drop into menu
// so user can give us one. The ADS EEPROM connected to the CS8900A
// does not contain the proper values to allow the MAC to be obtained
// automatically.
if (!g_BootCFG.mac[0] && !g_BootCFG.mac[1] && !g_BootCFG.mac[2])
{
EdbgOutputDebugString("WARNING: Uninitialized MAC address. Select valid address using menu.\r\n");
Selection = 0x20;
}
else
{
AutoBootDelay = g_BootCFG.delay;
switch(g_BootCFG.autoDownloadImage)
{
case BOOT_CFG_AUTODOWNLOAD_NK_NOR:
g_DownloadImage = FALSE;
EdbgOutputDebugString("\r\nPress [ENTER] to launch image stored in NOR flash or [SPACE] to cancel.\r\n");
EdbgOutputDebugString("\r\nInitiating image launch in %d seconds. ", AutoBootDelay--);
break;
case BOOT_CFG_AUTODOWNLOAD_NK_NAND:
g_DownloadImage = FALSE;
EdbgOutputDebugString("\r\nPress [ENTER] to launch image stored in NAND flash or [SPACE] to cancel.\r\n");
EdbgOutputDebugString("\r\nInitiating image launch in %d seconds. ", AutoBootDelay--);
break;
case BOOT_CFG_AUTODOWNLOAD_IPL_NAND:
g_DownloadImage = FALSE;
EdbgOutputDebugString("\r\nPress [ENTER] to launch IPL stored in NAND flash or [SPACE] to cancel.\r\n");
EdbgOutputDebugString("\r\nInitiating IPL launch in %d seconds. ", AutoBootDelay--);
break;
default:
g_DownloadImage = TRUE;
EdbgOutputDebugString("\r\nPress [ENTER] to download now or [SPACE] to cancel.\r\n");
EdbgOutputDebugString("\r\nInitiating image download in %d seconds. ", AutoBootDelay--);
break;
}
// Get a snapshot of the RTC seconds count.
//
StartTime = OEMEthGetSecs();
PrevTime = StartTime;
CurrTime = StartTime;
Selection = (UINT32)OEM_DEBUG_READ_NODATA;
// Allow the user an amount of time to halt the auto boot/download process.
// Count down to 0 before proceeding with default operation.
//
while ((CurrTime - StartTime) < g_BootCFG.delay)
{
UINT8 i=0;
UINT8 j;
Selection = OEMReadDebugByte();
if ((Selection == 0x20) || (Selection == 0x0d))
{
break;
}
CurrTime = OEMEthGetSecs();
if (CurrTime > PrevTime)
{
PrevTime = CurrTime;
if (AutoBootDelay < 9)
i = 11;
else if (AutoBootDelay < 99)
i = 12;
else if (AutoBootDelay < 999)
i = 13;
for (j = 0; j < i; j++)
{
OEMWriteDebugByte((BYTE)0x08); // print back space
}
KITLOutputDebugString ( "%d seconds. ", AutoBootDelay--);
}
}
}
switch (Selection)
{
case OEM_DEBUG_READ_NODATA: // fall through if nothing typed
case 0x0d: // user canceled wait
{
if (g_BootCFG.autoDownloadImage)
{
KITLOutputDebugString ( "\r\nLaunching flash image ... \r\n");
}
else
{
KITLOutputDebugString ( "\r\nStarting auto download ... \r\n");
}
break;
}
case 0x20:
{
Selection = 0;
for (;;)
{
// Show menu
KITLOutputDebugString ( "\r\n\r\nBoot Loader Configuration%s:\r\n\r\n", bCFGChanged ? " (UNSAVED CHANGES)" : "");
KITLOutputDebugString ( "0) IP address: %s\r\n",inet_ntoa(g_BootCFG.IP));
KITLOutputDebugString ( "1) Subnet Mask: %s\r\n", inet_ntoa(g_BootCFG.subnetMask));
KITLOutputDebugString ( "2) Boot delay: %d seconds\r\n", g_BootCFG.delay);
KITLOutputDebugString ( "3) DHCP: %s\r\n", (g_BootCFG.DHCPEnable == TRUE ? "Enabled" : "Disabled"));
KITLOutputDebugString ( "4) Reset to factory default configuration\r\n");
switch(g_BootCFG.autoDownloadImage)
{
case BOOT_CFG_AUTODOWNLOAD_NK_NOR:
KITLOutputDebugString("5) Autoboot: NK from NOR\r\n");
break;
case BOOT_CFG_AUTODOWNLOAD_NK_NAND:
KITLOutputDebugString("5) Autoboot: NK from NAND\r\n");
break;
case BOOT_CFG_AUTODOWNLOAD_IPL_NAND:
KITLOutputDebugString("5) Autoboot: IPL from NAND\r\n");
break;
default:
KITLOutputDebugString("5) Autoboot: Disabled\r\n");
break;
}
KITLOutputDebugString ( "6) MAC address: %x-%x-%x-%x-%x-%x\r\n",
g_BootCFG.mac[0] & 0x00FF, g_BootCFG.mac[0] >> 8,
g_BootCFG.mac[1] & 0x00FF, g_BootCFG.mac[1] >> 8,
g_BootCFG.mac[2] & 0x00FF, g_BootCFG.mac[2] >> 8);
KITLOutputDebugString ( "7) Format OS NAND region.\r\n");
KITLOutputDebugString ( "8) Format ALL NAND regions.\r\n");
KITLOutputDebugString ( "S) Save configuration\r\n");
KITLOutputDebugString ( "D) Download image now\r\n");
KITLOutputDebugString ( "L) Launch existing flash resident image now\r\n");
KITLOutputDebugString ( "\r\n\r\nEnter your selection: ");
// Read user selection
Selection = 0;
while (! ( ( (Selection >= '0') && (Selection <= '8') ) ||
( (Selection == 'D') || (Selection == 'd') ) ||
( (Selection == 'L') || (Selection == 'l') ) ||
( (Selection == 'S') || (Selection == 's') ) ))
{
Selection = OEMReadDebugByte();
}
KITLOutputDebugString ( "%c\r\n", Selection);
// Process user selection
switch (Selection)
{
case '0':
SetIP(&g_BootCFG);
bCFGChanged=TRUE;
break;
case '1':
SetMask(&g_BootCFG);
bCFGChanged=TRUE;
break;
case '2':
SetDelay(&g_BootCFG);
bCFGChanged=TRUE;
break;
case '3':
if (g_BootCFG.DHCPEnable == TRUE)
g_BootCFG.DHCPEnable = FALSE;
else
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -