forked from mirrors/qmk_userspace
		
	Add checksum tool for NXP LPC
This commit is contained in:
		
					parent
					
						
							
								b4a91ecf4e
							
						
					
				
			
			
				commit
				
					
						a9f5f201ad
					
				
			
		
					 2 changed files with 100 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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
									
								
								tool/mbed/lpc-vector-checksum.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								tool/mbed/lpc-vector-checksum.c
									
										
									
									
									
										Normal 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue