What it is
This project consists of one header file and one source file and it includes wrapper functions which allow to access the flash and fuse-bit programming functions in the stock bootloader on some of the Atmel's USB-enabled AVR chips. It also provides a convenient function which writes a whole page to the flash memory.
Why I wrote it
While developing my mechanical keyboard project, the GH60, I came across the need to program the flash memory during runtime. The avr-gcc compiler has the necessary headers to write your own bootloader code, which would allow me to achieve exactly what I needed, but since the chip I was using (ATmega32u4) already had a stock bootloader, I wanted to use it instead.
Unfortunately, I couldn't find any libraries to use the functions it provided, so I decided to write my own.
Check out the original article, where I describe how it works.
The library provides static inlines for all the bootloader's functions:
static inline void flash_page_erase_and_write(uint32_t addr);
static inline uint8_t flash_read_sig(uint32_t addr);
static inline uint8_t flash_read_fuse(uint32_t addr);
static inline void flash_fill_temp_buffer(uint16_t data, uint16_t addr);
static inline void flash_prg_page(uint32_t addr);
static inline void flash_page_erase(uint32_t addr);
static inline void flash_lock_wr_bits(uint8_t bits);
The meaning of arguments should be self-explanatory. Further documentation can be found in Atmel's datasheet.
Except for those functions, there are two higher-level functions:
static inline void run_bootloader();
void flash_write_page(uint32_t addr, const uint8_t *data);
The first one performs a jump to the bootloader section and gets the chip into DFU mode and the second one writes a whole flash page (at address addr) with provided data.
The code was tested on the following devices:
It should also work on the those chips, though compatibility hasn't been verified:
If you have succesfully run the code on any of those devices or made modifications which allowed it to run, please let me know in the comments.
You can download the files from my github repository.