From 11e545f56091e4fa808bd57a215d6b8066b39295 Mon Sep 17 00:00:00 2001 From: Zachary T Welch Date: Fri, 23 Oct 2009 01:13:19 -0700 Subject: [PATCH] Add Flash/NAND bank command argument helpers. This eliminates redundant code for parsing and retreiving the bank specified from a script command argument. This patch was written to replace existing functionality; however, the parsing logic can be updated later to allow flash commands to accept bank names as well as their numbers. --- src/flash/flash.c | 17 +++++++++++++++++ src/flash/flash.h | 10 ++++++++++ src/flash/nand.c | 13 +++++++++++++ src/flash/nand.h | 5 +++++ 4 files changed, 45 insertions(+) diff --git a/src/flash/flash.c b/src/flash/flash.c index db04e6e52..aa246598e 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -255,6 +255,23 @@ flash_bank_t *get_flash_bank_by_num(int num) return p; } +int flash_command_get_bank_by_num( + struct command_context_s *cmd_ctx, char *str, flash_bank_t **bank) +{ + unsigned bank_num; + COMMAND_PARSE_NUMBER(uint, str, bank_num); + + *bank = get_flash_bank_by_num(bank_num); + if (!*bank) + { + command_print(cmd_ctx, + "flash bank '#%u' not found", bank_num); + return ERROR_INVALID_ARGUMENTS; + } + return ERROR_OK; +} + + static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int retval; diff --git a/src/flash/flash.h b/src/flash/flash.h index a7f08f63d..05c4b2c48 100644 --- a/src/flash/flash.h +++ b/src/flash/flash.h @@ -313,6 +313,16 @@ extern int default_flash_mem_blank_check(struct flash_bank_s *bank); * @returns A flash_bank_t for flash bank @a num, or NULL */ extern flash_bank_t *get_flash_bank_by_num(int num); +/** + * Retreives @a bank from a command argument, reporting errors parsing + * the bank identifier or retreiving the specified bank. + * @param cmd_ctx The command context for reporting errors. + * @param str The string containing the bank identifier. + * @param bank On output, contians a pointer to the bank or NULL. + * @returns ERROR_OK on success, or an error indicating the problem. + */ +int flash_command_get_bank_by_num( + struct command_context_s *cmd_ctx, char *str, flash_bank_t **bank); /** * Returns the flash bank like get_flash_bank_by_num(), without probing. * @param num The flash bank number. diff --git a/src/flash/nand.c b/src/flash/nand.c index 6e4507580..d97c817d0 100644 --- a/src/flash/nand.c +++ b/src/flash/nand.c @@ -340,6 +340,19 @@ nand_device_t *get_nand_device_by_num(int num) return NULL; } +int nand_command_get_device_by_num(struct command_context_s *cmd_ctx, + char *str, nand_device_t **device) +{ + unsigned num; + COMMAND_PARSE_NUMBER(uint, str, num); + *device = get_nand_device_by_num(num); + if (!*device) { + command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds", str); + return ERROR_INVALID_ARGUMENTS; + } + return ERROR_OK; +} + static int nand_build_bbt(struct nand_device_s *device, int first, int last) { uint32_t page = 0x0; diff --git a/src/flash/nand.h b/src/flash/nand.h index b73e3304f..d86749438 100644 --- a/src/flash/nand.h +++ b/src/flash/nand.h @@ -217,6 +217,11 @@ extern int nand_calculate_ecc_kw(struct nand_device_s *device, const uint8_t *da extern int nand_register_commands(struct command_context_s *cmd_ctx); extern int nand_init(struct command_context_s *cmd_ctx); +/// helper for parsing a nand device command argument string +int nand_command_get_device_by_num(struct command_context_s *cmd_ctx, + char *str, nand_device_t **device); + + #define ERROR_NAND_DEVICE_INVALID (-1100) #define ERROR_NAND_OPERATION_FAILED (-1101) #define ERROR_NAND_OPERATION_TIMEOUT (-1102)