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