Root/usbboot/src/command_line.c

1/*
2 * Copyright(C) 2009 Qi Hardware Inc.,
3 * Authors: Xiangfu Liu <xiangfu@sharism.cc>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22#include "usb_boot_defines.h"
23#include "ingenic_usb.h"
24#include "cmd.h"
25#include "xburst-tools_version.h"
26 
27extern struct nand_in nand_in;
28extern struct sdram_in sdram_in;
29extern unsigned char code_buf[4 * 512 * 1024];
30
31int com_argc;
32char com_argv[MAX_ARGC][MAX_COMMAND_LENGTH];
33char * stage1;
34char * stage2;
35
36static const char COMMAND[][COMMAND_NUM]=
37{
38    "",
39    "query",
40    "querya",
41    "erase",
42    "read",
43    "prog",
44    "nquery",
45    "nerase",
46    "nread",
47    "nreadraw",
48    "nreadoob", /* index 10 */
49    "nprog",
50    "help",
51    "version",
52    "go",
53    "fconfig",
54    "exit",
55    "readnand",
56    "gpios",
57    "gpioc",
58    "boot", /* index 20 */
59    "list",
60    "select",
61    "unselect",
62    "chip",
63    "unchip",
64    "nmark",
65    "nmake",
66    "load",
67    "memtest",
68    "run"
69};
70
71static int handle_help(void)
72{
73    printf(" command support in current version:\n"
74    /* " query" */
75    /* " querya" */
76    /* " erase" */
77    /* " read" */
78    /* " prog" */
79    " nquery query NAND flash info\n"
80    " nerase erase NAND flash\n"
81    " nread read NAND flash data with checking bad block and ECC\n"
82    " nreadraw read NAND flash data without checking bad block and ECC\n"
83    " nreadoo read NAND flash oob without checking bad block and ECC\n" /* index 10 */
84    " nprog program NAND flash with data and ECC\n"
85    " help print this help\n"
86    " version show current USB Boot software version\n"
87    " go execute program in SDRAM\n"
88    " fconfig set USB Boot config file(not implement)\n"
89    " exit quit from telnet session\n"
90    " readnand read data from nand flash and store to SDRAM\n"
91    " gpios set one GPIO to high level\n"
92    " gpioc set one GPIO to low level\n"
93    " boot boot device and make it in stage2\n" /* index 20 */
94    " list show current device number can connect(not implement)\n"
95    /* " select" */
96    /* " unselect" */
97    /* " chip" */
98    /* " unchip" */
99    " nmark mark a bad block in NAND flash\n"
100    " nmake read all data from nand flash and store to file(not implement)\n"
101    " load load file data to SDRAM\n"
102    " memtest do SDRAM test\n"
103    " run run command script in file(implement by -c args)\n"
104    " sdprog program SD card(not implement)\n"
105    " sdread read data from SD card(not implement)\n");
106    return 1;
107}
108
109static int handle_version(void)
110{
111    printf(" USB Boot Software current version: %s\n", XBURST_TOOLS_VERSION);
112    return 1;
113}
114
115/* need transfer two para :blk_num ,start_blk */
116int handle_nerase(void)
117{
118    if (com_argc < 5) {
119        printf(" Usage: nerase (1) (2) (3) (4)\n"
120               " 1:start block number\n"
121               " 2:block length\n"
122               " 3:device index number\n"
123               " 4:flash chip index number\n");
124        return -1;
125    }
126
127    init_nand_in();
128
129    nand_in.start = atoi(com_argv[1]);
130    nand_in.length = atoi(com_argv[2]);
131    nand_in.dev = atoi(com_argv[3]);
132    if (atoi(com_argv[4]) >= MAX_DEV_NUM) {
133        printf(" Flash index number overflow!\n");
134        return -1;
135    }
136    (nand_in.cs_map)[atoi(com_argv[4])] = 1;
137
138    if (nand_erase(&nand_in) < 1)
139        return -1;
140
141    return 1;
142}
143
144int handle_nmark(void)
145{
146    if (com_argc < 4) {
147        printf(" Usage: nerase (1) (2) (3)\n"
148               " 1:bad block number\n"
149               " 2:device index number\n"
150               " 3:flash chip index number\n");
151        return -1;
152    }
153    init_nand_in();
154
155    nand_in.start = atoi(com_argv[1]);
156    nand_in.dev = atoi(com_argv[2]);
157
158    if (atoi(com_argv[3])>=MAX_DEV_NUM) {
159        printf(" Flash index number overflow!\n");
160        return -1;
161    }
162    (nand_in.cs_map)[atoi(com_argv[3])] = 1;
163
164    nand_markbad(&nand_in);
165    return 1;
166}
167
168int handle_memtest(void)
169{
170    unsigned int start, size;
171    if (com_argc != 2 && com_argc != 4)
172    {
173        printf(" Usage: memtest (1) [2] [3]\n"
174               " 1:device index number\n"
175               " 2:SDRAM start address\n"
176               " 3:test size\n");
177        return -1;
178    }
179
180    if (com_argc == 4) {
181        start = strtoul(com_argv[2], NULL, 0);
182        size = strtoul(com_argv[3], NULL, 0);
183    } else {
184        start = 0;
185        size = 0;
186    }
187    debug_memory(atoi(com_argv[1]), start, size);
188    return 1;
189}
190
191int handle_gpio(int mode)
192{
193    if (com_argc < 3) {
194        printf(" Usage:"
195               " gpios (1) (2)\n"
196               " 1:GPIO pin number\n"
197               " 2:device index number\n");
198        return -1;
199    }
200
201    debug_gpio(atoi(com_argv[2]), mode, atoi(com_argv[1]));
202    return 1;
203}
204
205int handle_load(void)
206{
207    if (com_argc<4) {
208        printf(" Usage:"
209               " load (1) (2) (3) \n"
210               " 1:SDRAM start address\n"
211               " 2:image file name\n"
212               " 3:device index number\n");
213
214        return -1;
215    }
216
217    sdram_in.start=strtoul(com_argv[1], NULL, 0);
218    printf(" start:::::: 0x%x\n", sdram_in.start);
219
220    sdram_in.dev = atoi(com_argv[3]);
221    sdram_in.buf = code_buf;
222    sdram_load_file(&sdram_in, com_argv[2]);
223    return 1;
224}
225
226int command_interpret(char * com_buf)
227{
228    if(com_buf[0] == '\n')
229        return 0;
230
231    com_argc = 0;
232    char *p = strtok(com_buf, "\n ");
233    strcpy(com_argv[com_argc++], p);
234
235    while(p = strtok(NULL, "\n "))
236        strcpy(com_argv[com_argc++], p);
237
238    int loop = 0;
239    for (loop = 1; loop <= COMMAND_NUM; loop++)
240        if (!strcmp(COMMAND[loop], com_argv[0]))
241            return loop;
242
243    return -1;
244}
245
246int command_handle(char *buf)
247{
248    int cmd = command_interpret(buf); /* get the command index */
249
250    switch (cmd) {
251    case 0:
252        break;
253    case 6:
254        nand_query();
255        break;
256    case 7:
257        handle_nerase();
258        break;
259    case 8: /* nread */
260        nand_read(NAND_READ);
261        break;
262    case 9: /* nreadraw */
263        nand_read(NAND_READ_RAW);
264        break;
265    case 10: /* nreadoob */
266        nand_read(NAND_READ_OOB);
267        break;
268    case 11:
269        nand_prog();
270        break;
271    case 12:
272        handle_help();
273        break;
274    case 13:
275        handle_version();
276        break;
277    case 14:
278        debug_go();
279        break;
280    case 16: /* exit */
281        printf(" exiting usbboot software\n");
282        return -1; /* return -1 to break the main.c while
283                 * then run usb_ingenic_cleanup*/
284        /*case 17:
285        nand_read(NAND_READ_TO_RAM); */
286        break;
287    case 18:
288        handle_gpio(2);
289        break;
290    case 19:
291        handle_gpio(3);
292        break;
293    case 20:
294        boot(stage1, stage2);
295        break;
296    case 26:
297        handle_nmark();
298        break;
299    case 28:
300        handle_load();
301        break;
302    case 29:
303        handle_memtest();
304        break;
305    case -1:
306    default:
307        printf(" command not support or input error!\n");
308        break;
309    }
310
311    return 1;
312}
313

Archive Download this file



interactive