Beispiel #1
0
int LoadIHexFile (char *FileName, u_char** FileBuffer)
{
  int rval = 0;
  int okline_counter = 0;
  u_char *endp;
  u_char *dp;
  int img_size = 0;
  char riga[MAXLINE+1];
  long laddr = 0;
  long raddr = 0;
  FILE *fh;
  USHORT bcount;
  USHORT addr;
  USHORT data;
  USHORT rectype;
  
  *FileBuffer = malloc(sizeof(u_char)*576) ; // 64 Bytes as reserve
  if (*FileBuffer==NULL) {
    printf ("Out of mem in LoadIHex\n") ;
    exit (1) ;
  }; 
  
  endp = *FileBuffer + 512;
  
  dp = *FileBuffer;
  
  if ( (fh = fopen(FileName, "r")) == NULL )
    return FILENOTFOUND;
  
  riga[MAXLINE] = '\0';
  while ( fgets(riga, MAXLINE, fh) ) {
    char *s;
    int k;
    
    if ( (s = strchr(riga, ':')) == NULL )
      continue;
    else
      s++;
    
    //Byte Count
    if ( ScanHex(&s, 2, &bcount) != OK ) {
      rval = BADFILETYPE;
      break;
    }
    u_char checksum = (u_char)bcount;
    
    //Address
    if ( ScanHex(&s, 4, &addr) != OK ) {
      rval = BADFILETYPE;
      break;
    }
    checksum += (u_char)(addr >> 8);
    checksum += (u_char)addr;
    
    //affect only low 16 bits of address
    raddr = laddr ;
    laddr &= 0xFFFF0000;
    laddr |= addr;

    
    //Record Type
    if ( ScanHex(&s, 2, &rectype) != OK ) {
      rval = BADFILETYPE;
      break;
    }
    checksum += (u_char)rectype;
    
    //Data Byte
    if (rectype == DATA_RECORD) {
      //buffer overflow
    // laddr anpassen, wenn STM32, sonst wird an die falsche stelle geladen (-0x8004000)
      raddr = laddr ;
      if (raddr>=0x8004000) raddr-=0x8004000 ;
      
      if (dp+raddr+bcount >= endp) {
	*FileBuffer= realloc(*FileBuffer, raddr+bcount+64) ; // 64 bytes as reserve
	dp = *FileBuffer ;
	if (*FileBuffer==NULL) {
	  printf ("Out of mem in LoadIHex\n") ;
	  exit (1) ;
	}; 
	endp = dp+raddr+bcount ;
      }
      
      char ok = TRUE;
      u_char *p;
      for (k = 0, p = dp+raddr; k < bcount && ok; k++) {
	if ( ScanHex(&s, 2, &data) != OK )
	  ok = FALSE;
	
	checksum += (u_char)data;
	*p++ = (u_char)data;
      }
      if (!ok) {	//Irgendwas war defekt
	
	rval = BADFILETYPE;
	break;
      }
      img_size = raddr + bcount;
    }
    else if (rectype == SEG_ADDR_RECORD) {
      if (bcount != 2) {
	rval = BADFILETYPE;
	break;
      } else {
	//Address
	USHORT addr;
	if ( ScanHex(&s, 4, &addr) != OK ) {
	  rval = BADFILETYPE;
	  break;
	}
	checksum += (u_char)(addr >> 8);
	checksum += (u_char)addr;
	
	laddr = (long)addr << 4;
      }
    } else if (rectype == LIN_ADDR_RECORD) {
      if (bcount != 2) {
	rval = BADFILETYPE;
	break;
      }	else {
	//Address
	USHORT addr;
	if ( ScanHex(&s, 4, &addr) != OK ) {
	  rval = BADFILETYPE;
	  break;
	}
	checksum += (u_char)(addr >> 8);
	checksum += (u_char)addr;
	
	laddr = (long)addr << 16;
      }
    } else {	// Unknown record type: discard data bytes (but check for validity)
Beispiel #2
0
int LoadIHexFile (char *FileName, long relocation_offset)
{
	int rval = 0;
	int okline_counter = 0;
	u_char *endp;
	u_char *dp;
	int img_size = 0;
	char riga[MAXLINE+1];
	long laddr = 0;
	FILE *fh;
	USHORT bcount;
	USHORT addr;
	USHORT data;
	USHORT rectype;

	endp = FileBuffer + BUFFERSIZE;
	dp = FileBuffer;

	//Relocation check
	if (dp + relocation_offset > endp)
		return BADPARAM;
	else
		dp += relocation_offset;

	if ( (fh = fopen(FileName, "r")) == NULL )
		return FILENOTFOUND;

	riga[MAXLINE] = '\0';
	while ( fgets(riga, MAXLINE, fh) )
	{
		char *s;
		int k;

		if ( (s = strchr(riga, ':')) == NULL )
			continue;
		else
			s++;

		//Byte Count
		if ( ScanHex(&s, 2, &bcount) != OK )
		{
			rval = BADFILETYPE;
			break;
		}
		u_char checksum = (u_char)bcount;

		//Address
		if ( ScanHex(&s, 4, &addr) != OK )
		{
			rval = BADFILETYPE;
			break;
		}
		checksum += (u_char)(addr >> 8);
		checksum += (u_char)addr;

		//affect only low 16 bits of address
		laddr &= 0xFFFF0000;
		laddr |= addr;

		//Record Type
		if ( ScanHex(&s, 2, &rectype) != OK )
		{
			rval = BADFILETYPE;
			break;
		}
		checksum += (u_char)rectype;

		//Data Byte
		if (rectype == DATA_RECORD)
		{
			//buffer overflow
			if (dp+laddr+bcount > endp)
			{
				rval = BUFFEROVERFLOW;
				break;
			}

			char ok = TRUE;
			u_char *p;
			for (k = 0, p = dp+laddr; k < bcount && ok; k++)
			{
				if ( ScanHex(&s, 2, &data) != OK )
					ok = FALSE;

				checksum += (u_char)data;
				*p++ = (u_char)data;
			}
			if (!ok)	//Irgendwas war defekt
			{
				rval = BADFILETYPE;
				break;
			}
			img_size = laddr + bcount;
		}
		else if (rectype == SEG_ADDR_RECORD)
		{
			if (bcount != 2)
			{
				rval = BADFILETYPE;
				break;
			}
			else
			{
				//Address
				USHORT addr;
				if ( ScanHex(&s, 4, &addr) != OK )
				{
					rval = BADFILETYPE;
					break;
				}
				checksum += (u_char)(addr >> 8);
				checksum += (u_char)addr;

				laddr = (long)addr << 4;
			}
		}
		else if (rectype == LIN_ADDR_RECORD)
		{
			if (bcount != 2)
			{
				rval = BADFILETYPE;
				break;
			}
			else
			{
				//Address
				USHORT addr;
				if ( ScanHex(&s, 4, &addr) != OK )
				{
					rval = BADFILETYPE;
					break;
				}
				checksum += (u_char)(addr >> 8);
				checksum += (u_char)addr;

				laddr = (long)addr << 16;
			}
		}
		else	// Unknown record type: discard data bytes (but check for validity)
		{