?? monitor.c
字號:
/*
Module Name:
Monitor.c
Abstract:
Implements platform debug routines.
*/
#include <windows.h>
#include <halether.h>
#include <pehdr.h>
#include <romldr.h>
#include <nkintr.h>
#include "XSC1BD.h"
#include "monitor.h"
#include "cfload.h"
#include "ethdown.h"
#include "sredown.h"
extern void Launch(unsigned int uAddr);
extern DWORD dwLaunchAddr;
static ULONG gDisplayAddr;
static BYTE gSize;
ULONG gRamBufStart; // starting address of available RAM
ULONG gRamBufEnd; // ending address of available RAM
INT
MonitorProgram(void)
{
TCHAR stringData[0x80];
TCHAR addrString[11];
LPTSTR stringPtr;
ULONG modifyAddr;
ULONG nCacheAddr;
ULONG dataValue;
ULONG length;
ULONG launchAddr;
ULONG value;
ULONG endAddr;
ShowHelpMessage();
while (TRUE)
{
EdbgOutputDebugString("\r\n Command:>");
GetInputBuffer(stringData);
// Determine and call the corresponding routine
stringPtr = stringData;
switch(*stringPtr++)
{
case 'c':
case 'C':
// Copy data to flash or ram.
{
TCHAR src[20], dst[20], len[20];
ULONG source, destination, length;
stringPtr = ParseString(stringPtr, src);
stringPtr = ParseString(stringPtr, dst);
stringPtr = ParseString(stringPtr, len);
if (Asc2Int(src, &source) && Asc2Int(dst, &destination) && Asc2Int(len, &length))
{
EdbgOutputDebugString("Source: 0x%x; Destination 0x%x; Length: 0x%x\r\n",
source, destination, length);
if (FlashCheckAddr(destination, length))
{
EdbgOutputDebugString("Start Copy Data....\r\n");
FlashWrite(destination, source, length);
}
else
{
memcpy((void *)destination, (void *)source, length);
}
EdbgOutputDebugString("Done.\r\n");
}
else
{
EdbgOutputDebugString("Invalid parameter.\r\n");
}
}
break;
case 'd':
case 'D':
//EdbgOutputDebugString("BootGetMemory!\r\n");
stringPtr = ParseString(stringPtr, addrString);
if (addrString[0] != (TCHAR) NULL)
{
//EdbgOutputDebugString("First = %s!\r\n", addrString);
if (!Asc2Int(addrString, &value))
{
switch (addrString[0])
{
case 'b':
case 'B':
gSize = sizeof(BYTE);
break;
case 'w':
case 'W':
gSize = sizeof(WORD);
break;
case 'd':
case 'D':
gSize = sizeof(DWORD);
break;
default:
break;
}
stringPtr = ParseString(stringPtr, addrString);
}
else
{
gSize = sizeof(DWORD);
}
if ((addrString[0] != (TCHAR) NULL) && Asc2Int(addrString, &value))
{
gDisplayAddr = value;
}
stringPtr = ParseString(stringPtr, addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &length))
{
length = 64;
}
}
else
{
length = 64;
}
EdbgOutputDebugString("StartAddr = 0x%x, length = 0x%x size = %d!\r\n", gDisplayAddr, length, gSize);
BootGetMemory(gDisplayAddr, length, gSize);
gDisplayAddr = (ULONG) gDisplayAddr + (gSize * length);
break;
case 'e':
case 'E':
EdbgOutputDebugString("Erase Flash!\r\n");
EraseSystemFlash();
break;
case 'g':
case 'G':
stringPtr = ParseString(stringPtr, addrString);
Asc2Int(addrString, &launchAddr);
EdbgOutputDebugString("Launch Address = 0x%x = %d!\r\n", launchAddr, launchAddr);
if (Asc2Int(addrString, &launchAddr))
{
EdbgOutputDebugString("Launch at = 0x%x!\r\n", launchAddr);
}
Launch(launchAddr);
break;
case 'h':
case 'H':
case '?':
ShowHelpMessage();
break;
case 'i':
case 'I':
DisplaySystemINFO();
break;
case 'l':
case 'L':
switch(*stringPtr)
{
case 's':
case 'S':
if(!SerialDownload())
break;
if (dwLaunchAddr == (EBOOT_IMAGE_START + 0x1000))
return 2;
else
EdbgOutputDebugString("Not Bootloader Image.\r\n");
break;
case 'e':
case 'E':
return 1;
break;
}
break;
case 'm':
case 'M':
{
stringPtr = ParseString(stringPtr, addrString);
if (addrString[0] == (TCHAR) NULL)
{
break;
}
gSize = sizeof(DWORD);
if (!Asc2Int(addrString, &value))
{
switch (addrString[0])
{
case 'b':
case 'B':
gSize = sizeof(BYTE);
break;
case 'w':
case 'W':
gSize = sizeof(WORD);
break;
case 'd':
case 'D':
gSize = sizeof(DWORD);
break;
default:
break;
}
stringPtr = ParseString(stringPtr, addrString);
}
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &modifyAddr))
{
break;
}
EdbgOutputDebugString("StartAddr = 0x%x,size = %d!\r\n", modifyAddr, gSize);
nCacheAddr = ( modifyAddr | CACHED_TO_UNCACHED_OFFSET );
while(TRUE)
{
BootDisplayMemory(modifyAddr, gSize);
EdbgOutputDebugString("\t");
GetInputBuffer(stringData);
stringPtr = stringData;
if (*stringPtr == (TCHAR) '.')
break;
if (*stringPtr == (TCHAR) NULL)
modifyAddr += gSize;
else
{
stringPtr = ParseString(stringPtr, addrString);
if( Asc2Int(addrString, &dataValue))
{
BootSetMemory(modifyAddr, dataValue, 1, gSize);
modifyAddr += gSize;
}
}
}
}
break;
case 'f':
case 'F':
{
stringPtr = ParseString(stringPtr, addrString);
if (addrString[0] == (TCHAR) NULL)
{
break;
}
//EdbgOutputDebugString("First = %c!\r\n", addrString);
gSize = sizeof(DWORD);
if (!Asc2Int(addrString, &value))
{
switch (addrString[0])
{
case 'b':
case 'B':
gSize = sizeof(BYTE);
break;
case 'w':
case 'W':
gSize = sizeof(WORD);
break;
case 'd':
case 'D':
gSize = sizeof(DWORD);
break;
default:
break;
}
stringPtr = ParseString(stringPtr, addrString);
}
//EdbgOutputDebugString("Second = %c!\r\n", addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &modifyAddr))
{
EdbgOutputDebugString("Error command format.\r\n");
break;
}
//EdbgOutputDebugString("Mod Addr = 0x%x!\r\n", modifyAddr);
stringPtr = ParseString(stringPtr, addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &endAddr))
{
EdbgOutputDebugString("Error command format.\r\n");
break;
}
stringPtr = ParseString(stringPtr, addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &dataValue))
{
EdbgOutputDebugString("Error command format.\r\n");
break;
}
length = endAddr - modifyAddr + 1;
switch (gSize)
{
case sizeof(BYTE):
break;
case sizeof(WORD):
if( length >= sizeof(WORD))
length = length/2;
else
length = 1;
break;
case sizeof(DWORD):
if (length >= sizeof(DWORD))
length = length/4;
else
length = 1;
break;
}
EdbgOutputDebugString("StartAddr = 0x%x, Value = 0x%x, length = 0x%x size = %d!\r\n", modifyAddr, dataValue, length, gSize);
BootSetMemory(modifyAddr, dataValue, length, gSize);
}
break;
case 'p':
case 'P':
{
stringPtr = ParseString(stringPtr, addrString);
if (addrString[0] == (TCHAR) NULL)
{
break;
}
//EdbgOutputDebugString("First = %c!\r\n", addrString);
gSize = sizeof(DWORD);
if (!Asc2Int(addrString, &value))
{
switch (addrString[0])
{
case 'b':
case 'B':
gSize = sizeof(BYTE);
break;
case 'w':
case 'W':
gSize = sizeof(WORD);
break;
case 'd':
case 'D':
gSize = sizeof(DWORD);
break;
default:
break;
}
stringPtr = ParseString(stringPtr, addrString);
}
//EdbgOutputDebugString("Second = %c!\r\n", addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &modifyAddr))
{
EdbgOutputDebugString("Error command format.\r\n");
break;
}
//EdbgOutputDebugString("Mod Addr = 0x%x!\r\n", modifyAddr);
stringPtr = ParseString(stringPtr, addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &endAddr))
{
EdbgOutputDebugString("Error command format.\r\n");
break;
}
stringPtr = ParseString(stringPtr, addrString);
if ((addrString[0] == (TCHAR) NULL) || !Asc2Int(addrString, &dataValue))
{
EdbgOutputDebugString("Error command format.\r\n");
break;
}
length = endAddr - modifyAddr + 1;
switch (gSize)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -