flash.c
00001
00002 #include "dev/flash.h"
00003
00004 #include <avr/boot.h>
00005 #include <inttypes.h>
00006 #include <avr/interrupt.h>
00007 #include <avr/pgmspace.h>
00008
00009
00010
00011
00012
00013 void
00014 flash_write_page(uint32_t page, uint8_t *buf)
00015 {
00016 uint16_t i;
00017 uint8_t sreg;
00018
00019
00020
00021 sreg = SREG;
00022 cli();
00023
00024 eeprom_busy_wait();
00025
00026 boot_page_erase(page);
00027 boot_spm_busy_wait();
00028
00029 for(i = 0; i < SPM_PAGESIZE; i += 2) {
00030
00031
00032 uint16_t w = *buf++;
00033 w += (*buf++) << 8;
00034
00035 boot_page_fill(page + i, w);
00036 }
00037
00038 boot_page_write(page);
00039 boot_spm_busy_wait();
00040
00041
00042
00043
00044 boot_rww_enable();
00045
00046
00047
00048 SREG = sreg;
00049 }
00050