Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Sat Aug 24 15:06:33 2013 +0000
Revision:
3:3c380e643e74
Parent:
2:8d75eb0ecd20
Child:
4:55f1977bd11a
warning surpressed :)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:6baefda2e511 1 #include "mbed.h"
okano 0:6baefda2e511 2
okano 2:8d75eb0ecd20 3 BusOut leds( LED4, LED3, LED2, LED1 );
okano 2:8d75eb0ecd20 4 DigitalOut reset_pin( p26 );
okano 2:8d75eb0ecd20 5 DigitalOut isp_pin( p25 );
okano 2:8d75eb0ecd20 6 Serial target ( p28, p27 );
okano 2:8d75eb0ecd20 7 LocalFileSystem local( "local" );
okano 0:6baefda2e511 8
okano 1:54e619428ae6 9 #define SOURCE_FILE "/local/bin"
okano 1:54e619428ae6 10 #define STR_BUFF_SIZE 64
okano 1:54e619428ae6 11 #define RAM_START_ADDRESS 0x10000300L
okano 1:54e619428ae6 12 #define SECTOR_SIZE 4096
okano 0:6baefda2e511 13
okano 2:8d75eb0ecd20 14 enum {
okano 2:8d75eb0ecd20 15 ENTER_TO_ISP_MODE,
okano 2:8d75eb0ecd20 16 NO_ISP_MODE
okano 2:8d75eb0ecd20 17 };
okano 2:8d75eb0ecd20 18
okano 0:6baefda2e511 19 void put_string( char *s );
okano 0:6baefda2e511 20 void get_string( char *s );
okano 0:6baefda2e511 21
okano 3:3c380e643e74 22 #pragma diag_suppress 1293
okano 3:3c380e643e74 23
okano 3:3c380e643e74 24
okano 2:8d75eb0ecd20 25 void print_command( char *command )
okano 2:8d75eb0ecd20 26 {
okano 2:8d75eb0ecd20 27 char s[ STR_BUFF_SIZE ];
okano 2:8d75eb0ecd20 28 char *pos;
okano 2:8d75eb0ecd20 29
okano 2:8d75eb0ecd20 30 strcpy( s, command );
okano 2:8d75eb0ecd20 31
okano 2:8d75eb0ecd20 32 if ( pos = strchr( s, '\r' ) )
okano 2:8d75eb0ecd20 33 *pos = '\0';
okano 2:8d75eb0ecd20 34
okano 2:8d75eb0ecd20 35 if ( pos = strchr( s, '\n' ) )
okano 2:8d75eb0ecd20 36 *pos = '\0';
okano 2:8d75eb0ecd20 37
okano 2:8d75eb0ecd20 38 printf( " command-\"%s\" : ", s );
okano 2:8d75eb0ecd20 39 }
okano 2:8d75eb0ecd20 40
okano 2:8d75eb0ecd20 41 void print_result( int r )
okano 2:8d75eb0ecd20 42 {
okano 2:8d75eb0ecd20 43 printf( "%s\r\n", r ? "Fail" : "Pass" );
okano 2:8d75eb0ecd20 44 }
okano 0:6baefda2e511 45
okano 0:6baefda2e511 46 int try_and_check( char *command, char *expected_return_str, int mode )
okano 0:6baefda2e511 47 {
okano 0:6baefda2e511 48 char rtn_str[ STR_BUFF_SIZE ];
okano 2:8d75eb0ecd20 49 int result;
okano 0:6baefda2e511 50
okano 2:8d75eb0ecd20 51 print_command( command );
okano 0:6baefda2e511 52 put_string( command );
okano 2:8d75eb0ecd20 53
okano 0:6baefda2e511 54 get_string( rtn_str );
okano 2:8d75eb0ecd20 55 print_result( result = strcmp( expected_return_str, rtn_str ) );
okano 0:6baefda2e511 56
okano 2:8d75eb0ecd20 57 return ( result );
okano 0:6baefda2e511 58 }
okano 0:6baefda2e511 59
okano 0:6baefda2e511 60 int try_and_check2( char *command, char *expected_return_str, int mode )
okano 0:6baefda2e511 61 {
okano 0:6baefda2e511 62 char rtn_str[ STR_BUFF_SIZE ];
okano 2:8d75eb0ecd20 63 int result;
okano 2:8d75eb0ecd20 64 print_command( command );
okano 0:6baefda2e511 65
okano 0:6baefda2e511 66 put_string( command );
okano 0:6baefda2e511 67
okano 0:6baefda2e511 68 get_string( rtn_str ); // just readout echoback
okano 0:6baefda2e511 69 get_string( rtn_str );
okano 2:8d75eb0ecd20 70 print_result( result = strcmp( expected_return_str, rtn_str ) );
okano 0:6baefda2e511 71
okano 2:8d75eb0ecd20 72 return ( result );
okano 0:6baefda2e511 73 }
okano 0:6baefda2e511 74
okano 0:6baefda2e511 75 char read_byte( void )
okano 0:6baefda2e511 76 {
okano 0:6baefda2e511 77 while ( !target.readable() )
okano 0:6baefda2e511 78 ;
okano 0:6baefda2e511 79
okano 0:6baefda2e511 80 return ( target.getc() );
okano 0:6baefda2e511 81 }
okano 0:6baefda2e511 82 char uue_table[ 64 ];
okano 0:6baefda2e511 83
okano 0:6baefda2e511 84 void initialize_uue_table( void )
okano 0:6baefda2e511 85 {
okano 0:6baefda2e511 86 int i;
okano 0:6baefda2e511 87
okano 0:6baefda2e511 88 uue_table[0] = 0x60; // 0x20 is translated to 0x60 !
okano 0:6baefda2e511 89
okano 0:6baefda2e511 90 for (i = 1; i < 64; i++) {
okano 0:6baefda2e511 91 uue_table[i] = (char)(0x20 + i);
okano 0:6baefda2e511 92 }
okano 0:6baefda2e511 93 }
okano 0:6baefda2e511 94
okano 0:6baefda2e511 95 long bin2uue( char *bin, char *str )
okano 0:6baefda2e511 96 {
okano 0:6baefda2e511 97 unsigned long v;
okano 1:54e619428ae6 98 long checksum = 0;
okano 0:6baefda2e511 99 int strpos = 0;
okano 0:6baefda2e511 100
okano 0:6baefda2e511 101 *(str + strpos++) = ' ' + 45;
okano 0:6baefda2e511 102
okano 0:6baefda2e511 103 for ( int i = 0; i < 45; i += 3 ) {
okano 1:54e619428ae6 104 checksum += *(bin + i + 0) + *(bin + i + 1) + *(bin + i + 2);
okano 0:6baefda2e511 105 v = (*(bin + i + 0) << 16) | (*(bin + i + 1) << 8) | (*(bin + i + 2) << 0);
okano 0:6baefda2e511 106 *(str + strpos++) = uue_table[ (v >> 18) & 0x3F ];
okano 0:6baefda2e511 107 *(str + strpos++) = uue_table[ (v >> 12) & 0x3F ];
okano 0:6baefda2e511 108 *(str + strpos++) = uue_table[ (v >> 6) & 0x3F ];
okano 0:6baefda2e511 109 *(str + strpos++) = uue_table[ (v >> 0) & 0x3F ];
okano 0:6baefda2e511 110 }
okano 0:6baefda2e511 111 *(str + strpos++) = '\n';
okano 0:6baefda2e511 112 *(str + strpos++) = '\0';
okano 0:6baefda2e511 113
okano 1:54e619428ae6 114 return checksum;
okano 0:6baefda2e511 115 }
okano 0:6baefda2e511 116
okano 1:54e619428ae6 117 void add_isp_checksum( char *b )
okano 1:54e619428ae6 118 {
okano 1:54e619428ae6 119 // see http://www.lpcware.com/content/nxpfile/lpc177x8x-checksum-insertion-program
okano 1:54e619428ae6 120
okano 1:54e619428ae6 121 unsigned int *p;
okano 1:54e619428ae6 122 unsigned int cksum = 0;
okano 1:54e619428ae6 123
okano 1:54e619428ae6 124 p = (unsigned int *)b;
okano 1:54e619428ae6 125
okano 1:54e619428ae6 126 for ( int i = 0; i < 7; i++ ) {
okano 1:54e619428ae6 127 cksum += *p++;
okano 1:54e619428ae6 128 }
okano 1:54e619428ae6 129
okano 1:54e619428ae6 130 printf( " -- value at checksum slot : 0x%08X\r\n", *p );
okano 1:54e619428ae6 131
okano 1:54e619428ae6 132 *p = 0xFFFFFFFF - cksum + 1;
okano 1:54e619428ae6 133 printf( " -- calculated checksum : 0x%08X\r\n", *p );
okano 1:54e619428ae6 134
okano 1:54e619428ae6 135 printf( " new checksum will be used to program flash\r\n" );
okano 1:54e619428ae6 136 }
okano 1:54e619428ae6 137
okano 1:54e619428ae6 138
okano 1:54e619428ae6 139
okano 1:54e619428ae6 140 void erase_sectors( int last_sector )
okano 1:54e619428ae6 141 {
okano 1:54e619428ae6 142 char command_str[ STR_BUFF_SIZE ];
okano 1:54e619428ae6 143
okano 1:54e619428ae6 144 sprintf( command_str, "P 0 %d\r\n", last_sector );
okano 2:8d75eb0ecd20 145 try_and_check( command_str, "0", 0 );
okano 1:54e619428ae6 146
okano 1:54e619428ae6 147 *(command_str) = 'E';
okano 2:8d75eb0ecd20 148 try_and_check( command_str, "0", 0 );
okano 1:54e619428ae6 149 }
okano 0:6baefda2e511 150
okano 0:6baefda2e511 151 #define FLASH_WRITING_SIZE 1024
okano 0:6baefda2e511 152 #define TRANSFER_SIZE (24 * 45)
okano 0:6baefda2e511 153
okano 0:6baefda2e511 154 char b[ TRANSFER_SIZE ];
okano 0:6baefda2e511 155
okano 1:54e619428ae6 156 void write_binary_data( FILE *fp )
okano 0:6baefda2e511 157 {
okano 0:6baefda2e511 158 char command_str[ STR_BUFF_SIZE ];
okano 1:54e619428ae6 159 long checksum = 0;
okano 0:6baefda2e511 160 int transfer_count = 0;
okano 0:6baefda2e511 161 int size;
okano 0:6baefda2e511 162
okano 0:6baefda2e511 163 initialize_uue_table();
okano 0:6baefda2e511 164
okano 0:6baefda2e511 165 for ( int i = FLASH_WRITING_SIZE; i < TRANSFER_SIZE; i++ )
okano 0:6baefda2e511 166 b[ i ] = 0;
okano 0:6baefda2e511 167
okano 0:6baefda2e511 168 while ( size = fread( b, sizeof( char ), FLASH_WRITING_SIZE, fp ) ) {
okano 0:6baefda2e511 169
okano 1:54e619428ae6 170 if ( !transfer_count ) {
okano 1:54e619428ae6 171 add_isp_checksum( b );
okano 1:54e619428ae6 172 }
okano 1:54e619428ae6 173
okano 1:54e619428ae6 174 sprintf( command_str, "W %ld %ld\r\n", RAM_START_ADDRESS, 1080 );
okano 2:8d75eb0ecd20 175 try_and_check( command_str, "0", 0 );
okano 0:6baefda2e511 176
okano 0:6baefda2e511 177 for ( int i = 0; i < 24; i++ ) {
okano 1:54e619428ae6 178 checksum += bin2uue( b + (i * 45), command_str );
okano 2:8d75eb0ecd20 179 printf( "%02d %s\r", i, command_str );
okano 0:6baefda2e511 180 put_string( command_str );
okano 0:6baefda2e511 181 if ( (i == 19) || (i == 23) ) {
okano 1:54e619428ae6 182 sprintf( command_str, "%ld\n", checksum );
okano 1:54e619428ae6 183 printf( " %ld %s\r\n", checksum, command_str );
okano 0:6baefda2e511 184 printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "OK", 0 ) ? "Fail" : "Pass" );
okano 0:6baefda2e511 185
okano 1:54e619428ae6 186 checksum = 0;
okano 0:6baefda2e511 187 }
okano 0:6baefda2e511 188 }
okano 0:6baefda2e511 189
okano 0:6baefda2e511 190 printf( "\"P 0 0\" %s\r\n", try_and_check( "P 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" );
okano 0:6baefda2e511 191
okano 0:6baefda2e511 192 sprintf( command_str, "C %ld %ld %ld\r\n", FLASH_WRITING_SIZE * transfer_count++, 0x10000300L, FLASH_WRITING_SIZE );
okano 2:8d75eb0ecd20 193 try_and_check( command_str, "0", 0 );
okano 0:6baefda2e511 194
okano 0:6baefda2e511 195
okano 0:6baefda2e511 196 }
okano 2:8d75eb0ecd20 197 try_and_check( "G 0 T\r\n", "0", 0 );
okano 0:6baefda2e511 198 }
okano 0:6baefda2e511 199
okano 1:54e619428ae6 200 int file_size( FILE *fp )
okano 1:54e619428ae6 201 {
okano 1:54e619428ae6 202 int size;
okano 1:54e619428ae6 203
okano 1:54e619428ae6 204 fseek( fp, 0, SEEK_END ); // seek to end of file
okano 1:54e619428ae6 205 size = ftell( fp ); // get current file pointer
okano 1:54e619428ae6 206 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 1:54e619428ae6 207
okano 1:54e619428ae6 208 return size;
okano 1:54e619428ae6 209 }
okano 1:54e619428ae6 210
okano 1:54e619428ae6 211 void reset_target( int isp_pin_state )
okano 1:54e619428ae6 212 {
okano 1:54e619428ae6 213 reset_pin = 1;
okano 1:54e619428ae6 214 isp_pin = 0;
okano 1:54e619428ae6 215 wait_ms( 100 );
okano 1:54e619428ae6 216 reset_pin = 0;
okano 1:54e619428ae6 217 wait_ms( 100 );
okano 1:54e619428ae6 218 reset_pin = 1;
okano 1:54e619428ae6 219 wait_ms( 100 );
okano 1:54e619428ae6 220 }
okano 1:54e619428ae6 221
okano 0:6baefda2e511 222 int main()
okano 0:6baefda2e511 223 {
okano 0:6baefda2e511 224 FILE *fp;
okano 0:6baefda2e511 225 char str_buf0[ STR_BUFF_SIZE ];
okano 0:6baefda2e511 226 char str_buf1[ STR_BUFF_SIZE ];
okano 1:54e619428ae6 227 int data_size;
okano 1:54e619428ae6 228 int last_sector;
okano 0:6baefda2e511 229
okano 2:8d75eb0ecd20 230 target.baud( 9600 );
okano 0:6baefda2e511 231
okano 0:6baefda2e511 232 if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) {
okano 0:6baefda2e511 233 error( "couldn't open source file" );
okano 0:6baefda2e511 234 return ( 1 );
okano 0:6baefda2e511 235 }
okano 0:6baefda2e511 236
okano 1:54e619428ae6 237 data_size = file_size( fp );
okano 1:54e619428ae6 238 last_sector = data_size / SECTOR_SIZE;
okano 0:6baefda2e511 239 printf( "\r\n\r\ntarget RESET\r\n" );
okano 1:54e619428ae6 240 printf( "data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
okano 0:6baefda2e511 241
okano 2:8d75eb0ecd20 242 reset_target( ENTER_TO_ISP_MODE );
okano 2:8d75eb0ecd20 243
okano 2:8d75eb0ecd20 244 try_and_check( "?", "Synchronized", 0 );
okano 0:6baefda2e511 245
okano 2:8d75eb0ecd20 246 try_and_check2( "Synchronized\r\n", "OK", 0 );
okano 2:8d75eb0ecd20 247 try_and_check2( "12000\r\n", "OK", 0 );
okano 2:8d75eb0ecd20 248 try_and_check2( "U 23130\r\n", "0", 0 );
okano 2:8d75eb0ecd20 249 try_and_check2( "A 0\r\n", "0", 0 );
okano 0:6baefda2e511 250
okano 2:8d75eb0ecd20 251 try_and_check( "K\r\n", "0", 0 );
okano 0:6baefda2e511 252 get_string( str_buf0 );
okano 0:6baefda2e511 253 get_string( str_buf1 );
okano 0:6baefda2e511 254 printf( " result of \"K\" = %s %s\r\n", str_buf0, str_buf1 );
okano 0:6baefda2e511 255
okano 2:8d75eb0ecd20 256 try_and_check( "J\r\n", "0", 0 );
okano 0:6baefda2e511 257 get_string( str_buf0 );
okano 0:6baefda2e511 258 printf( " result of \"J\" = %s\r\n", str_buf0 );
okano 0:6baefda2e511 259
okano 2:8d75eb0ecd20 260 erase_sectors( last_sector );
okano 2:8d75eb0ecd20 261 write_binary_data( fp );
okano 0:6baefda2e511 262
okano 0:6baefda2e511 263 fclose( fp );
okano 0:6baefda2e511 264
okano 2:8d75eb0ecd20 265 int i = 0;
okano 2:8d75eb0ecd20 266
okano 2:8d75eb0ecd20 267 while ( 1 ) {
okano 2:8d75eb0ecd20 268 leds = 0x1 << (i++ & 0x3);
okano 2:8d75eb0ecd20 269 wait( 0.1 );
okano 2:8d75eb0ecd20 270 }
okano 0:6baefda2e511 271 }
okano 0:6baefda2e511 272
okano 2:8d75eb0ecd20 273
okano 0:6baefda2e511 274 void put_string( char *s )
okano 0:6baefda2e511 275 {
okano 2:8d75eb0ecd20 276 char c;
okano 2:8d75eb0ecd20 277 static int i = 0;
okano 0:6baefda2e511 278
okano 3:3c380e643e74 279 while ( c = *s++ ) {
okano 0:6baefda2e511 280 target.putc( c );
okano 2:8d75eb0ecd20 281 leds = i++ & 0x1;
okano 2:8d75eb0ecd20 282 }
okano 0:6baefda2e511 283 }
okano 0:6baefda2e511 284
okano 0:6baefda2e511 285 void get_string( char *s )
okano 0:6baefda2e511 286 {
okano 0:6baefda2e511 287 int i = 0;
okano 0:6baefda2e511 288 char c = 0;
okano 0:6baefda2e511 289
okano 0:6baefda2e511 290 do {
okano 0:6baefda2e511 291 do {
okano 0:6baefda2e511 292 if ( target.readable() ) {
okano 0:6baefda2e511 293 c = target.getc();
okano 0:6baefda2e511 294
okano 0:6baefda2e511 295 if ( ( c == '\n') || (c == '\r') )
okano 0:6baefda2e511 296 break;
okano 0:6baefda2e511 297
okano 0:6baefda2e511 298 *s++ = c;
okano 0:6baefda2e511 299 i++;
okano 0:6baefda2e511 300 }
okano 0:6baefda2e511 301 } while ( 1 );
okano 0:6baefda2e511 302 } while ( !i );
okano 2:8d75eb0ecd20 303
okano 0:6baefda2e511 304 *s = '\0';
okano 0:6baefda2e511 305 }
okano 0:6baefda2e511 306