#define AVR_JTAG_REG_ProgrammingCommand_Len 15
#define AVR_JTAG_REG_FlashDataByte_Len 16
-struct avrf_type avft_chips_info[] =
+static struct avrf_type avft_chips_info[] =
{
-// name, chip_id, flash_page_size, flash_page_num, eeprom_page_size, eeprom_page_num
- {"atmega128", 0x9702, 256, 512, 8, 512},
+/* name, chip_id, flash_page_size, flash_page_num,
+ * eeprom_page_size, eeprom_page_num
+ */
+ {"atmega128", 0x9702, 256, 512, 8, 512},
+ {"at90can128", 0x9781, 256, 512, 8, 512},
};
int avr_jtag_sendinstr(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out);
static int avrf_erase(struct flash_bank *bank, int first, int last)
{
- LOG_INFO("%s", __FUNCTION__);
- return ERROR_OK;
+ struct target *target = bank->target;
+ struct avr_common *avr = target->arch_info;
+ int status;
+
+ LOG_DEBUG("%s", __FUNCTION__);
+
+ if (target->state != TARGET_HALTED)
+ {
+ LOG_ERROR("Target not halted");
+ return ERROR_TARGET_NOT_HALTED;
+ }
+
+ status = avr_jtagprg_enterprogmode(avr);
+ if (status != ERROR_OK)
+ return status;
+
+ status = avr_jtagprg_chiperase(avr);
+ if (status != ERROR_OK)
+ return status;
+
+ return avr_jtagprg_leaveprogmode(avr);
}
static int avrf_protect(struct flash_bank *bank, int set, int first, int last)
if (avr_info != NULL)
{
+ if (bank->sectors)
+ {
+ free(bank->sectors);
+ bank->sectors = NULL;
+ }
+
// chip found
bank->base = 0x00000000;
bank->size = (avr_info->flash_page_size * avr_info->flash_page_num);
.erase = avrf_erase,
.protect = avrf_protect,
.write = avrf_write,
+ .read = default_flash_read,
.probe = avrf_probe,
.auto_probe = avrf_auto_probe,
.erase_check = default_flash_mem_blank_check,