summaryrefslogtreecommitdiff
path: root/src/st-flash/flash_opts.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/st-flash/flash_opts.c')
-rw-r--r--src/st-flash/flash_opts.c118
1 files changed, 72 insertions, 46 deletions
diff --git a/src/st-flash/flash_opts.c b/src/st-flash/flash_opts.c
index 172a244..e2d4154 100644
--- a/src/st-flash/flash_opts.c
+++ b/src/st-flash/flash_opts.c
@@ -1,15 +1,25 @@
-#include <stdlib.h>
+/*
+ * File: flash_opts.c
+ *
+ * Flash Options
+ */
+
+#include <stdint.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
-#include <helper.h>
-
+#include <stm32.h>
+#include <stlink.h>
+#include "flash_opts.h"
#include "flash.h"
+#include <helper.h>
+
static bool starts_with(const char * str, const char * prefix) {
- size_t n = strlen(prefix);
+ uint32_t n = strlen(prefix);
- if (strlen(str) < n) { return(false); }
+ if (strlen(str) < n) { return (false); }
return (0 == strncmp(str, prefix, n));
}
@@ -18,7 +28,7 @@ static bool starts_with(const char * str, const char * prefix) {
// support decimal, hexadecimal, octal, binary format like 0xff 12 1k 1M, 0b1001
// negative numbers are not supported
// return 0 if success else return -1
-static int get_long_integer_from_char_array (const char *const str, uint64_t *read_value) {
+static int32_t get_long_integer_from_char_array (const char *const str, uint64_t *read_value) {
uint64_t value;
char *tail;
@@ -39,50 +49,50 @@ static int get_long_integer_from_char_array (const char *const str, uint64_t *re
} else if (tail[0] == '\0') {
/* value not changed */
} else {
- return(-1);
+ return (-1);
}
*read_value = value;
- return(0);
+ return (0);
}
// support positive integer from 0 to UINT32_MAX
// support decimal, hexadecimal, octal, binary format like 0xff 12 1k 1M, 0b1001
// negative numbers are not supported
// return 0 if success else return -1
-static int get_integer_from_char_array (const char *const str, uint32_t *read_value) {
+static int32_t get_integer_from_char_array (const char *const str, uint32_t *read_value) {
uint64_t value;
- int result = get_long_integer_from_char_array (str, &value);
+ int32_t result = get_long_integer_from_char_array (str, &value);
if (result != 0) {
- return(result);
+ return (result);
} else if (value > UINT32_MAX) {
fprintf (stderr, "*** Error: Integer greater than UINT32_MAX, cannot convert to int32_t\n");
- return(-1);
+ return (-1);
} else {
- *read_value = (uint32_t)value;
- return(0);
+ *read_value = value;
+ return (0);
}
}
-static int invalid_args(const char *expected) {
+static int32_t invalid_args(const char *expected) {
fprintf(stderr, "*** Error: Expected args for this command: %s\n", expected);
- return(-1);
+ return (-1);
}
-static int bad_arg(const char *arg) {
+static int32_t bad_arg(const char *arg) {
fprintf(stderr, "*** Error: Invalid value for %s\n", arg);
- return(-1);
+ return (-1);
}
-int flash_get_opts(struct flash_opts* o, int ac, char** av) {
+int32_t flash_get_opts(struct flash_opts* o, int32_t ac, char** av) {
// defaults
memset(o, 0, sizeof(*o));
o->log_level = STND_LOG_LEVEL;
// options
- int result;
+ int32_t result;
while (ac >= 1) {
if (strcmp(av[0], "--version") == 0) {
@@ -101,7 +111,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
ac--;
av++;
- if (ac < 1) { return(-1); }
+ if (ac < 1) { return (-1); }
serial = av[0];
} else {
@@ -117,7 +127,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
ac--;
av++;
- if (ac < 1) { return(-1); }
+ if (ac < 1) { return (-1); }
area = av[0];
} else {
@@ -139,7 +149,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
} else if (strcmp(area, "optcr1") == 0) {
o->area = FLASH_OPTCR1;
} else {
- return(-1);
+ return (-1);
}
} else if (strcmp(av[0], "--freq") == 0) {
@@ -147,17 +157,17 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
av++;
if (ac < 1) {
- return(-1);
+ return (-1);
}
o->freq = arg_parse_freq(av[0]);
if (o->freq < 0) {
- return(-1);
+ return (-1);
}
} else if (starts_with(av[0], "--freq=")) {
o->freq = arg_parse_freq(av[0] + strlen("--freq="));
if (o->freq < 0) {
- return(-1);
+ return (-1);
}
} else if (strcmp(av[0], "--format") == 0 || starts_with(av[0], "--format=")) {
const char * format;
@@ -166,7 +176,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
ac--;
av++;
- if (ac < 1) { return(-1); }
+ if (ac < 1) { return (-1); }
format = av[0];
} else {
@@ -178,7 +188,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
} else if (strcmp(format, "ihex") == 0) {
o->format = FLASH_FORMAT_IHEX;
} else {
- return(bad_arg("format"));
+ return (bad_arg("format"));
}
} else if ( starts_with(av[0], "--flash=")) {
const char *arg = av[0] + strlen("--flash=");
@@ -187,7 +197,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
result = get_integer_from_char_array(arg, &flash_size);
if (result != 0) {
- return(bad_arg ("--flash"));
+ return (bad_arg ("--flash"));
} else {
o->flash_size = (size_t)flash_size;
}
@@ -207,18 +217,18 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
// command and (optional) device name
while (ac >= 1) {
if (strcmp(av[0], "erase") == 0) {
- if (o->cmd != FLASH_CMD_NONE) { return(-1); }
+ if (o->cmd != FLASH_CMD_NONE) { return (-1); }
o->cmd = FLASH_CMD_ERASE;
} else if (strcmp(av[0], "read") == 0) {
- if (o->cmd != FLASH_CMD_NONE) { return(-1); }
+ if (o->cmd != FLASH_CMD_NONE) { return (-1); }
o->cmd = FLASH_CMD_READ;
} else if (strcmp(av[0], "write") == 0) {
- if (o->cmd != FLASH_CMD_NONE) { return(-1); }
+ if (o->cmd != FLASH_CMD_NONE) { return (-1); }
o->cmd = FLASH_CMD_WRITE;
} else if (strcmp(av[0], "reset") == 0) {
- if (o->cmd != FLASH_CMD_NONE) { return(-1); }
+ if (o->cmd != FLASH_CMD_NONE) { return (-1); }
o->cmd = CMD_RESET;
} else {
@@ -231,10 +241,27 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
switch (o->cmd) {
case FLASH_CMD_NONE: // no command found
- return(-1);
+ return (-1);
case FLASH_CMD_ERASE: // no more arguments expected
- if (ac != 0) { return(-1); }
+ if (ac != 0 && ac != 2) { return (-1); }
+ if (ac == 2) {
+ uint32_t address;
+ result = get_integer_from_char_array(av[0], &address);
+ if (result != 0) {
+ return bad_arg ("addr");
+ } else {
+ o->addr = (stm32_addr_t) address;
+ }
+
+ uint32_t size;
+ result = get_integer_from_char_array(av[1], &size);
+ if (result != 0) {
+ return bad_arg ("size");
+ } else {
+ o->size = (size_t) size;
+ }
+ }
break;
@@ -261,8 +288,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
break;
} else if (o->area == FLASH_OTP) {
- return bad_arg("TODO: otp not implemented yet");
- if (ac > 1) { return invalid_args("otp read: [path]"); }
+ if (ac > 1 || ac ==0 ) { return invalid_args("otp read: [path]"); }
if (ac > 0) { o->filename = av[0]; }
break;
} else if (o->area == FLASH_OPTION_BYTES) {
@@ -300,7 +326,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
if (result != 0) {
return bad_arg ("val");
} else {
- o->val = (uint32_t) val;
+ o->val = val;
}
} else if (o->area == FLASH_OPTION_BYTES_BOOT_ADD) { // expect option bytes boot address
if (ac != 1) { return invalid_args("option bytes boot_add write <value>"); }
@@ -309,9 +335,9 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
result = get_integer_from_char_array(av[0], &val);
if (result != 0) {
- return(bad_arg ("val"));
+ return (bad_arg ("val"));
} else {
- o->val = (uint32_t)val;
+ o->val = val;
}
} else if (o->area == FLASH_OPTCR) { // expect option control register value
if (ac != 1) { return invalid_args("option control register write <value>"); }
@@ -322,7 +348,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
if (result != 0) {
return bad_arg ("val");
} else {
- o->val = (uint32_t) val;
+ o->val = val;
}
} else if (o->area == FLASH_OPTCR1) { // expect option control register 1 value
if (ac != 1) { return invalid_args("option control register 1 write <value>"); }
@@ -332,7 +358,7 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
if (result != 0) {
return bad_arg ("val");
} else {
- o->val = (uint32_t) val;
+ o->val = val;
}
} else if (o->format == FLASH_FORMAT_BINARY) { // expect filename and addr
if (ac != 2) { return invalid_args("write <path> <addr>"); }
@@ -342,16 +368,16 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
result = get_integer_from_char_array(av[1], &addr);
if (result != 0) {
- return(bad_arg ("addr"));
+ return (bad_arg ("addr"));
} else {
o->addr = (stm32_addr_t)addr;
}
} else if (o->format == FLASH_FORMAT_IHEX) { // expect filename
- if (ac != 1) { return(invalid_args("write <path>")); }
+ if (ac != 1) { return (invalid_args("write <path>")); }
o->filename = av[0];
} else {
- return(-1); // should have been caught during format parsing
+ return (-1); // should have been caught during format parsing
}
break;
@@ -359,5 +385,5 @@ int flash_get_opts(struct flash_opts* o, int ac, char** av) {
default: break;
}
- return(0);
+ return (0);
}