?? main.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) 2006, 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: main.c
//
// OEM IPL routines for Freescale MX31 ADS hardware platform.
//
//------------------------------------------------------------------------------
#include <windows.h>
#include <iplcommon.h>
#include <bootpart.h> // Needed for partition types...
#include <fmd.h>
#include "bsp.h"
#include "keys.h"
//-----------------------------------------------------------------------------
// External Functions
extern void Launch(UINT32 ulLaunchAddr);
//-----------------------------------------------------------------------------
// External Variables
//-----------------------------------------------------------------------------
// Defines
// Version number
#define IPL_VERSION_MAJOR 1
#define IPL_VERSION_MINOR 0
//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------
// Global Variables
//
// These four variables below are used by iplcommon
//
// Flash start and length. They are used for NOR IPL.
// We only support NAND IPL so just set them 0.
UINT32 g_ulFlashBase = 0;
UINT32 g_ulFlashLengthBytes = 0;
// BootPart work buffer start and length that will
// be set in OEMIPLInit.
UINT32 g_ulBPartBase;
UINT32 g_ulBPartLengthBytes;
//-----------------------------------------------------------------------------
// Local Variables
//-----------------------------------------------------------------------------
// Local Functions
//------------------------------------------------------------------------------
//
// Function: main
//
// This function is the IPL main entry.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void main(void)
{
// Call into the IPLcommon main routine.
IPLmain();
}
//------------------------------------------------------------------------------
//
// Function: OEMMessageHandler
//
// This function is the OEM message handler.
//
// Parameters:
// MessageCode
// [in] IPL message code.
//
// pMessageString
// [in] The message to output.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
static void OEMMessageHandler(IPL_MESSAGE_CODE MessageCode,
LPWSTR pMessageString)
{
OEMWriteDebugString((UINT16 *)pMessageString);
}
//------------------------------------------------------------------------------
//
// Function: OEMIPLInit
//
// This function performs OEM initializaiton for IPL.
//
// Parameters:
// None.
//
// Returns:
// TRUE indicates success. FALSE indicates failure.
//
//------------------------------------------------------------------------------
BOOLEAN OEMIPLInit(void)
{
// Initialize the UART.
OEMInitDebugSerial();
KITLOutputDebugString("Microsoft Windows CE IPL %d.%d for MX31 ADS (%s %s)\r\n",
IPL_VERSION_MAJOR, IPL_VERSION_MINOR, __DATE__, __TIME__);
// Set BootPart work buffer start and length
g_ulBPartBase = (UINT32)OALPAtoUA(IMAGE_BOOT_NANDCACHE_RAM_START);
g_ulBPartLengthBytes = IMAGE_BOOT_NANDCACHE_RAM_SIZE;
// Messaging handler callback.
g_pfnMessageHandler = OEMMessageHandler;
// Initialize Keypad for ULDR forcing key read
KeypadInit();
return(TRUE);
}
//------------------------------------------------------------------------------
//
// Function: OEMGetUpdateMode
//
// This function determines whether the device is in update mode or
// normal boot mode. It also implements the IPLCOMMON helper routines.
//
// Parameters:
// None.
//
// Returns:
// TRUE indicates success. FALSE indicates failure.
//
//------------------------------------------------------------------------------
BOOLEAN OEMGetUpdateMode(void)
{
BOOL fUpdateMode = FALSE;
// Check the left softkey for forcing ULDR
if (KeypadRead() & KEY_TSOFT1)
{
fUpdateMode = TRUE;
KITLOutputDebugString("IPL: Forcing ULDR soft key 1 is down\r\n");
}
// Check the RAM flag
if (!fUpdateMode)
{
BOOL *pfUpdateMode = OALArgsQuery(OAL_ARGS_QUERY_UPDATEMODE);
if (pfUpdateMode != NULL)
{
fUpdateMode = *pfUpdateMode;
// Tell us when update flag is set
if (fUpdateMode)
KITLOutputDebugString("IPL: RAM Update Flag is set\r\n");
}
else
{
KITLOutputDebugString("IPL: RAM Update is not available!!\r\n");
}
}
// When RAM flag isn't set check persistent one
if (!fUpdateMode)
{
// Get persistent flag
if (!BP_GetUpdateModeFlag(&fUpdateMode))
KITLOutputDebugString("IPL: Failed to get Persistent Update Flag\r\n");
if (fUpdateMode)
KITLOutputDebugString("IPL: Persistent Update Flag is set\r\n");
}
if (fUpdateMode)
KITLOutputDebugString("IPL: Launching the Update Loader\r\n");
else
KITLOutputDebugString("IPL: Launching the OS image\r\n");
return(fUpdateMode);
}
//------------------------------------------------------------------------------
//
// Function: OEMTranslateBaseAddress
//
// This function converts an image virtual address into an
// IPL-compatible address.
//
// Parameters:
// ulPartType
// [in] Specifies the partition type.
//
// ulAddr
// [in] Starting virtual address of the specified partition.
//
// pulTransAddr
// [out] Pointer to the translated IPL-compatible address.
//
// Returns:
// TRUE indicates success. FALSE indicates failure.
//
//------------------------------------------------------------------------------
BOOLEAN OEMTranslateBaseAddress(UINT32 ulPartType, UINT32 ulAddr,
UINT32 *pulTransAddr)
{
if (pulTransAddr == NULL)
{
return(FALSE);
}
// No translation required since IPL is operating in Virtual space.
switch(ulPartType)
{
case PART_BOOTSECTION:
case PART_XIP:
default:
*pulTransAddr = ulAddr;
}
return(TRUE);
}
//------------------------------------------------------------------------------
//
// Function: OEMLaunchImage
//
// This function launches the loaded image.
//
// Parameters:
// ulLaunchAddr
// [in] Jump address of the image to launch.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
void OEMLaunchImage(UINT32 ulLaunchAddr)
{
UINT32 ulPhysicalJump = 0;
// The IPL is running with the MMU on - before we jump to the loaded image, we need to convert
// the launch address to a physical address and turn off the MMU.
// Convert jump address to a physical address.
ulPhysicalJump = OALVAtoPA((void *)ulLaunchAddr);
KITLOutputDebugString("Jumping to VA 0x%x PA 0x%x...\r\n", ulLaunchAddr, ulPhysicalJump);
// Jump...
Launch(ulPhysicalJump);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -