Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Revision:
20:98d7b5878e3e
Parent:
19:7a7381e78025
Child:
21:e149d0bdbf4a
--- a/main.cpp	Thu Sep 12 19:51:33 2013 +0000
+++ b/main.cpp	Fri Sep 13 02:50:11 2013 +0000
@@ -64,6 +64,11 @@
 
 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 );
@@ -75,6 +80,10 @@
 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 );
@@ -89,41 +98,21 @@
 
 #pragma diag_suppress 1293  //  surpressing a warning message of "assignment in condition" ;)
 
-
 int main()
 {
     FILE            *fp;
-    char            str_buf0[ STR_BUFF_SIZE ];
-    char            str_buf1[ STR_BUFF_SIZE ];
+    target_param    *tpp;
     int             data_size;
     int             last_sector;
-    target_param    *tpp;
 
     printf( "\r\n\r\n\r\nmbed ISP program : programming LPC device from mbed\r\n" );
 
-    target.baud( ISP_BAUD_RATE );
-
-    reset_target( ENTER_TO_ISP_MODE );
-
-    try_and_check( "?", "Synchronized", 0 );
-
-    try_and_check2( "Synchronized\r\n", "OK", 0 );
-    try_and_check2( "12000\r\n", "OK", 0 );
-    try_and_check2( "U 23130\r\n", "0", 0 );
-    try_and_check2( "A 0\r\n", "0", 0 );
+    if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) )
+    {
+        error( "couldn't open the taget" );
+        return ( 1 );
+    }
 
-    try_and_check( "K\r\n", "0", 0 );
-    get_string( str_buf0 );
-    get_string( str_buf1 );
-
-    printf( "    result of \"K\" = %s %s\r\n", str_buf0, str_buf1 );
-
-    try_and_check( "J\r\n", "0", 0 );
-    get_string( str_buf0 );
-
-    printf( "    result of \"J\" = %s\r\n", str_buf0 );
-
-    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   = %10d bytes\r\n", tpp->ram_size );
@@ -144,10 +133,8 @@
 
     erase_sectors( last_sector );
 
-    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 );
+    write_flash( fp, tpp );
+    verify_flash( fp, tpp );
 
     fclose( fp );
 
@@ -159,6 +146,9 @@
     
     if ( error_state )
         error( "  ** ISP failed\r\n" );
+    
+    post_writing_process( tpp );
+
 
 #define AUTO_PROGRAM_START
 #ifdef  AUTO_PROGRAM_START
@@ -181,8 +171,66 @@
         if ( target.readable() ) {
             pc.putc( target.getc() );
         }
+    }
+}
 
-    }
+
+target_param *open_target( int baud_date )
+{
+    target_param    *tpp;
+    char            str_buf0[ STR_BUFF_SIZE ];
+    char            str_buf1[ STR_BUFF_SIZE ];
+
+    target.baud( baud_date );
+    
+    reset_target( ENTER_TO_ISP_MODE );
+    
+    try_and_check( "?", "Synchronized", 0 );
+    
+    try_and_check2( "Synchronized\r\n", "OK", 0 );
+    try_and_check2( "12000\r\n", "OK", 0 );
+    try_and_check2( "U 23130\r\n", "0", 0 );
+    try_and_check2( "A 0\r\n", "0", 0 );
+    
+    try_and_check( "K\r\n", "0", 0 );
+    get_string( str_buf0 );
+    get_string( str_buf1 );
+    
+    printf( "    result of \"K\" = %s %s\r\n", str_buf0, str_buf1 );
+    
+    try_and_check( "J\r\n", "0", 0 );
+    get_string( str_buf0 );
+    
+    printf( "    result of \"J\" = %s\r\n", str_buf0 );
+    
+    tpp  = find_target_param( str_buf0 );
+    
+    return ( tpp );
+}
+
+
+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 );
+
 }
 
 
@@ -297,7 +345,7 @@
 }
 
 #define     BYTES_PER_LINE      45
-char        uue_table[ 64 ];
+char        uu_table[ 0x60 + 1 ];
 
 int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start )
 {
@@ -363,7 +411,6 @@
         total_size  += size;
     }
 
-    try_and_check( "G 0 T\r\n", "0", 0 );
     free( b );
 
     return ( total_size );
@@ -412,8 +459,6 @@
 
     free( b );
 
