host_dfu_task.c File Reference

#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"

Include dependency graph for host_dfu_task.c:

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"


Detailed Description

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

Definition in file host_dfu_task.c.


Define Documentation

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


Function Documentation

void host_dfu_task_init ( void   ) 

This function initializes the Host dfu application

Parameters:
none 
Returns:
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

Parameters:
none 
Returns:
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 }

Here is the call graph for this function:

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.

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 }

Here is the caller graph for this function:

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.

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 }

Here is the caller graph for this function:

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

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 }

Here is the caller graph for this function:

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 }

Here is the caller graph for this function:

U8 ascii_to_bin ( U8  b  ) 

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 }

Here is the caller graph for this function:


Variable Documentation

U8 buf[16] [static]

Definition at line 77 of file host_dfu_task.c.

Referenced by dfu_load_hex().

U8 prog_buf[16+FLASH_PAGE_SIZE] [static]

Definition at line 78 of file host_dfu_task.c.

Referenced by dfu_flush_prog(), and dfu_load_hex().

U8 check_buf[16+FLASH_PAGE_SIZE] [static]

Definition at line 79 of file host_dfu_task.c.

Referenced by dfu_flush_prog().

U8 dfu_status [static]

Definition at line 80 of file host_dfu_task.c.

Referenced by dfu_flush_prog(), and dfu_load_hex().

U16 end_addr [static]

Definition at line 82 of file host_dfu_task.c.

Referenced by dfu_flush_prog(), and dfu_load_hex().

U16 start_addr [static]

Definition at line 83 of file host_dfu_task.c.

Referenced by dfu_flush_prog(), and dfu_load_hex().

U8 pgm_index = 0 [static]

Definition at line 84 of file host_dfu_task.c.

Referenced by dfu_flush_prog(), and dfu_load_hex().

U8 pgm_nb_data = 0 [static]

Definition at line 85 of file host_dfu_task.c.

Referenced by dfu_flush_prog(), and dfu_load_hex().

U8 code firmware_name[] = "FIRMWARE.HEX"

Definition at line 88 of file host_dfu_task.c.

Referenced by host_dfu_task().


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