Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Fri Sep 13 03:34:43 2013 +0000
Revision:
22:bd98a782fba6
Child:
24:9830b4f1207b
dividing code into modules

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