Code to load a LPC1114 over tx/rx. I have only tested with a 1114 chip but it should work with other LPC uControllers
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
Diff: main.cpp
- Revision:
- 0:6baefda2e511
- Child:
- 1:54e619428ae6
diff -r 000000000000 -r 6baefda2e511 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Aug 24 06:57:50 2013 +0000 @@ -0,0 +1,223 @@ +#include "mbed.h" + +DigitalOut led1(LED1); +DigitalOut led2(LED2); + +DigitalOut reset_pin( p26 ); +DigitalOut isp_pin( p25 ); + +Serial pc (USBTX,USBRX); +Serial target (p28,p27); + +LocalFileSystem local("local"); +#define SOURCE_FILE "/local/bin" + +#define STR_BUFF_SIZE 128 + +void put_string( char *s ); +void get_string( char *s ); + + +int try_and_check( char *command, char *expected_return_str, int mode ) +{ + char rtn_str[ STR_BUFF_SIZE ]; + + put_string( command ); + get_string( rtn_str ); + + return ( strcmp( expected_return_str, rtn_str ) ); +} + +int try_and_check2( char *command, char *expected_return_str, int mode ) +{ + char rtn_str[ STR_BUFF_SIZE ]; + + put_string( command ); + + get_string( rtn_str ); // just readout echoback + printf( " RTN0=%s\r\n", rtn_str ); + get_string( rtn_str ); + printf( " RTN1=%s\r\n", rtn_str ); + + return ( strcmp( expected_return_str, rtn_str ) ); +} + +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 check_sum = 0; + int strpos = 0; + + *(str + strpos++) = ' ' + 45; + + for ( int i = 0; i < 45; i += 3 ) { + check_sum += *(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 check_sum; +} + + +#define FLASH_WRITING_SIZE 1024 +#define TRANSFER_SIZE (24 * 45) + +char b[ TRANSFER_SIZE ]; + +void sending_data( FILE *fp ) +{ + char command_str[ STR_BUFF_SIZE ]; + long check_sum = 0; + int transfer_count = 0; + int size; + + initialize_uue_table(); + + for ( int i = FLASH_WRITING_SIZE; i < TRANSFER_SIZE; i++ ) + b[ i ] = 0; + + while ( size = fread( b, sizeof( char ), FLASH_WRITING_SIZE, fp ) ) { + + sprintf( command_str, "W %ld %ld\r\n", 0x10000300L, 1080 ); + printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "0", 0 ) ? "Fail" : "Pass" ); + + for ( int i = 0; i < 24; i++ ) { + check_sum += bin2uue( b + (i * 45), command_str ); + printf( "%02d %s\r\n", i, command_str ); + put_string( command_str ); + if ( (i == 19) || (i == 23) ) { + sprintf( command_str, "%ld\n", check_sum ); + printf( " %ld %s\r\n", check_sum, command_str ); + printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "OK", 0 ) ? "Fail" : "Pass" ); + + check_sum = 0; + } + } + + printf( "\"P 0 0\" %s\r\n", try_and_check( "P 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" ); + + sprintf( command_str, "C %ld %ld %ld\r\n", FLASH_WRITING_SIZE * transfer_count++, 0x10000300L, FLASH_WRITING_SIZE ); + printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "0", 0 ) ? "Fail" : "Pass" ); + + + } + printf( "\"G 0 T\" %s\r\n", try_and_check( "G 0 T\r\n", "0", 0 ) ? "Fail" : "Pass" ); +} + +int main() +{ + FILE *fp; + char str_buf0[ STR_BUFF_SIZE ]; + char str_buf1[ STR_BUFF_SIZE ]; + + pc.baud(9600); + target.baud(9600); + + if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) { + error( "couldn't open source file" ); + return ( 1 ); + } + + printf( "\r\n\r\ntarget RESET\r\n" ); + + reset_pin = 1; + isp_pin = 0; + wait_ms( 100 ); + reset_pin = 0; + wait_ms( 100 ); + reset_pin = 1; + wait_ms( 100 ); + + printf( "\"?\" >> \"Synchronized\" %s\r\n", try_and_check( "?", "Synchronized", 0 ) ? "Fail" : "Pass" ); + printf( "\"Synchronized\\r\\n\" %s\r\n", try_and_check2( "Synchronized\r\n", "OK", 0 ) ? "Fail" : "Pass" ); + printf( "\"12000\" %s\r\n", try_and_check2( "12000\r\n", "OK", 0 ) ? "Fail" : "Pass" ); + printf( "\"U 23130\" %s\r\n", try_and_check2( "U 23130\r\n", "0", 0 ) ? "Fail" : "Pass" ); + printf( "\"A 0\" %s\r\n", try_and_check2( "A 0\r\n", "0", 0 ) ? "Fail" : "Pass" ); + + printf( "\"K\" %s\r\n", try_and_check( "K\r\n", "0", 0 ) ? "Fail" : "Pass" ); + get_string( str_buf0 ); + get_string( str_buf1 ); + printf( " result of \"K\" = %s %s\r\n", str_buf0, str_buf1 ); + + printf( "\"J\" %s\r\n", try_and_check( "J\r\n", "0", 0 ) ? "Fail" : "Pass" ); + get_string( str_buf0 ); + printf( " result of \"J\" = %s\r\n", str_buf0 ); + +#if 0 + printf( "\"N\" %s\r\n", try_and_check( "N\r\n", "0", 0 ) ? "Fail" : "Pass" ); + get_string( str_buf0 ); + printf( " result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) ); + get_string( str_buf0 ); + printf( " result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) ); + get_string( str_buf0 ); + printf( " result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) ); + get_string( str_buf0 ); + printf( " result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) ); +#endif + printf( "\"P 0 0\" %s\r\n", try_and_check( "P 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" ); + printf( "\"E 0 0\" %s\r\n", try_and_check( "E 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" ); + + sending_data( fp ); + fclose( fp ); + + while ( 1 ) + ; +} + +void put_string( char *s ) +{ + char c; + + while ( (c = *s++) ) + target.putc( c ); +} + +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++; + led2 = !led2; + + } + } while ( 1 ); + } while ( !i ); + *s = '\0'; +} +