summaryrefslogtreecommitdiff
path: root/src/flash/flash.c
diff options
context:
space:
mode:
authorZachary T Welch <zw@superlucidity.net>2009-11-17 13:04:49 -0800
committerZachary T Welch <zw@superlucidity.net>2009-11-19 13:39:41 -0800
commit870b8c04557f0b7441cc502debaf537984d77e2a (patch)
tree38f868b2f6f76890f35e794937e8cccb834e2a66 /src/flash/flash.c
parent8f446fcf676e9cd13cf53d9946f0cae5d29a10ec (diff)
downloadopenocd+libswd-870b8c04557f0b7441cc502debaf537984d77e2a.tar.gz
openocd+libswd-870b8c04557f0b7441cc502debaf537984d77e2a.tar.bz2
openocd+libswd-870b8c04557f0b7441cc502debaf537984d77e2a.tar.xz
openocd+libswd-870b8c04557f0b7441cc502debaf537984d77e2a.zip
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/flash.c')
-rw-r--r--src/flash/flash.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/flash/flash.c b/src/flash/flash.c
index 98e5ee0e..071503f1 100644
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -28,6 +28,7 @@
#endif
#include "flash.h"
+#include "common.h"
#include "image.h"
#include "time_support.h"
@@ -180,6 +181,23 @@ int flash_get_bank_count(void)
return i;
}
+struct flash_bank *get_flash_bank_by_name(const char *name)
+{
+ unsigned requested = get_flash_name_index(name);
+ unsigned found = 0;
+
+ struct flash_bank *bank;
+ for (bank = flash_banks; NULL != bank; bank = bank->next)
+ {
+ if (!flash_driver_name_matches(bank->driver->name, name))
+ continue;
+ if (++found < requested)
+ continue;
+ return bank;
+ }
+ return NULL;
+}
+
struct flash_bank *get_flash_bank_by_num(int num)
{
struct flash_bank *p = get_flash_bank_by_num_noprobe(num);
@@ -198,10 +216,14 @@ struct flash_bank *get_flash_bank_by_num(int num)
return p;
}
-COMMAND_HELPER(flash_command_get_bank_by_num,
- unsigned name_index, struct flash_bank **bank)
+COMMAND_HELPER(flash_command_get_bank_by_num, unsigned name_index,
+ struct flash_bank **bank)
{
const char *name = CMD_ARGV[name_index];
+ *bank = get_flash_bank_by_name(name);
+ if (*bank)
+ return ERROR_OK;
+
unsigned bank_num;
COMMAND_PARSE_NUMBER(uint, name, bank_num);