Code to load a LPC1114 over tx/rx. I have only tested with a 1114 chip but it should work with other LPC uControllers
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
isp.cpp@52:afd15e54142f, 2015-07-26 (annotated)
- Committer:
- ChrisABailey
- Date:
- Sun Jul 26 14:46:23 2015 +0000
- Revision:
- 52:afd15e54142f
- Parent:
- 48:99cfe3a929ea
Use MBED to load LPC1114. Modified to also load LPExpresso 1114 board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 30:e0d7524661ca | 1 | |
okano | 30:e0d7524661ca | 2 | #include "mbed.h" |
okano | 30:e0d7524661ca | 3 | #include "target_table.h" |
okano | 30:e0d7524661ca | 4 | #include "serial_utilities.h" |
okano | 30:e0d7524661ca | 5 | #include "command_interface.h" |
okano | 30:e0d7524661ca | 6 | #include "writing.h" |
okano | 30:e0d7524661ca | 7 | #include "uu_coding.h" |
okano | 30:e0d7524661ca | 8 | #include "target_handling.h" |
okano | 30:e0d7524661ca | 9 | #include "verification.h" |
okano | 30:e0d7524661ca | 10 | #include "isp.h" |
okano | 30:e0d7524661ca | 11 | #include "_user_settings.h" |
okano | 30:e0d7524661ca | 12 | |
okano | 41:74b9ff21098f | 13 | #define CRP_WORD_OFFSET 0x2FC |
okano | 41:74b9ff21098f | 14 | |
okano | 30:e0d7524661ca | 15 | |
okano | 30:e0d7524661ca | 16 | BusOut leds( LED4, LED3, LED2, LED1 ); |
okano | 30:e0d7524661ca | 17 | Ticker success; |
okano | 30:e0d7524661ca | 18 | |
okano | 32:3700d5df4e18 | 19 | int file_size( FILE *fp ); |
okano | 33:ce9fff4cbf09 | 20 | unsigned int read_crp( FILE *fp ); |
okano | 32:3700d5df4e18 | 21 | unsigned int crp_check( FILE *fp ); |
okano | 32:3700d5df4e18 | 22 | void success_indicator(); |
okano | 48:99cfe3a929ea | 23 | void user_action_waiting_indicator(); |
okano | 30:e0d7524661ca | 24 | |
okano | 33:ce9fff4cbf09 | 25 | |
okano | 48:99cfe3a929ea | 26 | int isp_flash_write( const char *file_name ) |
okano | 30:e0d7524661ca | 27 | { |
okano | 30:e0d7524661ca | 28 | FILE *fp; |
okano | 30:e0d7524661ca | 29 | target_param *tpp; |
okano | 30:e0d7524661ca | 30 | int data_size; |
okano | 30:e0d7524661ca | 31 | int last_sector; |
okano | 30:e0d7524661ca | 32 | int transferred_size; |
okano | 30:e0d7524661ca | 33 | int err; |
okano | 30:e0d7524661ca | 34 | |
ChrisABailey | 52:afd15e54142f | 35 | printf( " looking for target to write \"%s\"\r\n", file_name ); |
okano | 30:e0d7524661ca | 36 | if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) ) { |
okano | 30:e0d7524661ca | 37 | return ( ERROR_AT_TARGET_OPEN ); |
okano | 30:e0d7524661ca | 38 | } |
okano | 30:e0d7524661ca | 39 | |
okano | 44:568799eac6df | 40 | printf( " target device found : type = \"%s\"\r\n", tpp->type_name ); |
okano | 39:f68f9fa1e88e | 41 | printf( " ID = 0x%08X\r\n", tpp->id ); |
okano | 39:f68f9fa1e88e | 42 | printf( " RAM size = %10d bytes\r\n", tpp->ram_size ); |
okano | 39:f68f9fa1e88e | 43 | printf( " flash size = %10d bytes\r\n", tpp->flash_size ); |
okano | 30:e0d7524661ca | 44 | |
okano | 48:99cfe3a929ea | 45 | // |
okano | 48:99cfe3a929ea | 46 | // If user selected "flash erase only" |
okano | 48:99cfe3a929ea | 47 | // |
okano | 48:99cfe3a929ea | 48 | |
okano | 48:99cfe3a929ea | 49 | if ( *file_name == 0xFF ) { |
okano | 48:99cfe3a929ea | 50 | last_sector = find_sector( tpp->flash_size - 1, tpp ); |
okano | 48:99cfe3a929ea | 51 | |
okano | 48:99cfe3a929ea | 52 | // The file selector returns 0xFF as first character of the string |
okano | 48:99cfe3a929ea | 53 | // if user selected "flash erase". |
okano | 48:99cfe3a929ea | 54 | |
okano | 48:99cfe3a929ea | 55 | printf( "\r\n ==== flash erasing ====\r\n" ); |
okano | 48:99cfe3a929ea | 56 | |
okano | 48:99cfe3a929ea | 57 | if ( erase_sectors( last_sector ) ) |
okano | 48:99cfe3a929ea | 58 | return ( ERROR_AT_SECTOR_ERASE ); |
okano | 48:99cfe3a929ea | 59 | |
okano | 48:99cfe3a929ea | 60 | printf( " sectors from 0 to %d are erased. bye\r\n", last_sector ); |
okano | 48:99cfe3a929ea | 61 | exit ( 0 ); // quit from app |
okano | 48:99cfe3a929ea | 62 | } |
okano | 48:99cfe3a929ea | 63 | |
okano | 48:99cfe3a929ea | 64 | // |
okano | 48:99cfe3a929ea | 65 | // Normal operation |
okano | 48:99cfe3a929ea | 66 | // |
okano | 48:99cfe3a929ea | 67 | |
okano | 30:e0d7524661ca | 68 | printf( " opening file: \"%s\"\r\n", file_name ); |
okano | 30:e0d7524661ca | 69 | |
okano | 30:e0d7524661ca | 70 | if ( NULL == (fp = fopen( file_name, "rb" )) ) { |
okano | 30:e0d7524661ca | 71 | return ( ERROR_AT_FILE_OPEN ); |
okano | 30:e0d7524661ca | 72 | } |
okano | 30:e0d7524661ca | 73 | |
okano | 30:e0d7524661ca | 74 | data_size = file_size( fp ); |
okano | 41:74b9ff21098f | 75 | |
okano | 38:cb95bfe0546a | 76 | if ( !data_size ) |
okano | 38:cb95bfe0546a | 77 | return ( ERROR_DATA_SIZE_ZERO ); |
okano | 41:74b9ff21098f | 78 | |
okano | 44:568799eac6df | 79 | // last_sector = (data_size - 1) / tpp->sector_size; |
okano | 44:568799eac6df | 80 | last_sector = find_sector( data_size - 1, tpp ); |
okano | 33:ce9fff4cbf09 | 81 | |
okano | 41:74b9ff21098f | 82 | if ( data_size < (CRP_WORD_OFFSET + sizeof( unsigned int )) ) { |
okano | 41:74b9ff21098f | 83 | printf( " CRP check is not performed because data size is less than 0x300(768) bytes\r\n" ); |
okano | 41:74b9ff21098f | 84 | } else { |
okano | 41:74b9ff21098f | 85 | if ( crp_check( fp ) ) { |
okano | 41:74b9ff21098f | 86 | printf( " the CRP is enabled in the data source file\r\n" ); |
okano | 33:ce9fff4cbf09 | 87 | |
okano | 33:ce9fff4cbf09 | 88 | #ifdef CHECK_CRP_CODE |
okano | 41:74b9ff21098f | 89 | printf( " aborting execution by CRP warning\r\n" ); |
okano | 33:ce9fff4cbf09 | 90 | |
okano | 41:74b9ff21098f | 91 | return ( WARNING_CRP_CODE_DETECTED ); |
okano | 33:ce9fff4cbf09 | 92 | #else |
okano | 41:74b9ff21098f | 93 | printf( " this program continues to write the CRP enabled binary into the target flash\r\n" ); |
okano | 33:ce9fff4cbf09 | 94 | #endif |
okano | 41:74b9ff21098f | 95 | } |
okano | 32:3700d5df4e18 | 96 | } |
okano | 30:e0d7524661ca | 97 | |
okano | 30:e0d7524661ca | 98 | printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 ); |
okano | 30:e0d7524661ca | 99 | printf( " resetting target\r\n" ); |
okano | 30:e0d7524661ca | 100 | |
okano | 34:eaca33d3e632 | 101 | #ifdef ENABLE_WRITING |
okano | 44:568799eac6df | 102 | if ( erase_sectors( find_sector( data_size - 1, tpp ) ) ) |
okano | 30:e0d7524661ca | 103 | return ( ERROR_AT_SECTOR_ERASE ); |
okano | 30:e0d7524661ca | 104 | |
okano | 30:e0d7524661ca | 105 | printf( "\r\n ==== flash writing ====\r\n" ); |
okano | 30:e0d7524661ca | 106 | |
okano | 47:e7d395119a63 | 107 | if ( err = write_flash( fp, tpp, &transferred_size, data_size ) ) |
okano | 30:e0d7524661ca | 108 | return ( err ); |
okano | 30:e0d7524661ca | 109 | |
okano | 30:e0d7524661ca | 110 | printf( " -- %d bytes data are written\r\n", transferred_size ); |
okano | 34:eaca33d3e632 | 111 | leds_off(); |
okano | 34:eaca33d3e632 | 112 | #else |
okano | 34:eaca33d3e632 | 113 | printf( "\r\n ==== writing is disabled ====\r\n\r\n" ); |
okano | 34:eaca33d3e632 | 114 | #endif |
okano | 34:eaca33d3e632 | 115 | |
okano | 30:e0d7524661ca | 116 | |
okano | 44:568799eac6df | 117 | #if 0 |
okano | 44:568799eac6df | 118 | if ( tpp->id == 0x26113F37 ) { |
okano | 44:568799eac6df | 119 | // The MEMMAP register should be operated if want to verify the LPC176x flash data |
okano | 44:568799eac6df | 120 | } |
okano | 44:568799eac6df | 121 | #endif |
okano | 44:568799eac6df | 122 | |
okano | 30:e0d7524661ca | 123 | |
okano | 44:568799eac6df | 124 | #ifdef ENABLE_VERIFYING |
okano | 44:568799eac6df | 125 | if ( (tpp->id == 0x26113F37) || (tpp->id == 0x26013F37) ) { |
okano | 44:568799eac6df | 126 | printf( "\r\n ==== for the LPC176x, verification is not supported ====\r\n\r\n" ); |
okano | 44:568799eac6df | 127 | } else { |
okano | 44:568799eac6df | 128 | printf( "\r\n ==== flash reading and verifying ====\r\n" ); |
okano | 30:e0d7524661ca | 129 | |
okano | 47:e7d395119a63 | 130 | if ( err = verify_flash( fp, tpp, &transferred_size, data_size ) ) |
okano | 44:568799eac6df | 131 | return ( err ); |
okano | 44:568799eac6df | 132 | |
okano | 44:568799eac6df | 133 | printf( " -- %d bytes data are read and verified\r\n", transferred_size ); |
okano | 44:568799eac6df | 134 | leds_off(); |
okano | 44:568799eac6df | 135 | } |
okano | 33:ce9fff4cbf09 | 136 | #else |
okano | 33:ce9fff4cbf09 | 137 | printf( "\r\n ==== verifying has been skipped ====\r\n\r\n" ); |
okano | 44:568799eac6df | 138 | } |
okano | 33:ce9fff4cbf09 | 139 | #endif |
okano | 30:e0d7524661ca | 140 | |
okano | 34:eaca33d3e632 | 141 | |
okano | 30:e0d7524661ca | 142 | fclose( fp ); |
okano | 30:e0d7524661ca | 143 | |
okano | 30:e0d7524661ca | 144 | post_writing_process( tpp ); |
okano | 30:e0d7524661ca | 145 | |
okano | 48:99cfe3a929ea | 146 | return ( NO_ERROR ); |
okano | 30:e0d7524661ca | 147 | } |
okano | 30:e0d7524661ca | 148 | |
okano | 30:e0d7524661ca | 149 | |
okano | 30:e0d7524661ca | 150 | int file_size( FILE *fp ) |
okano | 30:e0d7524661ca | 151 | { |
okano | 30:e0d7524661ca | 152 | int size; |
okano | 30:e0d7524661ca | 153 | |
okano | 30:e0d7524661ca | 154 | fseek( fp, 0, SEEK_END ); // seek to end of file |
okano | 41:74b9ff21098f | 155 | size = ftell( fp ); // get current file pointer |
okano | 30:e0d7524661ca | 156 | fseek( fp, 0, SEEK_SET ); // seek back to beginning of file |
okano | 30:e0d7524661ca | 157 | |
okano | 30:e0d7524661ca | 158 | return size; |
okano | 30:e0d7524661ca | 159 | } |
okano | 30:e0d7524661ca | 160 | |
okano | 30:e0d7524661ca | 161 | |
okano | 32:3700d5df4e18 | 162 | unsigned int crp_check( FILE *fp ) |
okano | 32:3700d5df4e18 | 163 | { |
okano | 32:3700d5df4e18 | 164 | unsigned int crp; |
okano | 32:3700d5df4e18 | 165 | |
okano | 33:ce9fff4cbf09 | 166 | switch ( crp = read_crp( fp ) ) { |
okano | 33:ce9fff4cbf09 | 167 | case NO_ISP : |
okano | 33:ce9fff4cbf09 | 168 | printf( "\r\n WARNING : CRP code detected 0x%08X (NO_ISP)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 169 | break; |
okano | 33:ce9fff4cbf09 | 170 | case CRP1 : |
okano | 33:ce9fff4cbf09 | 171 | printf( "\r\n WARNING : CRP code detected 0x%08X (CRP1)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 172 | break; |
okano | 33:ce9fff4cbf09 | 173 | case CRP2 : |
okano | 33:ce9fff4cbf09 | 174 | printf( "\r\n WARNING : CRP code detected 0x%08X (CRP2)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 175 | break; |
okano | 33:ce9fff4cbf09 | 176 | case CRP3 : |
okano | 33:ce9fff4cbf09 | 177 | printf( "\r\n WARNING : CRP code detected 0x%08X (CRP3)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 178 | break; |
okano | 33:ce9fff4cbf09 | 179 | default : |
okano | 33:ce9fff4cbf09 | 180 | crp = 0x0; // no CRP code detected |
okano | 33:ce9fff4cbf09 | 181 | break; |
okano | 33:ce9fff4cbf09 | 182 | } |
okano | 41:74b9ff21098f | 183 | |
okano | 33:ce9fff4cbf09 | 184 | return ( crp ); |
okano | 33:ce9fff4cbf09 | 185 | } |
okano | 33:ce9fff4cbf09 | 186 | |
okano | 33:ce9fff4cbf09 | 187 | |
okano | 33:ce9fff4cbf09 | 188 | unsigned int read_crp( FILE *fp ) |
okano | 33:ce9fff4cbf09 | 189 | { |
okano | 33:ce9fff4cbf09 | 190 | unsigned int crp; |
okano | 33:ce9fff4cbf09 | 191 | |
okano | 41:74b9ff21098f | 192 | fseek( fp, CRP_WORD_OFFSET, SEEK_SET ); // seek to 0x2FC (764th byte) |
okano | 32:3700d5df4e18 | 193 | |
okano | 32:3700d5df4e18 | 194 | if ( 1 != fread( &crp, sizeof( crp ), 1, fp ) ) |
okano | 32:3700d5df4e18 | 195 | return ( CRP_CHECK_ERROR ); |
okano | 32:3700d5df4e18 | 196 | |
okano | 32:3700d5df4e18 | 197 | fseek( fp, 0, SEEK_SET ); // seek back to beginning of file |
okano | 32:3700d5df4e18 | 198 | |
okano | 32:3700d5df4e18 | 199 | return ( crp ); |
okano | 32:3700d5df4e18 | 200 | } |
okano | 32:3700d5df4e18 | 201 | |
okano | 32:3700d5df4e18 | 202 | |
okano | 30:e0d7524661ca | 203 | void start_target_in_normal_mode( int baud_rate ) |
okano | 30:e0d7524661ca | 204 | { |
okano | 30:e0d7524661ca | 205 | set_target_baud_rate( baud_rate ); |
okano | 30:e0d7524661ca | 206 | reset_target( NO_ISP_MODE ); |
okano | 30:e0d7524661ca | 207 | } |
okano | 30:e0d7524661ca | 208 | |
okano | 30:e0d7524661ca | 209 | void start_success_indicator( void ) |
okano | 30:e0d7524661ca | 210 | { |
okano | 30:e0d7524661ca | 211 | success.attach( &success_indicator, 0.1 ); |
okano | 30:e0d7524661ca | 212 | } |
okano | 30:e0d7524661ca | 213 | |
okano | 30:e0d7524661ca | 214 | void success_indicator() |
okano | 30:e0d7524661ca | 215 | { |
okano | 30:e0d7524661ca | 216 | static int i = 0; |
okano | 30:e0d7524661ca | 217 | |
okano | 30:e0d7524661ca | 218 | leds = 0x1 << (i++ & 0x3); |
okano | 30:e0d7524661ca | 219 | } |
okano | 30:e0d7524661ca | 220 | |
okano | 30:e0d7524661ca | 221 | void toggle_led( char v ) |
okano | 30:e0d7524661ca | 222 | { |
okano | 30:e0d7524661ca | 223 | leds = leds ^ (0x1 << v); |
okano | 30:e0d7524661ca | 224 | } |
okano | 30:e0d7524661ca | 225 | |
okano | 34:eaca33d3e632 | 226 | |
okano | 34:eaca33d3e632 | 227 | void leds_off( void ) |
okano | 34:eaca33d3e632 | 228 | { |
okano | 34:eaca33d3e632 | 229 | leds = 0x0; |
okano | 34:eaca33d3e632 | 230 | } |
okano | 47:e7d395119a63 | 231 | |
okano | 47:e7d395119a63 | 232 | void show_progress( int total_size, int file_size ) |
okano | 47:e7d395119a63 | 233 | { |
okano | 47:e7d395119a63 | 234 | printf( " -- %5.1f%%\r", ((float)total_size/(float)file_size) * 100.0 ); |
okano | 47:e7d395119a63 | 235 | fflush( stdout ); |
okano | 47:e7d395119a63 | 236 | } |