Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Revision:
7:815366f003ee
Parent:
6:0ae6fe8c8512
Child:
8:b220fadbb3d8
--- a/main.cpp	Sun Aug 25 02:54:53 2013 +0000
+++ b/main.cpp	Sun Aug 25 03:30:28 2013 +0000
@@ -24,6 +24,302 @@
 #define     LINES_PER_TRANSFER  (((FLASH_WRITING_SIZE / BYTES_PER_LINE) + 3) & ~0x3)
 #define     TRANSFER_SIZE       (LINES_PER_TRANSFER * BYTES_PER_LINE)
 
+#pragma diag_suppress 1293  //  surpressing a warning message of "assignment in condition"
+
+char uue_table[ 64 ];
+
+enum {
+    ENTER_TO_ISP_MODE,
+    NO_ISP_MODE
+};
+
+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_binary_data( FILE *fp, int ram_size );
+void    initialize_uue_table( void );
+long    bin2uue( char *bin, char *str );
+int     get_flash_writing_size( int ram_size );
+void    add_isp_checksum( char *b );
+void    send_RAM_transfer_checksum( int checksum );
+void    put_string( char *s );
+void    get_string( char *s );
+
+
+int main()
+{
+    FILE            *fp;
+    char            str_buf0[ STR_BUFF_SIZE ];
+    char            str_buf1[ STR_BUFF_SIZE ];
+    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( BAUD_RATE );
+    
+    printf( "  opening file: \"%s\"\r\n", SOURCE_FILE );
+
+    if ( NULL == (fp    = fopen( SOURCE_FILE, "rb" )) ) {
+        error( "couldn't open source file" );
+        return ( 1 );
+    }
+
+    data_size   = file_size( fp );
+    last_sector = data_size / SECTOR_SIZE;
+
+    printf( "  data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
+    printf( "  resetting target\r\n" );
+    
+    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 );
+    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 );
+    printf( "                      flash size = %10d bytes\r\n", tpp->flash_size );
+    
+    erase_sectors( last_sector );
+    write_binary_data( fp, tpp->ram_size );
+    
+    fclose( fp );
+    
+    int i   = 0;
+    
+    while ( 1 ) {
+        leds    = 0x1 << (i++ & 0x3);
+        wait( 0.1 );
+    }
+}
+
+
+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;
+    isp_pin = 0;
+    wait_ms( 100 );
+    reset_pin   = 0;
+    wait_ms( 100 );
+    reset_pin   = 1;
+    wait_ms( 100 );
+}
+
+
+int try_and_check( char *command, char *expected_return_str, int mode )
+{
+    char    rtn_str[ STR_BUFF_SIZE ];
+    int     result;
+    
+    print_command( command );
+    put_string( command );
+    
+    get_string( rtn_str );
+    print_result( result  = strcmp( expected_return_str, rtn_str ) );
+    
+    return ( result );
+}
+
+
+int try_and_check2( char *command, char *expected_return_str, int mode )
+{
+    char    rtn_str[ STR_BUFF_SIZE ];
+    int     result;
+    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 ) );
+    
+    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" );
+}
+
+
+char read_byte( void )
+{
+    while ( !target.readable() )
+        ;
+    
+    return ( target.getc() );
+}
+
+
+void erase_sectors( int last_sector )
+{
+    char    command_str[ STR_BUFF_SIZE ];
+    
+    sprintf( command_str, "P 0 %d\r\n", last_sector );
+    try_and_check( command_str, "0", 0 );
+    
+    *(command_str)  = 'E';
+    try_and_check( command_str, "0", 0 );
+}
+
+
+int write_binary_data( FILE *fp, int ram_size )
+{
+    char    command_str[ STR_BUFF_SIZE ];
+    long    checksum        = 0;
+    int     transfer_count  = 0;
+    int     total_size      = 0;
+    int     size;
+    
+    int     flash_writing_size;
+    int     lines_per_transfer;
+    int     transfer_size;
+    
+    initialize_uue_table();
+    
+    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 ) ) {
+        
+        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_WRITE_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 );
+            
+            printf( "%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_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 );
+}
+
+
+void initialize_uue_table( void )
+{
+    int     i;
+    
+    uue_table[0] = 0x60;           // 0x20 is translated to 0x60 !
+    
+    for (i = 1; i < 64; i++) {
+        uue_table[i] = (char)(0x20 + i);
+    }
+}
+
+
+long bin2uue( char *bin, char *str )
+{
+    unsigned long   v;
+    long            checksum    = 0;
+    int             strpos      = 0;
+    
+    *(str + strpos++) = ' ' + BYTES_PER_LINE;
+    
+    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 ];
+        *(str + strpos++) = uue_table[ (v >> 12) & 0x3F ];
+        *(str + strpos++) = uue_table[ (v >>  6) & 0x3F ];
+        *(str + strpos++) = uue_table[ (v >>  0) & 0x3F ];
+    }
+    *(str + strpos++) = '\n';
+    *(str + strpos++) = '\0';
+    
+    return checksum;
+}
 
 
 int get_flash_writing_size( int ram_size )
