Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Fri Sep 20 00:40:08 2013 +0000
Revision:
28:689c3880e0e4
Parent:
27:2b5c1eb39bb5
Child:
29:96e28bc1bd99
made function returns error. LED1 and LED2 assigned to toggle by TX and RX

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