/*************************************************************************** * https://github.com/dhylands/projects/blob/master/lpc/lpc-vector-checksum/lpc-vector-checksum.c * * Copyright (c) 2012 by Dave Hylands * All Rights Reserved * * Permission is granted to any individual or institution to use, copy, * modify, or redistribute this file so long as it is not sold for profit, * and that this copyright notice is retained. * *************************************************************************** * * This program calculates the vector checksum used in LPC17xx binary * images. * * Usage: lpc-vector-checksum file * ***************************************************************************/ #include #include #include #include #include /***************************************************************************/ /** * update_vector_checksum * * The algorithim is to write the checksum such that the checksum of the * first 8 words is equal to zero. * * The LPC1768 uses little-endian, and this particular routine assumes * that it's running on a little-endian architecture. */ static int update_vector_checksum( const char *filename ) { uint32_t sum; uint32_t header[8]; FILE *fs; int i; if (( fs = fopen( filename, "r+b" )) == NULL ) { fprintf( stderr, "Unable to open '%s' for reading/writing (%d): %s\n", filename, errno, strerror( errno )); return 0; } if ( fread( header, sizeof( header ), 1, fs ) != 1 ) { fprintf( stderr, "Failed to read header from '%s' (perhaps the file is too small?)", filename ); fclose( fs ); return 0; } sum = 0; for ( i = 0; i < 7; i++ ) { sum += header[i]; } printf( "sum = 0x%08x, value to write = 0x%08x\n", sum, -sum ); /* write back the checksum to location 7 * http://sigalrm.blogspot.jp/2011/10/cortex-m3-exception-vector-checksum.html */ fseek(fs, 0x1c, SEEK_SET); sum = -sum; fwrite(&sum, 4, 1, fs); fclose( fs ); return 1; } /***************************************************************************/ /** * main */ int main( int argc, char **argv ) { int arg; if ( argc < 2) { fprintf( stderr, "Usage: lpc-vector-checksum file ...\n" ); exit( 1 ); } for ( arg = 1; arg < argc; arg++ ) { update_vector_checksum( argv[ arg ]); } exit( 0 ); return 0; }