Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
Hapi_Tech
Date:
Sat Jul 04 05:29:32 2015 +0000
Revision:
50:57ad8e04f063
Parent:
47:e7d395119a63
Adding LPC11U68,11E68.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 24:9830b4f1207b 1 #include "mbed.h"
okano 24:9830b4f1207b 2 #include "verification.h"
okano 24:9830b4f1207b 3 #include "command_interface.h"
okano 24:9830b4f1207b 4 #include "uu_coding.h"
okano 24:9830b4f1207b 5 #include "serial_utilities.h"
okano 24:9830b4f1207b 6 #include "writing.h"
okano 30:e0d7524661ca 7 #include "isp.h"
okano 47:e7d395119a63 8 #include "_user_settings.h"
okano 28:689c3880e0e4 9
okano 24:9830b4f1207b 10
okano 47:e7d395119a63 11
okano 47:e7d395119a63 12 int verify_binary_data( FILE *fp, int *transferred_size_p, int file_size );
okano 47:e7d395119a63 13 int verify_uucoded_data( FILE *fp, int *transferred_size_p, int file_size );
okano 24:9830b4f1207b 14 void get_binary_from_uucode_str( char *b, int size );
okano 24:9830b4f1207b 15
okano 24:9830b4f1207b 16
okano 47:e7d395119a63 17 int verify_flash( FILE *fp, target_param *tpp, int *transferred_size_p, int file_size )
okano 24:9830b4f1207b 18 {
okano 24:9830b4f1207b 19 if ( tpp->write_type == BINARY )
okano 47:e7d395119a63 20 return ( verify_binary_data( fp, transferred_size_p, file_size ) );
okano 24:9830b4f1207b 21 else
okano 47:e7d395119a63 22 return ( verify_uucoded_data( fp, transferred_size_p, file_size ) );
okano 24:9830b4f1207b 23 }
okano 24:9830b4f1207b 24
okano 24:9830b4f1207b 25
okano 47:e7d395119a63 26 int verify_binary_data( FILE *fp, int *read_size_p, int file_size )
okano 24:9830b4f1207b 27 {
okano 24:9830b4f1207b 28 char command_str[ STR_BUFF_SIZE ];
okano 24:9830b4f1207b 29 int read_size = 0;
okano 24:9830b4f1207b 30 int size;
okano 24:9830b4f1207b 31 int flash_reading_size;
okano 24:9830b4f1207b 32 char *bf;
okano 24:9830b4f1207b 33 char *br;
okano 24:9830b4f1207b 34 int error_flag = 0;
okano 24:9830b4f1207b 35 unsigned long checksum = 0;
okano 24:9830b4f1207b 36 unsigned long checksum_count = 0;
okano 24:9830b4f1207b 37
okano 29:96e28bc1bd99 38
okano 24:9830b4f1207b 39 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 24:9830b4f1207b 40
okano 24:9830b4f1207b 41 flash_reading_size = 128;
okano 24:9830b4f1207b 42
okano 24:9830b4f1207b 43 if ( NULL == (bf = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 28:689c3880e0e4 44 return( ERROR_AT_MALLOC_FOR_VERIFY_FILE_BUFF );
okano 24:9830b4f1207b 45
okano 24:9830b4f1207b 46 if ( NULL == (br = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 28:689c3880e0e4 47 return( ERROR_AT_MALLOC_FOR_VERIFY_DATA_BUFF );
okano 24:9830b4f1207b 48
okano 24:9830b4f1207b 49
okano 24:9830b4f1207b 50 while ( size = fread( bf, sizeof( char ), flash_reading_size, fp ) ) {
okano 24:9830b4f1207b 51
okano 24:9830b4f1207b 52 if ( read_size < 0x20 ) {
okano 24:9830b4f1207b 53 for ( int i = 0; i < flash_reading_size; i += 4 ) {
okano 24:9830b4f1207b 54
okano 24:9830b4f1207b 55 if ( checksum_count == 7 ) {
okano 24:9830b4f1207b 56 checksum = 0xFFFFFFFF - checksum + 1;
okano 24:9830b4f1207b 57 *((unsigned int *)(bf + i)) = checksum;
okano 26:a63e73885b21 58 //printf( "\r\n\r\n -- calculated checksum : 0x%08X\r\n", checksum );
okano 24:9830b4f1207b 59 } else {
okano 24:9830b4f1207b 60 checksum += *((unsigned int *)(bf + i));
okano 24:9830b4f1207b 61 }
okano 26:a63e73885b21 62
okano 24:9830b4f1207b 63 checksum_count++;
okano 24:9830b4f1207b 64 }
okano 24:9830b4f1207b 65 }
okano 24:9830b4f1207b 66
okano 24:9830b4f1207b 67
okano 38:cb95bfe0546a 68 sprintf( command_str, "R %ld %ld\r\n", read_size, (size + 3) & ~0x3 ); // reading size must be 4*N
okano 35:0b434ef4af49 69 if ( try_and_check( command_str, "0" ) )
okano 27:2b5c1eb39bb5 70 return ( ERROR_AT_READ_COMMAND );
okano 24:9830b4f1207b 71
okano 24:9830b4f1207b 72 get_binary( br, 1 );
okano 24:9830b4f1207b 73 get_binary( br, size );
okano 24:9830b4f1207b 74
okano 24:9830b4f1207b 75 for ( int i = 0; i < size; i++ ) {
okano 24:9830b4f1207b 76 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 24:9830b4f1207b 77 if ( (*(bf + i) != *(br + i)) ) {
okano 24:9830b4f1207b 78 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 24:9830b4f1207b 79 error_flag++;
okano 24:9830b4f1207b 80 }
okano 24:9830b4f1207b 81 }
okano 24:9830b4f1207b 82
okano 24:9830b4f1207b 83 if ( error_flag )
okano 24:9830b4f1207b 84 break;
okano 26:a63e73885b21 85
okano 24:9830b4f1207b 86 read_size += size;
okano 47:e7d395119a63 87
okano 47:e7d395119a63 88 #ifdef ENABLE_PROGRESS_DISPLAY
okano 47:e7d395119a63 89 show_progress( read_size, file_size );
okano 47:e7d395119a63 90 #endif
okano 24:9830b4f1207b 91 }
okano 26:a63e73885b21 92
okano 24:9830b4f1207b 93 free( bf );
okano 24:9830b4f1207b 94 free( br );
okano 24:9830b4f1207b 95
okano 29:96e28bc1bd99 96 *read_size_p = read_size;
okano 29:96e28bc1bd99 97
okano 27:2b5c1eb39bb5 98 return ( error_flag ? ERROR_DATA_DOES_NOT_MATCH : NO_ERROR );
okano 24:9830b4f1207b 99 }
okano 24:9830b4f1207b 100
okano 24:9830b4f1207b 101
okano 34:eaca33d3e632 102 #define LINE_BYTES 44
okano 34:eaca33d3e632 103 #define N_OF_LINES 4
okano 34:eaca33d3e632 104 #define READ_SIZE (LINE_BYTES * N_OF_LINES)
okano 34:eaca33d3e632 105
okano 34:eaca33d3e632 106
okano 47:e7d395119a63 107 int verify_uucoded_data( FILE *fp, int *read_size_p, int file_size )
okano 24:9830b4f1207b 108 {
okano 24:9830b4f1207b 109 char command_str[ STR_BUFF_SIZE ];
okano 24:9830b4f1207b 110 int read_size = 0;
okano 24:9830b4f1207b 111 int size;
okano 24:9830b4f1207b 112 int flash_reading_size;
okano 24:9830b4f1207b 113 char *bf;
okano 24:9830b4f1207b 114 char *br;
okano 24:9830b4f1207b 115 int error_flag = 0;
okano 24:9830b4f1207b 116
okano 34:eaca33d3e632 117 flash_reading_size = READ_SIZE;
okano 24:9830b4f1207b 118
okano 24:9830b4f1207b 119 initialize_uud_table();
okano 24:9830b4f1207b 120
okano 24:9830b4f1207b 121 if ( NULL == (bf = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 24:9830b4f1207b 122 error( "malloc error happened (in verify process, file data buffer)\r\n" );
okano 24:9830b4f1207b 123
okano 24:9830b4f1207b 124 if ( NULL == (br = (char *)malloc( flash_reading_size * sizeof( char ) )) )
okano 24:9830b4f1207b 125 error( "malloc error happened (in verify process, read data buffer)\r\n" );
okano 24:9830b4f1207b 126
okano 24:9830b4f1207b 127 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
okano 24:9830b4f1207b 128
okano 24:9830b4f1207b 129 while ( size = fread( bf, sizeof( char ), flash_reading_size, fp ) ) {
okano 24:9830b4f1207b 130
okano 24:9830b4f1207b 131 if ( !read_size ) {
okano 24:9830b4f1207b 132 // overwriting 4 bytes data for address=0x1C
okano 24:9830b4f1207b 133 // there is a slot for checksum that is checked in (target's) boot process
okano 24:9830b4f1207b 134 add_isp_checksum( bf );
okano 24:9830b4f1207b 135 }
okano 24:9830b4f1207b 136
okano 38:cb95bfe0546a 137 sprintf( command_str, "R %ld %ld\r\n", read_size, (size + 3) & ~0x3 ); // reading size must be 4*N
okano 35:0b434ef4af49 138 if ( try_and_check( command_str, "0" ) )
okano 27:2b5c1eb39bb5 139 return ( ERROR_AT_READ_COMMAND );
okano 24:9830b4f1207b 140
okano 24:9830b4f1207b 141 get_binary_from_uucode_str( br, size );
okano 24:9830b4f1207b 142
okano 24:9830b4f1207b 143 for ( int i = 0; i < size; i++ ) {
okano 24:9830b4f1207b 144 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 24:9830b4f1207b 145 if ( (*(bf + i) != *(br + i)) ) {
okano 38:cb95bfe0546a 146 // printf( " %s 0x%02X --- 0x%02X\r\n", (*(bf + i) != *(br + i)) ? "***" : " ", *(bf + i), *(br + i) );
okano 24:9830b4f1207b 147 error_flag++;
okano 24:9830b4f1207b 148 }
okano 24:9830b4f1207b 149 }
okano 24:9830b4f1207b 150
okano 24:9830b4f1207b 151 if ( error_flag )
okano 24:9830b4f1207b 152 break;
okano 26:a63e73885b21 153
okano 24:9830b4f1207b 154 read_size += size;
okano 47:e7d395119a63 155
okano 47:e7d395119a63 156 #ifdef ENABLE_PROGRESS_DISPLAY
okano 47:e7d395119a63 157 show_progress( read_size, file_size );
okano 47:e7d395119a63 158 #endif
okano 24:9830b4f1207b 159 }
okano 24:9830b4f1207b 160
okano 24:9830b4f1207b 161 free( bf );
okano 24:9830b4f1207b 162 free( br );
okano 24:9830b4f1207b 163
okano 29:96e28bc1bd99 164 *read_size_p = read_size;
okano 29:96e28bc1bd99 165
okano 27:2b5c1eb39bb5 166 return ( error_flag ? ERROR_DATA_DOES_NOT_MATCH : NO_ERROR );
okano 24:9830b4f1207b 167 }
okano 24:9830b4f1207b 168
okano 24:9830b4f1207b 169
okano 24:9830b4f1207b 170 void get_binary_from_uucode_str( char *b, int size )
okano 24:9830b4f1207b 171 {
okano 34:eaca33d3e632 172 char s[ N_OF_LINES ][ STR_BUFF_SIZE ];
okano 24:9830b4f1207b 173 char ss[ STR_BUFF_SIZE ];
okano 24:9830b4f1207b 174 long checksum = 0;
okano 24:9830b4f1207b 175 int line_count = 0;
okano 24:9830b4f1207b 176 int read_size = 0;
okano 24:9830b4f1207b 177 int retry_count = 3;
okano 24:9830b4f1207b 178
okano 38:cb95bfe0546a 179 size = (size + 3) & ~0x3;
okano 24:9830b4f1207b 180
okano 24:9830b4f1207b 181 while ( retry_count-- ) {
okano 24:9830b4f1207b 182
okano 34:eaca33d3e632 183 for ( int i = 0; i < ((READ_SIZE < size) ? N_OF_LINES : ((size - 1) / LINE_BYTES) + 1) ; i++ )
okano 24:9830b4f1207b 184 get_string( s[ i ] );
okano 24:9830b4f1207b 185
okano 24:9830b4f1207b 186 get_string( ss );
okano 24:9830b4f1207b 187
okano 24:9830b4f1207b 188
okano 24:9830b4f1207b 189 while ( size ) {
okano 24:9830b4f1207b 190 read_size = uudecode_a_line( b, s[ line_count ] );
okano 24:9830b4f1207b 191
okano 24:9830b4f1207b 192 for ( int i = 0; i < read_size; i++ )
okano 24:9830b4f1207b 193 checksum += *b++;
okano 24:9830b4f1207b 194
okano 24:9830b4f1207b 195 size -= read_size;
okano 24:9830b4f1207b 196 line_count++;
okano 24:9830b4f1207b 197 }
okano 24:9830b4f1207b 198
okano 24:9830b4f1207b 199 // printf( " checksum -- %s (internal = %ld)\r\n", ss, checksum );
okano 24:9830b4f1207b 200
okano 24:9830b4f1207b 201 if ( checksum == atol( ss ) ) {
okano 24:9830b4f1207b 202 put_string( "OK\r\n" );
okano 24:9830b4f1207b 203 return;
okano 24:9830b4f1207b 204 // printf( " checksum OK\r\n" );
okano 24:9830b4f1207b 205 } else {
okano 24:9830b4f1207b 206 printf( " checksum RESEND\r\n" );
okano 24:9830b4f1207b 207 put_string( "RESEND\r\n" );
okano 24:9830b4f1207b 208 }
okano 24:9830b4f1207b 209 }
okano 24:9830b4f1207b 210 }