Browse Source

Add checksum tool for NXP LPC

tags/v1.9
tmk 10 years ago
parent
commit
a9f5f201ad
2 changed files with 100 additions and 1 deletions
  1. 1
    1
      tool/mbed/gcc.mk
  2. 99
    0
      tool/mbed/lpc-vector-checksum.c

+ 1
- 1
tool/mbed/gcc.mk View 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


+ 99
- 0
tool/mbed/lpc-vector-checksum.c View File

@@ -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;
}


Loading…
Cancel
Save