Code to load a LPC1114 over tx/rx. I have only tested with a 1114 chip but it should work with other LPC uControllers
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
Diff: main.cpp
- Revision:
- 12:5a33b5d39792
- Parent:
- 11:8dfc3217d1ca
- Child:
- 13:60995bf8b2c7
--- a/main.cpp Tue Aug 27 03:09:07 2013 +0000 +++ b/main.cpp Tue Aug 27 05:47:02 2013 +0000 @@ -2,13 +2,8 @@ * Sample of ISP operation for NXP MCUs * * @author Akifumi (Tedd) OKANO, NXP Semiconductors - * @version 1.0 + * @version 0.5 * @date Aug-2013 - * - * ISP - * - * - * */ #include "mbed.h" @@ -20,30 +15,17 @@ Serial target ( p28, p27 ); LocalFileSystem local( "local" ); +#define ENTER_TO_ISP_MODE 0 +#define NO_ISP_MODE 1 +#define STR_BUFF_SIZE 64 + #define SOURCE_FILE "/local/bin" #define BAUD_RATE 115200 //#define BAUD_RATE 57600 //#define BAUD_RATE 9600 -#define SECTOR_SIZE 4096 -#define RAM_START_ADDRESS 0x10000000 - -//#define RAM_WRITE_OFFSET 0x130 -#define RAM_WRITE_OFFSET 0x200 -#define RAM_WRITE_START (RAM_START_ADDRESS + RAM_WRITE_OFFSET) -#define BYTES_PER_LINE 45 -#define STR_BUFF_SIZE 64 - -#pragma diag_suppress 1293 // surpressing a warning message of "assignment in condition" ;) - -char uue_table[ 64 ]; int error_state = 0; -enum { - ENTER_TO_ISP_MODE, - NO_ISP_MODE -}; - int file_size( FILE *fp ); void reset_target( int isp_pin_state ); int try_and_check( char *command, char *expected_return_str, int mode ); @@ -52,15 +34,19 @@ void print_result( int r ); char read_byte( void ); void erase_sectors( int last_sector ); -int write_binary_data( FILE *fp, int ram_size ); +int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ); +int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start ); void initialize_uue_table( void ); long bin2uue( char *bin, char *str, int size ); -int get_flash_writing_size( int ram_size ); +int get_flash_writing_size( int ram_size, unsigned int ram_start ); void add_isp_checksum( char *b ); void send_RAM_transfer_checksum( int checksum ); void put_string( char *s ); +void put_binary( char *b, int size ); void get_string( char *s ); +#pragma diag_suppress 1293 // surpressing a warning message of "assignment in condition" ;) + int main() { @@ -75,19 +61,6 @@ target.baud( BAUD_RATE ); - printf( " opening file: \"%s\"\r\n", SOURCE_FILE ); - - if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) { - error( "couldn't open source file" ); - return ( 1 ); - } - - data_size = file_size( fp ); - last_sector = data_size / SECTOR_SIZE; - - printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 ); - printf( " resetting target\r\n" ); - reset_target( ENTER_TO_ISP_MODE ); try_and_check( "?", "Synchronized", 0 ); @@ -114,9 +87,26 @@ printf( " RAM size = %10d bytes\r\n", tpp->ram_size ); printf( " flash size = %10d bytes\r\n", tpp->flash_size ); + printf( " opening file: \"%s\"\r\n", SOURCE_FILE ); + + if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) { + error( "couldn't open source file" ); + return ( 1 ); + } + + data_size = file_size( fp ); + last_sector = data_size / tpp->sector_size; + + printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 ); + printf( " resetting target\r\n" ); + erase_sectors( last_sector ); - write_binary_data( fp, tpp->ram_size ); - + + if ( tpp->write_type == BINARY ) + write_binary_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address ); + else // UUENCODE + write_uuencoded_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address ); + fclose( fp ); printf( "\r\n %s\r\n\r\n", @@ -242,12 +232,13 @@ try_and_check( command_str, "0", 0 ); } +#define BYTES_PER_LINE 45 +char uue_table[ 64 ]; -int write_binary_data( FILE *fp, int ram_size ) +int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start ) { char command_str[ STR_BUFF_SIZE ]; long checksum = 0; - int transfer_count = 0; int total_size = 0; int size; @@ -255,17 +246,16 @@ int lines_per_transfer; int transfer_size; + char *b; + initialize_uue_table(); - flash_writing_size = get_flash_writing_size( ram_size ); - //lines_per_transfer = (((flash_writing_size / BYTES_PER_LINE) + 3) & ~0x3); + flash_writing_size = get_flash_writing_size( ram_size, ram_start ); lines_per_transfer = ((flash_writing_size / BYTES_PER_LINE) + 1); transfer_size = (((flash_writing_size + 11) / 12) * 12); // char b[ transfer_size ]; // this can be done in mbed-compiler. but I should do it in common way - char *b; - if ( NULL == (b = (char *)malloc( transfer_size * sizeof( char ) )) ) error( "malloc error happened\r\n" ); @@ -280,15 +270,14 @@ add_isp_checksum( b ); } - sprintf( command_str, "W %ld %ld\r\n", RAM_WRITE_START, transfer_size ); + sprintf( command_str, "W %ld %ld\r\n", ram_start, transfer_size ); try_and_check( command_str, "0", 0 ); for ( int i = 0; i < lines_per_transfer; i++ ) { - + checksum += bin2uue( b + (i * BYTES_PER_LINE), command_str, i == (lines_per_transfer - 1) ? (transfer_size % BYTES_PER_LINE) : BYTES_PER_LINE ); - printf( " data -- %02d %s\r", i, command_str ); - printf( " (%d)\r\n", i == (lines_per_transfer - 1) ? (transfer_size % BYTES_PER_LINE) : BYTES_PER_LINE ); +// printf( " data -- %02d %s\r", i, command_str ); put_string( command_str ); @@ -301,10 +290,10 @@ send_RAM_transfer_checksum( checksum ); checksum = 0; - sprintf( command_str, "P %d %d\r\n", total_size / SECTOR_SIZE, total_size / SECTOR_SIZE ); + sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size ); try_and_check( command_str, "0", 0 ); - sprintf( command_str, "C %d %d %d\r\n", total_size, RAM_WRITE_START, flash_writing_size ); + sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size ); try_and_check( command_str, "0", 0 ); total_size += size; @@ -313,10 +302,53 @@ try_and_check( "G 0 T\r\n", "0", 0 ); free( b ); - return ( transfer_count ); + return ( total_size ); } +int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start ) +{ + char command_str[ STR_BUFF_SIZE ]; + int total_size = 0; + int size; + int flash_writing_size; + char *b; + + flash_writing_size = 256; + + if ( NULL == (b = (char *)malloc( flash_writing_size * sizeof( char ) )) ) + error( "malloc error happened\r\n" ); + + while ( size = fread( b, sizeof( char ), flash_writing_size, fp ) ) { + + if ( !total_size ) { + // overwriting 4 bytes data for address=0x1C + // there is a slot for checksum that is checked in (target's) boot process + add_isp_checksum( b ); + } + + sprintf( command_str, "W %ld %ld\r\n", ram_start, flash_writing_size ); + try_and_check( command_str, "0", 0 ); + + put_binary( b, flash_writing_size ); + put_string( "\r\n" ); + + sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size ); + try_and_check( command_str, "0", 0 ); + + sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size ); + try_and_check( command_str, "0", 0 ); + + total_size += size; + printf( " total %d bytes transferred\r", total_size ); + + } + + free( b ); + + return ( total_size ); +} + void initialize_uue_table( void ) { int i; @@ -352,7 +384,7 @@ } -int get_flash_writing_size( int ram_size ) +int get_flash_writing_size( int ram_size, unsigned int ram_start ) { int flash_writing_size[] = { 4096, @@ -363,7 +395,7 @@ int available_size; int i; - available_size = ram_size - RAM_WRITE_OFFSET; + available_size = ram_size - (ram_start & 0xFFFF); for ( i = 0; i < sizeof( flash_writing_size ) / sizeof( int ); i++ ) { if ( flash_writing_size[ i ] < available_size ) @@ -417,6 +449,13 @@ } +void put_binary( char *b, int size ) +{ + for ( int i = 0; i < size; i++ ) + target.putc( *b++ ); +} + + Timeout timeout; int timeout_flag = 0; @@ -455,4 +494,3 @@ *s = '\0'; } -