@@ -36,346 +332,79 @@
     };
     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 {
-    ENTER_TO_ISP_MODE,
-    NO_ISP_MODE
-};
-
-void put_string( char *s );
-void get_string( char *s );
-
-#pragma diag_suppress 1293
-
-
-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" );
-}
-
-int try_and_check( char *command, char *expected_return_str, int mode )
-{
-    char    rtn_str[ STR_BUFF_SIZE ];
-    int     result;
-
-    print_command( command );
-    put_string( command );
-
-    get_string( rtn_str );
-    print_result( result  = strcmp( expected_return_str, rtn_str ) );
-
-    return ( result );
-}
-
-int try_and_check2( char *command, char *expected_return_str, int mode )
-{
-    char    rtn_str[ STR_BUFF_SIZE ];
-    int     result;
-    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 ) );
-
-    return ( result );
-}
-
-char read_byte( void )
-{
-    while ( !target.readable() )
-        ;
-
-    return ( target.getc() );
-}
-char uue_table[ 64 ];
-
-void initialize_uue_table( void )
-{
-    int     i;
-
-    uue_table[0] = 0x60;           // 0x20 is translated to 0x60 !
-
-    for (i = 1; i < 64; i++) {
-        uue_table[i] = (char)(0x20 + i);
-    }
-}
-
-long bin2uue( char *bin, char *str )
-{
-    unsigned long   v;
-    long            checksum    = 0;
-    int             strpos      = 0;
-
-    *(str + strpos++) = ' ' + BYTES_PER_LINE;
-
-    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 ];
-        *(str + strpos++) = uue_table[ (v >> 12) & 0x3F ];
-        *(str + strpos++) = uue_table[ (v >>  6) & 0x3F ];
-        *(str + strpos++) = uue_table[ (v >>  0) & 0x3F ];
-    }
-    *(str + strpos++) = '\n';
-    *(str + strpos++) = '\0';
-
-    return checksum;
-}
-
 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 erase_sectors( int last_sector )
-{
-    char    command_str[ STR_BUFF_SIZE ];
-
-    sprintf( command_str, "P 0 %d\r\n", last_sector );
-    try_and_check( command_str, "0", 0 );
-
-    *(command_str)  = 'E';
-    try_and_check( command_str, "0", 0 );
-}
-
-
 void send_RAM_transfer_checksum( int checksum )
 {
     char    command[ 16 ];
-
+    
     sprintf( command, "%d\n", checksum );
     try_and_check( command, "OK", 0 );
 }
 
 
-int write_binary_data( FILE *fp, int ram_size )
-{
-    char    command_str[ STR_BUFF_SIZE ];
-    long    checksum        = 0;
-    int     transfer_count  = 0;
-    int     total_size      = 0;
-    int     size;
-
-    int     flash_writing_size;
-    int     lines_per_transfer;
-    int     transfer_size;
-
-    initialize_uue_table();
-
-    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 ) ) {
-
-        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_WRITE_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 );
-
-            printf( "%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_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 )
-{
-    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;
-    isp_pin = 0;
-    wait_ms( 100 );
-    reset_pin   = 0;
-    wait_ms( 100 );
-    reset_pin   = 1;
-    wait_ms( 100 );
-}
-
-int main()
-{
-    FILE            *fp;
-    char            str_buf0[ STR_BUFF_SIZE ];
-    char            str_buf1[ STR_BUFF_SIZE ];
-    int             data_size;
-    int             last_sector;
-    target_param    *tpp;
-
-    target.baud( BAUD_RATE );
-
-    if ( NULL == (fp    = fopen( SOURCE_FILE, "rb" )) ) {
-        error( "couldn't open source file" );
-        return ( 1 );
-    }
-
-    data_size   = file_size( fp );
-    last_sector = data_size / SECTOR_SIZE;
-    printf( "\r\n\r\ntarget RESET\r\n" );
-    printf( "data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
-
-    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 );
-    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 );
-    printf( "                      flash size = %10d bytes\r\n", tpp->flash_size );
-
-    erase_sectors( last_sector );
-    write_binary_data( fp, tpp->ram_size );
-
-    fclose( fp );
-
-    int i   = 0;
-
-    while ( 1 ) {
-        leds    = 0x1 << (i++ & 0x3);
-        wait( 0.1 );
-    }
-}
-
-
 void put_string( char *s )
 {
     char            c;
     static int      i   = 0;
-
+    
     while ( c = *s++ ) {
         target.putc( c );
         leds    = i++ & 0x1;
     }
 }
 
+
 void get_string( char *s )
 {
     int     i   = 0;
     char    c   = 0;
-
+    
     do {
         do {
             if ( target.readable() ) {
                 c  = target.getc();
-
+                
                 if ( ( c == '\n') || (c == '\r') )
                     break;
-
+                
                 *s++    = c;
                 i++;
             }
         } while ( 1 );
     } while ( !i );
-
+    
     *s  = '\0';
 }
-