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
121122static 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+
127142static 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
148178static 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
154184static 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
176222static 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
182228static 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)
309371static 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