#include "config.h"
#endif
-#include "avrf.h"
+#include "imp.h"
#include <target/avrt.h>
-#include "flash.h"
/* AVR_JTAG_Instructions */
#define AVR_JTAG_REG_ProgrammingCommand_Len 15
#define AVR_JTAG_REG_FlashDataByte_Len 16
-struct avrf_type avft_chips_info[] =
+struct avrf_type
{
-// name, chip_id, flash_page_size, flash_page_num, eeprom_page_size, eeprom_page_num
- {"atmega128", 0x9702, 256, 512, 8, 512},
+ char name[15];
+ uint16_t chip_id;
+ int flash_page_size;
+ int flash_page_num;
+ int eeprom_page_size;
+ int eeprom_page_num;
};
-int avr_jtag_sendinstr(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out);
-int avr_jtag_senddat(struct jtag_tap *tap, uint32_t *dr_in, uint32_t dr_out, int len);
+struct avrf_flash_bank
+{
+ int ppage_size;
+ int probed;
+};
-int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out, int ir_len, int rti);
-int mcu_write_dr(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out, int dr_len, int rti);
-int mcu_write_ir_u8(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out, int ir_len, int rti);
-int mcu_write_dr_u8(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out, int dr_len, int rti);
-int mcu_write_ir_u16(struct jtag_tap *tap, uint16_t *ir_in, uint16_t ir_out, int ir_len, int rti);
-int mcu_write_dr_u16(struct jtag_tap *tap, uint16_t *ir_in, uint16_t ir_out, int dr_len, int rti);
-int mcu_write_ir_u32(struct jtag_tap *tap, uint32_t *ir_in, uint32_t ir_out, int ir_len, int rti);
-int mcu_write_dr_u32(struct jtag_tap *tap, uint32_t *ir_in, uint32_t ir_out, int dr_len, int rti);
-int mcu_execute_queue(void);
+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},
+ {"at90can128", 0x9781, 256, 512, 8, 512},
+};
/* avr program functions */
static int avr_jtag_reset(struct avr_common *avr, uint32_t reset)
if (CMD_ARGC < 6)
{
- LOG_WARNING("incomplete flash_bank avr configuration");
- return ERROR_FLASH_BANK_INVALID;
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
avrf_info = malloc(sizeof(struct avrf_flash_bank));
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);
if (CMD_ARGC < 1)
{
- command_print(CMD_CTX, "avr mass_erase <bank>");
- return ERROR_OK;
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
struct flash_bank *bank;
static const struct command_registration avrf_exec_command_handlers[] = {
{
.name = "mass_erase",
- .handler = &avrf_handle_mass_erase_command,
+ .usage = "<bank>",
+ .handler = avrf_handle_mass_erase_command,
.mode = COMMAND_EXEC,
.help = "erase entire device",
},
.name = "avrf",
.mode = COMMAND_ANY,
.help = "AVR flash command group",
+ .usage = "",
.chain = avrf_exec_command_handlers,
},
COMMAND_REGISTRATION_DONE
};
struct flash_driver avr_flash = {
- .name = "avr",
- .commands = avrf_command_handlers,
- .flash_bank_command = &avrf_flash_bank_command,
- .erase = &avrf_erase,
- .protect = &avrf_protect,
- .write = &avrf_write,
- .probe = &avrf_probe,
- .auto_probe = &avrf_auto_probe,
- .erase_check = &default_flash_mem_blank_check,
- .protect_check = &avrf_protect_check,
- .info = &avrf_info,
- };
+ .name = "avr",
+ .commands = avrf_command_handlers,
+ .flash_bank_command = avrf_flash_bank_command,
+ .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,
+ .protect_check = avrf_protect_check,
+ .info = avrf_info,
+};