Skip to content

Commit 60e53ad

Browse files
committed
sys/shell/cmds: add possibility to write raw bytes to MTD
1 parent 4f8ea2c commit 60e53ad

File tree

1 file changed

+77
-14
lines changed

1 file changed

+77
-14
lines changed

sys/shell/cmds/mtd.c

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <string.h>
2525

2626
#include "board.h"
27+
#include <ctype.h>
2728
#include "errno.h"
2829
#include "fmt.h"
2930
#include "macros/units.h"
@@ -120,23 +121,52 @@ static int cmd_read_page(mtd_dev_t *dev, int argc, char **argv)
120121

121122
static int _print_write_usage(const char *progname)
122123
{
123-
printf("usage: %s <addr> <data>\n", progname);
124+
printf("usage: %s [-b] <addr> <data>\n", progname);
124125
return -1;
125126
}
126127

128+
ssize_t _fmt_binary(char *buf)
129+
{
130+
size_t len = 0;
131+
if (strlen(buf) % 2) {
132+
return -1;
133+
}
134+
for (size_t i = 0; i < len; i++) {
135+
if (!isxdigit((int)(buf[i]))) {
136+
return -1;
137+
}
138+
}
139+
return fmt_hex_bytes((uint8_t *)buf, buf);
140+
}
141+
127142
static int cmd_write(mtd_dev_t *dev, int argc, char **argv)
128143
{
129144
uint32_t addr, len;
145+
void *data;
130146

131147
assert(strcmp(*argv, "write") == 0);
132148
if (argc < 3) {
133149
return _print_write_usage(argv[0]);
134150
}
135151

136-
addr = atoi(argv[1]);
137-
len = strlen(argv[2]);
152+
bool binary = argc > 3 && (strcmp(argv[1], "-b") == 0);
153+
if (binary) {
154+
addr = atoi(argv[2]);
155+
data = argv[3];
156+
ssize_t blen = _fmt_binary(data);
157+
if (blen < 0) {
158+
printf("error: data must be hexadecimal: %s\n", (char *)data);
159+
return -1;
160+
}
161+
len = blen;
162+
}
163+
else {
164+
addr = atoi(argv[1]);
165+
data = argv[2];
166+
len = strlen(data);
167+
}
138168

139-
int res = mtd_write(dev, argv[2], addr, len);
169+
int res = mtd_write(dev, data, addr, len);
140170

141171
if (res) {
142172
printf("error: %i\n", res);
@@ -147,24 +177,40 @@ static int cmd_write(mtd_dev_t *dev, int argc, char **argv)
147177

148178
static int _print_write_page_raw_usage(const char *progname)
149179
{
150-
printf("usage: %s <page> <offset> <data>\n", progname);
180+
printf("usage: %s [-b] <page> <offset> <data>\n", progname);
151181
return -1;
152182
}
153183

154184
static int cmd_write_page_raw(mtd_dev_t *dev, int argc, char **argv)
155185
{
156186
uint32_t page, offset, len;
187+
void *data;
157188

158189
assert(strcmp(*argv, "write_page_raw") == 0);
159190
if (argc < 4) {
160191
return _print_write_page_raw_usage(argv[0]);
161192
}
162193

163-
page = atoi(argv[1]);
164-
offset = atoi(argv[2]);
165-
len = strlen(argv[3]);
194+
bool binary = argc > 4 && (strcmp(argv[1], "-b") == 0);
195+
if (binary) {
196+
page = atoi(argv[2]);
197+
offset = atoi(argv[3]);
198+
data = argv[4];
199+
ssize_t blen = _fmt_binary(data);
200+
if (blen < 0) {
201+
printf("error: data must be hexadecimal: %s\n", (char *)data);
202+
return -1;
203+
}
204+
len = blen;
205+
}
206+
else {
207+
page = atoi(argv[1]);
208+
offset = atoi(argv[2]);
209+
data = argv[3];
210+
len = strlen(data);
211+
}
166212

167-
int res = mtd_write_page_raw(dev, argv[3], page, offset, len);
213+
int res = mtd_write_page_raw(dev, data, page, offset, len);
168214

169215
if (res) {
170216
printf("error: %i\n", res);
@@ -175,25 +221,41 @@ static int cmd_write_page_raw(mtd_dev_t *dev, int argc, char **argv)
175221

176222
static int _print_write_page_usage(const char *progname)
177223
{
178-
printf("usage: %s <page> <offset> <data>\n", progname);
224+
printf("usage: %s [-b] <page> <offset> <data>\n", progname);
179225
return -1;
180226
}
181227

182228
static int cmd_write_page(mtd_dev_t *dev, int argc, char **argv)
183229
{
184230
#if IS_USED(MODULE_MTD_WRITE_PAGE)
185231
uint32_t page, offset, len;
232+
void *data;
186233

187234
assert(strcmp(*argv, "write_page") == 0);
188235
if (argc < 4) {
189236
return _print_write_page_usage(argv[0]);
190237
}
191238

192-
page = atoi(argv[1]);
193-
offset = atoi(argv[2]);
194-
len = strlen(argv[3]);
239+
bool binary = argc > 4 && (strcmp(argv[1], "-b") == 0);
240+
if (binary) {
241+
page = atoi(argv[2]);
242+
offset = atoi(argv[3]);
243+
data = argv[4];
244+
ssize_t blen = _fmt_binary(data);
245+
if (blen < 0) {
246+
printf("error: data must be hexadecimal: %s\n", (char *)data);
247+
return -1;
248+
}
249+
len = blen;
250+
}
251+
else {
252+
page = atoi(argv[1]);
253+
offset = atoi(argv[2]);
254+
data = argv[3];
255+
len = strlen(data);
256+
}
195257

196-
int res = mtd_write_page(dev, argv[3], page, offset, len);
258+
int res = mtd_write_page(dev, data, page, offset, len);
197259

198260
if (res) {
199261
printf("error: %i\n", res);
@@ -309,6 +371,7 @@ static void _print_info(mtd_dev_t *dev)
309371
static int cmd_info(mtd_dev_t *dev, int argc, char **argv)
310372
{
311373
(void)argc;
374+
(void)argv;
312375
assert(strcmp(*argv, "info") == 0);
313376

314377
if (dev) {

0 commit comments

Comments
 (0)