diff options
-rw-r--r-- | src/flash/flash.c | 17 | ||||
-rw-r--r-- | src/flash/flash.h | 10 | ||||
-rw-r--r-- | src/flash/nand.c | 13 | ||||
-rw-r--r-- | src/flash/nand.h | 5 |
4 files changed, 45 insertions, 0 deletions
diff --git a/src/flash/flash.c b/src/flash/flash.c index db04e6e5..aa246598 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 a7f08f63..05c4b2c4 100644 --- a/src/flash/flash.h +++ b/src/flash/flash.h @@ -314,6 +314,16 @@ extern int default_flash_mem_blank_check(struct flash_bank_s *bank); */ 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. * @returns A flash_bank_t for flash bank @a num, or NULL. diff --git a/src/flash/nand.c b/src/flash/nand.c index 6e450758..d97c817d 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 b73e3304..d8674943 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) |