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:
47:e7d395119a63
LPC1768 and LPC1769 support added

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