X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fat91sam3.c;h=be17a5f807d3fcbdf78e2d8c4ccd8594e2c9fe14;hp=aff4d984539e9f6bb1c112d693929052775e9806;hb=ad090413a8dfacccc993ff15b8376e0f2bd56712;hpb=5e0ee6ab083f999e7007696762d8c55d647624dd diff --git a/src/flash/at91sam3.c b/src/flash/at91sam3.c index aff4d98453..be17a5f807 100644 --- a/src/flash/at91sam3.c +++ b/src/flash/at91sam3.c @@ -60,10 +60,8 @@ #include #include #include -#include "log.h" #include "types.h" #include "flash.h" -#include "target.h" #include "membuf.h" #include "at91sam3.h" #include "time_support.h" @@ -175,7 +173,7 @@ struct sam3_bank_private { // so we can find the chip we belong to struct sam3_chip *pChip; // so we can find the orginal bank pointer - flash_bank_t *pBank; + struct flash_bank *pBank; unsigned bank_number; uint32_t controller_address; uint32_t base_address; @@ -215,7 +213,7 @@ struct sam3_chip { // this is "initialized" from the global const structure struct sam3_chip_details details; - target_t *target; + struct target *target; struct sam3_cfg cfg; struct membuf *mbuf; @@ -231,9 +229,9 @@ struct sam3_reg_list { static struct sam3_chip *all_sam3_chips; static struct sam3_chip * -get_current_sam3(struct command_context_s *cmd_ctx) +get_current_sam3(struct command_context *cmd_ctx) { - target_t *t; + struct target *t; static struct sam3_chip *p; t = get_current_target(cmd_ctx); @@ -1393,7 +1391,7 @@ sam3_explain_mckr(struct sam3_chip *pChip) #if 0 static struct sam3_chip * -target2sam3(target_t *pTarget) +target2sam3(struct target *pTarget) { struct sam3_chip *pChip; @@ -1456,7 +1454,7 @@ static const struct sam3_reg_list sam3_all_regs[] = { static struct sam3_bank_private * -get_sam3_bank_private(flash_bank_t *bank) +get_sam3_bank_private(struct flash_bank *bank) { return (struct sam3_bank_private *)(bank->driver_priv); } @@ -1582,7 +1580,7 @@ sam3_GetInfo(struct sam3_chip *pChip) static int -sam3_erase_check(struct flash_bank_s *bank) +sam3_erase_check(struct flash_bank *bank) { int x; @@ -1606,7 +1604,7 @@ sam3_erase_check(struct flash_bank_s *bank) } static int -sam3_protect_check(struct flash_bank_s *bank) +sam3_protect_check(struct flash_bank *bank) { int r; uint32_t v=0; @@ -1641,12 +1639,7 @@ sam3_protect_check(struct flash_bank_s *bank) return ERROR_OK; } -static int -sam3_flash_bank_command(struct command_context_s *cmd_ctx, - char *cmd, - char **args, - int argc, - struct flash_bank_s *bank) +FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command) { struct sam3_chip *pChip; @@ -1714,7 +1707,7 @@ sam3_GetDetails(struct sam3_bank_private *pPrivate) const struct sam3_chip_details *pDetails; struct sam3_chip *pChip; void *vp; - flash_bank_t *saved_banks[SAM3_MAX_FLASH_BANKS]; + struct flash_bank *saved_banks[SAM3_MAX_FLASH_BANKS]; unsigned x; const char *cp; @@ -1782,7 +1775,7 @@ sam3_GetDetails(struct sam3_bank_private *pPrivate) static int -_sam3_probe(struct flash_bank_s *bank, int noise) +_sam3_probe(struct flash_bank *bank, int noise) { unsigned x; int r; @@ -1866,13 +1859,13 @@ _sam3_probe(struct flash_bank_s *bank, int noise) } static int -sam3_probe(struct flash_bank_s *bank) +sam3_probe(struct flash_bank *bank) { return _sam3_probe(bank, 1); } static int -sam3_auto_probe(struct flash_bank_s *bank) +sam3_auto_probe(struct flash_bank *bank) { return _sam3_probe(bank, 0); } @@ -1880,7 +1873,7 @@ sam3_auto_probe(struct flash_bank_s *bank) static int -sam3_erase(struct flash_bank_s *bank, int first, int last) +sam3_erase(struct flash_bank *bank, int first, int last) { struct sam3_bank_private *pPrivate; int r; @@ -1912,7 +1905,7 @@ sam3_erase(struct flash_bank_s *bank, int first, int last) } static int -sam3_protect(struct flash_bank_s *bank, int set, int first, int last) +sam3_protect(struct flash_bank *bank, int set, int first, int last) { struct sam3_bank_private *pPrivate; int r; @@ -1941,7 +1934,7 @@ sam3_protect(struct flash_bank_s *bank, int set, int first, int last) static int -sam3_info(flash_bank_t *bank, char *buf, int buf_size) +sam3_info(struct flash_bank *bank, char *buf, int buf_size) { if (bank->target->state != TARGET_HALTED) { LOG_ERROR("Target not halted"); @@ -2109,7 +2102,7 @@ sam3_page_write(struct sam3_bank_private *pPrivate, unsigned pagenum, uint8_t *b static int -sam3_write(struct flash_bank_s *bank, +sam3_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) @@ -2266,8 +2259,7 @@ sam3_write(struct flash_bank_s *bank, return r; } -static int -sam3_handle_info_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc) +COMMAND_HANDLER(sam3_handle_info_command) { struct sam3_chip *pChip; void *vp; @@ -2275,7 +2267,7 @@ sam3_handle_info_command(struct command_context_s *cmd_ctx, char *cmd, char **ar unsigned x; int r; - pChip = get_current_sam3(cmd_ctx); + pChip = get_current_sam3(CMD_CTX); if (!pChip) { return ERROR_OK; } @@ -2286,7 +2278,7 @@ sam3_handle_info_command(struct command_context_s *cmd_ctx, char *cmd, char **ar if (pChip->details.bank[0].pBank == NULL) { x = 0; need_define: - command_print(cmd_ctx, + command_print(CMD_CTX, "Please define bank %d via command: flash bank %s ... ", x, at91sam3_flash.name); @@ -2337,20 +2329,19 @@ sam3_handle_info_command(struct command_context_s *cmd_ctx, char *cmd, char **ar // print results cp = membuf_strtok(pChip->mbuf, "\n", &vp); while (cp) { - command_print(cmd_ctx,"%s", cp); + command_print(CMD_CTX,"%s", cp); cp = membuf_strtok(NULL, "\n", &vp); } return ERROR_OK; } -static int -sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc) +COMMAND_HANDLER(sam3_handle_gpnvm_command) { unsigned x,v; int r,who; struct sam3_chip *pChip; - pChip = get_current_sam3(cmd_ctx); + pChip = get_current_sam3(CMD_CTX); if (!pChip) { return ERROR_OK; } @@ -2362,7 +2353,7 @@ sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **a if (pChip->details.bank[0].pBank == NULL) { - command_print(cmd_ctx, "Bank0 must be defined first via: flash bank %s ...", + command_print(CMD_CTX, "Bank0 must be defined first via: flash bank %s ...", at91sam3_flash.name); return ERROR_FAIL; } @@ -2374,9 +2365,9 @@ sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **a } - switch (argc) { + switch (CMD_ARGC) { default: - command_print(cmd_ctx,"Too many parameters\n"); + command_print(CMD_CTX,"Too many parameters\n"); return ERROR_COMMAND_SYNTAX_ERROR; break; case 0: @@ -2387,17 +2378,17 @@ sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **a who = -1; break; case 2: - if ((0 == strcmp(argv[0], "show")) && (0 == strcmp(argv[1], "all"))) { + if ((0 == strcmp(CMD_ARGV[0], "show")) && (0 == strcmp(CMD_ARGV[1], "all"))) { who = -1; } else { uint32_t v32; - COMMAND_PARSE_NUMBER(u32, argv[1], v32); + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], v32); who = v32; } break; } - if (0 == strcmp("show", argv[0])) { + if (0 == strcmp("show", CMD_ARGV[0])) { if (who == -1) { showall: r = ERROR_OK; @@ -2406,49 +2397,48 @@ sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **a if (r != ERROR_OK) { break; } - command_print(cmd_ctx, "sam3-gpnvm%u: %u", x, v); + command_print(CMD_CTX, "sam3-gpnvm%u: %u", x, v); } return r; } if ((who >= 0) && (((unsigned)(who)) < pChip->details.n_gpnvms)) { r = FLASHD_GetGPNVM(&(pChip->details.bank[0]), who, &v); - command_print(cmd_ctx, "sam3-gpnvm%u: %u", who, v); + command_print(CMD_CTX, "sam3-gpnvm%u: %u", who, v); return r; } else { - command_print(cmd_ctx, "sam3-gpnvm invalid GPNVM: %u", who); + command_print(CMD_CTX, "sam3-gpnvm invalid GPNVM: %u", who); return ERROR_COMMAND_SYNTAX_ERROR; } } if (who == -1) { - command_print(cmd_ctx, "Missing GPNVM number"); + command_print(CMD_CTX, "Missing GPNVM number"); return ERROR_COMMAND_SYNTAX_ERROR; } - if (0 == strcmp("set", argv[0])) { + if (0 == strcmp("set", CMD_ARGV[0])) { r = FLASHD_SetGPNVM(&(pChip->details.bank[0]), who); - } else if ((0 == strcmp("clr", argv[0])) || - (0 == strcmp("clear", argv[0]))) { // quietly accept both + } else if ((0 == strcmp("clr", CMD_ARGV[0])) || + (0 == strcmp("clear", CMD_ARGV[0]))) { // quietly accept both r = FLASHD_ClrGPNVM(&(pChip->details.bank[0]), who); } else { - command_print(cmd_ctx, "Unkown command: %s", argv[0]); + command_print(CMD_CTX, "Unkown command: %s", CMD_ARGV[0]); r = ERROR_COMMAND_SYNTAX_ERROR; } return r; } -static int -sam3_handle_slowclk_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc) +COMMAND_HANDLER(sam3_handle_slowclk_command) { struct sam3_chip *pChip; - pChip = get_current_sam3(cmd_ctx); + pChip = get_current_sam3(CMD_CTX); if (!pChip) { return ERROR_OK; } - switch (argc) { + switch (CMD_ARGC) { case 0: // show break; @@ -2456,10 +2446,10 @@ sam3_handle_slowclk_command(struct command_context_s *cmd_ctx, char *cmd, char * { // set uint32_t v; - COMMAND_PARSE_NUMBER(u32, argv[0], v); + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], v); if (v > 200000) { // absurd slow clock of 200Khz? - command_print(cmd_ctx,"Absurd/illegal slow clock freq: %d\n", (int)(v)); + command_print(CMD_CTX,"Absurd/illegal slow clock freq: %d\n", (int)(v)); return ERROR_COMMAND_SYNTAX_ERROR; } pChip->cfg.slow_freq = v; @@ -2467,60 +2457,60 @@ sam3_handle_slowclk_command(struct command_context_s *cmd_ctx, char *cmd, char * } default: // error - command_print(cmd_ctx,"Too many parameters"); + command_print(CMD_CTX,"Too many parameters"); return ERROR_COMMAND_SYNTAX_ERROR; break; } - command_print(cmd_ctx, "Slowclk freq: %d.%03dkhz", + command_print(CMD_CTX, "Slowclk freq: %d.%03dkhz", (int)(pChip->cfg.slow_freq/ 1000), (int)(pChip->cfg.slow_freq% 1000)); return ERROR_OK; } - -static int sam3_registered; -static int -sam3_register_commands(struct command_context_s *cmd_ctx) -{ - command_t *pCmd; - - // only register once - if (!sam3_registered) { - sam3_registered++; - - pCmd = register_command(cmd_ctx, NULL, "at91sam3", NULL, COMMAND_ANY, NULL); - register_command(cmd_ctx, pCmd, - "gpnvm", - sam3_handle_gpnvm_command, - COMMAND_EXEC, - "at91sam3 gpnvm [action [], by default 'show', otherwise set | clear BIT"); - register_command(cmd_ctx, pCmd, - "info", - sam3_handle_info_command, - COMMAND_EXEC, - "at91sam3 info - print information about the current sam3 chip"); - register_command(cmd_ctx, pCmd, - "slowclk", - sam3_handle_slowclk_command, - COMMAND_EXEC, - "at91sam3 slowclk [VALUE] set the slowclock frequency (default 32768hz)"); - } - return ERROR_OK; -} - - -flash_driver_t at91sam3_flash = -{ - .name = "at91sam3", - .register_commands = sam3_register_commands, - - .flash_bank_command = sam3_flash_bank_command, - .erase = sam3_erase, - .protect = sam3_protect, - .write = sam3_write, - .probe = sam3_probe, - .auto_probe = sam3_auto_probe, - .erase_check = sam3_erase_check, - .protect_check = sam3_protect_check, - .info = sam3_info +static const struct command_registration at91sam3_exec_command_handlers[] = { + { + .name = "gpnvm", + .handler = &sam3_handle_gpnvm_command, + .mode = COMMAND_EXEC, + .usage = "[(set|clear) []]", + .help = "Without arguments, shows the gpnvm register; " + "otherwise, sets or clear the specified bit.", + }, + { + .name = "info", + .handler = &sam3_handle_info_command, + .mode = COMMAND_EXEC, + .help = "print information about the current sam3 chip", + }, + { + .name = "slowclk", + .handler = &sam3_handle_slowclk_command, + .mode = COMMAND_EXEC, + .usage = "", + .help = "set the slowclock frequency (default 32768hz)", + }, + COMMAND_REGISTRATION_DONE }; +static const struct command_registration at91sam3_command_handlers[] = { + { + .name = "at91sam3", + .mode = COMMAND_ANY, + .help = "at91sam3 flash command group", + .chain = at91sam3_exec_command_handlers, + }, + COMMAND_REGISTRATION_DONE +}; + +struct flash_driver at91sam3_flash = { + .name = "at91sam3", + .commands = at91sam3_command_handlers, + .flash_bank_command = &sam3_flash_bank_command, + .erase = &sam3_erase, + .protect = &sam3_protect, + .write = &sam3_write, + .probe = &sam3_probe, + .auto_probe = &sam3_auto_probe, + .erase_check = &sam3_erase_check, + .protect_check = &sam3_protect_check, + .info = &sam3_info, + };