Change return value on error.
[fw/openocd] / src / flash / nor / avrf.c
index fbc92772bc4e120ec509bf40dfea2faaca773c54..1ade45267deffd78d778b464e5e592406137a134 100644 (file)
@@ -21,9 +21,8 @@
 #include "config.h"
 #endif
 
-#include "avrf.h"
+#include "imp.h"
 #include <target/avrt.h>
-#include <flash/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)
@@ -186,8 +191,7 @@ FLASH_BANK_COMMAND_HANDLER(avrf_flash_bank_command)
 
        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));
@@ -200,8 +204,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)
@@ -302,6 +325,12 @@ static int avrf_probe(struct flash_bank *bank)
 
        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);
@@ -421,8 +450,7 @@ COMMAND_HANDLER(avrf_handle_mass_erase_command)
 
        if (CMD_ARGC < 1)
        {
-               command_print(CMD_CTX, "avr mass_erase <bank>");
-               return ERROR_OK;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        struct flash_bank *bank;
@@ -452,7 +480,8 @@ COMMAND_HANDLER(avrf_handle_mass_erase_command)
 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",
        },
@@ -469,15 +498,16 @@ static const struct command_registration avrf_command_handlers[] = {
 };
 
 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,
+};