Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Wed Dec 10 09:24:00 2014 +0000
Revision:
44:568799eac6df
Parent:
41:74b9ff21098f
Child:
45:0520330a7528
LPC1768 and LPC1769 support added

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 30:e0d7524661ca 23
okano 33:ce9fff4cbf09 24
okano 30:e0d7524661ca 25 int isp_flash_write( char *file_name )
okano 30:e0d7524661ca 26 {
okano 30:e0d7524661ca 27 FILE *fp;
okano 30:e0d7524661ca 28 target_param *tpp;
okano 30:e0d7524661ca 29 int data_size;
okano 30:e0d7524661ca 30 int last_sector;
okano 30:e0d7524661ca 31 int transferred_size;
okano 30:e0d7524661ca 32 int err;
okano 30:e0d7524661ca 33
okano 30:e0d7524661ca 34 if ( NULL == (tpp = open_target( ISP_BAUD_RATE )) ) {
okano 30:e0d7524661ca 35 return ( ERROR_AT_TARGET_OPEN );
okano 30:e0d7524661ca 36 }
okano 30:e0d7524661ca 37
okano 44:568799eac6df 38 printf( " target device found : type = \"%s\"\r\n", tpp->type_name );
okano 39:f68f9fa1e88e 39 printf( " ID = 0x%08X\r\n", tpp->id );
okano 39:f68f9fa1e88e 40 printf( " RAM size = %10d bytes\r\n", tpp->ram_size );
okano 39:f68f9fa1e88e 41 printf( " flash size = %10d bytes\r\n", tpp->flash_size );
okano 30:e0d7524661ca 42
okano 30:e0d7524661ca 43 printf( " opening file: \"%s\"\r\n", file_name );
okano 30:e0d7524661ca 44
okano 30:e0d7524661ca 45 if ( NULL == (fp = fopen( file_name, "rb" )) ) {
okano 30:e0d7524661ca 46 return ( ERROR_AT_FILE_OPEN );
okano 30:e0d7524661ca 47 }
okano 30:e0d7524661ca 48
okano 30:e0d7524661ca 49 data_size = file_size( fp );
okano 41:74b9ff21098f 50
okano 38:cb95bfe0546a 51 if ( !data_size )
okano 38:cb95bfe0546a 52 return ( ERROR_DATA_SIZE_ZERO );
okano 41:74b9ff21098f 53
okano 44:568799eac6df 54 for ( int i = 0; i < 32768; i += 4096 )
okano 44:568799eac6df 55 printf( "%10d : %2d\r\n", i, find_sector( i, tpp ) );
okano 44:568799eac6df 56
okano 44:568799eac6df 57
okano 44:568799eac6df 58 // last_sector = (data_size - 1) / tpp->sector_size;
okano 44:568799eac6df 59 last_sector = find_sector( data_size - 1, tpp );
okano 33:ce9fff4cbf09 60
okano 41:74b9ff21098f 61 if ( data_size < (CRP_WORD_OFFSET + sizeof( unsigned int )) ) {
okano 41:74b9ff21098f 62 printf( " CRP check is not performed because data size is less than 0x300(768) bytes\r\n" );
okano 41:74b9ff21098f 63 } else {
okano 41:74b9ff21098f 64 if ( crp_check( fp ) ) {
okano 41:74b9ff21098f 65 printf( " the CRP is enabled in the data source file\r\n" );
okano 33:ce9fff4cbf09 66
okano 33:ce9fff4cbf09 67 #ifdef CHECK_CRP_CODE
okano 41:74b9ff21098f 68 printf( " aborting execution by CRP warning\r\n" );
okano 33:ce9fff4cbf09 69
okano 41:74b9ff21098f 70 return ( WARNING_CRP_CODE_DETECTED );
okano 33:ce9fff4cbf09 71 #else
okano 41:74b9ff21098f 72 printf( " this program continues to write the CRP enabled binary into the target flash\r\n" );
okano 33:ce9fff4cbf09 73 #endif
okano 41:74b9ff21098f 74 }
okano 32:3700d5df4e18 75 }
okano 30:e0d7524661ca 76
okano 30:e0d7524661ca 77 printf( " data size = %d bytes, it takes %d secotrs in flash area\r\n", data_size, last_sector + 1 );
okano 30:e0d7524661ca 78 printf( " resetting target\r\n" );
okano 30:e0d7524661ca 79
okano 34:eaca33d3e632 80 #ifdef ENABLE_WRITING
okano 44:568799eac6df 81 if ( erase_sectors( find_sector( data_size - 1, tpp ) ) )
okano 30:e0d7524661ca 82 return ( ERROR_AT_SECTOR_ERASE );
okano 30:e0d7524661ca 83
okano 30:e0d7524661ca 84 printf( "\r\n ==== flash writing ====\r\n" );
okano 30:e0d7524661ca 85
okano 30:e0d7524661ca 86 if ( err = write_flash( fp, tpp, &transferred_size ) )
okano 30:e0d7524661ca 87 return ( err );
okano 30:e0d7524661ca 88
okano 30:e0d7524661ca 89 printf( " -- %d bytes data are written\r\n", transferred_size );
okano 34:eaca33d3e632 90 leds_off();
okano 34:eaca33d3e632 91 #else
okano 34:eaca33d3e632 92 printf( "\r\n ==== writing is disabled ====\r\n\r\n" );
okano 34:eaca33d3e632 93 #endif
okano 34:eaca33d3e632 94
okano 30:e0d7524661ca 95
okano 44:568799eac6df 96 #if 0
okano 44:568799eac6df 97 if ( tpp->id == 0x26113F37 ) {
okano 44:568799eac6df 98 // The MEMMAP register should be operated if want to verify the LPC176x flash data
okano 44:568799eac6df 99 }
okano 44:568799eac6df 100 #endif
okano 44:568799eac6df 101
okano 30:e0d7524661ca 102
okano 44:568799eac6df 103 #ifdef ENABLE_VERIFYING
okano 44:568799eac6df 104 if ( (tpp->id == 0x26113F37) || (tpp->id == 0x26013F37) ) {
okano 44:568799eac6df 105 printf( "\r\n ==== for the LPC176x, verification is not supported ====\r\n\r\n" );
okano 44:568799eac6df 106 } else {
okano 44:568799eac6df 107 printf( "\r\n ==== flash reading and verifying ====\r\n" );
okano 30:e0d7524661ca 108
okano 44:568799eac6df 109 if ( err = verify_flash( fp, tpp, &transferred_size ) )
okano 44:568799eac6df 110 return ( err );
okano 44:568799eac6df 111
okano 44:568799eac6df 112 printf( " -- %d bytes data are read and verified\r\n", transferred_size );
okano 44:568799eac6df 113 leds_off();
okano 44:568799eac6df 114 }
okano 33:ce9fff4cbf09 115 #else
okano 33:ce9fff4cbf09 116 printf( "\r\n ==== verifying has been skipped ====\r\n\r\n" );
okano 44:568799eac6df 117 }
okano 33:ce9fff4cbf09 118 #endif
okano 30:e0d7524661ca 119
okano 34:eaca33d3e632 120
okano 30:e0d7524661ca 121 fclose( fp );
okano 30:e0d7524661ca 122
okano 30:e0d7524661ca 123 post_writing_process( tpp );
okano 30:e0d7524661ca 124
okano 30:e0d7524661ca 125 return ( 0 );
okano 30:e0d7524661ca 126 }
okano 30:e0d7524661ca 127
okano 30:e0d7524661ca 128
okano 30:e0d7524661ca 129 int file_size( FILE *fp )
okano 30:e0d7524661ca 130 {
okano 30:e0d7524661ca 131 int size;
okano 30:e0d7524661ca 132
okano 30:e0d7524661ca 133 fseek( fp, 0, SEEK_END ); // seek to end of file
okano 41:74b9ff21098f 134 size = ftell( fp ); // get current file pointer
okano 30:e0d7524661ca 135 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 30:e0d7524661ca 136
okano 30:e0d7524661ca 137 return size;
okano 30:e0d7524661ca 138 }
okano 30:e0d7524661ca 139
okano 30:e0d7524661ca 140
okano 32:3700d5df4e18 141 unsigned int crp_check( FILE *fp )
okano 32:3700d5df4e18 142 {
okano 32:3700d5df4e18 143 unsigned int crp;
okano 32:3700d5df4e18 144
okano 33:ce9fff4cbf09 145 switch ( crp = read_crp( fp ) ) {
okano 33:ce9fff4cbf09 146 case NO_ISP :
okano 33:ce9fff4cbf09 147 printf( "\r\n WARNING : CRP code detected 0x%08X (NO_ISP)\r\n", crp );
okano 33:ce9fff4cbf09 148 break;
okano 33:ce9fff4cbf09 149 case CRP1 :
okano 33:ce9fff4cbf09 150 printf( "\r\n WARNING : CRP code detected 0x%08X (CRP1)\r\n", crp );
okano 33:ce9fff4cbf09 151 break;
okano 33:ce9fff4cbf09 152 case CRP2 :
okano 33:ce9fff4cbf09 153 printf( "\r\n WARNING : CRP code detected 0x%08X (CRP2)\r\n", crp );
okano 33:ce9fff4cbf09 154 break;
okano 33:ce9fff4cbf09 155 case CRP3 :
okano 33:ce9fff4cbf09 156 printf( "\r\n WARNING : CRP code detected 0x%08X (CRP3)\r\n", crp );
okano 33:ce9fff4cbf09 157 break;
okano 33:ce9fff4cbf09 158 default :
okano 33:ce9fff4cbf09 159 crp = 0x0; // no CRP code detected
okano 33:ce9fff4cbf09 160 break;
okano 33:ce9fff4cbf09 161 }
okano 41:74b9ff21098f 162
okano 33:ce9fff4cbf09 163 return ( crp );
okano 33:ce9fff4cbf09 164 }
okano 33:ce9fff4cbf09 165
okano 33:ce9fff4cbf09 166
okano 33:ce9fff4cbf09 167 unsigned int read_crp( FILE *fp )
okano 33:ce9fff4cbf09 168 {
okano 33:ce9fff4cbf09 169 unsigned int crp;
okano 33:ce9fff4cbf09 170
okano 41:74b9ff21098f 171 fseek( fp, CRP_WORD_OFFSET, SEEK_SET ); // seek to 0x2FC (764th byte)
okano 32:3700d5df4e18 172
okano 32:3700d5df4e18 173 if ( 1 != fread( &crp, sizeof( crp ), 1, fp ) )
okano 32:3700d5df4e18 174 return ( CRP_CHECK_ERROR );
okano 32:3700d5df4e18 175
okano 32:3700d5df4e18 176 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 32:3700d5df4e18 177
okano 32:3700d5df4e18 178 return ( crp );
okano 32:3700d5df4e18 179 }
okano 32:3700d5df4e18 180
okano 32:3700d5df4e18 181
okano 30:e0d7524661ca 182 void start_target_in_normal_mode( int baud_rate )
okano 30:e0d7524661ca 183 {
okano 30:e0d7524661ca 184 set_target_baud_rate( baud_rate );
okano 30:e0d7524661ca 185 reset_target( NO_ISP_MODE );
okano 30:e0d7524661ca 186 }
okano 30:e0d7524661ca 187
okano 30:e0d7524661ca 188 void start_success_indicator( void )
okano 30:e0d7524661ca 189 {
okano 30:e0d7524661ca 190 success.attach( &success_indicator, 0.1 );
okano 30:e0d7524661ca 191 }
okano 30:e0d7524661ca 192
okano 30:e0d7524661ca 193 void success_indicator()
okano 30:e0d7524661ca 194 {
okano 30:e0d7524661ca 195 static int i = 0;
okano 30:e0d7524661ca 196
okano 30:e0d7524661ca 197 leds = 0x1 << (i++ & 0x3);
okano 30:e0d7524661ca 198 }
okano 30:e0d7524661ca 199
okano 30:e0d7524661ca 200
okano 30:e0d7524661ca 201 void toggle_led( char v )
okano 30:e0d7524661ca 202 {
okano 30:e0d7524661ca 203 leds = leds ^ (0x1 << v);
okano 30:e0d7524661ca 204 }
okano 30:e0d7524661ca 205
okano 34:eaca33d3e632 206
okano 34:eaca33d3e632 207 void leds_off( void )
okano 34:eaca33d3e632 208 {
okano 34:eaca33d3e632 209 leds = 0x0;
okano 34:eaca33d3e632 210 }