Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Sun Aug 25 01:49:08 2013 +0000
Revision:
5:ff30f5b58617
Parent:
4:55f1977bd11a
Child:
6:0ae6fe8c8512
target_table_added

Who changed what in which revision?

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