Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ika_shouyu_poppoyaki by
isp.cpp@42:2b40666d8177, 2014-10-18 (annotated)
- Committer:
- k4zuki
- Date:
- Sat Oct 18 07:36:54 2014 +0000
- Revision:
- 42:2b40666d8177
- Parent:
- 41:74b9ff21098f
LPC82x series supported (only 824 is tested)
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 | 30:e0d7524661ca | 19 | |
okano | 32:3700d5df4e18 | 20 | int file_size( FILE *fp ); |
okano | 33:ce9fff4cbf09 | 21 | unsigned int read_crp( FILE *fp ); |
okano | 32:3700d5df4e18 | 22 | unsigned int crp_check( FILE *fp ); |
okano | 32:3700d5df4e18 | 23 | void success_indicator(); |
okano | 30:e0d7524661ca | 24 | |
okano | 33:ce9fff4cbf09 | 25 | |
okano | 30:e0d7524661ca | 26 | int isp_flash_write( 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 | |
okano | 30:e0d7524661ca | 35 | if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) ) { |
okano | 30:e0d7524661ca | 36 | return ( ERROR_AT_TARGET_OPEN ); |
okano | 30:e0d7524661ca | 37 | } |
okano | 30:e0d7524661ca | 38 | |
okano | 30:e0d7524661ca | 39 | printf( " target device found : type = \"%s\"\r\n", tpp->type_name ); |
okano | 39:f68f9fa1e88e | 40 | printf( " ID = 0x%08X\r\n", tpp->id ); |
okano | 39:f68f9fa1e88e | 41 | printf( " RAM size = %10d bytes\r\n", tpp->ram_size ); |
okano | 39:f68f9fa1e88e | 42 | printf( " flash size = %10d bytes\r\n", tpp->flash_size ); |
okano | 30:e0d7524661ca | 43 | |
okano | 30:e0d7524661ca | 44 | printf( " opening file: \"%s\"\r\n", file_name ); |
okano | 30:e0d7524661ca | 45 | |
okano | 30:e0d7524661ca | 46 | if ( NULL == (fp = fopen( file_name, "rb" )) ) { |
okano | 30:e0d7524661ca | 47 | return ( ERROR_AT_FILE_OPEN ); |
okano | 30:e0d7524661ca | 48 | } |
okano | 30:e0d7524661ca | 49 | |
okano | 30:e0d7524661ca | 50 | data_size = file_size( fp ); |
okano | 41:74b9ff21098f | 51 | |
okano | 38:cb95bfe0546a | 52 | if ( !data_size ) |
okano | 38:cb95bfe0546a | 53 | return ( ERROR_DATA_SIZE_ZERO ); |
okano | 41:74b9ff21098f | 54 | |
okano | 38:cb95bfe0546a | 55 | last_sector = (data_size - 1) / tpp->sector_size; |
okano | 33:ce9fff4cbf09 | 56 | |
okano | 41:74b9ff21098f | 57 | if ( data_size < (CRP_WORD_OFFSET + sizeof( unsigned int )) ) { |
okano | 41:74b9ff21098f | 58 | printf( " CRP check is not performed because data size is less than 0x300(768) bytes\r\n" ); |
okano | 41:74b9ff21098f | 59 | } else { |
okano | 41:74b9ff21098f | 60 | if ( crp_check( fp ) ) { |
okano | 41:74b9ff21098f | 61 | printf( " the CRP is enabled in the data source file\r\n" ); |
okano | 33:ce9fff4cbf09 | 62 | |
okano | 33:ce9fff4cbf09 | 63 | #ifdef CHECK_CRP_CODE |
okano | 41:74b9ff21098f | 64 | printf( " aborting execution by CRP warning\r\n" ); |
okano | 33:ce9fff4cbf09 | 65 | |
okano | 41:74b9ff21098f | 66 | return ( WARNING_CRP_CODE_DETECTED ); |
okano | 33:ce9fff4cbf09 | 67 | #else |
okano | 41:74b9ff21098f | 68 | printf( " this program continues to write the CRP enabled binary into the target flash\r\n" ); |
okano | 33:ce9fff4cbf09 | 69 | #endif |
okano | 41:74b9ff21098f | 70 | } |
okano | 32:3700d5df4e18 | 71 | } |
okano | 30:e0d7524661ca | 72 | |
okano | 30:e0d7524661ca | 73 | printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 ); |
okano | 30:e0d7524661ca | 74 | printf( " resetting target\r\n" ); |
okano | 30:e0d7524661ca | 75 | |
okano | 34:eaca33d3e632 | 76 | |
okano | 34:eaca33d3e632 | 77 | #ifdef ENABLE_WRITING |
okano | 30:e0d7524661ca | 78 | if ( erase_sectors( last_sector ) ) |
okano | 30:e0d7524661ca | 79 | return ( ERROR_AT_SECTOR_ERASE ); |
okano | 30:e0d7524661ca | 80 | |
okano | 30:e0d7524661ca | 81 | printf( "\r\n ==== flash writing ====\r\n" ); |
okano | 30:e0d7524661ca | 82 | |
okano | 30:e0d7524661ca | 83 | if ( err = write_flash( fp, tpp, &transferred_size ) ) |
okano | 30:e0d7524661ca | 84 | return ( err ); |
okano | 30:e0d7524661ca | 85 | |
okano | 30:e0d7524661ca | 86 | printf( " -- %d bytes data are written\r\n", transferred_size ); |
okano | 34:eaca33d3e632 | 87 | leds_off(); |
okano | 34:eaca33d3e632 | 88 | #else |
okano | 34:eaca33d3e632 | 89 | printf( "\r\n ==== writing is disabled ====\r\n\r\n" ); |
okano | 34:eaca33d3e632 | 90 | #endif |
okano | 34:eaca33d3e632 | 91 | |
okano | 30:e0d7524661ca | 92 | |
okano | 33:ce9fff4cbf09 | 93 | #ifdef ENABLE_VERIFYING |
okano | 30:e0d7524661ca | 94 | printf( "\r\n ==== flash reading and verifying ====\r\n" ); |
okano | 30:e0d7524661ca | 95 | |
okano | 30:e0d7524661ca | 96 | if ( err = verify_flash( fp, tpp, &transferred_size ) ) |
okano | 30:e0d7524661ca | 97 | return ( err ); |
okano | 30:e0d7524661ca | 98 | |
okano | 30:e0d7524661ca | 99 | printf( " -- %d bytes data are read and verified\r\n", transferred_size ); |
okano | 34:eaca33d3e632 | 100 | leds_off(); |
okano | 33:ce9fff4cbf09 | 101 | #else |
okano | 33:ce9fff4cbf09 | 102 | printf( "\r\n ==== verifying has been skipped ====\r\n\r\n" ); |
okano | 33:ce9fff4cbf09 | 103 | #endif |
okano | 30:e0d7524661ca | 104 | |
okano | 34:eaca33d3e632 | 105 | |
okano | 30:e0d7524661ca | 106 | fclose( fp ); |
okano | 30:e0d7524661ca | 107 | |
okano | 30:e0d7524661ca | 108 | post_writing_process( tpp ); |
okano | 30:e0d7524661ca | 109 | |
okano | 30:e0d7524661ca | 110 | return ( 0 ); |
okano | 30:e0d7524661ca | 111 | } |
okano | 30:e0d7524661ca | 112 | |
okano | 30:e0d7524661ca | 113 | |
okano | 30:e0d7524661ca | 114 | int file_size( FILE *fp ) |
okano | 30:e0d7524661ca | 115 | { |
okano | 30:e0d7524661ca | 116 | int size; |
okano | 30:e0d7524661ca | 117 | |
okano | 30:e0d7524661ca | 118 | fseek( fp, 0, SEEK_END ); // seek to end of file |
okano | 41:74b9ff21098f | 119 | size = ftell( fp ); // get current file pointer |
okano | 30:e0d7524661ca | 120 | fseek( fp, 0, SEEK_SET ); // seek back to beginning of file |
okano | 30:e0d7524661ca | 121 | |
okano | 30:e0d7524661ca | 122 | return size; |
okano | 30:e0d7524661ca | 123 | } |
okano | 30:e0d7524661ca | 124 | |
okano | 30:e0d7524661ca | 125 | |
okano | 32:3700d5df4e18 | 126 | unsigned int crp_check( FILE *fp ) |
okano | 32:3700d5df4e18 | 127 | { |
okano | 32:3700d5df4e18 | 128 | unsigned int crp; |
okano | 32:3700d5df4e18 | 129 | |
okano | 33:ce9fff4cbf09 | 130 | switch ( crp = read_crp( fp ) ) { |
okano | 33:ce9fff4cbf09 | 131 | case NO_ISP : |
okano | 33:ce9fff4cbf09 | 132 | printf( "\r\n WARNING : CRP code detected 0x%08X (NO_ISP)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 133 | break; |
okano | 33:ce9fff4cbf09 | 134 | case CRP1 : |
okano | 33:ce9fff4cbf09 | 135 | printf( "\r\n WARNING : CRP code detected 0x%08X (CRP1)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 136 | break; |
okano | 33:ce9fff4cbf09 | 137 | case CRP2 : |
okano | 33:ce9fff4cbf09 | 138 | printf( "\r\n WARNING : CRP code detected 0x%08X (CRP2)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 139 | break; |
okano | 33:ce9fff4cbf09 | 140 | case CRP3 : |
okano | 33:ce9fff4cbf09 | 141 | printf( "\r\n WARNING : CRP code detected 0x%08X (CRP3)\r\n", crp ); |
okano | 33:ce9fff4cbf09 | 142 | break; |
okano | 33:ce9fff4cbf09 | 143 | default : |
okano | 33:ce9fff4cbf09 | 144 | crp = 0x0; // no CRP code detected |
okano | 33:ce9fff4cbf09 | 145 | break; |
okano | 33:ce9fff4cbf09 | 146 | } |
okano | 41:74b9ff21098f | 147 | |
okano | 33:ce9fff4cbf09 | 148 | return ( crp ); |
okano | 33:ce9fff4cbf09 | 149 | } |
okano | 33:ce9fff4cbf09 | 150 | |
okano | 33:ce9fff4cbf09 | 151 | |
okano | 33:ce9fff4cbf09 | 152 | unsigned int read_crp( FILE *fp ) |
okano | 33:ce9fff4cbf09 | 153 | { |
okano | 33:ce9fff4cbf09 | 154 | unsigned int crp; |
okano | 33:ce9fff4cbf09 | 155 | |
okano | 41:74b9ff21098f | 156 | fseek( fp, CRP_WORD_OFFSET, SEEK_SET ); // seek to 0x2FC (764th byte) |
okano | 32:3700d5df4e18 | 157 | |
okano | 32:3700d5df4e18 | 158 | if ( 1 != fread( &crp, sizeof( crp ), 1, fp ) ) |
okano | 32:3700d5df4e18 | 159 | return ( CRP_CHECK_ERROR ); |
okano | 32:3700d5df4e18 | 160 | |
okano | 32:3700d5df4e18 | 161 | fseek( fp, 0, SEEK_SET ); // seek back to beginning of file |
okano | 32:3700d5df4e18 | 162 | |
okano | 32:3700d5df4e18 | 163 | return ( crp ); |
okano | 32:3700d5df4e18 | 164 | } |
okano | 32:3700d5df4e18 | 165 | |
okano | 32:3700d5df4e18 | 166 | |
okano | 30:e0d7524661ca | 167 | void start_target_in_normal_mode( int baud_rate ) |
okano | 30:e0d7524661ca | 168 | { |
okano | 30:e0d7524661ca | 169 | set_target_baud_rate( baud_rate ); |
okano | 30:e0d7524661ca | 170 | reset_target( NO_ISP_MODE ); |
okano | 30:e0d7524661ca | 171 | } |
okano | 30:e0d7524661ca | 172 | |
okano | 30:e0d7524661ca | 173 | void start_success_indicator( void ) |
okano | 30:e0d7524661ca | 174 | { |
okano | 30:e0d7524661ca | 175 | success.attach( &success_indicator, 0.1 ); |
okano | 30:e0d7524661ca | 176 | } |
okano | 30:e0d7524661ca | 177 | |
okano | 30:e0d7524661ca | 178 | void success_indicator() |
okano | 30:e0d7524661ca | 179 | { |
okano | 30:e0d7524661ca | 180 | static int i = 0; |
okano | 30:e0d7524661ca | 181 | |
okano | 30:e0d7524661ca | 182 | leds = 0x1 << (i++ & 0x3); |
okano | 30:e0d7524661ca | 183 | } |
okano | 30:e0d7524661ca | 184 | |
okano | 30:e0d7524661ca | 185 | |
okano | 30:e0d7524661ca | 186 | void toggle_led( char v ) |
okano | 30:e0d7524661ca | 187 | { |
okano | 30:e0d7524661ca | 188 | leds = leds ^ (0x1 << v); |
okano | 30:e0d7524661ca | 189 | } |
okano | 30:e0d7524661ca | 190 | |
okano | 34:eaca33d3e632 | 191 | |
okano | 34:eaca33d3e632 | 192 | void leds_off( void ) |
okano | 34:eaca33d3e632 | 193 | { |
okano | 34:eaca33d3e632 | 194 | leds = 0x0; |
okano | 34:eaca33d3e632 | 195 | } |