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:
- 6:0ae6fe8c8512
- Parent:
- 5:ff30f5b58617
- Child:
- 7:815366f003ee
--- a/main.cpp Sun Aug 25 01:49:08 2013 +0000 +++ b/main.cpp Sun Aug 25 02:54:53 2013 +0000 @@ -13,14 +13,39 @@ #define BAUD_RATE 115200 #define STR_BUFF_SIZE 64 -//#define RAM_START_ADDRESS 0x10000300L -#define RAM_START_ADDRESS 0x10000200L +#define RAM_START_ADDRESS 0x10000000 +#define RAM_WRITE_OFFSET 0x200 +#define RAM_WRITE_START (RAM_START_ADDRESS + RAM_WRITE_OFFSET) #define SECTOR_SIZE 4096 -//#define FLASH_WRITING_SIZE 1024 // This value should be 256, 512, 1024 or 4096 -#define FLASH_WRITING_SIZE 256 // This value should be 256, 512, 1024 or 4096 -#define LINES_PER_TRANSFER (((FLASH_WRITING_SIZE / 45) + 3) & ~0x3) -#define TRANSFER_SIZE (LINES_PER_TRANSFER * 45) +//#define FLASH_WRITING_SIZE 1024 // This value should be 256, 512, 1024 or 4096 +#define FLASH_WRITING_SIZE 512 // This value should be 256, 512, 1024 or 4096 +#define BYTES_PER_LINE 45 +#define LINES_PER_TRANSFER (((FLASH_WRITING_SIZE / BYTES_PER_LINE) + 3) & ~0x3) +#define TRANSFER_SIZE (LINES_PER_TRANSFER * BYTES_PER_LINE) + + + +int get_flash_writing_size( int ram_size ) +{ + int flash_writing_size[] = { + 4096, + 1024, + 512, + 256 + }; + int available_size; + int i; + + available_size = ram_size - RAM_WRITE_OFFSET; + + for ( i = 0; i < sizeof( flash_writing_size ) / sizeof( int ); i++ ) { + if ( flash_writing_size[ i ] < available_size ) + break; + } + + return ( flash_writing_size[ i ] ); +} enum { @@ -110,9 +135,9 @@ long checksum = 0; int strpos = 0; - *(str + strpos++) = ' ' + 45; + *(str + strpos++) = ' ' + BYTES_PER_LINE; - for ( int i = 0; i < 45; i += 3 ) { + for ( int i = 0; i < BYTES_PER_LINE; i += 3 ) { checksum += *(bin + i + 0) + *(bin + i + 1) + *(bin + i + 2); v = (*(bin + i + 0) << 16) | (*(bin + i + 1) << 8) | (*(bin + i + 2) << 0); *(str + strpos++) = uue_table[ (v >> 18) & 0x3F ]; @@ -170,9 +195,7 @@ } -char b[ TRANSFER_SIZE ]; - -void write_binary_data( FILE *fp ) +int write_binary_data( FILE *fp, int ram_size ) { char command_str[ STR_BUFF_SIZE ]; long checksum = 0; @@ -180,12 +203,27 @@ int total_size = 0; int size; + int flash_writing_size; + int lines_per_transfer; + int transfer_size; + initialize_uue_table(); - for ( int i = FLASH_WRITING_SIZE; i < TRANSFER_SIZE; i++ ) + flash_writing_size = get_flash_writing_size( ram_size ); + lines_per_transfer=(((flash_writing_size / BYTES_PER_LINE) + 3) & ~0x3); + transfer_size=(lines_per_transfer * BYTES_PER_LINE); + + // 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" ); + + for ( int i = flash_writing_size; i < transfer_size; i++ ) b[ i ] = 0; // this is not neccesary but just stuffing stuffing bytes - while ( size = fread( b, sizeof( char ), FLASH_WRITING_SIZE, fp ) ) { + while ( size = fread( b, sizeof( char ), flash_writing_size, fp ) ) { if ( !total_size ) { // overwriting 4 bytes data for address=0x1C @@ -193,11 +231,11 @@ add_isp_checksum( b ); } - sprintf( command_str, "W %ld %ld\r\n", RAM_START_ADDRESS, TRANSFER_SIZE ); + sprintf( command_str, "W %ld %ld\r\n", RAM_WRITE_START, transfer_size ); try_and_check( command_str, "0", 0 ); - for ( int i = 0; i < LINES_PER_TRANSFER; i++ ) { - checksum += bin2uue( b + (i * 45), command_str ); + for ( int i = 0; i < lines_per_transfer; i++ ) { + checksum += bin2uue( b + (i * BYTES_PER_LINE), command_str ); printf( "%02d %s\r", i, command_str ); @@ -215,12 +253,16 @@ 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_ADDRESS, FLASH_WRITING_SIZE ); + sprintf( command_str, "C %d %d %d\r\n", total_size, RAM_WRITE_START, flash_writing_size ); try_and_check( command_str, "0", 0 ); total_size += size; } + try_and_check( "G 0 T\r\n", "0", 0 ); + free( b ); + + return ( transfer_count ); } int file_size( FILE *fp ) @@ -287,11 +329,11 @@ tpp = find_target_param( str_buf0 ); printf( "target device found : type = \"%s\"\r\n", tpp->type_name ); printf( " ID = 0x%08X\r\n", tpp->id ); - printf( " RAM size = %7d bytes\r\n", tpp->ram_size ); - printf( " flash size = %7d bytes\r\n", tpp->flash_size ); + printf( " RAM size = %10d bytes\r\n", tpp->ram_size ); + printf( " flash size = %10d bytes\r\n", tpp->flash_size ); erase_sectors( last_sector ); - write_binary_data( fp ); + write_binary_data( fp, tpp->ram_size ); fclose( fp );