summaryrefslogtreecommitdiff
path: root/src/flash/nor/avrf.c
diff options
context:
space:
mode:
authorHans Peter Mortensn <hp000@space.aau.dk>2010-02-24 23:35:12 -0800
committerDavid Brownell <dbrownell@users.sourceforge.net>2010-02-24 23:35:12 -0800
commit7abe9f38b2321b00b240fb7901dc408106fb07f8 (patch)
treeb9c2df58b61d0b71066ddfffd16dfdb2b1f8a201 /src/flash/nor/avrf.c
parent75067c40424f0e3349f445ed4ec43476a89973da (diff)
downloadopenocd+libswd-7abe9f38b2321b00b240fb7901dc408106fb07f8.tar.gz
openocd+libswd-7abe9f38b2321b00b240fb7901dc408106fb07f8.tar.bz2
openocd+libswd-7abe9f38b2321b00b240fb7901dc408106fb07f8.tar.xz
openocd+libswd-7abe9f38b2321b00b240fb7901dc408106fb07f8.zip
AVR flash: handle AT90CAN128 chips
I have successfully programmed the AT90CAN128, based on the mega128   with some small modifications. [ dbrownell@users.sourceforge.net: patch cleanup ] Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src/flash/nor/avrf.c')
-rw-r--r--src/flash/nor/avrf.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/flash/nor/avrf.c b/src/flash/nor/avrf.c
index c0724190..5b40ad73 100644
--- a/src/flash/nor/avrf.c
+++ b/src/flash/nor/avrf.c
@@ -52,8 +52,11 @@
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);
@@ -200,8 +203,27 @@ FLASH_BANK_COMMAND_HANDLER(avrf_flash_bank_command)
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)