Add to 11U68 11E68
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
Diff: writing.cpp
- Revision:
- 22:bd98a782fba6
- Child:
- 24:9830b4f1207b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/writing.cpp Fri Sep 13 03:34:43 2013 +0000 @@ -0,0 +1,182 @@ + +#include "mbed.h" +#include "writing.h" +#include "command_interface.h" +#include "uu_coding.h" +#include "serial_utilities.h" + + +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 ); +int get_flash_writing_size( int ram_size, unsigned int ram_start ); + + +int write_flash( FILE *fp, target_param *tpp ) +{ + 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 ); +} + + +int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start ) +{ +#define BYTES_PER_LINE 45 + + char command_str[ STR_BUFF_SIZE ]; + long checksum = 0; + int total_size = 0; + int size; + + int flash_writing_size; + int lines_per_transfer; + int transfer_size; + + char *b; + + initialize_uue_table(); + + 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 + + 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 ) ) { + + 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, 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 ); + + put_string( command_str ); + + if ( !((i + 1) % 20) ) { + send_RAM_transfer_checksum( checksum ); + checksum = 0; + } + } + + send_RAM_transfer_checksum( checksum ); + checksum = 0; + + 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; + } + + free( b ); + + 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" ); + + printf( "\r\n ==== flash writing ====\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 add_isp_checksum( char *b ) +{ + // see http://www.lpcware.com/content/nxpfile/lpc177x8x-checksum-insertion-program + + unsigned int *p; + unsigned int cksum = 0; + + p = (unsigned int *)b; + + for ( int i = 0; i < 7; i++ ) { + cksum += *p++; + } + + printf( " -- value at checksum slot : 0x%08X\r\n", *p ); + + *p = 0xFFFFFFFF - cksum + 1; + printf( " -- calculated checksum : 0x%08X\r\n", *p ); + + printf( " new checksum will be used to program flash\r\n" ); +} + + +int get_flash_writing_size( int ram_size, unsigned int ram_start ) +{ + int flash_writing_size[] = { + 4096, + 1024, + 512, + 256 + }; + int available_size; + int i; + + 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 ) + break; + } + + return ( flash_writing_size[ i ] ); +} \ No newline at end of file