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 22:bd98a782fba6 1
okano 22:bd98a782fba6 2 #include "mbed.h"
okano 22:bd98a782fba6 3 #include "writing.h"
okano 22:bd98a782fba6 4 #include "command_interface.h"
okano 22:bd98a782fba6 5 #include "uu_coding.h"
okano 22:bd98a782fba6 6 #include "serial_utilities.h"
okano 30:e0d7524661ca 7 #include "isp.h"
okano 47:e7d395119a63 8 #include "_user_settings.h"
okano 22:bd98a782fba6 9
okano 22:bd98a782fba6 10
okano 47:e7d395119a63 11 int write_uuencoded_data( FILE *fp, target_param *tpp, int *total_size_p, int file_size );
okano 47:e7d395119a63 12 int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start, int *total_size_p, int file_size );
okano 47:e7d395119a63 13 int get_flash_writing_size( int ram_size, unsigned int ram_start );
okano 47:e7d395119a63 14 void show_progress( int total_size, int file_size );
okano 47:e7d395119a63 15
okano 47:e7d395119a63 16
okano 47:e7d395119a63 17 int write_flash( FILE *fp, target_param *tpp, int *transferred_size_p, int file_size )
okano 22:bd98a782fba6 18 {
okano 22:bd98a782fba6 19 if ( tpp->write_type == BINARY )
okano 47:e7d395119a63 20 return ( write_binary_data( fp, tpp->ram_size, tpp->sector_size, tpp->ram_start_address, transferred_size_p, file_size ) );
okano 22:bd98a782fba6 21 else // UUENCODE
okano 47:e7d395119a63 22 return ( write_uuencoded_data( fp, tpp, transferred_size_p, file_size ) );
okano 22:bd98a782fba6 23 }
okano 22:bd98a782fba6 24
okano 22:bd98a782fba6 25
okano 44:568799eac6df 26
okano 44:568799eac6df 27
okano 44:568799eac6df 28
okano 47:e7d395119a63 29 int write_uuencoded_data( FILE *fp, target_param *tpp, int *total_size_p, int file_size )
okano 22:bd98a782fba6 30 {
okano 22:bd98a782fba6 31 #define BYTES_PER_LINE 45
okano 22:bd98a782fba6 32
okano 22:bd98a782fba6 33 char command_str[ STR_BUFF_SIZE ];
okano 22:bd98a782fba6 34 long checksum = 0;
okano 29:96e28bc1bd99 35 int size;
okano 22:bd98a782fba6 36 int total_size = 0;
okano 44:568799eac6df 37 int sector_number;
okano 22:bd98a782fba6 38
okano 22:bd98a782fba6 39 int flash_writing_size;
okano 22:bd98a782fba6 40 int lines_per_transfer;
okano 22:bd98a782fba6 41 int transfer_size;
okano 22:bd98a782fba6 42
okano 22:bd98a782fba6 43 char *b;
okano 47:e7d395119a63 44
okano 44:568799eac6df 45 int ram_size = tpp->ram_size;
okano 44:568799eac6df 46 unsigned int ram_start = tpp->ram_start_address;
okano 29:96e28bc1bd99 47
okano 22:bd98a782fba6 48 initialize_uue_table();
okano 22:bd98a782fba6 49
okano 22:bd98a782fba6 50 flash_writing_size = get_flash_writing_size( ram_size, ram_start );
okano 22:bd98a782fba6 51 lines_per_transfer = ((flash_writing_size / BYTES_PER_LINE) + 1);
okano 22:bd98a782fba6 52 transfer_size = (((flash_writing_size + 11) / 12) * 12);
okano 22:bd98a782fba6 53
okano 22:bd98a782fba6 54 // char b[ transfer_size ]; // this can be done in mbed-compiler. but I should do it in common way
okano 22:bd98a782fba6 55
okano 22:bd98a782fba6 56 if ( NULL == (b = (char *)malloc( transfer_size * sizeof( char ) )) )
okano 28:689c3880e0e4 57 return( ERROR_AT_MALLOC_FOR_WRITE_BUFF );
okano 22:bd98a782fba6 58
okano 22:bd98a782fba6 59 for ( int i = flash_writing_size; i < transfer_size; i++ )
okano 22:bd98a782fba6 60 b[ i ] = 0; // this is not neccesary but just stuffing stuffing bytes
okano 22:bd98a782fba6 61
okano 22:bd98a782fba6 62 while ( size = fread( b, sizeof( char ), flash_writing_size, fp ) ) {
okano 22:bd98a782fba6 63
okano 22:bd98a782fba6 64 if ( !total_size ) {
okano 22:bd98a782fba6 65 // overwriting 4 bytes data for address=0x1C
okano 22:bd98a782fba6 66 // there is a slot for checksum that is checked in (target's) boot process
okano 22:bd98a782fba6 67 add_isp_checksum( b );
okano 22:bd98a782fba6 68 }
okano 22:bd98a782fba6 69
okano 22:bd98a782fba6 70 sprintf( command_str, "W %ld %ld\r\n", ram_start, transfer_size );
okano 35:0b434ef4af49 71 if ( try_and_check( command_str, "0" ) )
okano 27:2b5c1eb39bb5 72 return ( ERROR_AT_WRITE_COMMAND );
okano 22:bd98a782fba6 73
okano 22:bd98a782fba6 74 for ( int i = 0; i < lines_per_transfer; i++ ) {
okano 22:bd98a782fba6 75
okano 22:bd98a782fba6 76 checksum += bin2uue( b + (i * BYTES_PER_LINE), command_str, i == (lines_per_transfer - 1) ? (transfer_size % BYTES_PER_LINE) : BYTES_PER_LINE );
okano 22:bd98a782fba6 77
okano 22:bd98a782fba6 78 // printf( " data -- %02d %s\r", i, command_str );
okano 22:bd98a782fba6 79
okano 22:bd98a782fba6 80 put_string( command_str );
okano 22:bd98a782fba6 81
okano 22:bd98a782fba6 82 if ( !((i + 1) % 20) ) {
okano 28:689c3880e0e4 83 if ( send_RAM_transfer_checksum( checksum ) )
okano 28:689c3880e0e4 84 return ( ERROR_AT_SENDING_CHECKSUM );
okano 28:689c3880e0e4 85
okano 22:bd98a782fba6 86 checksum = 0;
okano 22:bd98a782fba6 87 }
okano 22:bd98a782fba6 88 }
okano 22:bd98a782fba6 89
okano 28:689c3880e0e4 90 if ( send_RAM_transfer_checksum( checksum ) )
okano 28:689c3880e0e4 91 return ( ERROR_AT_SENDING_CHECKSUM );
okano 28:689c3880e0e4 92
okano 22:bd98a782fba6 93 checksum = 0;
okano 22:bd98a782fba6 94
okano 44:568799eac6df 95 // sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size );
okano 44:568799eac6df 96
okano 44:568799eac6df 97 sector_number = find_sector( total_size, tpp );
okano 44:568799eac6df 98 sprintf( command_str, "P %d %d\r\n", sector_number, sector_number );
okano 47:e7d395119a63 99
okano 35:0b434ef4af49 100 if ( try_and_check( command_str, "0" ) )
okano 28:689c3880e0e4 101 return ( ERROR_AT_PREPARE_COMMAND );
okano 22:bd98a782fba6 102
okano 22:bd98a782fba6 103 sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size );
okano 35:0b434ef4af49 104 if ( try_and_check( command_str, "0" ) )
okano 27:2b5c1eb39bb5 105 return ( ERROR_AT_COPY_COMMAND );
okano 22:bd98a782fba6 106
okano 22:bd98a782fba6 107 total_size += size;
okano 47:e7d395119a63 108
okano 47:e7d395119a63 109 #ifdef ENABLE_PROGRESS_DISPLAY
okano 47:e7d395119a63 110 show_progress( total_size, file_size );
okano 47:e7d395119a63 111 #endif
okano 22:bd98a782fba6 112 }
okano 22:bd98a782fba6 113
okano 22:bd98a782fba6 114 free( b );
okano 29:96e28bc1bd99 115 *total_size_p = total_size;
okano 22:bd98a782fba6 116
okano 27:2b5c1eb39bb5 117 return ( NO_ERROR );
okano 22:bd98a782fba6 118 }
okano 22:bd98a782fba6 119
okano 22:bd98a782fba6 120
okano 47:e7d395119a63 121 int write_binary_data( FILE *fp, int ram_size, int sector_size, unsigned int ram_start, int *total_size_p, int file_size )
okano 22:bd98a782fba6 122 {
okano 22:bd98a782fba6 123 char command_str[ STR_BUFF_SIZE ];
okano 29:96e28bc1bd99 124 int total_size = 0;
okano 22:bd98a782fba6 125 int size;
okano 22:bd98a782fba6 126 int flash_writing_size;
okano 22:bd98a782fba6 127 char *b;
okano 22:bd98a782fba6 128
okano 22:bd98a782fba6 129 flash_writing_size = 256;
okano 22:bd98a782fba6 130
okano 22:bd98a782fba6 131 if ( NULL == (b = (char *)malloc( flash_writing_size * sizeof( char ) )) )
okano 28:689c3880e0e4 132 return( ERROR_AT_MALLOC_FOR_WRITE_BUFF );
okano 22:bd98a782fba6 133
okano 22:bd98a782fba6 134 while ( size = fread( b, sizeof( char ), flash_writing_size, fp ) ) {
okano 22:bd98a782fba6 135
okano 22:bd98a782fba6 136 if ( !total_size ) {
okano 22:bd98a782fba6 137 // overwriting 4 bytes data for address=0x1C
okano 22:bd98a782fba6 138 // there is a slot for checksum that is checked in (target's) boot process
okano 22:bd98a782fba6 139 add_isp_checksum( b );
okano 22:bd98a782fba6 140 }
okano 22:bd98a782fba6 141
okano 22:bd98a782fba6 142 sprintf( command_str, "W %ld %ld\r\n", ram_start, flash_writing_size );
okano 35:0b434ef4af49 143 if ( try_and_check( command_str, "0" ) )
okano 27:2b5c1eb39bb5 144 return ( ERROR_AT_WRITE_COMMAND );
okano 22:bd98a782fba6 145
okano 22:bd98a782fba6 146 put_binary( b, flash_writing_size );
okano 22:bd98a782fba6 147 put_string( "\r\n" );
okano 22:bd98a782fba6 148
okano 22:bd98a782fba6 149 sprintf( command_str, "P %d %d\r\n", total_size / sector_size, total_size / sector_size );
okano 35:0b434ef4af49 150 if ( try_and_check( command_str, "0" ) )
okano 28:689c3880e0e4 151 return ( ERROR_AT_PREPARE_COMMAND );
okano 22:bd98a782fba6 152
okano 22:bd98a782fba6 153 sprintf( command_str, "C %d %d %d\r\n", total_size, ram_start, flash_writing_size );
okano 35:0b434ef4af49 154 if ( try_and_check( command_str, "0" ) )
okano 27:2b5c1eb39bb5 155 return ( ERROR_AT_COPY_COMMAND );
okano 22:bd98a782fba6 156
okano 22:bd98a782fba6 157 total_size += size;
okano 22:bd98a782fba6 158 //printf( " total %d bytes transferred\r", total_size );
okano 22:bd98a782fba6 159
okano 47:e7d395119a63 160 #ifdef ENABLE_PROGRESS_DISPLAY
okano 47:e7d395119a63 161 show_progress( total_size, file_size );
okano 47:e7d395119a63 162 #endif
okano 22:bd98a782fba6 163 }
okano 22:bd98a782fba6 164
okano 22:bd98a782fba6 165 free( b );
okano 29:96e28bc1bd99 166 *total_size_p = total_size;
okano 22:bd98a782fba6 167
okano 27:2b5c1eb39bb5 168 return ( NO_ERROR );
okano 22:bd98a782fba6 169 }
okano 22:bd98a782fba6 170
okano 22:bd98a782fba6 171
okano 22:bd98a782fba6 172 void add_isp_checksum( char *b )
okano 22:bd98a782fba6 173 {
okano 22:bd98a782fba6 174 // see http://www.lpcware.com/content/nxpfile/lpc177x8x-checksum-insertion-program
okano 22:bd98a782fba6 175
okano 22:bd98a782fba6 176 unsigned int *p;
okano 22:bd98a782fba6 177 unsigned int cksum = 0;
okano 22:bd98a782fba6 178
okano 22:bd98a782fba6 179 p = (unsigned int *)b;
okano 22:bd98a782fba6 180
okano 22:bd98a782fba6 181 for ( int i = 0; i < 7; i++ ) {
okano 22:bd98a782fba6 182 cksum += *p++;
okano 22:bd98a782fba6 183 }
okano 22:bd98a782fba6 184
okano 22:bd98a782fba6 185 printf( " -- value at checksum slot : 0x%08X\r\n", *p );
okano 22:bd98a782fba6 186
okano 22:bd98a782fba6 187 *p = 0xFFFFFFFF - cksum + 1;
okano 22:bd98a782fba6 188 printf( " -- calculated checksum : 0x%08X\r\n", *p );
okano 22:bd98a782fba6 189
okano 26:a63e73885b21 190 printf( " new checksum will be used programing flash\r\n" );
okano 22:bd98a782fba6 191 }
okano 22:bd98a782fba6 192
okano 22:bd98a782fba6 193
okano 22:bd98a782fba6 194 int get_flash_writing_size( int ram_size, unsigned int ram_start )
okano 22:bd98a782fba6 195 {
okano 22:bd98a782fba6 196 int flash_writing_size[] = {
okano 22:bd98a782fba6 197 4096,
okano 22:bd98a782fba6 198 1024,
okano 22:bd98a782fba6 199 512,
okano 22:bd98a782fba6 200 256
okano 22:bd98a782fba6 201 };
okano 22:bd98a782fba6 202 int available_size;
okano 22:bd98a782fba6 203 int i;
okano 22:bd98a782fba6 204
okano 22:bd98a782fba6 205 available_size = ram_size - (ram_start & 0xFFFF);
okano 22:bd98a782fba6 206
okano 22:bd98a782fba6 207 for ( i = 0; i < sizeof( flash_writing_size ) / sizeof( int ); i++ ) {
okano 22:bd98a782fba6 208 if ( flash_writing_size[ i ] < available_size )
okano 22:bd98a782fba6 209 break;
okano 22:bd98a782fba6 210 }
okano 22:bd98a782fba6 211
okano 22:bd98a782fba6 212 return ( flash_writing_size[ i ] );
okano 28:689c3880e0e4 213 }
okano 28:689c3880e0e4 214
okano 28:689c3880e0e4 215
okano 28:689c3880e0e4 216 int post_writing_process( target_param *tpp )
okano 28:689c3880e0e4 217 {
okano 28:689c3880e0e4 218 if ( tpp->write_type == UUENCODE )
okano 35:0b434ef4af49 219 return ( try_and_check( "G 0 T\r\n", "0" ) );
okano 28:689c3880e0e4 220 else
okano 28:689c3880e0e4 221 return ( 0 );
okano 28:689c3880e0e4 222 }