The API are located at absolute addresses in the USB bootloader firmware and accept specific
registers values as parameters. These parameters are compatible with a C compiler calling con-
vention and thus can be called directly with function pointer declared as in the example below:
C Code Example
#if (FLASH_END==0x1FFFF) //128K bytes parts
#define LAST_BOOT_ENTRY 0xFFFE
#elif (FLASH_END==0xFFFF)//64K bytes parts
#define LAST_BOOT_ENTRY 0x7FFE
#else
#error You must define FLASH_END in bytes.
#endif
// These functions pointers are used to call functions entry points in bootloader
void (*boot_flash_page_erase_and_write)(unsigned long adr)=(void (*)(unsigned
long))(LAST_BOOT_ENTRY-12);
U8 (*boot_flash_read_sig) (unsigned long adr)=(U8 (*)(unsigned
long))(LAST_BOOT_ENTRY-10);
U8 (*boot_flash_read_fuse) (unsigned long adr)=(U8 (*)(unsigned
long))(LAST_BOOT_ENTRY-8);
void (*boot_flash_fill_temp_buffer) (unsigned int data,unsigned int adr)=(void
(*)(unsigned int, unsigned int))(LAST_BOOT_ENTRY-6);
void (*boot_flash_prg_page) (unsigned long adr)=(void (*)(unsigned
long))(LAST_BOOT_ENTRY-4);
void (*boot_flash_page_erase) (unsigned long adr)=(void (*)(unsigned
long))(LAST_BOOT_ENTRY-2);
void (*boot_lock_wr_bits) (unsigned char val)=(void (*)(unsigned
char))(LAST_BOOT_ENTRY);
// This function writes 0x55AA @ 0x1200 in the on-flash calling flash drivers located
in USB bootloader
void basic_flash_access(void)
{
unsigned long address;
unsigned int temp16;
temp16=0x55AA;
address=0x12000;
(*boot_flash_fill_temp_buffer)(temp16,address);
(*boot_flash_page_erase)(address);
(*boot_flash_prg_page)(address);
}
The full assembly code for the flash API drivers is given in “Appendix-B” on page 20.
16
7618C–AVR–07/08