X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstr9x.c;h=1f2c9581385fca52c9536d3d32a9d119e9928ccd;hb=8959fccc1926e8748e914730b8e05ca7e8b8d05b;hp=cfe6a77709866742d622d0d4c2401c6637e570c0;hpb=a8c8c238f2dd1abe102f83bfa392ac40f313dd73;p=fw%2Fopenocd diff --git a/src/flash/nor/str9x.c b/src/flash/nor/str9x.c index cfe6a7770..1f2c95813 100644 --- a/src/flash/nor/str9x.c +++ b/src/flash/nor/str9x.c @@ -28,11 +28,45 @@ #endif #include "imp.h" -#include "str9x.h" #include #include +/* Flash registers */ + +#define FLASH_BBSR 0x54000000 /* Boot Bank Size Register */ +#define FLASH_NBBSR 0x54000004 /* Non-Boot Bank Size Register */ +#define FLASH_BBADR 0x5400000C /* Boot Bank Base Address Register */ +#define FLASH_NBBADR 0x54000010 /* Non-Boot Bank Base Address Register */ +#define FLASH_CR 0x54000018 /* Control Register */ +#define FLASH_SR 0x5400001C /* Status Register */ +#define FLASH_BCE5ADDR 0x54000020 /* BC Fifth Entry Target Address Register */ + + +struct str9x_flash_bank +{ + uint32_t *sector_bits; + int variant; + int bank1; + struct working_area *write_algorithm; +}; + +enum str9x_status_codes +{ + STR9X_CMD_SUCCESS = 0, + STR9X_INVALID_COMMAND = 1, + STR9X_SRC_ADDR_ERROR = 2, + STR9X_DST_ADDR_ERROR = 3, + STR9X_SRC_ADDR_NOT_MAPPED = 4, + STR9X_DST_ADDR_NOT_MAPPED = 5, + STR9X_COUNT_ERROR = 6, + STR9X_INVALID_SECTOR = 7, + STR9X_SECTOR_NOT_BLANK = 8, + STR9X_SECTOR_NOT_PREPARED = 9, + STR9X_COMPARE_ERROR = 10, + STR9X_BUSY = 11 +}; + static uint32_t bank1start = 0x00080000; static int str9x_build_block_list(struct flash_bank *bank) @@ -124,8 +158,7 @@ FLASH_BANK_COMMAND_HANDLER(str9x_flash_bank_command) if (CMD_ARGC < 6) { - LOG_WARNING("incomplete flash_bank str9x configuration"); - return ERROR_FLASH_BANK_INVALID; + return ERROR_COMMAND_SYNTAX_ERROR; } str9x_info = malloc(sizeof(struct str9x_flash_bank)); @@ -246,6 +279,9 @@ static int str9x_erase(struct flash_bank *bank, int first, int last) total_timeout = 1000; } + /* this is so the compiler can *know* */ + assert(total_timeout > 0); + for (i = first; i <= last; i++) { int retval; @@ -364,6 +400,8 @@ static int str9x_write_block(struct flash_bank *bank, struct arm_algorithm armv4_5_info; int retval = ERROR_OK; + /* see contib/loaders/flash/str9x.s for src */ + static const uint32_t str9x_flash_write_code[] = { /* write: */ 0xe3c14003, /* bic r4, r1, #3 */ @@ -526,7 +564,7 @@ static int str9x_write(struct flash_bank *bank, } else if (retval == ERROR_FLASH_OPERATION_FAILED) { - LOG_ERROR("flash writing failed with error code: 0x%x", retval); + LOG_ERROR("flash writing failed"); return ERROR_FLASH_OPERATION_FAILED; } } @@ -580,14 +618,9 @@ static int str9x_write(struct flash_bank *bank, if (bytes_remaining) { uint8_t last_halfword[2] = {0xff, 0xff}; - i = 0; - while (bytes_remaining > 0) - { - last_halfword[i++] = *(buffer + bytes_written); - bytes_remaining--; - bytes_written++; - } + /* copy the last remaining bytes into the write buffer */ + memcpy(last_halfword, buffer+bytes_written, bytes_remaining); bank_adr = address & ~0x03; @@ -645,7 +678,6 @@ static int get_str9x_info(struct flash_bank *bank, char *buf, int buf_size) COMMAND_HANDLER(str9x_handle_flash_config_command) { - struct str9x_flash_bank *str9x_info; struct target *target = NULL; if (CMD_ARGC < 5) @@ -664,8 +696,6 @@ COMMAND_HANDLER(str9x_handle_flash_config_command) COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], bbadr); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], nbbadr); - str9x_info = bank->driver_priv; - target = bank->target; if (bank->target->state != TARGET_HALTED) @@ -705,6 +735,7 @@ static const struct command_registration str9x_command_handlers[] = { .name = "str9x", .mode = COMMAND_ANY, .help = "str9x flash command group", + .usage = "", .chain = str9x_config_command_handlers, }, COMMAND_REGISTRATION_DONE