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 Tedd OKANO

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?

UserRevisionLine numberNew 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 }