Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Fri Sep 13 03:34:43 2013 +0000
Revision:
22:bd98a782fba6
Parent:
21:e149d0bdbf4a
Child:
23:017f306cf3ca
dividing code into modules

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 19:7a7381e78025 5 * @version 0.8
okano 18:b401da200216 6 * @date Sep-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 22:bd98a782fba6 26 #include "serial_utilities.h"
okano 22:bd98a782fba6 27 #include "command_interface.h"
okano 22:bd98a782fba6 28 #include "writing.h"
okano 22:bd98a782fba6 29 #include "uu_coding.h"
okano 21:e149d0bdbf4a 30 #include "ika.h"
okano 21:e149d0bdbf4a 31
okano 0:6baefda2e511 32
okano 2:8d75eb0ecd20 33 BusOut leds( LED4, LED3, LED2, LED1 );
okano 2:8d75eb0ecd20 34 DigitalOut reset_pin( p26 );
okano 2:8d75eb0ecd20 35 DigitalOut isp_pin( p25 );
okano 2:8d75eb0ecd20 36 LocalFileSystem local( "local" );
okano 16:cac2348cfcfb 37 Ticker success;
okano 0:6baefda2e511 38
okano 19:7a7381e78025 39
okano 19:7a7381e78025 40
okano 19:7a7381e78025 41
okano 19:7a7381e78025 42
okano 12:5a33b5d39792 43 #define ENTER_TO_ISP_MODE 0
okano 12:5a33b5d39792 44 #define NO_ISP_MODE 1
okano 12:5a33b5d39792 45
okano 1:54e619428ae6 46 #define SOURCE_FILE "/local/bin"
okano 18:b401da200216 47
okano 18:b401da200216 48 // "ISP_BAUD_RATE" is baud rate for ISP operation
okano 18:b401da200216 49
okano 16:cac2348cfcfb 50 #define ISP_BAUD_RATE 115200
okano 16:cac2348cfcfb 51 //#define ISP_BAUD_RATE 57600
okano 16:cac2348cfcfb 52 //#define ISP_BAUD_RATE 9600
okano 16:cac2348cfcfb 53
okano 18:b401da200216 54 // "TARGET_OPERATION_BAUD_RATE" is baud rate for USB-serial bridge operation after
okano 18:b401da200216 55 // ISP completion.
okano 18:b401da200216 56 // if the target application uses serial(UART) and you use the bridge feature,
okano 18:b401da200216 57 // please set this value correctly.
okano 18:b401da200216 58
okano 16:cac2348cfcfb 59 #define TARGET_OPERATION_BAUD_RATE 9600
okano 4:55f1977bd11a 60
okano 8:b220fadbb3d8 61 int error_state = 0;
okano 7:815366f003ee 62
okano 20:98d7b5878e3e 63 target_param *open_target( int baud_date );
okano 20:98d7b5878e3e 64 int verify_flash( FILE *fp, target_param *tpp );
okano 20:98d7b5878e3e 65 int post_writing_process( target_param *tpp );
okano 20:98d7b5878e3e 66
okano 7:815366f003ee 67 int file_size( FILE *fp );
okano 7:815366f003ee 68 void reset_target( int isp_pin_state );
okano 7:815366f003ee 69 char read_byte( void );
okano 7:815366f003ee 70 void erase_sectors( int last_sector );
okano 19:7a7381e78025 71 int verify_binary_data( FILE *fp );
okano 20:98d7b5878e3e 72 int verify_uucoded_data( FILE *fp );
okano 20:98d7b5878e3e 73 void get_binary_from_uucode_str( char *b, int size );
okano 21:e149d0bdbf4a 74
okano 16:cac2348cfcfb 75 void success_indicator();
okano 7:815366f003ee 76
okano 19:7a7381e78025 77
okano 12:5a33b5d39792 78 #pragma diag_suppress 1293 // surpressing a warning message of "assignment in condition" ;)
okano 12:5a33b5d39792 79
okano 7:815366f003ee 80 int main()
okano 7:815366f003ee 81 {
okano 7:815366f003ee 82 FILE *fp;
okano 20:98d7b5878e3e 83 target_param *tpp;
okano 7:815366f003ee 84 int data_size;
okano 7:815366f003ee 85 int last_sector;
okano 8:b220fadbb3d8 86
okano 7:815366f003ee 87 printf( "\r\n\r\n\r\nmbed ISP program : programming LPC device from mbed\r\n" );
okano 7:815366f003ee 88
okano 20:98d7b5878e3e 89 if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) )
okano 20:98d7b5878e3e 90 {
okano 20:98d7b5878e3e 91 error( "couldn't open the taget" );
okano 20:98d7b5878e3e 92 return ( 1 );
okano 20:98d7b5878e3e 93 }
okano 8:b220fadbb3d8 94
okano 8:b220fadbb3d8 95 printf( " target device found : type = \"%s\"\r\n", tpp->type_name );
okano 8:b220fadbb3d8 96 printf( " ID = 0x%08X\r\n", tpp->id );
okano 8:b220fadbb3d8 97 printf( " RAM size = %10d bytes\r\n", tpp->ram_size );
okano 8:b220fadbb3d8 98 printf( " flash size = %10d bytes\r\n", tpp->flash_size );
okano 8:b220fadbb3d8 99
okano 12:5a33b5d39792 100 printf( " opening file: \"%s\"\r\n", SOURCE_FILE );
okano 12:5a33b5d39792 101
okano 12:5a33b5d39792 102 if ( NULL == (fp = fopen( SOURCE_FILE, "rb" )) ) {
okano 12:5a33b5d39792 103 error( "couldn't open source file" );
okano 12:5a33b5d39792 104 return ( 1 );
okano 12:5a33b5d39792 105 }
okano 12:5a33b5d39792 106
okano 12:5a33b5d39792 107 data_size = file_size( fp );
okano 12:5a33b5d39792 108 last_sector = data_size / tpp->sector_size;
okano 12:5a33b5d39792 109
okano 12:5a33b5d39792 110 printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
okano 12:5a33b5d39792 111 printf( " resetting target\r\n" );
okano 12:5a33b5d39792 112
okano 7:815366f003ee 113 erase_sectors( last_sector );
okano 12:5a33b5d39792 114
okano 20:98d7b5878e3e 115 write_flash( fp, tpp );
okano 20:98d7b5878e3e 116 verify_flash( fp, tpp );
okano 12:5a33b5d39792 117
okano 7:815366f003ee 118 fclose( fp );
okano 8:b220fadbb3d8 119
okano 8:b220fadbb3d8 120 printf( "\r\n %s\r\n\r\n",
okano 8:b220fadbb3d8 121 error_state ?
okano 8:b220fadbb3d8 122 "** The data could not be written :(" :
okano 8:b220fadbb3d8 123 "** The data has been written successflly :)"
okano 8:b220fadbb3d8 124 );
okano 19:7a7381e78025 125
okano 19:7a7381e78025 126 if ( error_state )
okano 19:7a7381e78025 127 error( " ** ISP failed\r\n" );
okano 20:98d7b5878e3e 128
okano 20:98d7b5878e3e 129 post_writing_process( tpp );
okano 20:98d7b5878e3e 130
okano 8:b220fadbb3d8 131
okano 16:cac2348cfcfb 132 #define AUTO_PROGRAM_START
okano 14:a7b9f74fb856 133 #ifdef AUTO_PROGRAM_START
okano 21:e149d0bdbf4a 134 set_target_baud_rate( TARGET_OPERATION_BAUD_RATE );
okano 16:cac2348cfcfb 135
okano 14:a7b9f74fb856 136 reset_target( NO_ISP_MODE );
okano 16:cac2348cfcfb 137 printf( " ** The program in flash has been started!!\r\n" );
okano 14:a7b9f74fb856 138 #endif
okano 14:a7b9f74fb856 139
okano 16:cac2348cfcfb 140 printf( " (now the mbed is working in \"serial through mode\")\r\n\r\n" );
okano 16:cac2348cfcfb 141
okano 16:cac2348cfcfb 142 success.attach( &success_indicator, 0.1 );
okano 16:cac2348cfcfb 143
okano 21:e149d0bdbf4a 144 usb_serial_bridge_operation(); // doesn't return. infinite loop in this function
okano 20:98d7b5878e3e 145 }
okano 16:cac2348cfcfb 146
okano 20:98d7b5878e3e 147
okano 22:bd98a782fba6 148 int verify_flash( FILE *fp, target_param *tpp )
okano 22:bd98a782fba6 149 {
okano 22:bd98a782fba6 150 if ( tpp->write_type == BINARY )
okano 22:bd98a782fba6 151 verify_binary_data( fp );
okano 22:bd98a782fba6 152 else
okano 22:bd98a782fba6 153 verify_uucoded_data( fp );
okano 22:bd98a782fba6 154 }
okano 22:bd98a782fba6 155
okano 22:bd98a782fba6 156
okano 22:bd98a782fba6 157 int post_writing_process( target_param *tpp )
okano 22:bd98a782fba6 158 {
okano 22:bd98a782fba6 159 if ( tpp->write_type == UUENCODE )
okano 22:bd98a782fba6 160 try_and_check( "G 0 T\r\n", "0", 0 );
okano 22:bd98a782fba6 161
okano 22:bd98a782fba6 162 }
okano 22:bd98a782fba6 163
okano 22:bd98a782fba6 164
okano 22:bd98a782fba6 165 int file_size( FILE *fp )
okano 22:bd98a782fba6 166 {
okano 22:bd98a782fba6 167 int size;
okano 22:bd98a782fba6 168
okano 22:bd98a782fba6 169 fseek( fp, 0, SEEK_END ); // seek to end of file
okano 22:bd98a782fba6 170 size = ftell( fp ); // get current file pointer
okano 22:bd98a782fba6 171 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 22:bd98a782fba6 172
okano 22:bd98a782fba6 173 return size;
okano 22:bd98a782fba6 174 }
okano 22:bd98a782fba6 175
okano 22:bd98a782fba6 176
okano 20:98d7b5878e3e 177 target_param *open_target( int baud_date )
okano 20:98d7b5878e3e 178 {
okano 20:98d7b5878e3e 179 target_param *tpp;
okano 20:98d7b5878e3e 180 char str_buf0[ STR_BUFF_SIZE ];
okano 20:98d7b5878e3e 181 char str_buf1[ STR_BUFF_SIZE ];
okano 20:98d7b5878e3e 182
okano 21:e149d0bdbf4a 183 set_target_baud_rate( baud_date );
okano 20:98d7b5878e3e 184
okano 20:98d7b5878e3e 185 reset_target( ENTER_TO_ISP_MODE );
okano 20:98d7b5878e3e 186
okano 20:98d7b5878e3e 187 try_and_check( "?", "Synchronized", 0 );
okano 20:98d7b5878e3e 188
okano 20:98d7b5878e3e 189 try_and_check2( "Synchronized\r\n", "OK", 0 );
okano 20:98d7b5878e3e 190 try_and_check2( "12000\r\n", "OK", 0 );
okano 20:98d7b5878e3e 191 try_and_check2( "U 23130\r\n", "0", 0 );
okano 20:98d7b5878e3e 192 try_and_check2( "A 0\r\n", "0", 0 );
okano 20:98d7b5878e3e 193
okano 20:98d7b5878e3e 194 try_and_check( "K\r\n", "0", 0 );
okano 20:98d7b5878e3e 195 get_string( str_buf0 );
okano 20:98d7b5878e3e 196 get_string( str_buf1 );
okano 20:98d7b5878e3e 197
okano 20:98d7b5878e3e 198 printf( " result of \"K\" = %s %s\r\n", str_buf0, str_buf1 );
okano 20:98d7b5878e3e 199
okano 20:98d7b5878e3e 200 try_and_check( "J\r\n", "0", 0 );
okano 20:98d7b5878e3e 201 get_string( str_buf0 );
okano 20:98d7b5878e3e 202
okano 20:98d7b5878e3e 203 printf( " result of \"J\" = %s\r\n", str_buf0 );
okano 20:98d7b5878e3e 204
okano 20:98d7b5878e3e 205 tpp = find_target_param( str_buf0 );
okano 20:98d7b5878e3e 206
okano 20:98d7b5878e3e 207 return ( tpp );
okano 20:98d7b5878e3e 208 }
okano 20:98d7b5878e3e 209
okano 20:98d7b5878e3e 210
okano 7:815366f003ee 211 void reset_target( int isp_pin_state )
okano 7:815366f003ee 212 {
okano 7:815366f003ee 213 reset_pin = 1;
okano 13:60995bf8b2c7 214 isp_pin = isp_pin_state;
okano 7:815366f003ee 215 wait_ms( 100 );
okano 13:60995bf8b2c7 216
okano 7:815366f003ee 217 reset_pin = 0;
okano 7:815366f003ee 218 wait_ms( 100 );
okano 13:60995bf8b2c7 219
okano 7:815366f003ee 220 reset_pin = 1;
okano 7:815366f003ee 221 wait_ms( 100 );
okano 7:815366f003ee 222 }
okano 7:815366f003ee 223
okano 7:815366f003ee 224
okano 7:815366f003ee 225
okano 7:815366f003ee 226 void erase_sectors( int last_sector )
okano 7:815366f003ee 227 {
okano 7:815366f003ee 228 char command_str[ STR_BUFF_SIZE ];
okano 8:b220fadbb3d8 229
okano 7:815366f003ee 230 sprintf( command_str, "P 0 %d\r\n", last_sector );
okano 7:815366f003ee 231 try_and_check( command_str, "0", 0 );
okano 8:b220fadbb3d8 232
okano 7:815366f003ee 233 *(command_str) = 'E';
okano 7:815366f003ee 234 try_and_check( command_str, "0", 0 );
okano 7:815366f003ee 235 }
okano 7:815366f003ee 236
okano 19:7a7381e78025 237
okano 19:7a7381e78025 238 int verify_binary_data( FILE *fp )
okano 19:7a7381e78025 239 {
okano 19:7a7381e78025 240 char command_str[ STR_BUFF_SIZE ];
okano 19:7a7381e78025 241 int read_size = 0;
okano 19:7a7381e78025 242 int size;
okano 19:7a7381e78025 243 int flash_reading_size;
okano 19:7a7381e78025 244 char *bf;
okano 19:7a7381e78025 245 char *br;
okano 19:7a7381e78025 246 int error_flag = 0;
okano 19:7a7381e78025 247 unsigned long checksum = 0;
okano 19:7a7381e78025 248 unsigned long checksum_count = 0;
okano 19:7a7381e78025 249
okano 19:7a7381e78025 250 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 19:7a7381e78025 251
okano 19:7a7381e78025 252 flash_reading_size = 128;
okano 19:7a7381e78025 253
okano 19:7a7381e78025 254 if ( NULL == (bf = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 19:7a7381e78025 255 error( "malloc error happened (in verify process, file data buffer)\r\n" );
okano 19:7a7381e78025 256
okano 19:7a7381e78025 257 if ( NULL == (br = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 19:7a7381e78025 258 error( "malloc error happened (in verify process, read data buffer)\r\n" );
okano 19:7a7381e78025 259
okano 19:7a7381e78025 260
okano 19:7a7381e78025 261 printf( "\r\n ==== flash reading and verifying ====\r\n" );
okano 19:7a7381e78025 262
okano 19:7a7381e78025 263 while ( size = fread( bf, sizeof( char ), flash_reading_size, fp ) ) {
okano 19:7a7381e78025 264
okano 19:7a7381e78025 265 if ( read_size < 0x20 ) {
okano 19:7a7381e78025 266 for ( int i = 0; i < flash_reading_size; i += 4 ) {
okano 19:7a7381e78025 267
okano 19:7a7381e78025 268 if ( checksum_count == 7 ) {
okano 19:7a7381e78025 269 checksum = 0xFFFFFFFF - checksum + 1;
okano 19:7a7381e78025 270 *((unsigned int *)(bf + i)) = checksum;
okano 19:7a7381e78025 271 //printf( "\r\n\r\n -- calculated checksum : 0x%08X\r\n", checksum );
okano 19:7a7381e78025 272 } else {
okano 19:7a7381e78025 273 checksum += *((unsigned int *)(bf + i));
okano 19:7a7381e78025 274 }
okano 19:7a7381e78025 275
okano 19:7a7381e78025 276 checksum_count++;
okano 19:7a7381e78025 277 }
okano 19:7a7381e78025 278 }
okano 19:7a7381e78025 279
okano 19:7a7381e78025 280
okano 19:7a7381e78025 281 sprintf( command_str, "R %ld %ld\r\n", read_size, size );
okano 19:7a7381e78025 282 // try_and_check( command_str, "0", MODE_SILENT );
okano 19:7a7381e78025 283 try_and_check( command_str, "0", 0 );
okano 19:7a7381e78025 284
okano 19:7a7381e78025 285 get_binary( br, 1 );
okano 19:7a7381e78025 286 get_binary( br, size );
okano 19:7a7381e78025 287
okano 19:7a7381e78025 288 for ( int i = 0; i < size; i++ ) {
okano 19:7a7381e78025 289 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 19:7a7381e78025 290 if ( (*(bf + i) != *(br + i)) ) {
okano 19:7a7381e78025 291 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 19:7a7381e78025 292 error_flag++;
okano 19:7a7381e78025 293 }
okano 19:7a7381e78025 294 }
okano 19:7a7381e78025 295
okano 19:7a7381e78025 296 if ( error_flag )
okano 19:7a7381e78025 297 break;
okano 19:7a7381e78025 298
okano 19:7a7381e78025 299 read_size += size;
okano 19:7a7381e78025 300
okano 19:7a7381e78025 301 // printf( " total %d bytes read\r\n", read_size );
okano 19:7a7381e78025 302 }
okano 19:7a7381e78025 303
okano 19:7a7381e78025 304 error_state |= error_flag;
okano 19:7a7381e78025 305
okano 19:7a7381e78025 306 printf( " total %d bytes read\r", read_size );
okano 19:7a7381e78025 307 printf( " verification result : \"%s\"\r\n", error_flag ? "Fail" : "Pass" );
okano 19:7a7381e78025 308
okano 19:7a7381e78025 309 free( bf );
okano 19:7a7381e78025 310 free( br );
okano 19:7a7381e78025 311
okano 19:7a7381e78025 312 return ( read_size );
okano 19:7a7381e78025 313 }
okano 19:7a7381e78025 314
okano 19:7a7381e78025 315
okano 20:98d7b5878e3e 316 int verify_uucoded_data( FILE *fp )
okano 20:98d7b5878e3e 317 {
okano 20:98d7b5878e3e 318 char command_str[ STR_BUFF_SIZE ];
okano 20:98d7b5878e3e 319 int read_size = 0;
okano 20:98d7b5878e3e 320 int size;
okano 20:98d7b5878e3e 321 int flash_reading_size;
okano 20:98d7b5878e3e 322 char *bf;
okano 20:98d7b5878e3e 323 char *br;
okano 20:98d7b5878e3e 324 int error_flag = 0;
okano 20:98d7b5878e3e 325
okano 20:98d7b5878e3e 326 flash_reading_size = 176;
okano 20:98d7b5878e3e 327
okano 22:bd98a782fba6 328 initialize_uud_table();
okano 22:bd98a782fba6 329
okano 20:98d7b5878e3e 330 if ( NULL == (bf = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 20:98d7b5878e3e 331 error( "malloc error happened (in verify process, file data buffer)\r\n" );
okano 20:98d7b5878e3e 332
okano 20:98d7b5878e3e 333 if ( NULL == (br = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 20:98d7b5878e3e 334 error( "malloc error happened (in verify process, read data buffer)\r\n" );
okano 20:98d7b5878e3e 335
okano 20:98d7b5878e3e 336 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 20:98d7b5878e3e 337
okano 20:98d7b5878e3e 338 while ( size = fread( bf, sizeof( char ), flash_reading_size, fp ) ) {
okano 20:98d7b5878e3e 339
okano 20:98d7b5878e3e 340 if ( !read_size ) {
okano 20:98d7b5878e3e 341 // overwriting 4 bytes data for address=0x1C
okano 20:98d7b5878e3e 342 // there is a slot for checksum that is checked in (target's) boot process
okano 20:98d7b5878e3e 343 add_isp_checksum( bf );
okano 20:98d7b5878e3e 344 }
okano 20:98d7b5878e3e 345
okano 20:98d7b5878e3e 346 sprintf( command_str, "R %ld %ld\r\n", read_size, size );
okano 20:98d7b5878e3e 347 try_and_check( command_str, "0", 0 );
okano 20:98d7b5878e3e 348
okano 20:98d7b5878e3e 349 get_binary_from_uucode_str( br, size );
okano 20:98d7b5878e3e 350
okano 20:98d7b5878e3e 351 for ( int i = 0; i < size; i++ ) {
okano 20:98d7b5878e3e 352 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 20:98d7b5878e3e 353 if ( (*(bf + i) != *(br + i)) ) {
okano 20:98d7b5878e3e 354 printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 20:98d7b5878e3e 355 error_flag++;
okano 20:98d7b5878e3e 356 }
okano 20:98d7b5878e3e 357 }
okano 20:98d7b5878e3e 358
okano 20:98d7b5878e3e 359 if ( error_flag )
okano 20:98d7b5878e3e 360 break;
okano 20:98d7b5878e3e 361
okano 20:98d7b5878e3e 362 read_size += size;
okano 20:98d7b5878e3e 363 // printf( " total %d bytes read\r", read_size );
okano 20:98d7b5878e3e 364 }
okano 20:98d7b5878e3e 365
okano 20:98d7b5878e3e 366 error_state |= error_flag;
okano 20:98d7b5878e3e 367
okano 20:98d7b5878e3e 368 printf( " total %d bytes read\r", read_size );
okano 20:98d7b5878e3e 369 printf( " verification result : \"%s\"\r\n", error_flag ? "Fail" : "Pass" );
okano 20:98d7b5878e3e 370
okano 20:98d7b5878e3e 371 free( bf );
okano 20:98d7b5878e3e 372 free( br );
okano 20:98d7b5878e3e 373
okano 20:98d7b5878e3e 374 return ( read_size );
okano 20:98d7b5878e3e 375 }
okano 20:98d7b5878e3e 376
okano 20:98d7b5878e3e 377
okano 20:98d7b5878e3e 378 void get_binary_from_uucode_str( char *b, int size )
okano 20:98d7b5878e3e 379 {
okano 20:98d7b5878e3e 380 #define N 4
okano 20:98d7b5878e3e 381
okano 20:98d7b5878e3e 382 char s[ N ][ STR_BUFF_SIZE ];
okano 20:98d7b5878e3e 383 char ss[ STR_BUFF_SIZE ];
okano 20:98d7b5878e3e 384 long checksum = 0;
okano 20:98d7b5878e3e 385 int line_count = 0;
okano 20:98d7b5878e3e 386 int read_size = 0;
okano 20:98d7b5878e3e 387 int retry_count = 3;
okano 20:98d7b5878e3e 388
okano 20:98d7b5878e3e 389
okano 20:98d7b5878e3e 390 while ( retry_count-- ) {
okano 20:98d7b5878e3e 391
okano 20:98d7b5878e3e 392 for ( int i = 0; i < N; i++ )
okano 20:98d7b5878e3e 393 get_string( s[ i ] );
okano 20:98d7b5878e3e 394
okano 20:98d7b5878e3e 395 get_string( ss );
okano 20:98d7b5878e3e 396
okano 20:98d7b5878e3e 397
okano 20:98d7b5878e3e 398 while ( size ) {
okano 20:98d7b5878e3e 399 read_size = uudecode_a_line( b, s[ line_count ] );
okano 20:98d7b5878e3e 400
okano 20:98d7b5878e3e 401 for ( int i = 0; i < read_size; i++ )
okano 20:98d7b5878e3e 402 checksum += *b++;
okano 20:98d7b5878e3e 403
okano 20:98d7b5878e3e 404 size -= read_size;
okano 20:98d7b5878e3e 405 line_count++;
okano 20:98d7b5878e3e 406 }
okano 20:98d7b5878e3e 407
okano 20:98d7b5878e3e 408 // printf( " checksum -- %s (internal = %ld)\r\n", ss, checksum );
okano 20:98d7b5878e3e 409
okano 20:98d7b5878e3e 410 if ( checksum == atol( ss ) ) {
okano 20:98d7b5878e3e 411 put_string( "OK\r\n" );
okano 20:98d7b5878e3e 412 return;
okano 20:98d7b5878e3e 413 // printf( " checksum OK\r\n" );
okano 20:98d7b5878e3e 414 } else {
okano 20:98d7b5878e3e 415 printf( " checksum RESEND\r\n" );
okano 20:98d7b5878e3e 416 put_string( "RESEND\r\n" );
okano 20:98d7b5878e3e 417 }
okano 20:98d7b5878e3e 418 }
okano 20:98d7b5878e3e 419 }
okano 20:98d7b5878e3e 420
okano 20:98d7b5878e3e 421
okano 20:98d7b5878e3e 422
okano 4:55f1977bd11a 423
okano 0:6baefda2e511 424
okano 19:7a7381e78025 425
okano 16:cac2348cfcfb 426 void success_indicator()
okano 16:cac2348cfcfb 427 {
okano 16:cac2348cfcfb 428 static int i = 0;
okano 16:cac2348cfcfb 429
okano 16:cac2348cfcfb 430 leds = 0x1 << (i++ & 0x3);
okano 16:cac2348cfcfb 431 }
okano 21:e149d0bdbf4a 432
okano 21:e149d0bdbf4a 433
okano 21:e149d0bdbf4a 434 void set_leds( char v )
okano 21:e149d0bdbf4a 435 {
okano 21:e149d0bdbf4a 436 leds = v;
okano 21:e149d0bdbf4a 437 }