#include "config.h"
Go to the source code of this file.
Defines | |
| #define | DFU_DETACH 0x00 |
| #define | DFU_DNLOAD 0x01 |
| #define | DFU_UPLOAD 0x02 |
| #define | DFU_GETSTATUS 0x03 |
| #define | DFU_CLRSTATUS 0x04 |
| #define | DFU_GETSTATE 0x05 |
| #define | DFU_ABORT 0x06 |
| #define | RECORD_MARK ':' |
| #define | DATA_RECORD 0x00 |
| #define | PAGE_RECORD 0x04 |
| #define | ATMEL_VID VID_ATMEL |
| #define | AT90DFU_PID PID_AT90USB128_DFU |
| #define | MAX_DATA_PER_RECORD 16 |
| #define | Dfu_download(n) |
| #define | Dfu_upload(n) |
| #define | Dfu_get_status() |
| #define | Dfu_read_manuf_id() |
| #define | Dfu_erase() |
| #define | Dfu_set_page(n) |
| #define | Dfu_start_appli(n) |
| #define | FIRMWARE_NAME "FIRMWARE.HEX" |
| #define | SIZE_BUF_STR 36 |
Functions | |
| void | dfu_read (U16 start, U16 end, U8 *buf) |
| void | dfu_prog (U16 start, U16 end, U8 *buf) |
| U8 | dfu_load_hex (void) |
| void | dfu_flush_prog (void) |
| U8 | ascii_to_bin (U8 b) |
Variables | |
| U8 | dfu_connected |
Definition in file host_dfu_task.h.
| #define DFU_DETACH 0x00 |
Definition at line 55 of file host_dfu_task.h.
| #define DFU_DNLOAD 0x01 |
Definition at line 56 of file host_dfu_task.h.
| #define DFU_UPLOAD 0x02 |
Definition at line 57 of file host_dfu_task.h.
| #define DFU_GETSTATUS 0x03 |
Definition at line 58 of file host_dfu_task.h.
| #define DFU_CLRSTATUS 0x04 |
Definition at line 59 of file host_dfu_task.h.
| #define DFU_GETSTATE 0x05 |
Definition at line 60 of file host_dfu_task.h.
| #define DFU_ABORT 0x06 |
Definition at line 61 of file host_dfu_task.h.
| #define RECORD_MARK ':' |
| #define DATA_RECORD 0x00 |
| #define PAGE_RECORD 0x04 |
| #define ATMEL_VID VID_ATMEL |
| #define AT90DFU_PID PID_AT90USB128_DFU |
| #define MAX_DATA_PER_RECORD 16 |
| #define Dfu_download | ( | n | ) |
Value:
(usb_request.bmRequestType = USB_SETUP_SET_CLASS_INTER,\ usb_request.bRequest = DFU_DNLOAD,\ usb_request.wValue = 0,\ usb_request.wIndex = 0,\ usb_request.wLength = n,\ usb_request.uncomplete_read = FALSE,\ host_send_control(data_stage))
Definition at line 73 of file host_dfu_task.h.
Referenced by dfu_prog(), and dfu_read().
| #define Dfu_upload | ( | n | ) |
Value:
(usb_request.bmRequestType = USB_SETUP_GET_CLASS_INTER,\ usb_request.bRequest = DFU_UPLOAD,\ usb_request.wValue = 0,\ usb_request.wIndex = 0,\ usb_request.wLength = n,\ usb_request.uncomplete_read = FALSE,\ host_send_control(data_stage))
Definition at line 81 of file host_dfu_task.h.
Referenced by dfu_read().
| #define Dfu_get_status | ( | ) |
Value:
(usb_request.bmRequestType = USB_SETUP_GET_CLASS_INTER,\ usb_request.bRequest = DFU_GETSTATUS,\ usb_request.wValue = 0,\ usb_request.wIndex = 0,\ usb_request.wLength = 6,\ usb_request.uncomplete_read = FALSE,\ host_send_control(data_stage))
Definition at line 90 of file host_dfu_task.h.
| #define Dfu_read_manuf_id | ( | ) |
Value:
( data_stage[0]=0x05,\ data_stage[1]=0x01,\ data_stage[2]=0x30,\ Dfu_download(3),\ Dfu_upload(1))
Definition at line 98 of file host_dfu_task.h.
| #define Dfu_erase | ( | ) |
Value:
( data_stage[0]=0x04,\ data_stage[1]=0x00,\ data_stage[2]=0xFF,\ Dfu_download(3))
Definition at line 104 of file host_dfu_task.h.
Referenced by host_dfu_task().
| #define Dfu_set_page | ( | n | ) |
Value:
( data_stage[0]=0x06,\ data_stage[1]=0x03,\ data_stage[2]=0x00,\ data_stage[3]=n,\ Dfu_download(4))
Definition at line 109 of file host_dfu_task.h.
Referenced by dfu_load_hex().
| #define Dfu_start_appli | ( | n | ) |
Value:
( data_stage[0]=0x04,\ data_stage[1]=0x03,\ data_stage[2]=0x00,\ Dfu_download(3),\ Dfu_get_status())
Definition at line 115 of file host_dfu_task.h.
| #define FIRMWARE_NAME "FIRMWARE.HEX" |
Definition at line 121 of file host_dfu_task.h.
| #define SIZE_BUF_STR 36 |
Definition at line 122 of file host_dfu_task.h.
Definition at line 297 of file host_dfu_task.c.
References data_stage, Dfu_download, Dfu_upload, i, j, LSB, and MSB.
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 }
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.
References data_stage, Dfu_download, i, j, LSB, and MSB.
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 }
| 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.
References ascii_to_bin(), buf, DATA_RECORD, dfu_flush_prog(), Dfu_set_page, dfu_status, end_addr, FALSE, file_close(), file_eof(), file_getc(), file_open(), FOPEN_MODE_R, i, Led0_off, MAX_DATA_PER_RECORD, PAGE_RECORD, pgm_index, pgm_nb_data, prog_buf, RECORD_MARK, start_addr, and TRUE.
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 }
| void dfu_flush_prog | ( | void | ) |
Definition at line 318 of file host_dfu_task.c.
References check_buf, dfu_prog(), dfu_read(), dfu_status, end_addr, FALSE, i, Led0_toggle, Leds_on, MSB, pgm_index, pgm_nb_data, prog_buf, and start_addr.
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.
00348 { 00349 b|='a'-'A'; // to_lower: '0'=>'0', 'A'=>'a', 'a'=>'a' 00350 return ( (b <= '9') ? (b-'0') : (b+10-'a') ); 00351 }
1.5.3