lpcchksum.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * calculate+inject LPC1700 vector checksum
  3. */
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <stdint.h>
  7. uint32_t getu32( uint8_t *buffer )
  8. {
  9. return buffer[0] + ( buffer[1] << 8 ) + ( buffer[2] << 16 ) + ( buffer[3] << 24 );
  10. }
  11. void putu32( uint8_t *buffer, uint32_t data )
  12. {
  13. buffer[0] = ( uint8_t )( data & 0xff );
  14. buffer[1] = ( uint8_t )( ( data >> 8 ) & 0xff );
  15. buffer[2] = ( uint8_t )( ( data >> 16 ) & 0xff );
  16. buffer[3] = ( uint8_t )( ( data >> 24 ) & 0xff );
  17. }
  18. int main( int argc, char **argv )
  19. {
  20. FILE *bin;
  21. uint32_t data;
  22. size_t len;
  23. int count;
  24. uint8_t *buffer;
  25. if ( argc < 2 )
  26. {
  27. fprintf( stderr, "Usage: %s <binfile>\nThe original file will be modified!\n", argv[0] );
  28. return 1;
  29. }
  30. if ( ( bin = fopen( argv[1], "rb" ) ) == NULL )
  31. {
  32. perror( "could not open input file" );
  33. return 1;
  34. }
  35. fseek( bin, 0, SEEK_END );
  36. len = ftell( bin );
  37. fseek( bin, 0, SEEK_SET );
  38. if ( ( buffer = malloc( len ) ) == NULL )
  39. {
  40. perror( "could not reserve memory" );
  41. fclose( bin );
  42. return 1;
  43. }
  44. fread( buffer, len, 1, bin );
  45. fclose( bin );
  46. data = 0;
  47. for ( count = 0; count < 7; count++ )
  48. {
  49. data += getu32( buffer + 4 * count );
  50. }
  51. printf( "data=%x chksum=%x\n", data, ~data + 1 );
  52. putu32( buffer + 28, ~data + 1 );
  53. if ( ( bin = fopen( argv[1], "wb" ) ) == NULL )
  54. {
  55. perror( "could not open output file" );
  56. return 1;
  57. }
  58. fwrite( buffer, len, 1, bin );
  59. fclose( bin );
  60. printf( "done\n" );
  61. free( buffer );
  62. return 0;
  63. }