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