1
2
3
4
5
6
7
8
9
10#ifndef __COMMAND_H
11#define __COMMAND_H
12
13#include <env.h>
14#include <linker_lists.h>
15
16#ifndef NULL
17#define NULL 0
18#endif
19
20
21#ifndef CONFIG_SYS_HELP_CMD_WIDTH
22#define CONFIG_SYS_HELP_CMD_WIDTH 10
23#endif
24
25#ifndef __ASSEMBLY__
26
27
28
29
30struct cmd_tbl_s {
31 char *name;
32 int maxargs;
33
34
35
36
37
38
39
40
41 int (*cmd_rep)(struct cmd_tbl_s *cmd, int flags, int argc,
42 char * const argv[], int *repeatable);
43
44 int (*cmd)(struct cmd_tbl_s *, int, int, char * const []);
45 char *usage;
46#ifdef CONFIG_SYS_LONGHELP
47 char *help;
48#endif
49#ifdef CONFIG_AUTO_COMPLETE
50
51 int (*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
52#endif
53};
54
55typedef struct cmd_tbl_s cmd_tbl_t;
56
57
58#if defined(CONFIG_CMD_RUN)
59extern int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
60#endif
61
62
63int _do_help (cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, int
64 flag, int argc, char * const argv[]);
65cmd_tbl_t *find_cmd(const char *cmd);
66cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len);
67int complete_subcmdv(cmd_tbl_t *cmdtp, int count, int argc,
68 char * const argv[], char last_char, int maxv,
69 char *cmdv[]);
70
71extern int cmd_usage(const cmd_tbl_t *cmdtp);
72
73
74int cmd_always_repeatable(cmd_tbl_t *cmdtp, int flag, int argc,
75 char * const argv[], int *repeatable);
76int cmd_never_repeatable(cmd_tbl_t *cmdtp, int flag, int argc,
77 char * const argv[], int *repeatable);
78int cmd_discard_repeatable(cmd_tbl_t *cmdtp, int flag, int argc,
79 char * const argv[]);
80
81static inline bool cmd_is_repeatable(cmd_tbl_t *cmdtp)
82{
83 return cmdtp->cmd_rep == cmd_always_repeatable;
84}
85
86#ifdef CONFIG_AUTO_COMPLETE
87extern int var_complete(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
88extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
89#endif
90
91
92
93
94
95
96
97
98
99
100int cmd_process_error(cmd_tbl_t *cmdtp, int err);
101
102
103
104
105
106
107
108
109
110#if defined(CONFIG_CMD_MEMORY) || \
111 defined(CONFIG_CMD_I2C) || \
112 defined(CONFIG_CMD_ITEST) || \
113 defined(CONFIG_CMD_PCI) || \
114 defined(CONFIG_CMD_SETEXPR)
115#define CMD_DATA_SIZE
116extern int cmd_get_data_size(char* arg, int default_size);
117#endif
118
119#ifdef CONFIG_CMD_BOOTD
120extern int do_bootd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
121#endif
122#ifdef CONFIG_CMD_BOOTM
123extern int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
124extern int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd);
125#else
126static inline int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd)
127{
128 return 0;
129}
130#endif
131
132extern int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
133
134extern int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
135
136extern int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc,
137 char *const argv[]);
138
139extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
140extern int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
141
142extern unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc,
143 char * const argv[]);
144
145#if defined(CONFIG_CMD_NVEDIT_EFI)
146extern int do_env_print_efi(cmd_tbl_t *cmdtp, int flag, int argc,
147 char * const argv[]);
148extern int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc,
149 char * const argv[]);
150#endif
151
152
153
154
155
156
157
158
159
160enum command_ret_t {
161 CMD_RET_SUCCESS,
162 CMD_RET_FAILURE,
163 CMD_RET_USAGE = -1,
164};
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180int cmd_process(int flag, int argc, char * const argv[],
181 int *repeatable, unsigned long *ticks);
182
183void fixup_cmdtable(cmd_tbl_t *cmdtp, int size);
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201int board_run_command(const char *cmdline);
202
203int run_command(const char *cmd, int flag);
204int run_command_repeatable(const char *cmd, int flag);
205
206
207
208
209
210
211
212
213
214
215
216
217int run_command_list(const char *cmd, int len, int flag);
218#endif
219
220
221
222
223#define CMD_FLAG_REPEAT 0x0001
224#define CMD_FLAG_BOOTD 0x0002
225#define CMD_FLAG_ENV 0x0004
226
227#ifdef CONFIG_AUTO_COMPLETE
228# define _CMD_COMPLETE(x) x,
229#else
230# define _CMD_COMPLETE(x)
231#endif
232#ifdef CONFIG_SYS_LONGHELP
233# define _CMD_HELP(x) x,
234#else
235# define _CMD_HELP(x)
236#endif
237
238#ifdef CONFIG_NEEDS_MANUAL_RELOC
239#define U_BOOT_SUBCMDS_RELOC(_cmdname) \
240 static void _cmdname##_subcmds_reloc(void) \
241 { \
242 static int relocated; \
243 \
244 if (relocated) \
245 return; \
246 \
247 fixup_cmdtable(_cmdname##_subcmds, \
248 ARRAY_SIZE(_cmdname##_subcmds)); \
249 relocated = 1; \
250 }
251#else
252#define U_BOOT_SUBCMDS_RELOC(_cmdname) \
253 static void _cmdname##_subcmds_reloc(void) { }
254#endif
255
256#define U_BOOT_SUBCMDS_DO_CMD(_cmdname) \
257 static int do_##_cmdname(cmd_tbl_t *cmdtp, int flag, int argc, \
258 char * const argv[], int *repeatable) \
259 { \
260 cmd_tbl_t *subcmd; \
261 \
262 _cmdname##_subcmds_reloc(); \
263 \
264 \
265 if (argc < 2 || argc > CONFIG_SYS_MAXARGS) \
266 return CMD_RET_USAGE; \
267 \
268 subcmd = find_cmd_tbl(argv[1], _cmdname##_subcmds, \
269 ARRAY_SIZE(_cmdname##_subcmds)); \
270 if (!subcmd || argc - 1 > subcmd->maxargs) \
271 return CMD_RET_USAGE; \
272 \
273 if (flag == CMD_FLAG_REPEAT && \
274 !cmd_is_repeatable(subcmd)) \
275 return CMD_RET_SUCCESS; \
276 \
277 return subcmd->cmd_rep(subcmd, flag, argc - 1, \
278 argv + 1, repeatable); \
279 }
280
281#ifdef CONFIG_AUTO_COMPLETE
282#define U_BOOT_SUBCMDS_COMPLETE(_cmdname) \
283 static int complete_##_cmdname(int argc, char * const argv[], \
284 char last_char, int maxv, \
285 char *cmdv[]) \
286 { \
287 return complete_subcmdv(_cmdname##_subcmds, \
288 ARRAY_SIZE(_cmdname##_subcmds), \
289 argc - 1, argv + 1, last_char, \
290 maxv, cmdv); \
291 }
292#else
293#define U_BOOT_SUBCMDS_COMPLETE(_cmdname)
294#endif
295
296#define U_BOOT_SUBCMDS(_cmdname, ...) \
297 static cmd_tbl_t _cmdname##_subcmds[] = { __VA_ARGS__ }; \
298 U_BOOT_SUBCMDS_RELOC(_cmdname) \
299 U_BOOT_SUBCMDS_DO_CMD(_cmdname) \
300 U_BOOT_SUBCMDS_COMPLETE(_cmdname)
301
302#ifdef CONFIG_CMDLINE
303#define U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
304 _usage, _help, _comp) \
305 { #_name, _maxargs, _cmd_rep, cmd_discard_repeatable, \
306 _usage, _CMD_HELP(_help) _CMD_COMPLETE(_comp) }
307
308#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
309 _usage, _help, _comp) \
310 { #_name, _maxargs, \
311 _rep ? cmd_always_repeatable : cmd_never_repeatable, \
312 _cmd, _usage, _CMD_HELP(_help) _CMD_COMPLETE(_comp) }
313
314#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \
315 ll_entry_declare(cmd_tbl_t, _name, cmd) = \
316 U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
317 _usage, _help, _comp);
318
319#define U_BOOT_CMDREP_COMPLETE(_name, _maxargs, _cmd_rep, _usage, \
320 _help, _comp) \
321 ll_entry_declare(cmd_tbl_t, _name, cmd) = \
322 U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
323 _usage, _help, _comp)
324
325#else
326#define U_BOOT_SUBCMD_START(name) static cmd_tbl_t name[] = {};
327#define U_BOOT_SUBCMD_END
328
329#define _CMD_REMOVE(_name, _cmd) \
330 int __remove_ ## _name(void) \
331 { \
332 if (0) \
333 _cmd(NULL, 0, 0, NULL); \
334 return 0; \
335 }
336
337#define U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
338 _usage, _help, _comp) \
339 { #_name, _maxargs, 0 ? _cmd_rep : NULL, NULL, _usage, \
340 _CMD_HELP(_help) _CMD_COMPLETE(_comp) }
341
342#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, \
343 _help, _comp) \
344 { #_name, _maxargs, NULL, 0 ? _cmd : NULL, _usage, \
345 _CMD_HELP(_help) _CMD_COMPLETE(_comp) }
346
347#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, \
348 _comp) \
349 _CMD_REMOVE(sub_ ## _name, _cmd)
350
351#define U_BOOT_CMDREP_COMPLETE(_name, _maxargs, _cmd_rep, _usage, \
352 _help, _comp) \
353 _CMD_REMOVE(sub_ ## _name, _cmd_rep)
354
355#endif
356
357#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help) \
358 U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL)
359
360#define U_BOOT_CMD_MKENT(_name, _maxargs, _rep, _cmd, _usage, _help) \
361 U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
362 _usage, _help, NULL)
363
364#define U_BOOT_SUBCMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
365 _comp) \
366 U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
367 "", "", _comp)
368
369#define U_BOOT_SUBCMD_MKENT(_name, _maxargs, _rep, _do_cmd) \
370 U_BOOT_SUBCMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
371 NULL)
372
373#define U_BOOT_CMD_WITH_SUBCMDS(_name, _usage, _help, ...) \
374 U_BOOT_SUBCMDS(_name, __VA_ARGS__) \
375 U_BOOT_CMDREP_COMPLETE(_name, CONFIG_SYS_MAXARGS, do_##_name, \
376 _usage, _help, complete_##_name)
377
378#endif
379