AVR Libc Home Page | AVR Libc Development Pages | |||
Main Page | FAQ | Library Reference | Additional Documentation | Example Projects |
#include <avr/io.h> #include <avr/boot.h>
The macros in this module provide a C language interface to the bootloader support functionality of certain AVR processors. These macros are designed to work with all sizes of flash memory.
#include <inttypes.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> void boot_program_page (uint32_t page, uint8_t *buf) { uint16_t i; uint8_t sreg; // Disable interrupts. sreg = SREG; cli(); eeprom_busy_wait (); boot_page_erase (page); boot_spm_busy_wait (); // Wait until the memory is erased. for (i=0; i<SPM_PAGESIZE; i+=2) { // Set up little-endian word. uint16_t w = *buf++; w += (*buf++) << 8; boot_page_fill (page + i, w); } boot_page_write (page); // Store buffer in flash page. boot_spm_busy_wait(); // Wait until the memory is written. // Reenable RWW-section again. We need this if we want to jump back // to the application after bootloading. boot_rww_enable (); // Re-enable interrupts (if they were ever enabled). SREG = sreg; }
Defines | |
#define | BOOTLOADER_SECTION __attribute__ ((section (".bootloader"))) |
#define | boot_spm_interrupt_enable() (__SPM_REG |= (uint8_t)_BV(SPMIE)) |
#define | boot_spm_interrupt_disable() (__SPM_REG &= (uint8_t)~_BV(SPMIE)) |
#define | boot_is_spm_interrupt() (__SPM_REG & (uint8_t)_BV(SPMIE)) |
#define | boot_rww_busy() (__SPM_REG & (uint8_t)_BV(__COMMON_ASB)) |
#define | boot_spm_busy() (__SPM_REG & (uint8_t)_BV(SPMEN)) |
#define | boot_spm_busy_wait() do{}while(boot_spm_busy()) |
#define | GET_LOW_FUSE_BITS (0x0000) |
#define | GET_LOCK_BITS (0x0001) |
#define | GET_EXTENDED_FUSE_BITS (0x0002) |
#define | GET_HIGH_FUSE_BITS (0x0003) |
#define | boot_lock_fuse_bits_get(address) |
#define | boot_page_fill(address, data) __boot_page_fill_normal(address, data) |
#define | boot_page_erase(address) __boot_page_erase_normal(address) |
#define | boot_page_write(address) __boot_page_write_normal(address) |
#define | boot_rww_enable() __boot_rww_enable() |
#define | boot_lock_bits_set(lock_bits) __boot_lock_bits_set(lock_bits) |
#define | boot_page_fill_safe(address, data) |
#define | boot_page_erase_safe(address) |
#define | boot_page_write_safe(address) |
#define | boot_rww_enable_safe() |
#define | boot_lock_bits_set_safe(lock_bits) |
|
Check if the SPM interrupt is enabled. |
|
Set the bootloader lock bits.
boot_lock_bits_set (_BV (BLB12));
|
|
Value: do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_lock_bits_set (lock_bits); \ } while (0) |
|
Value: (__extension__({ \ uint8_t __result; \ __asm__ __volatile__ \ ( \ "ldi r30, %3\n\t" \ "ldi r31, 0\n\t" \ "sts %1, %2\n\t" \ "lpm %0, Z\n\t" \ : "=r" (__result) \ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ "M" (address) \ : "r0", "r30", "r31" \ ); \ __result; \ })) address .
Parameter
|
|
Erase the flash page that contains address.
|
|
Value: do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_page_erase (address); \ } while (0) |
|
Fill the bootloader temporary page buffer for flash address with data word.
|
|
Value: do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_page_fill(address, data); \ } while (0) |
|
Write the bootloader temporary page buffer to flash page that contains address.
|
|
Value: do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_page_write (address); \ } while (0) |
|
Check if the RWW section is busy. |
|
Enable the Read-While-Write memory section. |
|
Value: do { \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ boot_rww_enable(); \ } while (0) |
|
Check if the SPM instruction is busy. |
|
Wait while the SPM instruction is busy. |
|
Disable the SPM interrupt. |
|
Enable the SPM interrupt. |
|
Used to declare a function or variable to be placed into a new section called .bootloader. This section and its contents can then be relocated to any address (such as the bootloader NRWW area) at link-time. |
|
address to read the extended fuse bits, using boot_lock_fuse_bits_get |
|
address to read the high fuse bits, using boot_lock_fuse_bits_get |
|
address to read the lock bits, using boot_lock_fuse_bits_get |
|
address to read the low fuse bits, using boot_lock_fuse_bits_get |