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

📄 sredown.c

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



Module Name:

    SreDown.c

Abstract:
	Implements routines to download Sre File form Sreial Port.

*/

#include <windows.h>
#include <halether.h>
#include <nkintr.h> 
#include <pehdr.h>
#include <romldr.h>

#include "SreDown.h"

extern DWORD dwLaunchAddr;

BOOL
SerialDownload(void)
{
	INT	HeaderType = 0;
	BYTE	DataChecksum ;
 	BYTE 	DataCounter;
 	BYTE	HeaderByte ;
 	ULONG	ImageAddress;
 	BYTE	StartHeader[] = {0x00,0x00,0xFC};
 	BYTE	CalBuffer[] = {0,0,0,0};
 	BYTE	Buffer;
 	int i;
	
	EdbgOutputDebugString("please send ! ('.' & CR stop load)\r\n");

	while(TRUE)
	{
		HeaderType = GetSreHeader();
		DataChecksum = 0;
		DataCounter = 0;
		ImageAddress = 0;
		switch(HeaderType)
		{
			case 3:	/* End of the File */
				if(!GetDataByte(&DataCounter,&DataChecksum))
					return FALSE;

				for (i=4;i >0;)
					{
						i--;
						if(!GetDataByte(&Buffer,&DataChecksum))
							return FALSE;		
						CalBuffer[i] = Buffer;
					}
						
				dwLaunchAddr = *((DWORD *) CalBuffer);

				if(!GetDataByte(&Buffer,&DataChecksum))
					return FALSE;		
					
				if(DataChecksum != 0xFF)
				{
					EdbgOutputDebugString(" END Record Checksum Fail.\r\n");
					return FALSE;
				}	
				
				
				return TRUE;			
				break;						

			case 2: /* Start of the File */
				if(!GetDataByte(&DataCounter,&DataChecksum))
					return FALSE;
				i = DataCounter;
				for (i=0;i < DataCounter ; i++)
					{
						if(!GetDataByte(&HeaderByte,&DataChecksum))
							return FALSE;	
						//EdbgOutputDebugString("%B=%B", HeaderByte, StartHeader[i]);	
						if(HeaderByte != StartHeader[i] )
						{
							EdbgOutputDebugString("Not SRE file format.\r\n");
							return FALSE;
						}
					}
					
				//EdbgOutputDebugString("/r/n C=%B", DataChecksum);	
						
				if(DataChecksum != 0xFF)
				{
					EdbgOutputDebugString("START Record Checksum Fail.\r\n");
					return FALSE;
				}				
				break;
			case 1: /* Data */
				if(!GetDataByte(&DataCounter,&DataChecksum))
					return FALSE;

				for (i=4;i >0;)
					{
						i--;
						if(!GetDataByte(&Buffer,&DataChecksum))
							return FALSE;		
						CalBuffer[i] = Buffer;
					}
						
				ImageAddress = *((ULONG *) CalBuffer);
				ImageAddress += DBUFFER_OFFSET;
				
				i = DataCounter - 4;
					
				//EdbgOutputDebugString( "'%X , %B'",ImageAddress, i);

				for (;i >1;i--)
					{
						if(!GetDataByte(&Buffer,&DataChecksum))
							return FALSE;		
					*((BYTE *)ImageAddress) = Buffer;
					ImageAddress = ImageAddress + 1;
					}
				if(!GetDataByte(&Buffer,&DataChecksum))
					return FALSE;		
					
				if(DataChecksum != 0xFF)
				{
					EdbgOutputDebugString( "DATA Record Checksum Fail.\r\n");
					return FALSE;
				}					
				break;			
				default:
					EdbgOutputDebugString( "Not SRE file format.\r\n");
					return FALSE;
					break;
		}
	}
	
	while(1);	
}


int 
GetSreHeader(void)
{
	int	data;
	
	while (TRUE)
	{
		data = Sgetc();
		if(data == 'S')
		{
			data = Sgetc();
			EdbgOutputDebugString( ".");
			switch(data)
			{
				case '0':
					return 2;
					break;
				case '3':
					return 1;
					break;
				case '7':
					return 3;
					break;
				default:
					return 0;
					break;
			}
		}else if(data == '.') return 0;		
	}
}


int
Sgetc(void)
{
	int  sdata;
	
	sdata = OEM_DEBUG_READ_NODATA;
	
	while(sdata == OEM_DEBUG_READ_NODATA)
	{
		sdata = OEMReadDebugByte();
	}	
	
	return(sdata);
}


BOOL
GetDataByte(PBYTE DataBuffer, PBYTE RecordChecksum)
{
	int data;
	BYTE hexData;
	
	hexData = 0;
	
// High Byte	
	data = Sgetc();
	if ((data >= '0' && data <= '9') ||
		(((data >= 'a' && data <= 'f') ||
		(data >= 'A' && data <= 'F'))))
	{
		hexData += data & 0x0F;
		
		if (data > '9')
		{
			hexData += 9;
		}
		hexData *= 16;
	}else return FALSE;

// Low Byte
	data = Sgetc();
	if ((data >= '0' && data <= '9') ||
		(((data >= 'a' && data <= 'f') ||
		(data >= 'A' && data <= 'F'))))
	{
		hexData += data & 0x0F;
		
		if (data > '9')
		{
			hexData += 9;
		}
	}else return FALSE;
	
	*DataBuffer = hexData;
	*RecordChecksum += hexData;
	
	//EdbgOutputDebugString( "%B", hexData );
	
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -