00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "config.h"
00047 #include "conf_usb.h"
00048
00049 #ifndef HOST_UPGRADE_MODE
00050 # warning HOST_UPGRADE_MODE not defined as ENABLE or DISABLE, using DISABLE...
00051 # define HOST_UPGRADE_MODE DISABLE
00052 #endif
00053
00054
00055 #if (HOST_UPGRADE_MODE==ENABLE)
00056
00057 # ifndef __ICCAVR__
00058 # error HOST_UPGRADE_MODE feature run only under IAR
00059 # endif
00060
00061 #include "modules/file_system/fat.h"
00062 #include "modules/file_system/fs_com.h"
00063 #include "modules/file_system/navigation.h"
00064 #include "modules/file_system/file.h"
00065 #include "modules/file_system/nav_utils.h"
00066 #include "lib_mcu/flash/flash_lib.h"
00067 #include "stdio.h"
00068 #include "string.h"
00069
00070
00071
00072
00073 #define MAX_DATA_LINE 16
00074
00075
00076 #define UPGRADE_SIZE_MAX 50
00077 #define UPGRADE_ADDR 0x333
00078
00079
00080
00081
00082
00083
00084 code char msg_to_upgrade[UPGRADE_SIZE_MAX] At(UPGRADE_ADDR);
00085
00086
00087 typedef struct
00088 {
00089 U8 u8_nb_data;
00090 U16 u16_add;
00091 U8 u8_type;
00092 U8* datas;
00093 } St_hex_line;
00094
00095
00096
00097 static void firm_upgrade_displayzone ( void );
00098 static void firm_upgrade_status ( char *status );
00099 static Bool firm_upgrade_searchfile ( const char* filename );
00100 static Bool firm_upgrade_readhexline ( St_hex_line* line );
00101 static U8 firm_upgrade_ascii2bin ( U8 ascii );
00102 static U8 firm_upgrade_readbyte ( void );
00103
00104
00111 void firm_upgrade_run( void )
00112 {
00113 Fs_index sav_index;
00114 U8 u8_i, save_int;
00115 St_hex_line hex_line;
00116 U8 datas[MAX_DATA_LINE];
00117 char filename[30];
00118
00119 hex_line.datas = datas;
00120 hex_line.u8_type = 0;
00121
00122
00123 sav_index = nav_getindex();
00124
00125 printf("\n\rDislpay upgrade zone BEFORE upgrade:\n\r");
00126 firm_upgrade_displayzone();
00127
00128 printf("Search upgrade file\n\r...\r");
00129 if( !firm_upgrade_searchfile( "upgrade*" ) )
00130 {
00131 firm_upgrade_status("No upgrade file");
00132 nav_gotoindex(&sav_index);
00133 return;
00134 }
00135
00136 nav_file_getname( filename, 50 );
00137 printf("Open upgrade file \"%s\"\n\r...\r", filename );
00138 if( !file_open(FOPEN_MODE_R) )
00139 {
00140 firm_upgrade_status("!! Error to open upgrade file");
00141 nav_gotoindex(&sav_index);
00142 return;
00143 }
00144
00145 printf("Check upgrade file\n\r...\r");
00146 while (!file_eof())
00147 {
00148
00149 hex_line.u8_nb_data = MAX_DATA_LINE;
00150 if( !firm_upgrade_readhexline( &hex_line ) )
00151 {
00152 file_close();
00153 firm_upgrade_status("!! Error in HEX file format");
00154 nav_gotoindex(&sav_index);
00155 return;
00156 }
00157
00158 if( (hex_line.u16_add < UPGRADE_ADDR)
00159 || (hex_line.u16_add+hex_line.u8_nb_data) > (UPGRADE_ADDR+UPGRADE_SIZE_MAX) )
00160 {
00161 file_close();
00162 firm_upgrade_status("!! Upgrade zone not autorized");
00163 nav_gotoindex(&sav_index);
00164 return;
00165 }
00166 }
00167
00168 printf("Program FLASH\n\r...\r");
00169
00170 if( !flash_lib_check() )
00171 {
00172 file_close();
00173 firm_upgrade_status("!! The bootloder if not loaded");
00174 nav_gotoindex(&sav_index);
00175 return;
00176 }
00177
00178 file_seek(0,FS_SEEK_SET);
00179 while (!file_eof())
00180 {
00181
00182 hex_line.u8_nb_data = MAX_DATA_LINE;
00183 if( !firm_upgrade_readhexline( &hex_line ) )
00184 {
00185 file_close();
00186 firm_upgrade_status("!! Error in HEX file format");
00187 nav_gotoindex(&sav_index);
00188 return;
00189 }
00190
00191
00192 save_int=Get_interrupt_state();
00193 Disable_interrupt();
00194
00195 flash_wr_block( hex_line.datas, hex_line.u16_add, hex_line.u8_nb_data );
00196
00197 for( u8_i=0; u8_i<hex_line.u8_nb_data; u8_i++ )
00198 {
00199 if( hex_line.datas[u8_i] != flash_rd_byte((U8 farcode*)hex_line.u16_add) )
00200 {
00201 file_close();
00202 firm_upgrade_status("!! Programmation in flash BAD\n\r!!! Check if the bootloader is loaded in chip.");
00203 nav_gotoindex(&sav_index);
00204 return;
00205 }
00206 hex_line.u16_add++;
00207 }
00208
00209 if(save_int) { Enable_interrupt(); }
00210 }
00211
00212 file_close();
00213 firm_upgrade_status("Upgrade successfull");
00214 nav_gotoindex(&sav_index);
00215
00216 printf("Dislpay upgrade zone AFTER upgrade:\n\r");
00217 firm_upgrade_displayzone();
00218 }
00219
00220
00223 static void firm_upgrade_displayzone( void )
00224 {
00225 char ram_msg_upgrade[UPGRADE_SIZE_MAX+1];
00226
00227
00228 for( U8 u8_i=0; u8_i<UPGRADE_SIZE_MAX; u8_i++ )
00229 {
00230 ram_msg_upgrade[u8_i] = msg_to_upgrade[u8_i];
00231 }
00232 ram_msg_upgrade[UPGRADE_SIZE_MAX]=0;
00233 printf( "\"" );
00234 printf( ram_msg_upgrade );
00235 printf( "\"\r\n" );
00236 }
00237
00238
00245 static Bool firm_upgrade_searchfile( const char* filename )
00246 {
00247 U8 u8_drive_lun;
00248
00249
00250 u8_drive_lun = 1;
00251 while( 1 )
00252 {
00253 if( u8_drive_lun >= nav_drive_nb() )
00254 return FALSE;
00255
00256 nav_drive_set( u8_drive_lun );
00257 if( nav_partition_mount() )
00258 {
00259
00260 if( nav_setcwd((FS_STRING)filename,TRUE,FALSE) )
00261 break;
00262 }
00263 u8_drive_lun++;
00264 }
00265 return TRUE;
00266 }
00267
00268
00277 static Bool firm_upgrade_readhexline( St_hex_line* line )
00278 {
00279 U8 u8_i, u8_nb_data, u8_crc=0;
00280 U8 *ptr_data;
00281
00282
00283 if( ':' != file_getc())
00284 return FALSE;
00285
00286
00287 u8_nb_data = firm_upgrade_readbyte();
00288 u8_crc += u8_nb_data;
00289 if( u8_nb_data > line->u8_nb_data )
00290 return FALSE;
00291 line->u8_nb_data = u8_nb_data;
00292
00293
00294 line->u16_add = (((U16)firm_upgrade_readbyte())<<8) | firm_upgrade_readbyte();
00295 u8_crc += LSB(line->u16_add);
00296 u8_crc += MSB(line->u16_add);
00297
00298
00299
00300
00301
00302
00303
00304
00305 line->u8_type = firm_upgrade_readbyte();
00306 u8_crc += line->u8_type;
00307
00308
00309 ptr_data = line->datas;
00310 for( u8_i=0; u8_i<u8_nb_data; u8_i++ )
00311 {
00312 *ptr_data = firm_upgrade_readbyte();
00313 u8_crc += *ptr_data;
00314 ptr_data++;
00315 }
00316
00317
00318
00319
00320 u8_crc += firm_upgrade_readbyte();
00321
00322
00323 file_getc();file_getc();
00324
00325 return( 0 == u8_crc );
00326 }
00327
00328
00333 static void firm_upgrade_status( char *status )
00334 {
00335 char file_status_name[] = "status.txt";
00336
00337 printf( status );
00338 printf( "\n\r" );
00339
00340
00341 if( !nav_file_create((FS_STRING)file_status_name) )
00342 {
00343 if( fs_g_status != FS_ERR_FILE_EXIST )
00344 return;
00345
00346 }
00347 if( file_open(FOPEN_MODE_W) )
00348 {
00349
00350 file_write_buf( (unsigned char*) status, strlen(status) );
00351 file_close();
00352 }
00353 }
00354
00355
00363 static U8 firm_upgrade_ascii2bin(U8 ascii)
00364 {
00365 U8 byte=0;
00366 if( ('0'<=ascii) && (ascii<='9') )
00367 byte = ascii-'0';
00368 if( ('a'<=ascii) && (ascii<='f') )
00369 byte = (ascii-'a'+10);
00370 if( ('A'<=ascii) && (ascii<='F') )
00371 byte = (ascii-'A'+10);
00372 return byte;
00373 }
00374
00380 static U8 firm_upgrade_readbyte( void )
00381 {
00382 U8 ascii_msb ,ascii_lsb;
00383 ascii_msb = file_getc();
00384 ascii_lsb = file_getc();
00385 return (firm_upgrade_ascii2bin(ascii_msb)<<4) | firm_upgrade_ascii2bin(ascii_lsb);
00386 }
00387
00388 #endif // (HOST_UPGRADE_MODE==ENABLE)
00389