Add to 11U68 11E68
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
Diff: main.cpp
- 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); } -