Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Mon Sep 09 11:42:06 2013 +0000
Revision:
16:cac2348cfcfb
Parent:
15:051ca36cc64b
Child:
17:339f40a14f67
mbed goes into "serial through mode" after ISP writing finished

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 11:8dfc3217d1ca 1 /**
okano 11:8dfc3217d1ca 2 * Sample of ISP operation for NXP MCUs
okano 11:8dfc3217d1ca 3 *
okano 14:a7b9f74fb856 4 * @author Tedd OKANO
okano 14:a7b9f74fb856 5 * @version 0.6
okano 11:8dfc3217d1ca 6 * @date Aug-2013
okano 14:a7b9f74fb856 7 *
okano 14:a7b9f74fb856 8 * This program programs MCU flash memory through UART. It uses
okano 14:a7b9f74fb856 9 * "In-System Programming (ISP)" interface in target MCU (NXP LPC micro-
okano 14:a7b9f74fb856 10 * controllers).
okano 14:a7b9f74fb856 11 *
okano 14:a7b9f74fb856 12 * The ISP is done by PC and serial cable normally. The ISP protocol is
okano 14:a7b9f74fb856 13 * executed software on a PC. The software reads a data file and transfers
okano 14:a7b9f74fb856 14 * the data with the ISP protocol.
okano 14:a7b9f74fb856 15 * This program does same process of that. The mbed perform the function like
okano 14:a7b9f74fb856 16 * "FlashMagic" and "lpc21isp".
okano 14:a7b9f74fb856 17 * (This program not just copies the binary but also insert 4 byte checksum at
okano 14:a7b9f74fb856 18 * address 0x1C.)
okano 14:a7b9f74fb856 19 *
okano 14:a7b9f74fb856 20 * This program currently supports LPC1114(LPC1114FN28/102 - DIP28-ARM) and
okano 14:a7b9f74fb856 21 * LPC810(LPC810M021FN8 - DIP8-ARM).
okano 11:8dfc3217d1ca 22 */
okano 11:8dfc3217d1ca 23
okano 5:ff30f5b58617 24 #include "mbed.h"
okano 5:ff30f5b58617 25 #include "target_table.h"
okano 0:6baefda2e511 26
okano 2:8d75eb0ecd20 27 BusOut leds( LED4, LED3, LED2, LED1 );
okano 2:8d75eb0ecd20 28 DigitalOut reset_pin( p26 );
okano 2:8d75eb0ecd20 29 DigitalOut isp_pin( p25 );
okano 2:8d75eb0ecd20 30 Serial target ( p28, p27 );
okano 16:cac2348cfcfb 31 Serial pc ( USBTX,USBRX );
okano 2:8d75eb0ecd20 32 LocalFileSystem local( "local" );
okano 16:cac2348cfcfb 33 Ticker success;
okano 0:6baefda2e511 34
okano 12:5a33b5d39792 35 #define ENTER_TO_ISP_MODE 0
okano 12:5a33b5d39792 36 #define NO_ISP_MODE 1
okano 12:5a33b5d39792 37 #define STR_BUFF_SIZE 64
okano 12:5a33b5d39792 38
okano 1:54e619428ae6 39 #define SOURCE_FILE "/local/bin"
okano 16:cac2348cfcfb 40 #define ISP_BAUD_RATE 115200
okano 16:cac2348cfcfb 41 //#define ISP_BAUD_RATE 57600
okano 16:cac2348cfcfb 42 //#define ISP_BAUD_RATE 9600
okano 16:cac2348cfcfb 43
okano 16:cac2348cfcfb 44 #define TARGET_OPERATION_BAUD_RATE 9600
okano 4:55f1977bd11a 45
okano 8:b220fadbb3d8 46 int error_state = 0;
okano 7:815366f003ee 47
okano 7:815366f003ee 48 int file_size( FILE *fp );
okano 7:815366f003ee 49 void reset_target( int isp_pin_state );
okano 7:815366f003ee 50 int try_and_check( char *command, char *expected_return_str, int mode );
okano 7:815366f003ee 51 int try_and_check2( char *command, char *expected_return_str, int mode );
okano 7:815366f003ee 52 void print_command( char *command );
okano 7:815366f003ee 53 void print_result( int r );
okano 7:815366f003ee 54 char read_byte( void );
okano 7:815366f003ee 55 void erase_sectors( int last_sector );
okano 12:5a33b5d39792 56 int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int );
okano 12:5a33b5d39792 57 int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start );
okano 7:815366f003ee 58 void initialize_uue_table( void );
okano 11:8dfc3217d1ca 59 long bin2uue( char *bin, char *str, int size );
okano 12:5a33b5d39792 60 int get_flash_writing_size( int ram_size, unsigned int ram_start );
okano 7:815366f003ee 61 void add_isp_checksum( char *b );
okano 7:815366f003ee 62 void send_RAM_transfer_checksum( int checksum );
okano 7:815366f003ee 63 void put_string( char *s );
okano 12:5a33b5d39792 64 void put_binary( char *b, int size );
okano 7:815366f003ee 65 void get_string( char *s );
okano 16:cac2348cfcfb 66 void success_indicator();
okano 7:815366f003ee 67
okano 12:5a33b5d39792 68 #pragma diag_suppress 1293 // surpressing a warning message of "assignment in condition" ;)
okano 12:5a33b5d39792 69
okano 7:815366f003ee 70
okano 7:815366f003ee 71 int main()
okano 7:815366f003ee 72 {
okano 7:815366f003ee 73 FILE *fp;
okano 7:815366f003ee 74 char str_buf0[ STR_BUFF_SIZE ];
okano 7:815366f003ee 75 char str_buf1[ STR_BUFF_SIZE ];
okano 7:815366f003ee 76 int data_size;
okano 7:815366f003ee 77 int last_sector;
okano 7:815366f003ee 78 target_param *tpp;
okano 8:b220fadbb3d8 79
okano 7:815366f003ee 80 printf( "\r\n\r\n\r\nmbed ISP program : programming LPC device from mbed\r\n" );
okano 7:815366f003ee 81
okano 16:cac2348cfcfb 82 target.baud( ISP_BAUD_RATE );
okano 8:b220fadbb3d8 83
okano 7:815366f003ee 84 reset_target( ENTER_TO_ISP_MODE );
okano 8:b220fadbb3d8 85
okano 7:815366f003ee 86 try_and_check( "?", "Synchronized", 0 );
okano 8:b220fadbb3d8 87
okano 7:815366f003ee 88 try_and_check2( "Synchronized\r\n", "OK", 0 );
okano 7:815366f003ee 89 try_and_check2( "12000\r\n", "OK", 0 );
okano 7:815366f003ee 90 try_and_check2( "U 23130\r\n", "0", 0 );
okano 7:815366f003ee 91 try_and_check2( "A 0\r\n", "0", 0 );
okano 8:b220fadbb3d8 92
okano 7:815366f003ee 93 try_and_check( "K\r\n", "0", 0 );
okano 7:815366f003ee 94 get_string( str_buf0 );
okano 7:815366f003ee 95 get_string( str_buf1 );
okano 8:b220fadbb3d8 96
okano 7:815366f003ee 97 printf( " result of \"K\" = %s %s\r\n", str_buf0, str_buf1 );
okano 8:b220fadbb3d8 98
okano 7:815366f003ee 99 try_and_check( "J\r\n", "0", 0 );
okano 7:815366f003ee 100 get_string( str_buf0 );
okano 8:b220fadbb3d8 101
okano 7:815366f003ee 102 printf( " result of \"J\" = %s\r\n", str_buf0 );
okano 8:b220fadbb3d8 103
okano 7:815366f003ee 104 tpp = find_target_param( str_buf0 );
okano 8:b220fadbb3d8 105 printf( " target device found : type = \"%s\"\r\n", tpp->type_name );
okano 8:b220fadbb3d8 106 printf( " ID = 0x%08X\r\n", tpp->id );
okano 8:b220fadbb3d8 107 printf( " RAM size = %10d bytes\r\n", tpp->ram_size );
okano 8:b220fadbb3d8 108 printf( " flash size = %10d bytes\r\n", tpp->flash_size );
okano 8:b220fadbb3d8 109
okano 12:5a33b5d39792 110 printf( " opening file: \"%s\"\r\n", SOURCE_FILE );
okano 12:5a33b5d39792 111
okano 12:5a33b5d39792 112 if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) {
okano 12:5a33b5d39792 113 error( "couldn't open source file" );
okano 12:5a33b5d39792 114 return ( 1 );
okano 12:5a33b5d39792 115 }
okano 12:5a33b5d39792 116
okano 12:5a33b5d39792 117 data_size = file_size( fp );
okano 12:5a33b5d39792 118 last_sector = data_size / tpp->sector_size;
okano 12:5a33b5d39792 119
okano 12:5a33b5d39792 120 printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
okano 12:5a33b5d39792 121 printf( " resetting target\r\n" );
okano 12:5a33b5d39792 122
okano 7:815366f003ee 123 erase_sectors( last_sector );
okano 12:5a33b5d39792 124
okano 12:5a33b5d39792 125 if ( tpp->write_type == BINARY )
okano 12:5a33b5d39792 126 write_binary_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address );
okano 12:5a33b5d39792 127 else // UUENCODE
okano 12:5a33b5d39792 128 write_uuencoded_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address );
okano 12:5a33b5d39792 129
okano 7:815366f003ee 130 fclose( fp );
okano 8:b220fadbb3d8 131
okano 8:b220fadbb3d8 132 printf( "\r\n %s\r\n\r\n",
okano 8:b220fadbb3d8 133 error_state ?
okano 8:b220fadbb3d8 134 "** The data could not be written :(" :
okano 8:b220fadbb3d8 135 "** The data has been written successflly :)"
okano 8:b220fadbb3d8 136 );
okano 8:b220fadbb3d8 137
okano 16:cac2348cfcfb 138 #define AUTO_PROGRAM_START
okano 14:a7b9f74fb856 139 #ifdef AUTO_PROGRAM_START
okano 16:cac2348cfcfb 140 target.baud( TARGET_OPERATION_BAUD_RATE );
okano 16:cac2348cfcfb 141
okano 14:a7b9f74fb856 142 reset_target( NO_ISP_MODE );
okano 16:cac2348cfcfb 143 printf( " ** The program in flash has been started!!\r\n" );
okano 14:a7b9f74fb856 144 #endif
okano 14:a7b9f74fb856 145
okano 16:cac2348cfcfb 146 printf( " (now the mbed is working in \"serial through mode\")\r\n\r\n" );
okano 16:cac2348cfcfb 147
okano 16:cac2348cfcfb 148 success.attach( &success_indicator, 0.1 );
okano 16:cac2348cfcfb 149
okano 16:cac2348cfcfb 150 while (1) {
okano 8:b220fadbb3d8 151
okano 16:cac2348cfcfb 152 if ( pc.readable() ) {
okano 16:cac2348cfcfb 153 target.putc( pc.getc() );
okano 16:cac2348cfcfb 154 }
okano 16:cac2348cfcfb 155
okano 16:cac2348cfcfb 156 if ( target.readable() ) {
okano 16:cac2348cfcfb 157 pc.putc( target.getc() );
okano 16:cac2348cfcfb 158 }
okano 16:cac2348cfcfb 159
okano 7:815366f003ee 160 }
okano 7:815366f003ee 161 }
okano 7:815366f003ee 162
okano 7:815366f003ee 163
okano 7:815366f003ee 164 int file_size( FILE *fp )
okano 7:815366f003ee 165 {
okano 7:815366f003ee 166 int size;
okano 8:b220fadbb3d8 167
okano 7:815366f003ee 168 fseek( fp, 0, SEEK_END ); // seek to end of file
okano 7:815366f003ee 169 size = ftell( fp ); // get current file pointer
okano 7:815366f003ee 170 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 8:b220fadbb3d8 171
okano 7:815366f003ee 172 return size;
okano 7:815366f003ee 173 }
okano 7:815366f003ee 174
okano 7:815366f003ee 175
okano 7:815366f003ee 176 void reset_target( int isp_pin_state )
okano 7:815366f003ee 177 {
okano 7:815366f003ee 178 reset_pin = 1;
okano 13:60995bf8b2c7 179 isp_pin = isp_pin_state;
okano 7:815366f003ee 180 wait_ms( 100 );
okano 13:60995bf8b2c7 181
okano 7:815366f003ee 182 reset_pin = 0;
okano 7:815366f003ee 183 wait_ms( 100 );
okano 13:60995bf8b2c7 184
okano 7:815366f003ee 185 reset_pin = 1;
okano 7:815366f003ee 186 wait_ms( 100 );
okano 7:815366f003ee 187 }
okano 7:815366f003ee 188
okano 7:815366f003ee 189
okano 7:815366f003ee 190 int try_and_check( char *command, char *expected_return_str, int mode )
okano 7:815366f003ee 191 {
okano 7:815366f003ee 192 char rtn_str[ STR_BUFF_SIZE ];
okano 8:b220fadbb3d8 193 int result = 1;
okano 8:b220fadbb3d8 194
okano 7:815366f003ee 195 print_command( command );
okano 7:815366f003ee 196 put_string( command );
okano 8:b220fadbb3d8 197
okano 7:815366f003ee 198 get_string( rtn_str );
okano 7:815366f003ee 199 print_result( result = strcmp( expected_return_str, rtn_str ) );
okano 8:b220fadbb3d8 200
okano 8:b220fadbb3d8 201 if ( result && !mode )
okano 8:b220fadbb3d8 202 error( "command failed\r\n" );
okano 8:b220fadbb3d8 203
okano 8:b220fadbb3d8 204 error_state |= result;
okano 8:b220fadbb3d8 205
okano 7:815366f003ee 206 return ( result );
okano 7:815366f003ee 207 }
okano 7:815366f003ee 208
okano 7:815366f003ee 209
okano 7:815366f003ee 210 int try_and_check2( char *command, char *expected_return_str, int mode )
okano 7:815366f003ee 211 {
okano 7:815366f003ee 212 char rtn_str[ STR_BUFF_SIZE ];
okano 8:b220fadbb3d8 213 int result = 1;
okano 8:b220fadbb3d8 214
okano 7:815366f003ee 215 print_command( command );
okano 7:815366f003ee 216 put_string( command );
okano 8:b220fadbb3d8 217
okano 7:815366f003ee 218 get_string( rtn_str ); // just readout echoback
okano 7:815366f003ee 219 get_string( rtn_str );
okano 7:815366f003ee 220 print_result( result = strcmp( expected_return_str, rtn_str ) );
okano 8:b220fadbb3d8 221
okano 8:b220fadbb3d8 222 if ( result && !mode )
okano 8:b220fadbb3d8 223 error( "command failed\r\n" );
okano 8:b220fadbb3d8 224
okano 8:b220fadbb3d8 225 error_state |= result;
okano 8:b220fadbb3d8 226
okano 7:815366f003ee 227 return ( result );
okano 7:815366f003ee 228 }
okano 7:815366f003ee 229
okano 7:815366f003ee 230
okano 7:815366f003ee 231 void print_command( char *command )
okano 7:815366f003ee 232 {
okano 7:815366f003ee 233 char s[ STR_BUFF_SIZE ];
okano 7:815366f003ee 234 char *pos;
okano 8:b220fadbb3d8 235
okano 7:815366f003ee 236 strcpy( s, command );
okano 8:b220fadbb3d8 237
okano 7:815366f003ee 238 if ( pos = strchr( s, '\r' ) )
okano 7:815366f003ee 239 *pos = '\0';
okano 8:b220fadbb3d8 240
okano 7:815366f003ee 241 if ( pos = strchr( s, '\n' ) )
okano 7:815366f003ee 242 *pos = '\0';
okano 8:b220fadbb3d8 243
okano 7:815366f003ee 244 printf( " command-\"%s\" : ", s );
okano 7:815366f003ee 245 }
okano 7:815366f003ee 246
okano 7:815366f003ee 247
okano 7:815366f003ee 248 void print_result( int r )
okano 7:815366f003ee 249 {
okano 7:815366f003ee 250 printf( "%s\r\n", r ? "Fail" : "Pass" );
okano 7:815366f003ee 251 }
okano 7:815366f003ee 252
okano 7:815366f003ee 253
okano 7:815366f003ee 254 char read_byte( void )
okano 7:815366f003ee 255 {
okano 7:815366f003ee 256 while ( !target.readable() )
okano 7:815366f003ee 257 ;
okano 8:b220fadbb3d8 258
okano 7:815366f003ee 259 return ( target.getc() );
okano 7:815366f003ee 260 }
okano 7:815366f003ee 261
okano 7:815366f003ee 262
okano 7:815366f003ee 263 void erase_sectors( int last_sector )
okano 7:815366f003ee 264 {
okano 7:815366f003ee 265 char command_str[ STR_BUFF_SIZE ];
okano 8:b220fadbb3d8 266
okano 7:815366f003ee 267 sprintf( command_str, "P 0 %d\r\n", last_sector );
okano 7:815366f003ee 268 try_and_check( command_str, "0", 0 );
okano 8:b220fadbb3d8 269
okano 7:815366f003ee 270 *(command_str) = 'E';
okano 7:815366f003ee 271 try_and_check( command_str, "0", 0 );
okano 7:815366f003ee 272 }
okano 7:815366f003ee 273
okano 12:5a33b5d39792 274 #define BYTES_PER_LINE 45
okano 12:5a33b5d39792 275 char uue_table[ 64 ];
okano 7:815366f003ee 276
okano 12:5a33b5d39792 277 int write_uuencoded_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start )
okano 7:815366f003ee 278 {
okano 7:815366f003ee 279 char command_str[ STR_BUFF_SIZE ];
okano 7:815366f003ee 280 long checksum = 0;
okano 7:815366f003ee 281 int total_size = 0;
okano 7:815366f003ee 282 int size;
okano 8:b220fadbb3d8 283
okano 7:815366f003ee 284 int flash_writing_size;
okano 7:815366f003ee 285 int lines_per_transfer;
okano 7:815366f003ee 286 int transfer_size;
okano 8:b220fadbb3d8 287
okano 12:5a33b5d39792 288 char *b;
okano 12:5a33b5d39792 289
okano 7:815366f003ee 290 initialize_uue_table();
okano 8:b220fadbb3d8 291
okano 12:5a33b5d39792 292 flash_writing_size = get_flash_writing_size( ram_size, ram_start );
okano 11:8dfc3217d1ca 293 lines_per_transfer = ((flash_writing_size / BYTES_PER_LINE) + 1);
okano 11:8dfc3217d1ca 294 transfer_size = (((flash_writing_size + 11) / 12) * 12);
okano 8:b220fadbb3d8 295
okano 7:815366f003ee 296 // char b[ transfer_size ]; // this can be done in mbed-compiler. but I should do it in common way
okano 8:b220fadbb3d8 297
okano 7:815366f003ee 298 if ( NULL == (b = (char *)malloc( transfer_size * sizeof( char ) )) )
okano 7:815366f003ee 299 error( "malloc error happened\r\n" );
okano 8:b220fadbb3d8 300
okano 7:815366f003ee 301 for ( int i = flash_writing_size; i < transfer_size; i++ )
okano 7:815366f003ee 302 b[ i ] = 0; // this is not neccesary but just stuffing stuffing bytes
okano 8:b220fadbb3d8 303
okano 7:815366f003ee 304 while ( size = fread( b, sizeof( char ), flash_writing_size, fp ) ) {
okano 8:b220fadbb3d8 305
okano 7:815366f003ee 306 if ( !total_size ) {
okano 7:815366f003ee 307 // overwriting 4 bytes data for address=0x1C
okano 7:815366f003ee 308 // there is a slot for checksum that is checked in (target's) boot process
okano 7:815366f003ee 309 add_isp_checksum( b );
okano 7:815366f003ee 310 }
okano 8:b220fadbb3d8 311
okano 12:5a33b5d39792 312 sprintf( command_str, "W %ld %ld\r\n", ram_start, transfer_size );
okano 7:815366f003ee 313 try_and_check( command_str, "0", 0 );
okano 8:b220fadbb3d8 314
okano 7:815366f003ee 315 for ( int i = 0; i < lines_per_transfer; i++ ) {
okano 12:5a33b5d39792 316
okano 11:8dfc3217d1ca 317 checksum += bin2uue( b + (i * BYTES_PER_LINE), command_str, i == (lines_per_transfer - 1) ? (transfer_size % BYTES_PER_LINE) : BYTES_PER_LINE );
okano 8:b220fadbb3d8 318
okano 13:60995bf8b2c7 319 // printf( " data -- %02d %s\r", i, command_str );
okano 8:b220fadbb3d8 320
okano 7:815366f003ee 321 put_string( command_str );
okano 8:b220fadbb3d8 322
okano 7:815366f003ee 323 if ( !((i + 1) % 20) ) {
okano 7:815366f003ee 324 send_RAM_transfer_checksum( checksum );
okano 7:815366f003ee 325 checksum = 0;
okano 7:815366f003ee 326 }
okano 7:815366f003ee 327 }
okano 8:b220fadbb3d8 328
okano 7:815366f003ee 329 send_RAM_transfer_checksum( checksum );
okano 7:815366f003ee 330 checksum = 0;
okano 8:b220fadbb3d8 331
okano 12:5a33b5d39792 332 sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size );
okano 7:815366f003ee 333 try_and_check( command_str, "0", 0 );
okano 8:b220fadbb3d8 334
okano 12:5a33b5d39792 335 sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size );
okano 7:815366f003ee 336 try_and_check( command_str, "0", 0 );
okano 8:b220fadbb3d8 337
okano 7:815366f003ee 338 total_size += size;
okano 7:815366f003ee 339 }
okano 8:b220fadbb3d8 340
okano 7:815366f003ee 341 try_and_check( "G 0 T\r\n", "0", 0 );
okano 7:815366f003ee 342 free( b );
okano 8:b220fadbb3d8 343
okano 12:5a33b5d39792 344 return ( total_size );
okano 7:815366f003ee 345 }
okano 7:815366f003ee 346
okano 7:815366f003ee 347
okano 12:5a33b5d39792 348 int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start )
okano 12:5a33b5d39792 349 {
okano 12:5a33b5d39792 350 char command_str[ STR_BUFF_SIZE ];
okano 12:5a33b5d39792 351 int total_size = 0;
okano 12:5a33b5d39792 352 int size;
okano 12:5a33b5d39792 353 int flash_writing_size;
okano 12:5a33b5d39792 354 char *b;
okano 12:5a33b5d39792 355
okano 12:5a33b5d39792 356 flash_writing_size = 256;
okano 12:5a33b5d39792 357
okano 12:5a33b5d39792 358 if ( NULL == (b = (char *)malloc( flash_writing_size * sizeof( char ) )) )
okano 12:5a33b5d39792 359 error( "malloc error happened\r\n" );
okano 12:5a33b5d39792 360
okano 12:5a33b5d39792 361 while ( size = fread( b, sizeof( char ), flash_writing_size, fp ) ) {
okano 12:5a33b5d39792 362
okano 12:5a33b5d39792 363 if ( !total_size ) {
okano 12:5a33b5d39792 364 // overwriting 4 bytes data for address=0x1C
okano 12:5a33b5d39792 365 // there is a slot for checksum that is checked in (target's) boot process
okano 12:5a33b5d39792 366 add_isp_checksum( b );
okano 12:5a33b5d39792 367 }
okano 12:5a33b5d39792 368
okano 12:5a33b5d39792 369 sprintf( command_str, "W %ld %ld\r\n", ram_start, flash_writing_size );
okano 12:5a33b5d39792 370 try_and_check( command_str, "0", 0 );
okano 12:5a33b5d39792 371
okano 12:5a33b5d39792 372 put_binary( b, flash_writing_size );
okano 12:5a33b5d39792 373 put_string( "\r\n" );
okano 12:5a33b5d39792 374
okano 12:5a33b5d39792 375 sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size );
okano 12:5a33b5d39792 376 try_and_check( command_str, "0", 0 );
okano 12:5a33b5d39792 377
okano 12:5a33b5d39792 378 sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size );
okano 12:5a33b5d39792 379 try_and_check( command_str, "0", 0 );
okano 12:5a33b5d39792 380
okano 12:5a33b5d39792 381 total_size += size;
okano 12:5a33b5d39792 382 printf( " total %d bytes transferred\r", total_size );
okano 12:5a33b5d39792 383
okano 12:5a33b5d39792 384 }
okano 12:5a33b5d39792 385
okano 12:5a33b5d39792 386 free( b );
okano 12:5a33b5d39792 387
okano 12:5a33b5d39792 388 return ( total_size );
okano 12:5a33b5d39792 389 }
okano 12:5a33b5d39792 390
okano 7:815366f003ee 391 void initialize_uue_table( void )
okano 7:815366f003ee 392 {
okano 7:815366f003ee 393 int i;
okano 8:b220fadbb3d8 394
okano 7:815366f003ee 395 uue_table[0] = 0x60; // 0x20 is translated to 0x60 !
okano 8:b220fadbb3d8 396
okano 7:815366f003ee 397 for (i = 1; i < 64; i++) {
okano 7:815366f003ee 398 uue_table[i] = (char)(0x20 + i);
okano 7:815366f003ee 399 }
okano 7:815366f003ee 400 }
okano 7:815366f003ee 401
okano 7:815366f003ee 402
okano 11:8dfc3217d1ca 403 long bin2uue( char *bin, char *str, int size )
okano 7:815366f003ee 404 {
okano 7:815366f003ee 405 unsigned long v;
okano 7:815366f003ee 406 long checksum = 0;
okano 7:815366f003ee 407 int strpos = 0;
okano 8:b220fadbb3d8 408
okano 11:8dfc3217d1ca 409 *(str + strpos++) = ' ' + size;
okano 8:b220fadbb3d8 410
okano 11:8dfc3217d1ca 411 for ( int i = 0; i < size; i += 3 ) {
okano 7:815366f003ee 412 checksum += *(bin + i + 0) + *(bin + i + 1) + *(bin + i + 2);
okano 7:815366f003ee 413 v = (*(bin + i + 0) << 16) | (*(bin + i + 1) << 8) | (*(bin + i + 2) << 0);
okano 7:815366f003ee 414 *(str + strpos++) = uue_table[ (v >> 18) & 0x3F ];
okano 7:815366f003ee 415 *(str + strpos++) = uue_table[ (v >> 12) & 0x3F ];
okano 7:815366f003ee 416 *(str + strpos++) = uue_table[ (v >> 6) & 0x3F ];
okano 7:815366f003ee 417 *(str + strpos++) = uue_table[ (v >> 0) & 0x3F ];
okano 7:815366f003ee 418 }
okano 7:815366f003ee 419 *(str + strpos++) = '\n';
okano 7:815366f003ee 420 *(str + strpos++) = '\0';
okano 8:b220fadbb3d8 421
okano 7:815366f003ee 422 return checksum;
okano 7:815366f003ee 423 }
okano 6:0ae6fe8c8512 424
okano 6:0ae6fe8c8512 425
okano 12:5a33b5d39792 426 int get_flash_writing_size( int ram_size, unsigned int ram_start )
okano 6:0ae6fe8c8512 427 {
okano 6:0ae6fe8c8512 428 int flash_writing_size[] = {
okano 6:0ae6fe8c8512 429 4096,
okano 6:0ae6fe8c8512 430 1024,
okano 6:0ae6fe8c8512 431 512,
okano 6:0ae6fe8c8512 432 256
okano 6:0ae6fe8c8512 433 };
okano 6:0ae6fe8c8512 434 int available_size;
okano 6:0ae6fe8c8512 435 int i;
okano 8:b220fadbb3d8 436
okano 12:5a33b5d39792 437 available_size = ram_size - (ram_start & 0xFFFF);
okano 8:b220fadbb3d8 438
okano 6:0ae6fe8c8512 439 for ( i = 0; i < sizeof( flash_writing_size ) / sizeof( int ); i++ ) {
okano 6:0ae6fe8c8512 440 if ( flash_writing_size[ i ] < available_size )
okano 6:0ae6fe8c8512 441 break;
okano 6:0ae6fe8c8512 442 }
okano 8:b220fadbb3d8 443
okano 6:0ae6fe8c8512 444 return ( flash_writing_size[ i ] );
okano 6:0ae6fe8c8512 445 }
okano 4:55f1977bd11a 446
okano 4:55f1977bd11a 447
okano 1:54e619428ae6 448 void add_isp_checksum( char *b )
okano 1:54e619428ae6 449 {
okano 1:54e619428ae6 450 // see http://www.lpcware.com/content/nxpfile/lpc177x8x-checksum-insertion-program
okano 8:b220fadbb3d8 451
okano 1:54e619428ae6 452 unsigned int *p;
okano 1:54e619428ae6 453 unsigned int cksum = 0;
okano 8:b220fadbb3d8 454
okano 1:54e619428ae6 455 p = (unsigned int *)b;
okano 8:b220fadbb3d8 456
okano 1:54e619428ae6 457 for ( int i = 0; i < 7; i++ ) {
okano 1:54e619428ae6 458 cksum += *p++;
okano 1:54e619428ae6 459 }
okano 8:b220fadbb3d8 460
okano 1:54e619428ae6 461 printf( " -- value at checksum slot : 0x%08X\r\n", *p );
okano 8:b220fadbb3d8 462
okano 1:54e619428ae6 463 *p = 0xFFFFFFFF - cksum + 1;
okano 1:54e619428ae6 464 printf( " -- calculated checksum : 0x%08X\r\n", *p );
okano 8:b220fadbb3d8 465
okano 1:54e619428ae6 466 printf( " new checksum will be used to program flash\r\n" );
okano 1:54e619428ae6 467 }
okano 1:54e619428ae6 468
okano 1:54e619428ae6 469
okano 4:55f1977bd11a 470 void send_RAM_transfer_checksum( int checksum )
okano 4:55f1977bd11a 471 {
okano 4:55f1977bd11a 472 char command[ 16 ];
okano 8:b220fadbb3d8 473
okano 4:55f1977bd11a 474 sprintf( command, "%d\n", checksum );
okano 4:55f1977bd11a 475 try_and_check( command, "OK", 0 );
okano 4:55f1977bd11a 476 }
okano 4:55f1977bd11a 477
okano 0:6baefda2e511 478
okano 0:6baefda2e511 479 void put_string( char *s )
okano 0:6baefda2e511 480 {
okano 2:8d75eb0ecd20 481 char c;
okano 2:8d75eb0ecd20 482 static int i = 0;
okano 8:b220fadbb3d8 483
okano 3:3c380e643e74 484 while ( c = *s++ ) {
okano 0:6baefda2e511 485 target.putc( c );
okano 2:8d75eb0ecd20 486 leds = i++ & 0x1;
okano 2:8d75eb0ecd20 487 }
okano 0:6baefda2e511 488 }
okano 0:6baefda2e511 489
okano 7:815366f003ee 490
okano 12:5a33b5d39792 491 void put_binary( char *b, int size )
okano 12:5a33b5d39792 492 {
okano 12:5a33b5d39792 493 for ( int i = 0; i < size; i++ )
okano 12:5a33b5d39792 494 target.putc( *b++ );
okano 12:5a33b5d39792 495 }
okano 12:5a33b5d39792 496
okano 12:5a33b5d39792 497
okano 9:ca4c9a2ac8e1 498 Timeout timeout;
okano 9:ca4c9a2ac8e1 499
okano 9:ca4c9a2ac8e1 500 int timeout_flag = 0;
okano 9:ca4c9a2ac8e1 501
okano 9:ca4c9a2ac8e1 502 void set_flag()
okano 9:ca4c9a2ac8e1 503 {
okano 9:ca4c9a2ac8e1 504 timeout_flag = 1;
okano 9:ca4c9a2ac8e1 505 }
okano 9:ca4c9a2ac8e1 506
okano 9:ca4c9a2ac8e1 507
okano 0:6baefda2e511 508 void get_string( char *s )
okano 0:6baefda2e511 509 {
okano 0:6baefda2e511 510 int i = 0;
okano 0:6baefda2e511 511 char c = 0;
okano 9:ca4c9a2ac8e1 512 timeout_flag = 0;
okano 9:ca4c9a2ac8e1 513
okano 9:ca4c9a2ac8e1 514 timeout.attach( &set_flag, 1 );
okano 8:b220fadbb3d8 515
okano 0:6baefda2e511 516 do {
okano 0:6baefda2e511 517 do {
okano 0:6baefda2e511 518 if ( target.readable() ) {
okano 0:6baefda2e511 519 c = target.getc();
okano 8:b220fadbb3d8 520
okano 0:6baefda2e511 521 if ( ( c == '\n') || (c == '\r') )
okano 0:6baefda2e511 522 break;
okano 8:b220fadbb3d8 523
okano 0:6baefda2e511 524 *s++ = c;
okano 0:6baefda2e511 525 i++;
okano 0:6baefda2e511 526 }
okano 9:ca4c9a2ac8e1 527
okano 9:ca4c9a2ac8e1 528 if ( timeout_flag )
okano 9:ca4c9a2ac8e1 529 return;
okano 0:6baefda2e511 530 } while ( 1 );
okano 0:6baefda2e511 531 } while ( !i );
okano 8:b220fadbb3d8 532
okano 0:6baefda2e511 533 *s = '\0';
okano 0:6baefda2e511 534 }
okano 9:ca4c9a2ac8e1 535
okano 16:cac2348cfcfb 536
okano 16:cac2348cfcfb 537 void success_indicator()
okano 16:cac2348cfcfb 538 {
okano 16:cac2348cfcfb 539 static int i = 0;
okano 16:cac2348cfcfb 540
okano 16:cac2348cfcfb 541 leds = 0x1 << (i++ & 0x3);
okano 16:cac2348cfcfb 542 }
okano 16:cac2348cfcfb 543