X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fat91sam7.c;h=02046608a1894cd0e9ae92b5d7709618e9941451;hp=266be06875a30984d86103de05207f8a97c5aa37;hb=bdae918dcd3bbcd1a90b2c5f65291908271727f7;hpb=0796dfff89bf00f82a780d7719767bcffe881d67 diff --git a/src/flash/at91sam7.c b/src/flash/at91sam7.c index 266be06875..02046608a1 100644 --- a/src/flash/at91sam7.c +++ b/src/flash/at91sam7.c @@ -52,13 +52,13 @@ #include "at91sam7.h" #include "binarybuffer.h" -static int at91sam7_protect_check(struct flash_bank_s *bank); -static int at91sam7_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count); +static int at91sam7_protect_check(struct flash_bank *bank); +static int at91sam7_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count); -static uint32_t at91sam7_get_flash_status(target_t *target, int bank_number); -static void at91sam7_set_flash_mode(flash_bank_t *bank, int mode); -static uint32_t at91sam7_wait_status_busy(flash_bank_t *bank, uint32_t waitbits, int timeout); -static int at91sam7_flash_command(struct flash_bank_s *bank, uint8_t cmd, uint16_t pagen); +static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number); +static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode); +static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout); +static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen); static uint32_t MC_FMR[4] = { 0xFFFFFF60, 0xFFFFFF70, 0xFFFFFF80, 0xFFFFFF90 }; static uint32_t MC_FCR[4] = { 0xFFFFFF64, 0xFFFFFF74, 0xFFFFFF84, 0xFFFFFF94 }; @@ -88,7 +88,7 @@ static long SRAMSIZ[16] = { #endif -static uint32_t at91sam7_get_flash_status(target_t *target, int bank_number) +static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number) { uint32_t fsr; target_read_u32(target, MC_FSR[bank_number], &fsr); @@ -97,10 +97,10 @@ static uint32_t at91sam7_get_flash_status(target_t *target, int bank_number) } /* Read clock configuration and set at91sam7_info->mck_freq */ -static void at91sam7_read_clock_info(flash_bank_t *bank) +static void at91sam7_read_clock_info(struct flash_bank *bank) { - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; - target_t *target = bank->target; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; + struct target *target = bank->target; uint32_t mckr, mcfr, pllr, mor; unsigned long tmp = 0, mainfreq; @@ -176,11 +176,11 @@ static void at91sam7_read_clock_info(flash_bank_t *bank) } /* Setup the timimg registers for nvbits or normal flash */ -static void at91sam7_set_flash_mode(flash_bank_t *bank, int mode) +static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode) { uint32_t fmr, fmcn = 0, fws = 0; - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; - target_t *target = bank->target; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; + struct target *target = bank->target; if (mode && (mode != at91sam7_info->flashmode)) { @@ -224,7 +224,7 @@ static void at91sam7_set_flash_mode(flash_bank_t *bank, int mode) at91sam7_info->flashmode = mode; } -static uint32_t at91sam7_wait_status_busy(flash_bank_t *bank, uint32_t waitbits, int timeout) +static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout) { uint32_t status; @@ -251,11 +251,11 @@ static uint32_t at91sam7_wait_status_busy(flash_bank_t *bank, uint32_t waitbits, } /* Send one command to the AT91SAM flash controller */ -static int at91sam7_flash_command(struct flash_bank_s *bank, uint8_t cmd, uint16_t pagen) +static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen) { uint32_t fcr; - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; - target_t *target = bank->target; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; + struct target *target = bank->target; fcr = (0x5A << 24) | ((pagen&0x3FF) << 8) | cmd; target_write_u32(target, MC_FCR[bank->bank_number], fcr); @@ -280,11 +280,11 @@ static int at91sam7_flash_command(struct flash_bank_s *bank, uint8_t cmd, uint16 } /* Read device id register, main clock frequency register and fill in driver info structure */ -static int at91sam7_read_part_info(struct flash_bank_s *bank) +static int at91sam7_read_part_info(struct flash_bank *bank) { - flash_bank_t *t_bank = bank; - at91sam7_flash_bank_t *at91sam7_info; - target_t *target = t_bank->target; + struct flash_bank *t_bank = bank; + struct at91sam7_flash_bank *at91sam7_info; + struct target *target = t_bank->target; uint16_t bnk, sec; uint16_t arch; @@ -304,7 +304,7 @@ static int at91sam7_read_part_info(struct flash_bank_s *bank) if (at91sam7_info->cidr != 0) { /* flash already configured, update clock and check for protected sectors */ - flash_bank_t *fb = bank; + struct flash_bank *fb = bank; t_bank = fb; while (t_bank) @@ -336,7 +336,7 @@ static int at91sam7_read_part_info(struct flash_bank_s *bank) if (at91sam7_info->flash_autodetection == 0) { /* banks and sectors are already created, based on data from input file */ - flash_bank_t *fb = bank; + struct flash_bank *fb = bank; t_bank = fb; while (t_bank) { @@ -532,10 +532,10 @@ static int at91sam7_read_part_info(struct flash_bank_s *bank) if (bnk > 0) { /* create a new flash bank element */ - flash_bank_t *fb = malloc(sizeof(flash_bank_t)); + struct flash_bank *fb = malloc(sizeof(struct flash_bank)); fb->target = target; fb->driver = bank->driver; - fb->driver_priv = malloc(sizeof(at91sam7_flash_bank_t)); + fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank)); fb->next = NULL; /* link created bank in 'flash_banks' list and redirect t_bank */ @@ -551,7 +551,7 @@ static int at91sam7_read_part_info(struct flash_bank_s *bank) t_bank->num_sectors = sectors_num; /* allocate sectors */ - t_bank->sectors = malloc(sectors_num * sizeof(flash_sector_t)); + t_bank->sectors = malloc(sectors_num * sizeof(struct flash_sector)); for (sec = 0; sec < sectors_num; sec++) { t_bank->sectors[sec].offset = sec * pages_per_sector * page_size; @@ -595,9 +595,9 @@ static int at91sam7_read_part_info(struct flash_bank_s *bank) return ERROR_OK; } -static int at91sam7_erase_check(struct flash_bank_s *bank) +static int at91sam7_erase_check(struct flash_bank *bank) { - target_t *target = bank->target; + struct target *target = bank->target; uint16_t retval; uint32_t blank; uint16_t fast_check; @@ -661,12 +661,12 @@ static int at91sam7_erase_check(struct flash_bank_s *bank) return ERROR_OK; } -static int at91sam7_protect_check(struct flash_bank_s *bank) +static int at91sam7_protect_check(struct flash_bank *bank) { uint8_t lock_pos, gpnvm_pos; uint32_t status; - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; if (at91sam7_info->cidr == 0) { @@ -713,9 +713,9 @@ static int at91sam7_protect_check(struct flash_bank_s *bank) FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) { - flash_bank_t *t_bank = bank; - at91sam7_flash_bank_t *at91sam7_info; - target_t *target = t_bank->target; + struct flash_bank *t_bank = bank; + struct at91sam7_flash_bank *at91sam7_info; + struct target *target = t_bank->target; uint32_t base_address; uint32_t bank_size; @@ -734,7 +734,7 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) int bnk, sec; - at91sam7_info = malloc(sizeof(at91sam7_flash_bank_t)); + at91sam7_info = malloc(sizeof(struct at91sam7_flash_bank)); t_bank->driver_priv = at91sam7_info; /* part wasn't probed for info yet */ @@ -743,26 +743,26 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) at91sam7_info->ext_freq = 0; at91sam7_info->flash_autodetection = 0; - if (argc < 13) + if (CMD_ARGC < 13) { at91sam7_info->flash_autodetection = 1; return ERROR_OK; } - COMMAND_PARSE_NUMBER(u32, args[1], base_address); + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], base_address); - COMMAND_PARSE_NUMBER(int, args[3], chip_width); - COMMAND_PARSE_NUMBER(int, args[4], bus_width); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], chip_width); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[4], bus_width); - COMMAND_PARSE_NUMBER(int, args[8], banks_num); - COMMAND_PARSE_NUMBER(int, args[9], num_sectors); - COMMAND_PARSE_NUMBER(u16, args[10], pages_per_sector); - COMMAND_PARSE_NUMBER(u16, args[11], page_size); - COMMAND_PARSE_NUMBER(u16, args[12], num_nvmbits); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[8], banks_num); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[9], num_sectors); + COMMAND_PARSE_NUMBER(u16, CMD_ARGV[10], pages_per_sector); + COMMAND_PARSE_NUMBER(u16, CMD_ARGV[11], page_size); + COMMAND_PARSE_NUMBER(u16, CMD_ARGV[12], num_nvmbits); - if (argc == 14) { + if (CMD_ARGC == 14) { unsigned long freq; - COMMAND_PARSE_NUMBER(ulong, args[13], freq); + COMMAND_PARSE_NUMBER(ulong, CMD_ARGV[13], freq); ext_freq = freq * 1000; at91sam7_info->ext_freq = ext_freq; } @@ -774,8 +774,8 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) return ERROR_OK; } - target_name = calloc(strlen(args[7]) + 1, sizeof(char)); - strcpy(target_name, args[7]); + target_name = calloc(strlen(CMD_ARGV[7]) + 1, sizeof(char)); + strcpy(target_name, CMD_ARGV[7]); /* calculate bank size */ bank_size = num_sectors * pages_per_sector * page_size; @@ -785,10 +785,10 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) if (bnk > 0) { /* create a new bank element */ - flash_bank_t *fb = malloc(sizeof(flash_bank_t)); + struct flash_bank *fb = malloc(sizeof(struct flash_bank)); fb->target = target; fb->driver = bank->driver; - fb->driver_priv = malloc(sizeof(at91sam7_flash_bank_t)); + fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank)); fb->next = NULL; /* link created bank in 'flash_banks' list and redirect t_bank */ @@ -804,7 +804,7 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) t_bank->num_sectors = num_sectors; /* allocate sectors */ - t_bank->sectors = malloc(num_sectors * sizeof(flash_sector_t)); + t_bank->sectors = malloc(num_sectors * sizeof(struct flash_sector)); for (sec = 0; sec < num_sectors; sec++) { t_bank->sectors[sec].offset = sec * pages_per_sector * page_size; @@ -827,9 +827,9 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) return ERROR_OK; } -static int at91sam7_erase(struct flash_bank_s *bank, int first, int last) +static int at91sam7_erase(struct flash_bank *bank, int first, int last) { - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; int sec; uint32_t nbytes, pos; uint8_t *buffer; @@ -895,13 +895,13 @@ static int at91sam7_erase(struct flash_bank_s *bank, int first, int last) return ERROR_OK; } -static int at91sam7_protect(struct flash_bank_s *bank, int set, int first, int last) +static int at91sam7_protect(struct flash_bank *bank, int set, int first, int last) { uint32_t cmd; int sector; uint32_t pagen; - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; if (at91sam7_info->cidr == 0) { @@ -945,11 +945,11 @@ static int at91sam7_protect(struct flash_bank_s *bank, int set, int first, int l return ERROR_OK; } -static int at91sam7_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count) +static int at91sam7_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) { int retval; - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; - target_t *target = bank->target; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; + struct target *target = bank->target; uint32_t dst_min_alignment, wcount, bytes_remaining = count; uint32_t first_page, last_page, pagen, buffer_pos; @@ -979,7 +979,7 @@ static int at91sam7_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t o return ERROR_FLASH_BANK_NOT_PROBED; first_page = offset/dst_min_alignment; - last_page = CEIL(offset + count, dst_min_alignment); + last_page = DIV_ROUND_UP(offset + count, dst_min_alignment); LOG_DEBUG("first_page: %i, last_page: %i, count %i", (int)first_page, (int)last_page, (int)count); @@ -997,7 +997,7 @@ static int at91sam7_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t o /* Write one block to the PageWriteBuffer */ buffer_pos = (pagen-first_page)*dst_min_alignment; - wcount = CEIL(count,4); + wcount = DIV_ROUND_UP(count,4); if ((retval = target_write_memory(target, bank->base + pagen*dst_min_alignment, 4, wcount, buffer + buffer_pos)) != ERROR_OK) { return retval; @@ -1014,7 +1014,7 @@ static int at91sam7_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t o return ERROR_OK; } -static int at91sam7_probe(struct flash_bank_s *bank) +static int at91sam7_probe(struct flash_bank *bank) { /* we can't probe on an at91sam7 * if this is an at91sam7, it has the configured flash */ @@ -1033,10 +1033,10 @@ static int at91sam7_probe(struct flash_bank_s *bank) return ERROR_OK; } -static int at91sam7_info(struct flash_bank_s *bank, char *buf, int buf_size) +static int at91sam7_info(struct flash_bank *bank, char *buf, int buf_size) { int printed; - at91sam7_flash_bank_t *at91sam7_info = bank->driver_priv; + struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv; if (at91sam7_info->cidr == 0) { @@ -1100,16 +1100,16 @@ static int at91sam7_info(struct flash_bank_s *bank, char *buf, int buf_size) */ COMMAND_HANDLER(at91sam7_handle_gpnvm_command) { - flash_bank_t *bank; + struct flash_bank *bank; int bit; uint8_t flashcmd; uint32_t status; - at91sam7_flash_bank_t *at91sam7_info; + struct at91sam7_flash_bank *at91sam7_info; int retval; - if (argc != 2) + if (CMD_ARGC != 2) { - command_print(cmd_ctx, "at91sam7 gpnvm "); + command_print(CMD_CTX, "at91sam7 gpnvm "); return ERROR_OK; } @@ -1120,7 +1120,7 @@ COMMAND_HANDLER(at91sam7_handle_gpnvm_command) } if (strcmp(bank->driver->name, "at91sam7")) { - command_print(cmd_ctx, "not an at91sam7 flash bank '%s'", args[0]); + command_print(CMD_CTX, "not an at91sam7 flash bank '%s'", CMD_ARGV[0]); return ERROR_FLASH_BANK_INVALID; } if (bank->target->state != TARGET_HALTED) @@ -1129,11 +1129,11 @@ COMMAND_HANDLER(at91sam7_handle_gpnvm_command) return ERROR_TARGET_NOT_HALTED; } - if (strcmp(args[1], "set") == 0) + if (strcmp(CMD_ARGV[1], "set") == 0) { flashcmd = SGPB; } - else if (strcmp(args[1], "clear") == 0) + else if (strcmp(CMD_ARGV[1], "clear") == 0) { flashcmd = CGPB; } @@ -1152,10 +1152,10 @@ COMMAND_HANDLER(at91sam7_handle_gpnvm_command) } } - COMMAND_PARSE_NUMBER(int, args[0], bit); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], bit); if ((bit < 0) || (bit >= at91sam7_info->num_nvmbits)) { - command_print(cmd_ctx, "gpnvm bit '#%s' is out of bounds for target %s", args[0], at91sam7_info->target_name); + command_print(CMD_CTX, "gpnvm bit '#%s' is out of bounds for target %s", CMD_ARGV[0], at91sam7_info->target_name); return ERROR_OK; } @@ -1178,20 +1178,32 @@ COMMAND_HANDLER(at91sam7_handle_gpnvm_command) return ERROR_OK; } -static int at91sam7_register_commands(struct command_context_s *cmd_ctx) -{ - command_t *at91sam7_cmd = register_command(cmd_ctx, NULL, "at91sam7", - NULL, COMMAND_ANY, NULL); - - register_command(cmd_ctx, at91sam7_cmd, "gpnvm", - at91sam7_handle_gpnvm_command, COMMAND_EXEC, - "at91sam7 gpnvm set | clear, " - "set or clear one gpnvm bit"); +static const struct command_registration at91sam7_exec_command_handlers[] = { + { + .name = "gpnvm", + .handler = &at91sam7_handle_gpnvm_command, + .mode = COMMAND_EXEC, + .usage = "gpnvm set | clear, " + "set or clear one gpnvm bit", + }, + COMMAND_REGISTRATION_DONE +}; +static const struct command_registration at91sam7_command_handlers[] = { + { + .name = "at91sam7", + .mode = COMMAND_ANY, + .help = "at91sam7 flash command group", + .chain = at91sam7_exec_command_handlers, + }, + COMMAND_REGISTRATION_DONE +}; - return ERROR_OK; +static int at91sam7_register_commands(struct command_context *cmd_ctx) +{ + return register_commands(cmd_ctx, NULL, at91sam7_command_handlers); } -flash_driver_t at91sam7_flash = { +struct flash_driver at91sam7_flash = { .name = "at91sam7", .register_commands = &at91sam7_register_commands, .flash_bank_command = &at91sam7_flash_bank_command,