.reset = mx8_reset,
},
AVR_EEPROM_DECLARE(EE_READY_vect),
+#ifdef RWWSRE
AVR_SELFPROG_DECLARE(SPMCSR, SELFPRGEN, SPM_READY_vect),
+#else
+ AVR_SELFPROG_DECLARE_NORWW(SPMCSR, SELFPRGEN, SPM_READY_vect),
+#endif
AVR_WATCHDOG_DECLARE(WDTCSR, WDT_vect),
.extint = {
AVR_EXTINT_DECLARE(0, 'D', 2),
typedef struct avr_flash_t {
avr_io_t io;
+ uint16_t flags;
uint16_t spm_pagesize;
uint8_t r_spm;
avr_regbit_t selfprgen;
avr_regbit_t pgers; // page erase
avr_regbit_t pgwrt; // page write
avr_regbit_t blbset; // lock bit set
+ avr_regbit_t rwwsre; // read while write section read enable
+ avr_regbit_t rwwsb; // read while write section busy
avr_int_vector_t flash; // Interrupt vector
} avr_flash_t;
+/* Set if the flash supports a Read While Write section */
+#define AVR_SELFPROG_HAVE_RWW (1 << 0)
+
void avr_flash_init(avr_t * avr, avr_flash_t * p);
#define AVR_IOCTL_FLASH_SPM AVR_IOCTL_DEF('f','s','p','m')
-#define AVR_SELFPROG_DECLARE(_spmr, _spen, _vector) \
- .selfprog = {\
+#define AVR_SELFPROG_DECLARE_INTERNAL(_spmr, _spen, _vector) \
.r_spm = _spmr,\
.spm_pagesize = SPM_PAGESIZE,\
.selfprgen = AVR_IO_REGBIT(_spmr, _spen),\
.flash = {\
.enable = AVR_IO_REGBIT(_spmr, SPMIE),\
.vector = _vector,\
- },\
+ }\
+
+#define AVR_SELFPROG_DECLARE_NORWW(_spmr, _spen, _vector) \
+ .selfprog = {\
+ .flags = 0,\
+ AVR_SELFPROG_DECLARE_INTERNAL(_spmr, _spen, _vector),\
+ }
+
+#define AVR_SELFPROG_DECLARE(_spmr, _spen, _vector) \
+ .selfprog = {\
+ .flags = AVR_SELFPROG_HAVE_RWW,\
+ AVR_SELFPROG_DECLARE_INTERNAL(_spmr, _spen, _vector),\
+ .rwwsre = AVR_IO_REGBIT(_spmr, RWWSRE),\
+ .rwwsb = AVR_IO_REGBIT(_spmr, RWWSB),\
}
#ifdef __cplusplus