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