|
@@ -0,0 +1,99 @@
|
|
|
|
+/***************************************************************************
|
|
|
|
+* 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 <stdio.h>
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+#include <stdint.h>
|
|
|
|
+#include <errno.h>
|
|
|
|
+#include <string.h>
|
|
|
|
+
|
|
|
|
+/***************************************************************************/
|
|
|
|
+/**
|
|
|
|
+* 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;
|
|
|
|
+}
|
|
|
|
+
|