📄 checksumgen.cpp
字号:
#include "CheckSumGen.h"
#define BL_KEYVAL_CHECK if ( keystr[2] != ':' ) { res = FALSE; break; }
unsigned long Crc32Table[256];
UInt8 bootFlashMem [BOOT_FLASH_MEM_LENGTH*2];
UWord32 SRecordChecksum;
static char file_name[]={"bootchecksum.h"};
static char sRecordFileName[SRECORD_MAX_LINE_LENGHT ]; /* File names */
static char logFileName[SRECORD_MAX_LINE_LENGHT ];
static char _help[] =
"\nUsage: CheckSumGen [-options] \n\
Options:\n\
-s:<S-Record file> - the S-Record file name\n\
-o:<output file> - the directory for output file\n\
";
static void help( void ) { printf( _help ); }
int main( int argc, char *argv[], char *envp[] )
{
char srecType[SRECORD_MAX_LINE_LENGHT];
UWord32 dataAddress, bootFlashData;
UInt8 DataBuffer[8];
FILE * fis, *logOut;
int len, i, j;
int res = 0;
char buf[2 * SRECORD_MAX_LINE_LENGHT];
if( argc <= 1 )
{
help();
return(0);
}
for (i = 1; i < argc; i++)
{
strcpy( buf, argv[i] );
res = parse_opt( buf ); /* Parse command line options */
};
if (*sRecordFileName != '\0') /* srecord file is required */
{
/* config file open for reading */
fis = fopen( sRecordFileName, "rb" );
if ( fis == NULL )
{
fprintf( stderr, "*** Can not open sRecord file %s\n",
sRecordFileName);
help();
return(0);
};
}
else
{
fprintf( stderr, "\n*** sRecord file required\n\n" );
help();
return(0);
};
if (*logFileName != '\0')
{
/* log file open - rewrite */
strcat( logFileName, "\\" );
strcat(logFileName, file_name);
logOut = fopen( logFileName , "wt" );
if ( logOut == NULL )
{
fprintf( stderr, "*** Can not open output file %s\n",
logFileName );
help();
return(0);
};
}
else
{
fprintf( stderr, "\n*** the directory for output file required\n\n" );
help();
return(0);
};
memset (bootFlashMem, 0xFF, BOOT_FLASH_MEM_LENGTH*2);
if (fis) {
while(fgets(&srecType[0], SRECORD_MAX_LINE_LENGHT, fis))
{
// fprintf(logOut, "\n");
len = strlen(srecType);
if (( srecType[0] | 0x20 ) == 's' )
{
if ( srecType[1] == '3' )
{
for (i = 0; i < 8; i++)
{
DataBuffer[i] = srecType[4 + i];
}
/*get the address, process if it is the boot flash*/
dataAddress = bootAsciiToHex((unsigned char *)&DataBuffer[0], 8);
/*if it is the boot flash*/
j = (dataAddress - START_BOOT_FLASH_ADDRESS)*2;
if (dataAddress >= START_BOOT_FLASH_ADDRESS && dataAddress <= END_BOOT_FALSH_ADDRESS)
{
// fprintf(logOut, " %x", dataAddress);
/*read data from S-Record and write into the array bootFlashMem*/
for (i = 0; i < len - 17; i = i + 2)
{
bootFlashData = bootAsciiToHex((unsigned char *)&srecType[12 + i], 2);
bootFlashMem[j] = (UInt8) bootFlashData;
// fprintf(logOut, "%02X", bootFlashMem[j]);
j++;
}
}
}
}
}
fclose(fis);
// for (i = 0; i < BOOT_FLASH_MEM_LENGTH*2; i = i+2)
// fprintf(logOut, "%02x%02x\n", bootFlashMem[i], bootFlashMem[i+1]);
/*exlude 3 word - version, and check sum*/
memcpy((void*)&bootFlashMem[8], (void*)&bootFlashMem[14], BOOT_FLASH_MEM_LENGTH*2 - 14);
// fprintf(logOut, "New Array *********************\n\n");
// for (i = 0; i < BOOT_FLASH_MEM_LENGTH*2; i = i+2)
// fprintf(logOut, "%02x%02x\n", bootFlashMem[i], bootFlashMem[i+1]);
// i = fwrite(bootFlashMem, sizeof(char),BOOT_FLASH_MEM_LENGTH*2 - 6, logOut);
InitCrc();
SRecordChecksum = Crc32(bootFlashMem, BOOT_FLASH_MEM_LENGTH*2 - 6, 0);
fprintf(logOut, ";The check sum is 0x%08X\n", SRecordChecksum);
fprintf(logOut, "BLchecksum1 equ $%04x\n", SRecordChecksum & 0xFFFF);
fprintf(logOut, "BLchecksum2 equ $%04x\n", SRecordChecksum >> 16);
}
fclose(logOut);
return 0;
}
UWord32 bootAsciiToHex( unsigned char * strbuf, char length )
{
unsigned long value = 0L;
unsigned char var;
while (length != 0)
{
length--;
var = *strbuf;
if( var > 0x2F && var < 0x3A )
var -= 0x30; /* ASCII characters '0', '1', ... , '9' */
else
{
var |= 0x20; /* ASCII characters 'A', 'B', ... , 'F' to 'a', 'b', ... , 'f' */
if( var > 0x60 && var < 0x67 )
var -= 0x57; /* ASCII characters 'a', 'b', ... , 'f' */
else
{
printf ("Error\n");
}
}
value |= (UWord32)var << (4 * length);
strbuf++;
}
return value;
}
void InitCrc(void)
{
static bool crcDone=false;
unsigned long i,j,crc;
if(crcDone)
return;
for(i=0;i<256;i++)
{
crc=i;
for(j=0;j<8;j++)
crc=(crc>>1)^((crc & 1) ? 0xEDB88320UL : 0);
Crc32Table[(int)i]=crc & 0xFFFFFFFFUL;
}
crcDone=true;
}
unsigned long Crc32(const unsigned char *buff, unsigned length, unsigned long crc)
{
const unsigned char *p = buff;
crc = ~crc;
while (length-- > 0)
crc = Crc32Table[(crc ^ *p++) & 0xFF] ^ ((crc >> 8) & 0xFFFFFFL);
return ~crc;
}
int parse_opt (char* keystr)
{
int res;
res = 1;
if ( keystr[0] == '-' )
{
switch ( tolower(keystr[1]) )
{
case 's':
{
BL_KEYVAL_CHECK;
strcpy(sRecordFileName, &keystr[3]);
break;
};
case 'o':
{
BL_KEYVAL_CHECK;
strcpy(logFileName, &keystr[3]);
break;
};
default:
{
fprintf( stderr, "Invalid switch: %s\n\n", keystr);
return 0;
};
}
}
else
{
res = 0;
};
if ( res == 1 )
{
return(1);
}
else
{
fprintf( stderr, "\n*** Invalid switch: %s\n", keystr);
return 0;
};
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -