Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Revision:
22:bd98a782fba6
Parent:
21:e149d0bdbf4a
Child:
23:017f306cf3ca
--- a/main.cpp	Fri Sep 13 03:09:09 2013 +0000
+++ b/main.cpp	Fri Sep 13 03:34:43 2013 +0000
@@ -23,7 +23,10 @@
 
 #include    "mbed.h"
 #include    "target_table.h"
-#include    "command_utilities.h"
+#include    "serial_utilities.h"
+#include    "command_interface.h"
+#include    "writing.h"
+#include    "uu_coding.h"
 #include    "ika.h"
 
 
@@ -39,7 +42,6 @@
 
 #define     ENTER_TO_ISP_MODE   0
 #define     NO_ISP_MODE         1
-#define     STR_BUFF_SIZE       64
 
 #define     SOURCE_FILE         "/local/bin"
 
@@ -59,30 +61,16 @@
 int     error_state         = 0;
 
 target_param *open_target( int baud_date );
-int     write_flash( FILE *fp, target_param *tpp );
 int     verify_flash( FILE *fp, target_param *tpp );
 int     post_writing_process( target_param *tpp );
 
 int     file_size( FILE *fp );
 void    reset_target( int isp_pin_state );
-int     try_and_check( char *command, char *expected_return_str, int mode );
-int     try_and_check2( char *command, char *expected_return_str, int mode );
-void    print_command( char *command );
-void    print_result( int r );
 char    read_byte( void );
 void    erase_sectors( int last_sector );
-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     verify_binary_data( FILE *fp );
 int     verify_uucoded_data( FILE *fp );
 void    get_binary_from_uucode_str( char *b, int size );
-int     uudecode_a_line( char *b, char *s );
-void    initialize_uud_table( void );
-void    initialize_uue_table( void );
-long    bin2uue( char *bin, char *str, int 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    success_indicator();
 
@@ -157,6 +145,35 @@
 }
 
 
+int verify_flash( FILE *fp, target_param *tpp )
+{
+    if ( tpp->write_type == BINARY )
+        verify_binary_data( fp );
+    else
+        verify_uucoded_data( fp );
+}
+
+
+int post_writing_process( target_param *tpp )
+{
+    if ( tpp->write_type == UUENCODE )
+                try_and_check( "G 0 T\r\n", "0", 0 );
+
+}
+
+
+int file_size( FILE *fp )
+{
+    int     size;
+
+    fseek( fp, 0, SEEK_END ); // seek to end of file
+    size    = ftell( fp );       // get current file pointer
+    fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
+
+    return size;
+}
+
+
 target_param *open_target( int baud_date )
 {
     target_param    *tpp;
@@ -191,43 +208,6 @@
 }
 
 
-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 verify_flash( FILE *fp, target_param *tpp )
-{
-    if ( tpp->write_type == BINARY )
-        verify_binary_data( fp );
-    else
-        verify_uucoded_data( fp );
-}
-
-
-int post_writing_process( target_param *tpp )
-{
-    if ( tpp->write_type == UUENCODE )
-                try_and_check( "G 0 T\r\n", "0", 0 );
-
-}
-
-
-int file_size( FILE *fp )
-{
-    int     size;
-
-    fseek( fp, 0, SEEK_END ); // seek to end of file
-    size    = ftell( fp );       // get current file pointer
-    fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
-
-    return size;
-}
-
-
 void reset_target( int isp_pin_state )
 {
     reset_pin   = 1;
@@ -242,69 +222,6 @@
 }
 
 
