Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

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