host_dfu_task.h File Reference

#include "config.h"

Include dependency graph for host_dfu_task.h:

This graph shows which files directly or indirectly include this file:

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


Detailed Description

This file contains the function declarations for usb dfu task application - Compiler: IAR EWAVR and GNU GCC for AVR

Definition in file host_dfu_task.h.


Define Documentation

#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   ':'

Definition at line 63 of file host_dfu_task.h.

Referenced by dfu_load_hex().

#define DATA_RECORD   0x00

Definition at line 64 of file host_dfu_task.h.

Referenced by dfu_load_hex().

#define PAGE_RECORD   0x04

Definition at line 65 of file host_dfu_task.h.

Referenced by dfu_load_hex().

#define ATMEL_VID   VID_ATMEL

Definition at line 67 of file host_dfu_task.h.

Referenced by host_dfu_task().

#define AT90DFU_PID   PID_AT90USB128_DFU

Definition at line 68 of file host_dfu_task.h.

Referenced by host_dfu_task().

#define MAX_DATA_PER_RECORD   16

Definition at line 70 of file host_dfu_task.h.

Referenced by dfu_load_hex().

#define Dfu_download (  ) 

Value:

Definition at line 73 of file host_dfu_task.h.

Referenced by dfu_prog(), and dfu_read().

#define Dfu_upload (  ) 

Value:

Definition at line 81 of file host_dfu_task.h.

Referenced by dfu_read().

 
#define Dfu_get_status (  ) 

Value:

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 (  ) 

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 (  ) 

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.


Function Documentation

void dfu_read ( U16  start,
U16  end,
U8 buf 
)

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 }

void dfu_prog ( U16  start,
U16  end,
U8 buf 
)

This function sends a dfu USB programming frame to an AT90USXxxx DFU bootloader.

Parameters:
start,: start Address
end,: end Address
*buf,: pointer to data buffer
Returns:
none

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.

Parameters:
none 
Returns:
U8 status (TRUE=OK, FALSE=KO)

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

U8 ascii_to_bin ( U8  b  ) 

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 }


Generated on Wed Sep 23 09:49:39 2009 for ATMEL by  doxygen 1.5.3