Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Thu Sep 26 11:51:03 2013 +0000
Revision:
34:eaca33d3e632
Parent:
33:ce9fff4cbf09
Child:
38:cb95bfe0546a
[1]; fix: verification function was having a bug. 3/4 of the code was having chance of verification fail.; ; [2]; "ENABLE_WRITING" option added (see "_user_setting.h"). Verifying-only operation can be done with disabling this word

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