]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Add checksum tool for NXP LPC
authortmk <nobody@nowhere>
Fri, 20 Jun 2014 06:30:10 +0000 (15:30 +0900)
committertmk <nobody@nowhere>
Wed, 30 Jul 2014 05:07:43 +0000 (14:07 +0900)
tool/mbed/gcc.mk
tool/mbed/lpc-vector-checksum.c [new file with mode: 0644]

index 0fc41fe2757b3d5ac353f9830e5aa347c8d477a8..032f7c6cae048239298a8f8aa891befa2ef01c0f 100644 (file)
@@ -7,7 +7,7 @@ LD      = $(GCC_BIN)arm-none-eabi-gcc
 OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
 OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
 SIZE   = $(GCC_BIN)arm-none-eabi-size
-CHKSUM  = ~/Dropbox/MBED/tool/lpc-vector-checksum
+CHKSUM  = $(TMK_DIR)/tool/mbed/lpc-vector-checksum
 
 CPU = -mcpu=cortex-m0 -mthumb
 
diff --git a/tool/mbed/lpc-vector-checksum.c b/tool/mbed/lpc-vector-checksum.c
new file mode 100644 (file)
index 0000000..316a125
--- /dev/null
@@ -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;
+}
+