Ika Shouyu Poppoyaki - LPC82x supported
Fork of ika_shouyu_poppoyaki by
main.cpp
- Committer:
- okano
- Date:
- 2013-08-24
- Revision:
- 0:6baefda2e511
- Child:
- 1:54e619428ae6
File content as of revision 0:6baefda2e511:
#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'; }