summaryrefslogtreecommitdiff
path: root/src/flash/nand.c
diff options
context:
space:
mode:
authorZachary T Welch <zw@superlucidity.net>2009-10-22 22:33:12 -0700
committerZachary T Welch <zw@superlucidity.net>2009-11-05 18:03:20 -0800
commit93ab9ce8885cd45f5f9beba7d7e55536655eb5bf (patch)
tree9a6830986281c40512802f378cca2e06d19765e1 /src/flash/nand.c
parente9566a4a6af9b16762c66cf632abbeafbe8f874f (diff)
downloadopenocd+libswd-93ab9ce8885cd45f5f9beba7d7e55536655eb5bf.tar.gz
openocd+libswd-93ab9ce8885cd45f5f9beba7d7e55536655eb5bf.tar.bz2
openocd+libswd-93ab9ce8885cd45f5f9beba7d7e55536655eb5bf.tar.xz
openocd+libswd-93ab9ce8885cd45f5f9beba7d7e55536655eb5bf.zip
Improve nand.c command argument parsing.
Diffstat (limited to 'src/flash/nand.c')
-rw-r--r--src/flash/nand.c125
1 files changed, 53 insertions, 72 deletions
diff --git a/src/flash/nand.c b/src/flash/nand.c
index d97c817d..7fb7c99e 100644
--- a/src/flash/nand.c
+++ b/src/flash/nand.c
@@ -1107,12 +1107,16 @@ int handle_nand_list_command(struct command_context_s *cmd_ctx, char *cmd, char
static int handle_nand_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- nand_device_t *p;
int i = 0;
int j = 0;
int first = -1;
int last = -1;
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
+
switch (argc) {
default:
return ERROR_COMMAND_SYNTAX_ERROR;
@@ -1121,15 +1125,16 @@ static int handle_nand_info_command(struct command_context_s *cmd_ctx, char *cmd
last = INT32_MAX;
break;
case 2:
- first = last = strtoul(args[1], NULL, 0);
+ COMMAND_PARSE_NUMBER(int, args[1], i);
+ first = last = i;
+ i = 0;
break;
case 3:
- first = strtoul(args[1], NULL, 0);
- last = strtoul(args[2], NULL, 0);
+ COMMAND_PARSE_NUMBER(int, args[1], first);
+ COMMAND_PARSE_NUMBER(int, args[2], last);
break;
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
if (p)
{
if (p->device)
@@ -1181,15 +1186,16 @@ static int handle_nand_info_command(struct command_context_s *cmd_ctx, char *cmd
static int handle_nand_probe_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- nand_device_t *p;
- int retval;
-
if (argc != 1)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
+
if (p)
{
if ((retval = nand_probe(p)) == ERROR_OK)
@@ -1205,29 +1211,25 @@ static int handle_nand_probe_command(struct command_context_s *cmd_ctx, char *cm
command_print(cmd_ctx, "unknown error when probing NAND flash device");
}
}
- else
- {
- command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds", args[0]);
- }
return ERROR_OK;
}
static int handle_nand_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- nand_device_t *p;
- int retval;
-
if (argc != 1 && argc != 3)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
+
if (p)
{
- char *cp;
unsigned long offset;
unsigned long length;
@@ -1235,16 +1237,12 @@ static int handle_nand_erase_command(struct command_context_s *cmd_ctx, char *cm
if (argc == 3) {
unsigned long size = p->erase_size * p->num_blocks;
- offset = strtoul(args[1], &cp, 0);
- if (*cp || (offset == ULONG_MAX)
- || (offset % p->erase_size) != 0
- || offset >= size)
+ COMMAND_PARSE_NUMBER(ulong, args[1], offset);
+ if ((offset % p->erase_size) != 0 || offset >= size)
return ERROR_INVALID_ARGUMENTS;
- length = strtoul(args[2], &cp, 0);
- if (*cp || (length == ULONG_MAX)
- || (length == 0)
- || (length % p->erase_size) != 0
+ COMMAND_PARSE_NUMBER(ulong, args[2], length);
+ if ((length == 0) || (length % p->erase_size) != 0
|| (length + offset) > size)
return ERROR_INVALID_ARGUMENTS;
@@ -1272,18 +1270,12 @@ static int handle_nand_erase_command(struct command_context_s *cmd_ctx, char *cm
command_print(cmd_ctx, "unknown error when erasing NAND flash device");
}
}
- else
- {
- command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds", args[0]);
- }
return ERROR_OK;
}
int handle_nand_check_bad_blocks_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- nand_device_t *p;
- int retval;
int first = -1;
int last = -1;
@@ -1293,31 +1285,25 @@ int handle_nand_check_bad_blocks_command(struct command_context_s *cmd_ctx, char
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
- if (!p) {
- command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds",
- args[0]);
- return ERROR_INVALID_ARGUMENTS;
- }
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
if (argc == 3)
{
- char *cp;
unsigned long offset;
unsigned long length;
- offset = strtoul(args[1], &cp, 0);
- if (*cp || offset == ULONG_MAX || offset % p->erase_size)
- {
+ COMMAND_PARSE_NUMBER(ulong, args[1], offset);
+ if (offset % p->erase_size)
return ERROR_INVALID_ARGUMENTS;
- }
offset /= p->erase_size;
- length = strtoul(args[2], &cp, 0);
- if (*cp || length == ULONG_MAX || length % p->erase_size)
- {
+ COMMAND_PARSE_NUMBER(ulong, args[2], length);
+ if (length % p->erase_size)
return ERROR_INVALID_ARGUMENTS;
- }
+
length -= 1;
length /= p->erase_size;
@@ -1357,15 +1343,16 @@ static int handle_nand_write_command(struct command_context_s *cmd_ctx, char *cm
duration_t duration;
char *duration_text;
- nand_device_t *p;
-
if (argc < 3)
{
return ERROR_COMMAND_SYNTAX_ERROR;
-
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
+
if (p)
{
uint8_t *page = NULL;
@@ -1374,7 +1361,7 @@ static int handle_nand_write_command(struct command_context_s *cmd_ctx, char *cm
uint32_t oob_size = 0;
const int *eccpos = NULL;
- offset = strtoul(args[2], NULL, 0);
+ COMMAND_PARSE_NUMBER(u32, args[2], offset);
if (argc > 3)
{
@@ -1509,24 +1496,22 @@ static int handle_nand_write_command(struct command_context_s *cmd_ctx, char *cm
free(duration_text);
duration_text = NULL;
}
- else
- {
- command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds", args[0]);
- }
return ERROR_OK;
}
static int handle_nand_dump_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- nand_device_t *p;
-
if (argc < 4)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
+
if (p)
{
if (p->device)
@@ -1540,8 +1525,10 @@ static int handle_nand_dump_command(struct command_context_s *cmd_ctx, char *cmd
uint32_t page_size = 0;
uint8_t *oob = NULL;
uint32_t oob_size = 0;
- uint32_t address = strtoul(args[2], NULL, 0);
- uint32_t size = strtoul(args[3], NULL, 0);
+ uint32_t address;
+ COMMAND_PARSE_NUMBER(u32, args[2], address);
+ uint32_t size;
+ COMMAND_PARSE_NUMBER(u32, args[3], size);
uint32_t bytes_done = 0;
enum oob_formats oob_format = NAND_OOB_NONE;
@@ -1631,24 +1618,22 @@ static int handle_nand_dump_command(struct command_context_s *cmd_ctx, char *cmd
command_print(cmd_ctx, "#%s: not probed", args[0]);
}
}
- else
- {
- command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds", args[0]);
- }
return ERROR_OK;
}
static int handle_nand_raw_access_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- nand_device_t *p;
-
if ((argc < 1) || (argc > 2))
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
- p = get_nand_device_by_num(strtoul(args[0], NULL, 0));
+ nand_device_t *p;
+ int retval = nand_command_get_device_by_num(cmd_ctx, args[0], &p);
+ if (ERROR_OK != retval)
+ return retval;
+
if (p)
{
if (p->device)
@@ -1676,10 +1661,6 @@ static int handle_nand_raw_access_command(struct command_context_s *cmd_ctx, cha
command_print(cmd_ctx, "#%s: not probed", args[0]);
}
}
- else
- {
- command_print(cmd_ctx, "NAND flash device '#%s' is out of bounds", args[0]);
- }
return ERROR_OK;
}