X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Faduc702x.c;h=643705cae287c0df6cf1cc0ec31626c1ab99ca0b;hb=f0ce88b3af9a6090ac986160950d66317de5087e;hp=a4007d07248f0e9a85fdd0c17d8149f70faa541f;hpb=1ee66e0ce730aaaa8113599dc2df76be11bae26e;p=openocd.git diff --git a/src/flash/aduc702x.c b/src/flash/aduc702x.c index a4007d0724..643705cae2 100644 --- a/src/flash/aduc702x.c +++ b/src/flash/aduc702x.c @@ -27,21 +27,12 @@ #include "armv4_5.h" #include "binarybuffer.h" #include "time_support.h" +#include "algorithm.h" -static int aduc702x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); -static int aduc702x_register_commands(struct command_context_s *cmd_ctx); -static int aduc702x_erase(struct flash_bank_s *bank, int first, int last); -static int aduc702x_protect(struct flash_bank_s *bank, int set, int first, int last); -static int aduc702x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count); -static int aduc702x_write_single(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count); -static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count); -static int aduc702x_probe(struct flash_bank_s *bank); -static int aduc702x_info(struct flash_bank_s *bank, char *buf, int buf_size); -static int aduc702x_protect_check(struct flash_bank_s *bank); -static int aduc702x_build_sector_list(struct flash_bank_s *bank); -static int aduc702x_check_flash_completion(target_t* target, unsigned int timeout_ms); -static int aduc702x_set_write_enable(target_t *target, int enable); +static int aduc702x_build_sector_list(struct flash_bank *bank); +static int aduc702x_check_flash_completion(struct target* target, unsigned int timeout_ms); +static int aduc702x_set_write_enable(struct target *target, int enable); #define ADUC702x_FLASH 0xfffff800 #define ADUC702x_FLASH_FEESTA (0*4) @@ -53,49 +44,17 @@ static int aduc702x_set_write_enable(target_t *target, int enable); #define ADUC702x_FLASH_FEEPRO (6*4) #define ADUC702x_FLASH_FEEHIDE (7*4) -typedef struct { - uint32_t feesta; - uint32_t feemod; - uint32_t feecon; - uint32_t feedat; - uint32_t feeadr; - uint32_t feesign; - uint32_t feepro; - uint32_t feehide; -} ADUC702x_FLASH_MMIO; - -typedef struct -{ - working_area_t *write_algorithm; -} aduc702x_flash_bank_t; - -flash_driver_t aduc702x_flash = -{ - .name = "aduc702x", - .register_commands = aduc702x_register_commands, - .flash_bank_command = aduc702x_flash_bank_command, - .erase = aduc702x_erase, - .protect = aduc702x_protect, - .write = aduc702x_write, - .probe = aduc702x_probe, - .auto_probe = aduc702x_probe, - .erase_check = default_flash_blank_check, - .protect_check = aduc702x_protect_check, - .info = aduc702x_info +struct aduc702x_flash_bank { + struct working_area *write_algorithm; }; -static int aduc702x_register_commands(struct command_context_s *cmd_ctx) -{ - return ERROR_OK; -} - /* flash bank aduc702x 0 0 0 0 * The ADC7019-28 devices all have the same flash layout */ -static int aduc702x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) +FLASH_BANK_COMMAND_HANDLER(aduc702x_flash_bank_command) { - aduc702x_flash_bank_t *nbank; + struct aduc702x_flash_bank *nbank; - nbank = malloc(sizeof(aduc702x_flash_bank_t)); + nbank = malloc(sizeof(struct aduc702x_flash_bank)); bank->base = 0x80000; bank->size = 0xF800; // top 4k not accessible @@ -106,16 +65,16 @@ static int aduc702x_flash_bank_command(struct command_context_s *cmd_ctx, char * return ERROR_OK; } -static int aduc702x_build_sector_list(struct flash_bank_s *bank) +static int aduc702x_build_sector_list(struct flash_bank *bank) { - //aduc7026_flash_bank_t *aduc7026_info = bank->driver_priv; + //aduc7026_struct flash_bank *aduc7026_info = bank->driver_priv; int i = 0; uint32_t offset = 0; // sector size is 512 bank->num_sectors = bank->size / 512; - bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors); + bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors); for (i = 0; i < bank->num_sectors; ++i) { bank->sectors[i].offset = offset; @@ -128,19 +87,19 @@ static int aduc702x_build_sector_list(struct flash_bank_s *bank) return ERROR_OK; } -static int aduc702x_protect_check(struct flash_bank_s *bank) +static int aduc702x_protect_check(struct flash_bank *bank) { printf("aduc702x_protect_check not implemented yet.\n"); return ERROR_OK; } -static int aduc702x_erase(struct flash_bank_s *bank, int first, int last) +static int aduc702x_erase(struct flash_bank *bank, int first, int last) { //int res; int x; int count; //uint32_t v; - target_t *target = bank->target; + struct target *target = bank->target; aduc702x_set_write_enable(target, 1); @@ -187,7 +146,7 @@ static int aduc702x_erase(struct flash_bank_s *bank, int first, int last) return ERROR_OK; } -static int aduc702x_protect(struct flash_bank_s *bank, int set, int first, int last) +static int aduc702x_protect(struct flash_bank *bank, int set, int first, int last) { printf("aduc702x_protect not implemented yet.\n"); return ERROR_FLASH_OPERATION_FAILED; @@ -198,15 +157,15 @@ static int aduc702x_protect(struct flash_bank_s *bank, int set, int first, int l * * Caller should not check for other return values specifically */ -static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count) +static int aduc702x_write_block(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) { - aduc702x_flash_bank_t *aduc702x_info = bank->driver_priv; - target_t *target = bank->target; + struct aduc702x_flash_bank *aduc702x_info = bank->driver_priv; + struct target *target = bank->target; uint32_t buffer_size = 7000; - working_area_t *source; + struct working_area *source; uint32_t address = bank->base + offset; - reg_param_t reg_params[6]; - armv4_5_algorithm_t armv4_5_info; + struct reg_param reg_params[6]; + struct armv4_5_algorithm armv4_5_info; int retval = ERROR_OK; if (((count%2)!=0)||((offset%2)!=0)) @@ -343,11 +302,11 @@ static int aduc702x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint /* All-JTAG, single-access method. Very slow. Used only if there is no * working area available. */ -static int aduc702x_write_single(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count) +static int aduc702x_write_single(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) { uint32_t x; uint8_t b; - target_t *target = bank->target; + struct target *target = bank->target; aduc702x_set_write_enable(target, 1); @@ -384,7 +343,7 @@ static int aduc702x_write_single(struct flash_bank_s *bank, uint8_t *buffer, uin return ERROR_OK; } -int aduc702x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count) +int aduc702x_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) { int retval; @@ -408,12 +367,12 @@ int aduc702x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, return retval; } -static int aduc702x_probe(struct flash_bank_s *bank) +static int aduc702x_probe(struct flash_bank *bank) { return ERROR_OK; } -static int aduc702x_info(struct flash_bank_s *bank, char *buf, int buf_size) +static int aduc702x_info(struct flash_bank *bank, char *buf, int buf_size) { snprintf(buf, buf_size, "aduc702x flash driver info"); return ERROR_OK; @@ -421,7 +380,7 @@ static int aduc702x_info(struct flash_bank_s *bank, char *buf, int buf_size) /* sets FEEMOD bit 3 * enable = 1 enables writes & erases, 0 disables them */ -static int aduc702x_set_write_enable(target_t *target, int enable) +static int aduc702x_set_write_enable(struct target *target, int enable) { // don't bother to preserve int enable bit here target_write_u16(target, ADUC702x_FLASH + ADUC702x_FLASH_FEEMOD, enable ? 8 : 0); @@ -434,7 +393,7 @@ static int aduc702x_set_write_enable(target_t *target, int enable) * * this function sleeps 1ms between checks (after the first one), * so in some cases may slow things down without a usleep after the first read */ -static int aduc702x_check_flash_completion(target_t* target, unsigned int timeout_ms) +static int aduc702x_check_flash_completion(struct target* target, unsigned int timeout_ms) { uint8_t v = 4; @@ -452,3 +411,15 @@ static int aduc702x_check_flash_completion(target_t* target, unsigned int timeou else return ERROR_OK; } +struct flash_driver aduc702x_flash = { + .name = "aduc702x", + .flash_bank_command = &aduc702x_flash_bank_command, + .erase = &aduc702x_erase, + .protect = &aduc702x_protect, + .write = &aduc702x_write, + .probe = &aduc702x_probe, + .auto_probe = &aduc702x_probe, + .erase_check = &default_flash_blank_check, + .protect_check = &aduc702x_protect_check, + .info = &aduc702x_info + };