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

📄 checksumgen.cpp

📁 56f8300E系列dsp的BOOTloader
💻 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 + -