#include "config.h"#include "conf_usb.h"#include "modules/file_system/fat.h"#include "modules/file_system/fs_com.h"#include "modules/file_system/navigation.h"#include "modules/file_system/file.h"#include "modules/file_system/nav_utils.h"#include "host_dfu_task.h"#include "modules/usb/host_chap9/usb_host_task.h"#include "modules/usb/host_chap9/usb_host_enum.h"#include "lib_mcu/usb/usb_drv.h"#include "lib_mcu/flash/flash.h"
Go to the source code of this file.
Defines | |
| #define | LOG_STR_CODE(str) |
Functions | |
| void | host_dfu_task_init (void) |
| void | host_dfu_task (void) |
| U8 | dfu_load_hex (void) |
| void | dfu_prog (U16 start, U16 end, U8 *buf) |
| void | dfu_read (U16 start, U16 end, U8 *buf) |
| void | dfu_flush_prog (void) |
| U8 | ascii_to_bin (U8 b) |
Variables | |
| U8 | dfu_connected = 0 |
| static U8 | buf [16] |
| static U8 | prog_buf [16+FLASH_PAGE_SIZE] |
| static U8 | check_buf [16+FLASH_PAGE_SIZE] |
| static U8 | dfu_status |
| static U16 | end_addr |
| static U16 | start_addr |
| static U8 | pgm_index = 0 |
| static U8 | pgm_nb_data = 0 |
| U8 code | firmware_name [] = "FIRMWARE.HEX" |
Definition in file host_dfu_task.c.
| #define LOG_STR_CODE | ( | str | ) |
Definition at line 66 of file host_dfu_task.c.
| void host_dfu_task_init | ( | void | ) |
This function initializes the Host dfu application
| none |
Definition at line 95 of file host_dfu_task.c.
References dfu_connected, Joy_init, and Leds_init.
00096 { 00097 Joy_init(); 00098 Leds_init(); 00099 dfu_connected=0; 00100 }
| void host_dfu_task | ( | void | ) |
This function manages the HOST dfu application
| none |
Definition at line 108 of file host_dfu_task.c.
References AT90DFU_PID, ATMEL_VID, dfu_connected, Dfu_erase, dfu_load_hex(), FALSE, firmware_name, Get_PID, Get_VID, goto_code_name(), Is_device_disconnection_event, Is_host_ready, Is_joy_left, Is_joy_up, Is_new_device_connection_event, Led0_off, Led0_on, Led2_off, Led2_on, LOG_STR_CODE, nav_drive_set(), nav_partition_mount(), and nav_reset().
00109 { 00110 if(Is_host_ready()) //Enumeration successfull, device is operationnal 00111 { 00112 if(Is_new_device_connection_event()) //New device connected and enumerated... 00113 { 00114 // Check host is connected to ATMEL bootloader 00115 if(Get_VID()==ATMEL_VID && Get_PID()==AT90DFU_PID) 00116 { 00117 LOG_STR_CODE(log_dfu_connect); 00118 dfu_connected=1; 00119 Led2_on(); 00120 } 00121 else 00122 { 00123 dfu_connected=0; 00124 } 00125 } 00126 if(dfu_connected) 00127 { 00128 if(Is_joy_up()||Is_joy_left()) 00129 { 00130 nav_reset(); 00131 nav_drive_set(0); 00132 if(nav_partition_mount()) 00133 { 00134 if(goto_code_name((U8 code *)firmware_name,FALSE,FALSE)) 00135 { 00136 Led0_on(); 00137 Dfu_erase(); 00138 Led0_off(); 00139 dfu_load_hex(); 00140 } 00141 } 00142 } 00143 } 00144 } 00145 00146 //Device disconnection... 00147 if(Is_device_disconnection_event()) 00148 { 00149 dfu_connected=0; 00150 Led2_off(); 00151 } 00152 }
| U8 dfu_load_hex | ( | void | ) |
This function program an intel hexfile to the on-chip flash memory of an AT90USXxxx connected in DFU bootloader.
| none |
Definition at line 160 of file host_dfu_task.c.
Referenced by host_dfu_task(), and ushell_cmddfu_load().
00161 { 00162 U8 record_type; 00163 U16 addr; 00164 U8 nb_data; 00165 U8 i; 00166 U8 stop=0; 00167 00168 dfu_status=TRUE; 00169 file_open(FOPEN_MODE_R); // Open hex firmware file 00170 while (file_eof()==FALSE) 00171 { 00172 i=file_getc(); 00173 while(i!=RECORD_MARK) 00174 { 00175 i=file_getc(); 00176 if(file_eof()) 00177 { 00178 stop=1; 00179 break; 00180 } 00181 } 00182 if(stop) break; 00183 // Build the hex record information from file 00184 nb_data=ascii_to_bin(file_getc()); 00185 nb_data=nb_data<<4; 00186 nb_data+=ascii_to_bin(file_getc()); 00187 addr=ascii_to_bin(file_getc()); 00188 addr=addr<<4; 00189 addr+=ascii_to_bin(file_getc()); 00190 addr=addr<<4; 00191 addr+=ascii_to_bin(file_getc()); 00192 addr=addr<<4; 00193 addr+=ascii_to_bin(file_getc()); 00194 record_type=ascii_to_bin(file_getc()); 00195 record_type=record_type<<4; 00196 record_type+=ascii_to_bin(file_getc()); 00197 for(i=0;i<nb_data;i++) 00198 { 00199 buf[i]=ascii_to_bin(file_getc()); 00200 buf[i]=buf[i]<<4; 00201 buf[i]+=ascii_to_bin(file_getc()); 00202 } 00203 // Decode record type 00204 switch(record_type) 00205 { 00206 case DATA_RECORD: 00207 if(addr!=end_addr+1 && pgm_index!=0) //None consecutive addr, first flush previous buffer 00208 { 00209 dfu_flush_prog(); 00210 } 00211 // Add new data to prog buffer 00212 for(i=0;i<nb_data;i++) 00213 { 00214 prog_buf[pgm_index]=buf[i]; 00215 pgm_index++; 00216 } 00217 // Update nb of data to load 00218 pgm_nb_data+=nb_data; 00219 // Compute last byte add to load 00220 if(pgm_nb_data>nb_data) 00221 { // Data exist in buffer 00222 end_addr=end_addr+nb_data; 00223 } 00224 else // first load 00225 { 00226 end_addr=addr+nb_data-1; 00227 start_addr=addr; 00228 } 00229 //If enough data flush prog buffer 00230 if(pgm_index>=10*MAX_DATA_PER_RECORD) 00231 { 00232 dfu_flush_prog(); 00233 } 00234 break; 00235 case PAGE_RECORD: 00236 if(pgm_index) // Prog buffer not empty ? 00237 { 00238 dfu_flush_prog(); // Then flush it 00239 } 00240 Dfu_set_page(buf[1]); // Send page change frame 00241 default: //Ignore all other record types 00242 break; 00243 } 00244 } 00245 // Remaining data in buffer before quit? 00246 if(pgm_index>0) 00247 { 00248 dfu_flush_prog(); 00249 } 00250 file_close(); 00251 Led0_off(); 00252 return dfu_status; 00253 }
This function sends a dfu USB programming frame to an AT90USXxxx DFU bootloader.
| start,: | start Address | |
| end,: | end Address | |
| *buf,: | pointer to data buffer |
Definition at line 263 of file host_dfu_task.c.
Referenced by dfu_flush_prog().
00264 { 00265 U8 i; 00266 U16 j; 00267 U8 padding; 00268 00269 data_stage[0]=0x01; 00270 data_stage[1]=0; 00271 data_stage[2]=MSB(start); 00272 data_stage[3]=LSB(start); 00273 data_stage[4]=MSB(end); 00274 data_stage[5]=LSB(end); 00275 for(i=6;i<32;i++) 00276 { 00277 data_stage[i]=0; 00278 } 00279 padding=start%32; 00280 j=padding; 00281 while(j) 00282 { 00283 data_stage[i]=0x00; 00284 i++; j--; 00285 } 00286 j=end-start+1; 00287 while(j) 00288 { 00289 data_stage[i]=*buf; 00290 buf++; 00291 j--;i++; 00292 } 00293 Dfu_download(32+end-start+1+padding); 00294 }
Definition at line 296 of file host_dfu_task.c.
Referenced by dfu_flush_prog().
00297 { 00298 U16 j; 00299 U16 i; 00300 00301 data_stage[0]=0x03; 00302 data_stage[1]=0; 00303 data_stage[2]=MSB(start); 00304 data_stage[3]=LSB(start); 00305 data_stage[4]=MSB(end); 00306 data_stage[5]=LSB(end); 00307 Dfu_download(6); 00308 i=end-start+1; 00309 Dfu_upload(i); 00310 for(j=0;j<i;j++) 00311 { 00312 *buf=data_stage[j]; 00313 buf++; 00314 } 00315 }
| void dfu_flush_prog | ( | void | ) |
Definition at line 317 of file host_dfu_task.c.
Referenced by dfu_load_hex().
00318 { 00319 U8 i; 00320 // All buffer in the same flash memory page ? 00321 if( MSB(start_addr)== MSB(end_addr)) 00322 { 00323 dfu_prog(start_addr,end_addr,prog_buf); 00324 } 00325 else // No, program in two times 00326 { 00327 i=(end_addr%FLASH_PAGE_SIZE); 00328 dfu_prog(start_addr,end_addr-i-1,prog_buf); 00329 dfu_prog(end_addr-i,end_addr,&prog_buf[pgm_nb_data-i-1]); 00330 } 00331 // Verify on the fly... 00332 dfu_read(start_addr,end_addr,check_buf); 00333 for(i=0;i<pgm_nb_data;i++) 00334 { 00335 if(prog_buf[i]!=check_buf[i]) 00336 { 00337 Leds_on(); 00338 dfu_status=FALSE; 00339 } 00340 } 00341 Led0_toggle(); 00342 pgm_index=0; 00343 pgm_nb_data=0; 00344 }
Definition at line 346 of file host_dfu_task.c.
Referenced by dfu_load_hex().
00347 { 00348 b|='a'-'A'; // to_lower: '0'=>'0', 'A'=>'a', 'a'=>'a' 00349 return ( (b <= '9') ? (b-'0') : (b+10-'a') ); 00350 }
U8 dfu_status [static] |
U16 start_addr [static] |
U8 pgm_nb_data = 0 [static] |
| U8 code firmware_name[] = "FIRMWARE.HEX" |
1.5.3