BOOTLOADER
Main Page
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
bootloader
middleware
shell
shell.c
Go to the documentation of this file.
1
/******************************************************
2
* Function: Receive argv,argc from shell argument and
3
* execute command
4
*
5
* File: shell.c
6
* Author: Book Chen
7
* Date: 2008.07.18
8
*******************************************************
9
*/
10
#include "
includes.h
"
11
12
#if(DEBUG_SHELL==1)
13
#define DEBUG_COMMAND 0
14
#endif
15
16
#define ShellIdleState 0
17
#define ShellInitial0State 1
18
#define ShellInitial1State 2
19
#define ShellInitial2State 3
20
#define ShellWaitCommandState 4
21
#define ShellDispatchState 5
22
#define ShellExecuteState 6
23
#define ShellExecuteStopState 7
24
25
#define ExecuteIdleState 0
26
#define ExecuteStartState 1
27
#define ExecuteRunState 2
28
29
// support shell commands
30
#define ItemInfo 0
31
#define ItemTftp 1
32
#define ItemAudio 2
33
#define ItemVideo 3
34
#define ItemVga 4
35
#define ItemXmodem 5
36
#define ItemDmaTest0 6
37
#define ItemDmaTest1 7
38
#define ItemDmaTest2 8
39
#define ItemDmaTest3 9
40
#define ItemGetImage 10
41
#define ItemRunImage 11
42
#define ItemLs 12
43
44
INT8U
info
[]=
"info"
;
45
INT8U
tftp
[]=
"tftp"
;
46
INT8U
audio
[]=
"audio"
;
47
INT8U
video
[]=
"video"
;
48
INT8U
vga
[]=
"vga"
;
49
INT8U
xmodem
[]=
"xmodem"
;
50
INT8U
dmatest0
[]=
"dmatest0"
;
51
INT8U
dmatest1
[]=
"dmatest1"
;
52
INT8U
dmatest2
[]=
"dmatest2"
;
53
INT8U
dmatest3
[]=
"dmatest3"
;
54
INT8U
getimage
[]=
"getimage"
;
55
INT8U
runimage
[]=
"runimage"
;
56
INT8U
ls
[]=
"ls"
;
57
INT8U
*
ShellCommand
[]={
58
info
,
59
tftp
,
60
audio
,
61
video
,
62
vga
,
63
xmodem
,
64
dmatest0
,
65
dmatest1
,
66
dmatest2
,
67
dmatest3
,
68
getimage
,
69
runimage
,
70
ls
,
71
(
INT8U
*)0
72
};
73
74
SHELL_CONTROL
ShellCtrl
;
75
void
F_ShellInit
(
void
);
76
void
F_ShellSvc
(
void
);
77
78
void
F_ShellInit
(
void
){
79
ShellCtrl.
State
=
ShellInitial0State
;
80
ShellCtrl.
Id
=
ID_SHELL
;
81
ShellCtrl.
Timer
=0;
82
}
83
void
F_ShellSvc
(
void
){
84
unsigned
char
i;
85
unsigned
char
Argc;
86
unsigned
char
**ppArgv;
// pointer of pArgv
87
void (*GotoStart)(void);
88
//unsigned char *pData;
89
90
switch
(ShellCtrl.
State
){
91
case
ShellIdleState
:
92
break
;
93
case
ShellInitial0State
:
94
if
(
F_Uart0InUseCheck
()==
TRUE
)
return
;
95
F_Uart0Allocate
(ShellCtrl.
Id
);
96
F_Uart0UlconSet
(ShellCtrl.
Id
,0x00000003);
97
F_Uart0UconSet
(ShellCtrl.
Id
,0x00000045);
98
//F_Uart0BaudrateConfig(ShellCtrl.Id,115200);
99
//F_Uart0BaudrateConfig(ShellCtrl.Id,57600);
100
//F_Uart0BaudrateConfig(ShellCtrl.Id,38400);
101
F_Uart0BaudrateConfig
(ShellCtrl.
Id
,19200);
102
//F_Uart0BaudrateConfig(ShellCtrl.Id,9600);
103
F_Uart0Release
(ShellCtrl.
Id
);
104
ClearSubPending
(
BIT_SUB_RXD0
|
BIT_SUB_TXD0
|
BIT_SUB_ERR0
);
105
ClearPending
(
BIT_UART0
);
106
//F_SysEnableSubIrq(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); // enable rxt,txd,err subirq in uart0 irq
107
F_InterruptSubIrqEnable
(
BIT_SUB_TXD0
|
BIT_SUB_RXD0
);
// enable rxt subirq in uart0 irq
108
//F_SysEnableSubIrq(BIT_SUB_RXD0); // enable rxt subirq in uart0 irq
109
F_InterruptIrqEnable
(
BIT_UART0
);
// enable uart0 irq
110
F_ShellArgumentInit
();
111
ShellCtrl.
State
=
ShellInitial1State
;
112
break
;
113
case
ShellInitial1State
:
114
printf
(
"\n*********************"
);
115
printf
(
"\n Hello, I am bootloader"
);
116
printf
(
"\n compiled by ADS 1.2"
);
117
printf
(
"\n*********************"
);
118
printf
(
"\nARM:>"
);
119
//ShellCtrl.State=ShellInitial2State;
120
ShellCtrl.
State
=
ShellWaitCommandState
;
121
break
;
122
case
ShellInitial2State
:
123
F_ShellArgumentSvc
();
124
break
;
125
case
ShellWaitCommandState
:
126
F_ShellArgumentSvc
();
127
if
(
F_ShellArgumentCheck
()==
TRUE
) ShellCtrl.
State
=
ShellDispatchState
;
128
break
;
129
case
ShellDispatchState
:
130
Argc=
ArgumentCtrl
.
Argc
;
131
ppArgv=(
unsigned
char
**)&
ArgumentCtrl
.
pArgv
;
132
#
if
(DEBUG_COMMAND==1)
133
if
(Argc>0){
134
for
(i=0;i<Argc;i++)
printf
(
"\n %s "
,*ppArgv++);
// show arguments
135
}
136
#endif
137
if
(Argc>0){
138
for
(i=0;;i++){
139
if
(
ShellCommand
[i]==(
INT8U
*)0){
140
printf
(
"\n command not found"
);
141
break
;
142
}
143
if
(
strcmp
((
char
*)
ArgumentCtrl
.
pArgv
[0],(
char
*)
ShellCommand
[i])==0){
144
//printf("\n shell command %s ",ShellCommand[i]);
145
ShellCtrl.
ExecuteItem
=i;
146
ShellCtrl.
ExecuteState
=
ExecuteStartState
;
147
ShellCtrl.
State
=
ShellExecuteState
;
148
//ShellCtrl.State=ShellExecuteStopState;
149
return
;
150
}
151
}
152
}
153
printf
(
"\nARM:>"
);
154
F_ShellArgumentReset
();
155
ShellCtrl.
State
=
ShellWaitCommandState
;
156
break
;
157
case
ShellExecuteState
:
158
switch
(ShellCtrl.
ExecuteItem
){
159
case
ItemInfo
:
160
switch
(ShellCtrl.
ExecuteState
){
161
case
ExecuteIdleState
:
162
ShellCtrl.
State
=
ShellExecuteStopState
;
163
break
;
164
case
ExecuteStartState
:
165
printf
(
"\n system infomation"
);
166
printf
(
"\n mcu: s3c2440"
);
167
printf
(
"\n sdram: 64mb"
);
168
printf
(
"\n nandflash: 64mb"
);
169
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
170
break
;
171
}
172
break
;
173
case
ItemTftp
:
174
switch
(ShellCtrl.
ExecuteState
){
175
case
ExecuteIdleState
:
176
ShellCtrl.
State
=
ShellExecuteStopState
;
177
break
;
178
case
ExecuteStartState
:
179
F_TftpPlay
();
180
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
181
break
;
182
case
ExecuteRunState
:
183
if
(
F_TftpStatusCheck
()==
FALSE
)
return
;
184
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
185
break
;
186
}
187
break
;
188
case
ItemAudio
:
189
switch
(ShellCtrl.
ExecuteState
){
190
case
ExecuteIdleState
:
191
ShellCtrl.
State
=
ShellExecuteStopState
;
192
break
;
193
case
ExecuteStartState
:
194
//printf("\n audio demo ");
195
//F_TestAudioPlay();
196
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
197
break
;
198
case
ExecuteRunState
:
199
//if(F_TestAudioStatusCheck()==FALSE) return;
200
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
201
break
;
202
}
203
break
;
204
case
ItemVideo
:
205
switch
(ShellCtrl.
ExecuteState
){
206
case
ExecuteIdleState
:
207
ShellCtrl.
State
=
ShellExecuteStopState
;
208
break
;
209
case
ExecuteStartState
:
210
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
211
break
;
212
}
213
break
;
214
case
ItemVga
:
215
switch
(ShellCtrl.
ExecuteState
){
216
case
ExecuteIdleState
:
217
ShellCtrl.
State
=
ShellExecuteStopState
;
218
break
;
219
case
ExecuteStartState
:
220
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
221
break
;
222
case
ExecuteRunState
:
223
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
224
break
;
225
}
226
break
;
227
case
ItemXmodem
:
228
switch
(ShellCtrl.
ExecuteState
){
229
case
ExecuteIdleState
:
230
ShellCtrl.
State
=
ShellExecuteStopState
;
231
break
;
232
case
ExecuteStartState
:
233
if
(
F_XmodemInUseCheck
()==
TRUE
)
return
;
234
ShellCtrl.
Timer
=10000;
235
F_XmodemAllocate
(ShellCtrl.
Id
);
236
F_Uart0BufferReset
();
237
F_XmodemRxStart
(ShellCtrl.
Id
);
238
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
239
break
;
240
case
ExecuteRunState
:
241
if
(
F_XmodemStatusCheck
()!=
TRUE
)
return
;
// check xmodem idle
242
//if((F_XmodemStatusCheck()!=TRUE)&&(ShellCtrl.Timer!=0)) return; // check xmodem idle
243
F_Uart0BufferReset
();
244
F_XmodemRelease
(ShellCtrl.
Id
);
245
if
(ShellCtrl.
Timer
!=0)
printf
(
"\n xmodem transfer success"
);
246
printf
(
"\n XmodemCtrl.BlockNumber: %2x "
,
XmodemCtrl
.
BlockNumber
);
247
printf
(
"\n XmodemCtrl.TotalBlockCount: %8x "
,
XmodemCtrl
.
TotalBlockCount
);
248
printf
(
"\n XmodemCtrl.ByteCount: %8x "
,
XmodemCtrl
.
ByteCount
);
249
printf
(
"\n XmodemCtrl.pData: %8x "
,(
INT32U
)
XmodemCtrl
.
pData
);
250
printf
(
"\n XmodemCtrl.State: %2x "
,
XmodemCtrl
.
State
);
251
printf
(
"\n XmodemCtrl.SubState: %2x "
,
XmodemCtrl
.
SubState
);
252
printf
(
"\n XmodemCtrl.ErrorCount: %2x "
,
XmodemCtrl
.
ErrorCount
);
253
printf
(
"\n XmodemCtrl.ErrorCode: %2x "
,
XmodemCtrl
.
ErrorCode
);
254
printf
(
"\n XmodemCtrl.ErrorRecord: %2x "
,
XmodemCtrl
.
ErrorRecord
);
255
//pData=(unsigned char *)0x30400000;
256
//for(i=0;i<=32;i++){
257
// printf("\n %2x %2x %2x %2x %2x %2x %2x %2x",pData[0+8*i],pData[1+8*i],pData[2+8*i],pData[3+8*i],pData[4+8*i],pData[5+8*i],pData[6+8*i],pData[7+8*i]);
258
//}
259
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
260
break
;
261
}
262
break
;
263
case
ItemDmaTest0
:
264
switch
(ShellCtrl.
ExecuteState
){
265
case
ExecuteIdleState
:
266
ShellCtrl.
State
=
ShellExecuteStopState
;
267
break
;
268
case
ExecuteStartState
:
269
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
270
break
;
271
case
ExecuteRunState
:
272
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
273
break
;
274
}
275
break
;
276
case
ItemDmaTest1
:
277
switch
(ShellCtrl.
ExecuteState
){
278
case
ExecuteIdleState
:
279
ShellCtrl.
State
=
ShellExecuteStopState
;
280
break
;
281
case
ExecuteStartState
:
282
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
283
break
;
284
case
ExecuteRunState
:
285
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
286
break
;
287
}
288
break
;
289
case
ItemDmaTest2
:
290
switch
(ShellCtrl.
ExecuteState
){
291
case
ExecuteIdleState
:
292
ShellCtrl.
State
=
ShellExecuteStopState
;
293
break
;
294
case
ExecuteStartState
:
295
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
296
break
;
297
case
ExecuteRunState
:
298
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
299
break
;
300
}
301
break
;
302
case
ItemDmaTest3
:
303
switch
(ShellCtrl.
ExecuteState
){
304
case
ExecuteIdleState
:
305
ShellCtrl.
State
=
ShellExecuteStopState
;
306
break
;
307
case
ExecuteStartState
:
308
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
309
break
;
310
case
ExecuteRunState
:
311
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
312
break
;
313
}
314
break
;
315
case
ItemGetImage
:
316
switch
(ShellCtrl.
ExecuteState
){
317
case
ExecuteIdleState
:
318
ShellCtrl.
State
=
ShellExecuteStopState
;
319
break
;
320
case
ExecuteStartState
:
321
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
322
break
;
323
case
ExecuteRunState
:
324
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
325
break
;
326
}
327
break
;
328
case
ItemRunImage
:
329
switch
(ShellCtrl.
ExecuteState
){
330
case
ExecuteIdleState
:
331
ShellCtrl.
State
=
ShellExecuteStopState
;
332
break
;
333
case
ExecuteStartState
:
334
//======
335
// Linux boot...I use it to boot my code
336
//======
337
//F_MmuCacheCleanInvalidate(); // include I&D cache
338
//F_MmuTlbInvalidate();
339
//__asm{
340
// mov ip, #0
341
// mcr p15, 0, ip, c13, c0, 0 /* zero PID */
342
// mcr p15, 0, ip, c7, c7, 0 /* invalidate I,D caches */
343
// mcr p15, 0, ip, c7, c10, 4 /* drain write buffer */
344
// mcr p15, 0, ip, c8, c7, 0 /* invalidate I,D TLBs */
345
// mrc p15, 0, ip, c1, c0, 0 /* get control register */
346
// bic ip, ip, #0x0001 /* disable MMU */
347
// mcr p15, 0, ip, c1, c0, 0 /* write control register */
348
//}
349
//Timer2Counter=100;
350
//while(Timer2Counter!=0); // Delay(1000);
351
DisableInt
();
352
memcpy
((
INT8U
*)0,(
INT8U
*)
IMAGE_ADDRESS
,0x1000);
// update steppingstone
353
GotoStart=(void (*)(void))
IMAGE_ADDRESS
;
354
//GotoStart=(void (*)(void))0x30008000;
355
(*GotoStart)();
//goto image start address
356
//ShellCtrl.ExecuteState=ExecuteRunState;
357
//break;
358
}
359
break
;
360
case
ItemLs
:
361
switch
(ShellCtrl.
ExecuteState
){
362
case
ExecuteIdleState
:
363
ShellCtrl.
State
=
ShellExecuteStopState
;
364
break
;
365
case
ExecuteStartState
:
366
printf
(
"\n command list"
);
367
printf
(
"\n info"
);
368
printf
(
"\n tftp"
);
369
printf
(
"\n audio"
);
370
printf
(
"\n video"
);
371
printf
(
"\n vga"
);
372
printf
(
"\n xmodem"
);
373
printf
(
"\n dmatest0"
);
374
printf
(
"\n dmatest1"
);
375
printf
(
"\n dmatest2"
);
376
printf
(
"\n dmatest3"
);
377
printf
(
"\n getimage"
);
378
printf
(
"\n runimage"
);
379
ShellCtrl.
ExecuteState
=
ExecuteRunState
;
380
break
;
381
case
ExecuteRunState
:
382
ShellCtrl.
ExecuteState
=
ExecuteIdleState
;
383
break
;
384
}
385
break
;
386
default
:
387
ShellCtrl.
State
=
ShellExecuteStopState
;
388
break
;
389
}
390
break
;
391
case
ShellExecuteStopState
:
392
printf
(
"\nARM:>"
);
393
F_ShellArgumentReset
();
394
ShellCtrl.
State
=
ShellWaitCommandState
;
395
break
;
396
default
:
397
break
;
398
}
399
}
400
Generated on Wed Jun 13 2012 00:03:10 for BOOTLOADER by
1.8.1.1