-int try_and_check( char *command, char *expected_return_str, int mode )
-{
-    char    rtn_str[ STR_BUFF_SIZE ];
-    int     result  = 1;
-
-    print_command( command );
-    put_string( command );
-
-    get_string( rtn_str );
-    print_result( result  = strcmp( expected_return_str, rtn_str ) );
-
-    if ( result && !mode )
-        error( "command failed\r\n" );
-
-    error_state |= result;
-
-    return ( result );
-}
-
-
-int try_and_check2( char *command, char *expected_return_str, int mode )
-{
-    char    rtn_str[ STR_BUFF_SIZE ];
-    int     result  = 1;
-
-    print_command( command );
-    put_string( command );
-
-    get_string( rtn_str );  // just readout echoback
-    get_string( rtn_str );
-    print_result( result  = strcmp( expected_return_str, rtn_str ) );
-
-    if ( result && !mode )
-        error( "command failed\r\n" );
-
-    error_state |= result;
-
-    return ( result );
-}
-
-
-void print_command( char *command )
-{
-    char    s[ STR_BUFF_SIZE ];
-    char    *pos;
-
-    strcpy( s, command );
-
-    if ( pos    = strchr( s, '\r' ) )
-        *pos    = '\0';
-
-    if ( pos    = strchr( s, '\n' ) )
-        *pos    = '\0';
-
-    printf( "  command-\"%s\" : ", s );
-}
-
-
-void print_result( int r )
-{
-    printf( "%s\r\n", r ? "Fail" : "Pass" );
-}
-
 
 void erase_sectors( int last_sector )
 {
@@ -317,124 +234,6 @@
     try_and_check( command_str, "0", 0 );
 }
 
-#define     BYTES_PER_LINE      45
-char        uu_table[ 0x60 + 1 ];
-
-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     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 );
-}
-
 
 int verify_binary_data( FILE *fp )
 {
@@ -526,6 +325,8 @@
 
     flash_reading_size  = 176;
 
+    initialize_uud_table();
+
     if ( NULL == (bf    = (char *)malloc( flash_reading_size * sizeof( char ) )) )
         error( "malloc error happened (in verify process, file data buffer)\r\n" );
 
@@ -585,7 +386,6 @@
     int     read_size   = 0;
     int     retry_count = 3;
 
-    initialize_uud_table();
 
     while ( retry_count-- ) {
 
@@ -619,127 +419,7 @@
 }
 
 
-int uudecode_a_line( char *b, char *s )
-{
 
-    unsigned long   v;
-    int             read_size;
-
-    read_size   = (*s++) - ' ';
-
-    for ( int i = 0; i < read_size; i += 3 ) {
-        v        = uu_table[ *s++ ] << 18;
-        v       |= uu_table[ *s++ ] << 12;
-        v       |= uu_table[ *s++ ] <<  6;
-        v       |= uu_table[ *s++ ] <<  0;
-
-        *b++     = (v >> 16) & 0xFF;
-        *b++     = (v >>  8) & 0xFF;
-        *b++     = (v >>  0) & 0xFF;
-    }
-
-    return ( read_size );
-}
-
-
-void initialize_uue_table( void )
-{
-    int     i;
-
-    uu_table[ 0 ] = 0x60;           // 0x20 is translated to 0x60 !
-
-    for ( i = 1; i < 64; i++ ) {
-        uu_table[ i ] = (char)(' ' + i);
-    }
-}
-
-
-void initialize_uud_table( void )
-{
-    int     i;
-
-    uu_table[ 0x60 ] = 0;
-
-    for ( i = 0x21; i < 0x60; i++ ) {
-        uu_table[ i ] = i - 0x20;
-    }
-}
-
-
-long bin2uue( char *bin, char *str, int size )
-{
-    unsigned long   v;
-    long            checksum    = 0;
-    int             strpos      = 0;
-
-    *(str + strpos++) = ' ' + size;
-
-    for ( int i = 0; i < size; 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++) = uu_table[ (v >> 18) & 0x3F ];
-        *(str + strpos++) = uu_table[ (v >> 12) & 0x3F ];
-        *(str + strpos++) = uu_table[ (v >>  6) & 0x3F ];
-        *(str + strpos++) = uu_table[ (v >>  0) & 0x3F ];
-    }
-    *(str + strpos++) = '\n';
-    *(str + strpos++) = '\0';
-
-    return checksum;
-}
-
-
-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 ] );
-}
-
-
-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" );
-}
-
-
-void send_RAM_transfer_checksum( int checksum )
-{
-    char    command[ 16 ];
-
-    sprintf( command, "%d\n", checksum );
-    try_and_check( command, "OK", 0 );
-}