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

📄 monitor.c

📁 这个是嵌入式arm系列的一个bootloader程序。对需要编写bootloader的很有参考价值
💻 C
📖 第 1 页 / 共 2 页
字号:
/*



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 + -