-    verify_binary_data( fp );
-
     return ( total_size );
 }
 
@@ -496,14 +541,154 @@
 }
 
 
+int verify_uucoded_data( FILE *fp )
+{
+    char    command_str[ STR_BUFF_SIZE ];
+    int     read_size   = 0;
+    int     size;
+    int     flash_reading_size;
+    char    *bf;
+    char    *br;
+    int     error_flag  = 0;
+
+    flash_reading_size  = 176;
+
+    if ( NULL == (bf    = (char *)malloc( flash_reading_size * sizeof( char ) )) )
+        error( "malloc error happened (in verify process, file data buffer)\r\n" );
+
+    if ( NULL == (br    = (char *)malloc( flash_reading_size * sizeof( char ) )) )
+        error( "malloc error happened (in verify process, read data buffer)\r\n" );
+
+    fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
+
+    while ( size    = fread( bf, sizeof( char ), flash_reading_size, fp ) ) {
+
+        if ( !read_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( bf );
+        }
+
+        sprintf( command_str, "R %ld %ld\r\n", read_size, size );
+        try_and_check( command_str, "0", 0 );
+
+        get_binary_from_uucode_str( br, size );
+
+        for ( int i = 0; i < size; i++ ) {
+//            printf( "   %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : "   ", *(bf + i), *(br + i) );
+            if ( (*(bf + i) != *(br + i)) ) {
+                printf( "   %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : "   ", *(bf + i), *(br + i) );
+                error_flag++;
+            }
+        }
+
+        if ( error_flag )
+            break;
+            
+        read_size   += size;
+//        printf( "  total %d bytes read\r", read_size );
+    }
+
+    error_state |= error_flag;
+
+    printf( "  total %d bytes read\r", read_size );
+    printf( "  verification result : \"%s\"\r\n", error_flag ? "Fail" : "Pass" );
+
+    free( bf );
+    free( br );
+
+    return ( read_size );
+}
+
+
+void get_binary_from_uucode_str( char *b, int size )
+{
+#define N   4
+
+    char    s[ N ][ STR_BUFF_SIZE ];
+    char    ss[ STR_BUFF_SIZE ];
+    long    checksum    = 0;
+    int     line_count  = 0;
+    int     read_size   = 0;
+    int     retry_count = 3;
+
+    initialize_uud_table();
+
+    while ( retry_count-- ) {
+
+        for ( int i = 0; i < N; i++ )
+            get_string( s[ i ] );
+
+        get_string( ss );
+
+
+        while ( size ) {
+            read_size   = uudecode_a_line( b, s[ line_count ] );
+
+            for ( int i = 0; i < read_size; i++ )
+                checksum    += *b++;
+
+            size    -= read_size;
+            line_count++;
+        }
+
+//        printf( "  checksum -- %s (internal = %ld)\r\n", ss, checksum );
+
+        if ( checksum == atol( ss ) ) {
+            put_string( "OK\r\n" );
+            return;
+//            printf( "  checksum OK\r\n" );
+        } else {
+            printf( "  checksum RESEND\r\n" );
+            put_string( "RESEND\r\n" );
+        }
+    }
+}
+
+
+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;
 
-    uue_table[0] = 0x60;           // 0x20 is translated to 0x60 !
+    uu_table[ 0 ] = 0x60;           // 0x20 is translated to 0x60 !
+
+    for ( i = 1; i < 64; i++ ) {
+        uu_table[ i ] = (char)(' ' + i);
+    }
+}
+
 
-    for (i = 1; i < 64; i++) {
-        uue_table[i] = (char)(0x20 + i);
+void initialize_uud_table( void )
+{
+    int     i;
+
+    uu_table[ 0x60 ] = 0;
+
+    for ( i = 0x21; i < 0x60; i++ ) {
+        uu_table[ i ] = i - 0x20;
     }
 }
 
@@ -519,10 +704,10 @@
     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++) = uue_table[ (v >> 18) & 0x3F ];
-        *(str + strpos++) = uue_table[ (v >> 12) & 0x3F ];
-        *(str + strpos++) = uue_table[ (v >>  6) & 0x3F ];
-        *(str + strpos++) = uue_table[ (v >>  0) & 0x3F ];
+        *(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';
@@ -667,4 +852,3 @@
     
     leds    = 0x1 << (i++ & 0x3);
 }
-