diff options
author | Zachary T Welch <zw@superlucidity.net> | 2009-11-17 13:04:49 -0800 |
---|---|---|
committer | Zachary T Welch <zw@superlucidity.net> | 2009-11-19 13:39:41 -0800 |
commit | 870b8c04557f0b7441cc502debaf537984d77e2a (patch) | |
tree | 38f868b2f6f76890f35e794937e8cccb834e2a66 /src/flash/nand.c | |
parent | 8f446fcf676e9cd13cf53d9946f0cae5d29a10ec (diff) |
allow flash/nand banks commands to accept names
Add get_flash_bank_by_name (and get_nand_device_by_name) helpers
to retrieves struct flash_bank * (struct nand_device *) given a
driver name and an (optional) driver-specific bank index.
These are used to extend flash_command_get_bank_by_num (and
nand_command_get_device_by_num) to allow all flash (nand) commands to
reference defined banks by name, not just by number.
To avoid some code duplication, add the flash/common.[ch] files to hold
functionality common to both types driver. The first two methods are
helpers for the above routines to find a bank specified by a "name" or
"name.index" string. get_flash_name_index() finds the '.index' portion,
while flash_driver_name_matches() performs the string portion matching.
Diffstat (limited to 'src/flash/nand.c')
-rw-r--r-- | src/flash/nand.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/flash/nand.c b/src/flash/nand.c index 53b6531d..d812805a 100644 --- a/src/flash/nand.c +++ b/src/flash/nand.c @@ -25,6 +25,7 @@ #endif #include "nand.h" +#include "common.h" #include "time_support.h" #include "fileio.h" @@ -288,6 +289,23 @@ int nand_register_commands(struct command_context *cmd_ctx) return ERROR_OK; } +struct nand_device *get_nand_device_by_name(const char *name) +{ + unsigned requested = get_flash_name_index(name); + unsigned found = 0; + + struct nand_device *nand; + for (nand = nand_devices; NULL != nand; nand = nand->next) + { + if (!flash_driver_name_matches(nand->controller->name, name)) + continue; + if (++found < requested) + continue; + return nand; + } + return NULL; +} + struct nand_device *get_nand_device_by_num(int num) { struct nand_device *p; @@ -308,11 +326,15 @@ COMMAND_HELPER(nand_command_get_device_by_num, unsigned name_index, struct nand_device **nand) { const char *str = CMD_ARGV[name_index]; + *nand = get_nand_device_by_name(str); + if (*nand) + return ERROR_OK; + unsigned num; COMMAND_PARSE_NUMBER(uint, str, num); *nand = get_nand_device_by_num(num); if (!*nand) { - command_print(CMD_CTX, "NAND flash device '#%s' is out of bounds", str); + command_print(CMD_CTX, "NAND flash device '%s' not found", str); return ERROR_INVALID_ARGUMENTS; } return ERROR_OK; |