1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43#include <common.h>
44#include <command.h>
45#include <environment.h>
46#include <search.h>
47#include <errno.h>
48#include <malloc.h>
49#include <watchdog.h>
50#include <serial.h>
51#include <linux/stddef.h>
52#include <asm/byteorder.h>
53#if defined(CONFIG_CMD_NET)
54#include <net.h>
55#endif
56
57DECLARE_GLOBAL_DATA_PTR;
58
59#if !defined(CONFIG_ENV_IS_IN_EEPROM) && \
60 !defined(CONFIG_ENV_IS_IN_FLASH) && \
61 !defined(CONFIG_ENV_IS_IN_DATAFLASH) && \
62 !defined(CONFIG_ENV_IS_IN_MG_DISK) && \
63 !defined(CONFIG_ENV_IS_IN_MMC) && \
64 !defined(CONFIG_ENV_IS_IN_NAND) && \
65 !defined(CONFIG_ENV_IS_IN_NVRAM) && \
66 !defined(CONFIG_ENV_IS_IN_ONENAND) && \
67 !defined(CONFIG_ENV_IS_IN_SPI_FLASH) && \
68 !defined(CONFIG_ENV_IS_NOWHERE)
69# error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\
70SPI_FLASH|MG_DISK|NVRAM|MMC} or CONFIG_ENV_IS_NOWHERE
71#endif
72
73#define XMK_STR(x) #x
74#define MK_STR(x) XMK_STR(x)
75
76
77
78
79#define MAX_ENV_SIZE (1 << 20)
80
81ulong load_addr = CONFIG_SYS_LOAD_ADDR;
82
83
84
85
86static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
87#define N_BAUDRATES (sizeof(baudrate_table) / sizeof(baudrate_table[0]))
88
89
90
91
92
93
94
95
96static int env_id = 1;
97
98int get_env_id(void)
99{
100 return env_id;
101}
102
103
104
105
106
107
108static int env_print(char *name)
109{
110 char *res = NULL;
111 size_t len;
112
113 if (name) {
114 ENTRY e, *ep;
115
116 e.key = name;
117 e.data = NULL;
118 hsearch_r(e, FIND, &ep, &env_htab);
119 if (ep == NULL)
120 return 0;
121 len = printf("%s=%s\n", ep->key, ep->data);
122 return len;
123 }
124
125
126 len = hexport_r(&env_htab, '\n', &res, 0);
127
128 if (len > 0) {
129 puts(res);
130 free(res);
131 return len;
132 }
133
134
135 return 0;
136}
137
138int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
139{
140 int i;
141 int rcode = 0;
142
143 if (argc == 1) {
144
145 rcode = env_print(NULL);
146 if (!rcode)
147 return 1;
148 printf("\nEnvironment size: %d/%ld bytes\n",
149 rcode, (ulong)ENV_SIZE);
150 return 0;
151 }
152
153
154 for (i = 1; i < argc; ++i) {
155 int rc = env_print(argv[i]);
156 if (!rc) {
157 printf("## Error: \"%s\" not defined\n", argv[i]);
158 ++rcode;
159 }
160 }
161
162 return rcode;
163}
164
165#ifdef CONFIG_CMD_GREPENV
166static int do_env_grep (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
167{
168 ENTRY *match;
169 unsigned char matched[env_htab.size / 8];
170 int rcode = 1, arg = 1, idx;
171
172 if (argc < 2)
173 return cmd_usage(cmdtp);
174
175 memset(matched, 0, env_htab.size / 8);
176
177 while (arg <= argc) {
178 idx = 0;
179 while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) {
180 if (!(matched[idx / 8] & (1 << (idx & 7)))) {
181 puts(match->key);
182 puts("=");
183 puts(match->data);
184 puts("\n");
185 }
186 matched[idx / 8] |= 1 << (idx & 7);
187 rcode = 0;
188 }
189 arg++;
190 }
191
192 return rcode;
193}
194#endif
195
196
197
198
199
200
201int _do_env_set (int flag, int argc, char * const argv[])
202{
203 bd_t *bd = gd->bd;
204 int i, len;
205 int console = -1;
206 char *name, *value, *s;
207 ENTRY e, *ep;
208
209 name = argv[1];
210
211 if (strchr(name, '=')) {
212 printf("## Error: illegal character '=' in variable name \"%s\"\n", name);
213 return 1;
214 }
215
216 env_id++;
217
218
219
220 e.key = name;
221 e.data = NULL;
222 hsearch_r(e, FIND, &ep, &env_htab);
223
224
225 if (strcmp(name, "stdin") == 0)
226 console = stdin;
227 else if (strcmp(name, "stdout") == 0)
228 console = stdout;
229 else if (strcmp(name, "stderr") == 0)
230 console = stderr;
231
232 if (console != -1) {
233 if (argc < 3) {
234 printf("Can't delete \"%s\"\n", name);
235 return 1;
236 }
237
238#ifdef CONFIG_CONSOLE_MUX
239 i = iomux_doenv(console, argv[2]);
240 if (i)
241 return i;
242#else
243
244 if (console_assign(console, argv[2]) < 0)
245 return 1;
246
247#ifdef CONFIG_SERIAL_MULTI
248 if (serial_assign(argv[2]) < 0)
249 return 1;
250#endif
251#endif
252 }
253
254
255
256
257
258 if (ep) {
259#ifndef CONFIG_ENV_OVERWRITE
260 if ((strcmp(name, "serial#") == 0) ||
261 ((strcmp(name, "ethaddr") == 0)
262#if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
263 && (strcmp(ep->data, MK_STR(CONFIG_ETHADDR)) != 0)
264#endif
265 ) ) {
266 printf("Can't overwrite \"%s\"\n", name);
267 return 1;
268 }
269#endif
270
271
272
273 if (strcmp(name, "baudrate") == 0) {
274 int baudrate = simple_strtoul(argv[2], NULL, 10);
275 int i;
276 for (i = 0; i < N_BAUDRATES; ++i) {
277 if (baudrate == baudrate_table[i])
278 break;
279 }
280 if (i == N_BAUDRATES) {
281 printf("## Baudrate %d bps not supported\n",
282 baudrate);
283 return 1;
284 }
285 printf ("## Switch baudrate to %d bps and press ENTER ...\n",
286 baudrate);
287 udelay(50000);
288 gd->baudrate = baudrate;
289#if defined(CONFIG_PPC) || defined(CONFIG_MCF52x2)
290 gd->bd->bi_baudrate = baudrate;
291#endif
292
293 serial_setbrg();
294 udelay(50000);
295 for (;;) {
296 if (getc() == '\r')
297 break;
298 }
299 }
300 }
301
302
303 if ((argc < 3) || argv[2] == NULL) {
304 int rc = hdelete_r(name, &env_htab);
305 return !rc;
306 }
307
308
309
310
311 for (i = 2, len = 0; i < argc; ++i)
312 len += strlen(argv[i]) + 1;
313
314 value = malloc(len);
315 if (value == NULL) {
316 printf("## Can't malloc %d bytes\n", len);
317 return 1;
318 }
319 for (i = 2, s = value; i < argc; ++i) {
320 char *v = argv[i];
321
322 while ((*s++ = *v++) != '\0')
323 ;
324 *(s-1) = ' ';
325 }
326 if (s != value)
327 *--s = '\0';
328
329 e.key = name;
330 e.data = value;
331 hsearch_r(e, ENTER, &ep, &env_htab);
332 free(value);
333 if (!ep) {
334 printf("## Error inserting \"%s\" variable, errno=%d\n",
335 name, errno);
336 return 1;
337 }
338
339
340
341
342
343
344 if (strcmp(name, "ipaddr") == 0) {
345 char *s = argv[2];
346 char *e;
347 unsigned long addr;
348 bd->bi_ip_addr = 0;
349 for (addr = 0, i = 0; i < 4; ++i) {
350 ulong val = s ? simple_strtoul(s, &e, 10) : 0;
351 addr <<= 8;
352 addr |= (val & 0xFF);
353 if (s) s = (*e) ? e+1 : e;
354 }
355 bd->bi_ip_addr = htonl(addr);
356 return 0;
357 } else if (strcmp(argv[1], "loadaddr") == 0) {
358 load_addr = simple_strtoul(argv[2], NULL, 16);
359 return 0;
360 }
361#if defined(CONFIG_CMD_NET)
362 else if (strcmp(argv[1], "bootfile") == 0) {
363 copy_filename(BootFile, argv[2], sizeof(BootFile));
364 return 0;
365 }
366#endif
367 return 0;
368}
369
370int setenv(char *varname, char *varvalue)
371{
372 char * const argv[4] = { "setenv", varname, varvalue, NULL };
373 if ((varvalue == NULL) || (varvalue[0] == '\0'))
374 return _do_env_set(0, 2, argv);
375 else
376 return _do_env_set(0, 3, argv);
377}
378
379int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
380{
381 if (argc < 2)
382 return cmd_usage(cmdtp);
383
384 return _do_env_set(flag, argc, argv);
385}
386
387
388
389
390#if defined(CONFIG_CMD_ASKENV)
391int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
392{
393 extern char console_buffer[CONFIG_SYS_CBSIZE];
394 char message[CONFIG_SYS_CBSIZE];
395 int size = CONFIG_SYS_CBSIZE - 1;
396 int i, len, pos;
397 char *local_args[4];
398
399 local_args[0] = argv[0];
400 local_args[1] = argv[1];
401 local_args[2] = NULL;
402 local_args[3] = NULL;
403
404
405 switch (argc) {
406 case 1:
407 return cmd_usage(cmdtp);
408
409 case 2:
410 sprintf(message, "Please enter '%s':", argv[1]);
411 break;
412
413 case 3:
414 sprintf(message, "Please enter '%s':", argv[1]);
415 size = simple_strtoul(argv[2], NULL, 10);
416 break;
417
418 default:
419 for (i = 2, pos = 0; i < argc - 1; i++) {
420 if (pos)
421 message[pos++] = ' ';
422
423 strcpy(message+pos, argv[i]);
424 pos += strlen(argv[i]);
425 }
426 message[pos] = '\0';
427 size = simple_strtoul(argv[argc - 1], NULL, 10);
428 break;
429 }
430
431 if (size >= CONFIG_SYS_CBSIZE)
432 size = CONFIG_SYS_CBSIZE - 1;
433
434 if (size <= 0)
435 return 1;
436
437
438 len = readline(message);
439
440 if (size < len)
441 console_buffer[size] = '\0';
442
443 len = 2;
444 if (console_buffer[0] != '\0') {
445 local_args[2] = console_buffer;
446 len = 3;
447 }
448
449
450 return _do_env_set(flag, len, local_args);
451}
452#endif
453
454
455
456
457#if defined(CONFIG_CMD_EDITENV)
458int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
459{
460 char buffer[CONFIG_SYS_CBSIZE];
461 char *init_val;
462 int len;
463
464 if (argc < 2)
465 return cmd_usage(cmdtp);
466
467
468 init_val = getenv(argv[1]);
469 if (init_val)
470 len = sprintf(buffer, "%s", init_val);
471 else
472 buffer[0] = '\0';
473
474 readline_into_buffer("edit: ", buffer);
475
476 return setenv(argv[1], buffer);
477}
478#endif
479
480
481
482
483
484
485char *getenv(char *name)
486{
487 if (gd->flags & GD_FLG_ENV_READY) {
488 ENTRY e, *ep;
489
490 WATCHDOG_RESET();
491
492 e.key = name;
493 e.data = NULL;
494 hsearch_r(e, FIND, &ep, &env_htab);
495
496 return ep ? ep->data : NULL;
497 }
498
499
500
501 if (getenv_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
502 return (char *)(gd->env_buf);
503
504 return NULL;
505}
506
507
508
509
510int getenv_f(char *name, char *buf, unsigned len)
511{
512 int i, nxt;
513
514 for (i = 0; env_get_char(i) != '\0'; i = nxt+1) {
515 int val, n;
516
517 for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) {
518 if (nxt >= CONFIG_ENV_SIZE)
519 return -1;
520 }
521
522 val = envmatch((uchar *)name, i);
523 if (val < 0)
524 continue;
525
526
527 for (n = 0; n < len; ++n, ++buf) {
528 if ((*buf = env_get_char(val++)) == '\0')
529 return n;
530 }
531
532 if (n)
533 *--buf = '\0';
534
535 printf("env_buf [%d bytes] too small for value of \"%s\"\n",
536 len, name);
537
538 return n;
539 }
540 return -1;
541}
542
543#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
544
545int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
546{
547 extern char *env_name_spec;
548
549 printf("Saving Environment to %s...\n", env_name_spec);
550
551 return saveenv() ? 1 : 0;
552}
553
554U_BOOT_CMD(
555 saveenv, 1, 0, do_env_save,
556 "save environment variables to persistent storage",
557 ""
558);
559
560#endif
561
562
563
564
565
566
567
568
569
570
571int envmatch(uchar *s1, int i2)
572{
573 while (*s1 == env_get_char(i2++))
574 if (*s1++ == '=')
575 return i2;
576 if (*s1 == '\0' && env_get_char(i2-1) == '=')
577 return i2;
578 return -1;
579}
580
581static int do_env_default(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
582{
583 if ((argc != 2) || (strcmp(argv[1], "-f") != 0))
584 return cmd_usage(cmdtp);
585
586 set_default_env("## Resetting to default environment\n");
587 return 0;
588}
589
590static int do_env_delete(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
591{
592 printf("Not implemented yet\n");
593 return 0;
594}
595
596#ifdef CONFIG_CMD_EXPORTENV
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
639{
640 char buf[32];
641 char *addr, *cmd, *res;
642 size_t size;
643 ssize_t len;
644 env_t *envp;
645 char sep = '\n';
646 int chk = 0;
647 int fmt = 0;
648
649 cmd = *argv;
650
651 while (--argc > 0 && **++argv == '-') {
652 char *arg = *argv;
653 while (*++arg) {
654 switch (*arg) {
655 case 'b':
656 if (fmt++)
657 goto sep_err;
658 sep = '\0';
659 break;
660 case 'c':
661 if (fmt++)
662 goto sep_err;
663 sep = '\0';
664 chk = 1;
665 break;
666 case 't':
667 if (fmt++)
668 goto sep_err;
669 sep = '\n';
670 break;
671 default:
672 return cmd_usage(cmdtp);
673 }
674 }
675 }
676
677 if (argc < 1)
678 return cmd_usage(cmdtp);
679
680 addr = (char *)simple_strtoul(argv[0], NULL, 16);
681
682 if (argc == 2) {
683 size = simple_strtoul(argv[1], NULL, 16);
684 memset(addr, '\0', size);
685 } else {
686 size = 0;
687 }
688
689 if (sep) {
690 len = hexport_r(&env_htab, sep, &addr, size);
691 if (len < 0) {
692 error("Cannot export environment: errno = %d\n",
693 errno);
694 return 1;
695 }
696 sprintf(buf, "%zX", (size_t)len);
697 setenv("filesize", buf);
698
699 return 0;
700 }
701
702 envp = (env_t *)addr;
703
704 if (chk)
705 res = (char *)envp->data;
706 else
707 res = addr;
708
709 len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
710 if (len < 0) {
711 error("Cannot export environment: errno = %d\n",
712 errno);
713 return 1;
714 }
715
716 if (chk) {
717 envp->crc = crc32(0, envp->data, ENV_SIZE);
718#ifdef CONFIG_ENV_ADDR_REDUND
719 envp->flags = ACTIVE_FLAG;
720#endif
721 }
722 sprintf(buf, "%zX", (size_t)(len + offsetof(env_t, data)));
723 setenv("filesize", buf);
724
725 return 0;
726
727sep_err:
728 printf("## %s: only one of \"-b\", \"-c\" or \"-t\" allowed\n",
729 cmd);
730 return 1;
731}
732#endif
733
734#ifdef CONFIG_CMD_IMPORTENV
735
736
737
738
739
740
741
742
743
744
745
746
747static int do_env_import(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
748{
749 char *cmd, *addr;
750 char sep = '\n';
751 int chk = 0;
752 int fmt = 0;
753 int del = 0;
754 size_t size;
755
756 cmd = *argv;
757
758 while (--argc > 0 && **++argv == '-') {
759 char *arg = *argv;
760 while (*++arg) {
761 switch (*arg) {
762 case 'b':
763 if (fmt++)
764 goto sep_err;
765 sep = '\0';
766 break;
767 case 'c':
768 if (fmt++)
769 goto sep_err;
770 sep = '\0';
771 chk = 1;
772 break;
773 case 't':
774 if (fmt++)
775 goto sep_err;
776 sep = '\n';
777 break;
778 case 'd':
779 del = 1;
780 break;
781 default:
782 return cmd_usage(cmdtp);
783 }
784 }
785 }
786
787 if (argc < 1)
788 return cmd_usage(cmdtp);
789
790 if (!fmt)
791 printf("## Warning: defaulting to text format\n");
792
793 addr = (char *)simple_strtoul(argv[0], NULL, 16);
794
795 if (argc == 2) {
796 size = simple_strtoul(argv[1], NULL, 16);
797 } else {
798 char *s = addr;
799
800 size = 0;
801
802 while (size < MAX_ENV_SIZE) {
803 if ((*s == sep) && (*(s+1) == '\0'))
804 break;
805 ++s;
806 ++size;
807 }
808 if (size == MAX_ENV_SIZE) {
809 printf("## Warning: Input data exceeds %d bytes"
810 " - truncated\n", MAX_ENV_SIZE);
811 }
812 ++size;
813 printf("## Info: input data size = %zd = 0x%zX\n", size, size);
814 }
815
816 if (chk) {
817 uint32_t crc;
818 env_t *ep = (env_t *)addr;
819
820 size -= offsetof(env_t, data);
821 memcpy(&crc, &ep->crc, sizeof(crc));
822
823 if (crc32(0, ep->data, size) != crc) {
824 puts("## Error: bad CRC, import failed\n");
825 return 1;
826 }
827 addr = (char *)ep->data;
828 }
829
830 if (himport_r(&env_htab, addr, size, sep, del ? 0 : H_NOCLEAR) == 0) {
831 error("Environment import failed: errno = %d\n", errno);
832 return 1;
833 }
834 gd->flags |= GD_FLG_ENV_READY;
835
836 return 0;
837
838sep_err:
839 printf("## %s: only one of \"-b\", \"-c\" or \"-t\" allowed\n",
840 cmd);
841 return 1;
842}
843#endif
844
845#if defined(CONFIG_CMD_RUN)
846extern int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
847#endif
848
849
850
851
852static cmd_tbl_t cmd_env_sub[] = {
853#if defined(CONFIG_CMD_ASKENV)
854 U_BOOT_CMD_MKENT(ask, CONFIG_SYS_MAXARGS, 1, do_env_ask, "", ""),
855#endif
856 U_BOOT_CMD_MKENT(default, 1, 0, do_env_default, "", ""),
857 U_BOOT_CMD_MKENT(delete, 2, 0, do_env_delete, "", ""),
858#if defined(CONFIG_CMD_EDITENV)
859 U_BOOT_CMD_MKENT(edit, 2, 0, do_env_edit, "", ""),
860#endif
861#if defined(CONFIG_CMD_EXPORTENV)
862 U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
863#endif
864#if defined(CONFIG_CMD_GREPENV)
865 U_BOOT_CMD_MKENT(grep, CONFIG_SYS_MAXARGS, 1, do_env_grep, "", ""),
866#endif
867#if defined(CONFIG_CMD_IMPORTENV)
868 U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
869#endif
870 U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_env_print, "", ""),
871#if defined(CONFIG_CMD_RUN)
872 U_BOOT_CMD_MKENT(run, CONFIG_SYS_MAXARGS, 1, do_run, "", ""),
873#endif
874#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
875 U_BOOT_CMD_MKENT(save, 1, 0, do_env_save, "", ""),
876#endif
877 U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 0, do_env_set, "", ""),
878};
879
880#if defined(CONFIG_NEEDS_MANUAL_RELOC)
881void env_reloc(void)
882{
883 fixup_cmdtable(cmd_env_sub, ARRAY_SIZE(cmd_env_sub));
884}
885#endif
886
887static int do_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
888{
889 cmd_tbl_t *cp;
890
891 if (argc < 2)
892 return cmd_usage(cmdtp);
893
894
895 argc--;
896 argv++;
897
898 cp = find_cmd_tbl(argv[0], cmd_env_sub, ARRAY_SIZE(cmd_env_sub));
899
900 if (cp)
901 return cp->cmd(cmdtp, flag, argc, argv);
902
903 return cmd_usage(cmdtp);
904}
905
906U_BOOT_CMD(
907 env, CONFIG_SYS_MAXARGS, 1, do_env,
908 "environment handling commands",
909#if defined(CONFIG_CMD_ASKENV)
910 "ask name [message] [size] - ask for environment variable\nenv "
911#endif
912 "default -f - reset default environment\n"
913#if defined(CONFIG_CMD_EDITENV)
914 "env edit name - edit environment variable\n"
915#endif
916 "env export [-t | -b | -c] addr [size] - export environment\n"
917#if defined(CONFIG_CMD_GREPENV)
918 "env grep string [...] - search environment\n"
919#endif
920 "env import [-d] [-t | -b | -c] addr [size] - import environment\n"
921 "env print [name ...] - print environment\n"
922#if defined(CONFIG_CMD_RUN)
923 "env run var [...] - run commands in an environment variable\n"
924#endif
925 "env save - save environment\n"
926 "env set [-f] name [arg ...]\n"
927);
928
929
930
931
932
933#if defined(CONFIG_CMD_EDITENV)
934U_BOOT_CMD_COMPLETE(
935 editenv, 2, 0, do_env_edit,
936 "edit environment variable",
937 "name\n"
938 " - edit environment variable 'name'",
939 var_complete
940);
941#endif
942
943U_BOOT_CMD_COMPLETE(
944 printenv, CONFIG_SYS_MAXARGS, 1, do_env_print,
945 "print environment variables",
946 "\n - print values of all environment variables\n"
947 "printenv name ...\n"
948 " - print value of environment variable 'name'",
949 var_complete
950);
951
952#ifdef CONFIG_CMD_GREPENV
953U_BOOT_CMD_COMPLETE(
954 grepenv, CONFIG_SYS_MAXARGS, 0, do_env_grep,
955 "search environment variables",
956 "string ...\n"
957 " - list environment name=value pairs matching 'string'",
958 var_complete
959);
960#endif
961
962U_BOOT_CMD_COMPLETE(
963 setenv, CONFIG_SYS_MAXARGS, 0, do_env_set,
964 "set environment variables",
965 "name value ...\n"
966 " - set environment variable 'name' to 'value ...'\n"
967 "setenv name\n"
968 " - delete environment variable 'name'",
969 var_complete
970);
971
972#if defined(CONFIG_CMD_ASKENV)
973
974U_BOOT_CMD(
975 askenv, CONFIG_SYS_MAXARGS, 1, do_env_ask,
976 "get environment variables from stdin",
977 "name [message] [size]\n"
978 " - get environment variable 'name' from stdin (max 'size' chars)\n"
979 "askenv name\n"
980 " - get environment variable 'name' from stdin\n"
981 "askenv name size\n"
982 " - get environment variable 'name' from stdin (max 'size' chars)\n"
983 "askenv name [message] size\n"
984 " - display 'message' string and get environment variable 'name'"
985 "from stdin (max 'size' chars)"
986);
987#endif
988
989#if defined(CONFIG_CMD_RUN)
990U_BOOT_CMD_COMPLETE(
991 run, CONFIG_SYS_MAXARGS, 1, do_run,
992 "run commands in an environment variable",
993 "var [...]\n"
994 " - run the commands in the environment variable(s) 'var'",
995 var_complete
996);
997#endif
998