📄 sredown.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 + -