BOOTLOADER
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
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";
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 
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);
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
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:
124  break;
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;
147  ShellCtrl.State=ShellExecuteState;
148  //ShellCtrl.State=ShellExecuteStopState;
149  return;
150  }
151  }
152  }
153  printf("\nARM:>");
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);
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
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:>");
394  ShellCtrl.State=ShellWaitCommandState;
395  break;
396  default:
397  break;
398  }
399 }
400