source: svn/newcon3bcm2_21bu/dst/dhl/src/DHL_DBG_Shell.c @ 76

Last change on this file since 76 was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 37.9 KB
Line 
1/**
2        @file
3                DHL_DBG_Shell.c
4
5        @brief
6                DHL mini debug shell implementation
7
8        Copyright 2006~2010 Digital STREAM Technology, Inc.
9        All Rights Reserved
10*/
11
12
13#include "DHL_OSAL.h"
14#include "DHL_DBG.h"
15
16#include "DHL_OSAL_Priv.h" // get line API
17#include "DHL_DBG_Priv.h" // symtab API
18#include "DHL_OSAL_Config.h"
19
20//#include <string.h>
21#include <stdio.h>
22
23/*
24        ¸ðµç Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÏÁö´Â ¾ÊÀ¸¸ç, compile timeÀ» ÁÙÀ̱â À§ÇØ
25        °¢ ¸ðµâÀº ÇÊ¿äÇÑ ¸¸Å­ÀÇ Çì´õ¸¦ ¼±¾ðÇϵµ·Ï ÇÔ.
26*/
27
28
29
30/*
31        DHL µð¹ö±× ¸ðµâ À̸§ Á¤ÀÇ ·ê Âü°í:
32
33        DHL ¸ðµâµéÀº ¸ðµÎ * ·Î ½ÃÀÛ.
34        API´Â ´ë¹®ÀÚ, Platform ¹× ±âŸ´Â ¼Ò¹®ÀÚ »ç¿ë.
35
36        µðÆúÆ® ·¹º§Àº 0À¸·Î ¼³Á¤ÇÑ´Ù. (0: ¿¡·¯ ¸Þ½ÃÁö¸¸ Ãâ·Â)
37       
38       
39*/
40
41DHL_MODULE("*shl", 0);
42
43
44
45#if COMMENT
46____Config____(){}
47#endif
48
49/*
50        ÀÌ ¸ðµâ ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â °¢Á¾ configuration Á¤ÀÇ.
51*/
52
53#define SUPPORT_DBG_SHELL 1
54        // image size¸¦ ÁÙÀ̱â À§ÇØ shell Äڵ带 ¿ÏÀüÈ÷ Á¦°ÅÇÏ°í ½Í´Ù¸é
55        // ÀÌ flag °ªÀ» 0À¸·Î ¼³Á¤ÇÏ¸é µÈ´Ù.
56
57
58#if SUPPORT_DBG_SHELL
59        // ÀÌ if Á¶°ÇÀº "±²ÀåÈ÷" ³ÐÀº Á¶°ÇÀ¸·Î, ÀÌ ÆÄÀÏ ¼Ò½º ÄÚµåÀÇ ´ëºÎºÐÀ» Æ÷ÇÔÇÑ´Ù.
60
61
62#define SHELL_DEBUG 1
63
64
65
66#define MAX_SHELL_HISTORY 30
67
68
69/*
70        naming rule: SHELL_XXXXX
71        values: 0 or 1
72*/
73
74#define SHELL_USE_SHELL_TASK 0
75        // 1À̸é shell Àü¿ë task¸¦ »ç¿ëÇÑ´Ù.
76        //
77        // Á¦°øµÇ´Â platform¿¡¼­ shellÀÌ ÀÌ¹Ì Á¦°øµÇ´Â °æ¿ì
78        // µÎ°³ÀÇ shell µ¿ÀÛÀÌ ºÒ°¡ÇÔÀ¸·Î
79        // minishellÀº dispatch extensionÀ¸·Î µ¿ÀÛÇØ¾ß ÇÑ´Ù.
80        // ±×·² °æ¿ì 0 À¸·Î Çϰí, command dispatch ¸¦ »ç¿ëÇÏ¿© µ¿ÀÛÇϵµ·Ï ÇÑ´Ù.
81
82
83#define SHELL_INTERNAL_ECHO 1
84        // 1À̸é shell ³»ºÎ¿¡¼­ local echo (ÀÔ·Â ¹ÞÀº ¹®ÀÚ¸¦ ´Ù½Ã È­¸é¿¡ Ãâ·Â) ÇÑ´Ù.
85        //
86        // stdio api¿Í ¼­·Î ¸ÂÃç¾ß ÇÑ´Ù.
87        // °¡´ÉÇϸé stdio ¿¡¼­´Â echo¸¦ ÇÏÁö ¸»°í
88        // ¿©±â shell¿¡¼­ local echo¸¦ ÇÏ´Â °Ô ±ÇÀåµÊ.
89
90
91#define SHELL_AUTHORIZED_ACCESS 0
92        // 1À̸é ÀÓÀÇÀÇ »ç¿ëÀÚ°¡ shell Á¢±ÙÀ» ÇÏÁö ¸øÇϵµ·Ï
93        // passwd¸¦ ÅëÇÑ authorized »ç¿ëÀÚ¸¸À» Á¢±Ù Çã¿ëÇÑ´Ù.
94        //
95        // º¸¾ÈÀÌ ÇÊ¿äÇÑ °æ¿ì ¾ç»ê SW build ½Ã¿¡ »ç¿ë °¡´É.
96        // ¹Ýµå½Ã ÇÊ¿äÇÏÁö´Â ¾ÊÀ½.
97
98#define SHELL_SUPPORT_BG_EXE 1
99        // 1À̸é shell ¸í·ÉÀ» ½ÇÇàÇÒ ¶§ background ½ÇÇà flag°¡ ÀÖ´Â °æ¿ì
100        // º°µµÀÇ task¸¦ »ý¼ºÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù.
101        //
102        // ¸Þ¸ð¸®°¡ ºÎÁ·ÇÏÁö ¾Ê°í, task »ý¼º¿¡ Á¦¾àÀÌ ¾ø´Â °æ¿ì »ç¿ë ±ÇÀå.
103
104#define SHELL_ALLOW_EXIT 1
105        // 1À̸é 'exit' ¸í·ÉÀ» ÀÔ·ÂÇÏ¿© shell exitÀ» Çã¿ëÇÑ´Ù.
106        //
107        // linux ó·³ multi processingÀÌ °¡´ÉÇÑ os¿¡¼­ À¯¿ë.
108        // ±âŸ os¿¡¼­´Â Çã¿ëÇÏÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù.
109
110#define SHELL_SUPPORT_EXT_KEY 1
111        // 1À̸é LG box/LG term ¿¡¼­ »ç¿ë °¡´ÉÇÑ È®Àå ۸¦ Áö¿øÇÑ´Ù.
112        //
113        // platform¿¡ ¸ÂÃç¼­ ¼³Á¤.
114
115#define SHELL_ECHO_TEST 1
116        // 1À̸é echo ¸í·É¿¡ ÀÇÇÑ echo test ÄÚµå Æ÷ÇÔÇÑ´Ù.
117        //
118        // È®ÀåŰ µîÀÇ Å×½ºÆ®¿¡ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù.
119        // serial emulatorµîÀÇ Å͹̳ΠŸÀÔÀÌ Æ¯¼öÇÑ °æ¿ì
120        // echo test·Î ÀûÀýÇÑ key code¸¦ ã¾Æ³¾ ¼ö ÀÖ´Ù.
121
122
123#define SHELL_USE_OS_SYMBOL 0
124        // 1À̸é os symbol (build °úÁ¤¿¡¼­ linker°¡ ¸¸µé¾îÁÖ´Â symbol) À» »ç¿ëÇÑ´Ù.
125        //
126        // º¸Åë symtable on/off flag´Â makefile µî¿¡¼­ ¼³Á¤Çϱ⠶§¹®¿¡
127        // ¿©±â¼­´Â Ç×»ó 1·Î ÇÏ´Â °ÍÀÌ ±ÇÀåµÈ´Ù.
128
129
130#define SHELL_SUPPORT_INPUT_EMULATION 0
131        // ÀÓ½Ã..
132        // @todo ..
133
134#define SHELL_SUPPORT_HISTORY 1
135        // 1ÀÌ¸é °ú°Å ÀÔ·Â ¸í·ÉµéÀÇ ÀçȰ¿ë ±â´É Ãß°¡.
136       
137
138
139#if COMMENT
140____Types____(){}
141#endif
142
143/*
144        ÀÌ ¸ðµâ ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â structure ¹× enumerations.
145*/
146
147
148typedef UINT32 (*SHELL_CMD_HANDLER_TYPE)(int,...);
149
150
151#if SHELL_SUPPORT_BG_EXE
152#define DHL_SHELL_BG_TASK_PRIORITY  TASK_PRI_DHL_SHELLX
153#define DHL_SHELL_BG_TASK_STACKSIZE 16384
154#endif
155
156
157#define DHL_SHELL_TASK_PRIORITY   TASK_PRI_DHL_SHELL
158#define DHL_SHELL_TASK_STACKSIZE  16384
159
160
161#if SHELL_AUTHORIZED_ACCESS
162static BOOL s_buser_authorized;
163        // ÀÏ´Ü 1·Î ÇØµÎÀÚ.
164        // ³ªÁß¿¡ ¾ç»ê½Ã¿¡´Â µðÆúÆ®·Î 0ÀÌ µÇ°í
165        // authorize µÈ »ç¿ëÀÚ¿¡°Ô¸¸ shell »ç¿ëÀÌ Çã°¡µÈ´Ù
166#endif // SHELL_AUTHORIZED_ACCESS
167
168
169#if SHELL_ALLOW_EXIT
170// shell exit ¿äû flag
171static BOOL s_request_exit;
172#endif // SHELL_ALLOW_EXIT
173
174
175static DHL_OS_TASK_ID s_shell_tid;
176
177
178// cafrii 070302, argument 8°³ Á¦ÇÑ »çÇ×À» ¾ø¾Ú.
179typedef struct 
180{
181        void *fn;   // function pointer
182        int n_arg;
183        int args[1]; // »ç½ÇÀº 1°³°¡ ¾Æ´Ï¶ó ÇÊ¿äÇÑ ¸¸Å­ °¡º¯ÀûÀ¸·Î ÇÒ´çÇÑ´Ù.
184       
185} DebugShellParam;
186
187#define SIZE_OF_DEBUG_SHELL_PARAM(n_arg) \
188                (sizeof(DebugShellParam) + sizeof(int)*(n_arg))
189
190
191
192#define MAX_CALL_ARG 8 // for newcon3, <- 32
193
194
195#define DHL_SHELL_MAX_CMDLINE 255
196
197// cafrii 061226 new shell token management design
198//
199#define DHL_SHELL_MAX_TOKEN_LEN 80
200#define DHL_SHELL_MAX_TOKEN (MAX_CALL_ARG + 4) //10
201
202typedef enum
203{
204        ShellToken_Unknown = 0,
205       
206        ShellToken_Digit,
207        ShellToken_HexDigit,
208        ShellToken_String,
209        ShellToken_Symbol,
210
211} DebugShellTokenType;
212
213
214typedef struct
215{
216        char text[DHL_SHELL_MAX_TOKEN_LEN+1]; // max 80 characters
217
218        DebugShellTokenType type;
219
220        union {
221                UINT32 value; // if text is digit..
222                void *addr;   // if text is symbol..
223                char *string; // if text is string..
224        } u;
225
226} DebugShellToken;
227
228
229//DebugShellToken *g_dbg_tokens;
230
231
232typedef struct
233{
234        char cmdline[DHL_SHELL_MAX_CMDLINE];
235       
236        DebugShellToken *tokens;
237       
238
239        BOOL bCmdMatched;
240
241} DebugShellContext;
242
243
244
245// À¯È¿ÇÑ call ÁÖ¼Ò ¿µ¿ªÀÎÁö üũÇÏ´Â macro.
246//
247#define DHL_VALID_ADDR(ad) 0 // ÀÓ½Ã.. dhl_dbg_is_text_symbol((UINT32)ad)
248                // call °¡´ÉÇÑ text symbol ÀÎÁö üũ..
249                // dhl_dbg api °¡ Á¦°øµÇ´Ï ±×°ÍÀ» »ç¿ëÇÒ °Í..
250
251
252
253// cafrii 061212 add
254//   ZMon¿¡¼­ ÀԷµǴ ¸ðµç address´Â ´ÙÀ½°ú °°Àº formÀ» ÃëÇØ¾ß ÇÑ´Ù.
255//   0x12345678  ¶Ç´Â  0X12345678
256//
257#define DHL_VALID_HEX_ADDR(s) ( \
258        ((s)[0] == '0') && ((s)[1] == 'x' || (s)[1] == 'X') && (strlen(s) == 8) )
259
260
261
262#if COMMENT
263____Variables____(){}
264#endif
265
266/*
267        global·Î Àû¿ëµÇ´Â variable Á¤ÀÇ.
268        °¢ function º°·Î Ư¼öÇÑ ¿ëµµÀÇ variableÀº °¢ functionX block ¿¡¼­ Á¤ÀÇ °¡´É.
269*/
270
271
272
273#if COMMENT
274____History____(){}
275#endif
276
277
278static char *g_dhl_pShellHistory[MAX_SHELL_HISTORY];
279
280static void shell_add_to_history(char *buf)
281{
282        // history bufferÀÇ ¸Ç ¾ÕÀ¸·Î push µÈ´Ù.
283        // ¸¸¾à ¿ÏÀüÈ÷ µ¿ÀÏÇÑ command°¡ history buf¿¡ ÀÌ¹Ì ÀÖÀ¸¸é ±× buf´Â »èÁ¦µÈ´Ù.
284        int i, k;
285        char *p = NULL;
286       
287        if (buf == NULL || buf[0] == 0) return;
288
289        // µ¿ÀÏÇÑ ³»¿ë °Ë»ö..
290        for (i=0; i<MAX_SHELL_HISTORY; i++) {
291                if (g_dhl_pShellHistory[i] && strcmp(buf, g_dhl_pShellHistory[i])==0) {
292                        p = g_dhl_pShellHistory[i];
293                        break;
294                }
295        }
296
297        if (p && i < MAX_SHELL_HISTORY) // µ¿ÀÏÇÑ °ÍÀÌ Á¸ÀçÇÑ´Ù.
298        {
299                // i¸¦ ¸Ç ¾ÕÀ¸·Î À§Ä¡ À̵¿..
300                g_dhl_pShellHistory[i] = NULL;
301                for (k=i; k>0; k--)
302                        g_dhl_pShellHistory[k] = g_dhl_pShellHistory[k-1];
303                g_dhl_pShellHistory[0] = p;
304                return;
305        }
306
307        p = DHL_OS_Malloc(strlen(buf)+1);
308        strcpy(p, buf);
309       
310        if (g_dhl_pShellHistory[MAX_SHELL_HISTORY-1])
311                DHL_OS_Free((void **)&g_dhl_pShellHistory[MAX_SHELL_HISTORY-1]);
312       
313        for (i=MAX_SHELL_HISTORY-1; i>0; i--)
314                g_dhl_pShellHistory[i] = g_dhl_pShellHistory[i-1];
315
316        g_dhl_pShellHistory[0] = p;
317}
318
319
320static void shell_cmd_history(DebugShellToken *tokens, int nToken)
321{
322        int i;
323
324        DHL_UNUSED(tokens);
325        DHL_UNUSED(nToken);
326       
327        for (i=MAX_SHELL_HISTORY-1; i>=0; i--) {
328                if (g_dhl_pShellHistory[i] == 0) continue;
329                DHL_OS_Printf("  (%2d) '%s'\n", i, g_dhl_pShellHistory[i]);
330        }
331}
332
333
334
335
336#if COMMENT
337____Symbol____(){}
338#endif
339
340
341/*
342        symbolÀ» ºÐ¼®ÇÑ´Ù.
343
344        ¸ÕÀú os symtabÀ» º¸°í, ±× ´ÙÀ½¿¡ DHL symtabÀ» ã´Â´Ù.
345
346*/
347
348#define SYM_TYPE_UNKNOWN 0
349#define SYM_TYPE_TEXT 1
350#define SYM_TYPE_DATA 2
351
352static void *shell_lookup_symbol(char *str, int *pType)
353{
354        UINT32 calladdr;
355        int type;
356
357        /* alias symbol¿¡ ¿ì¼± ¼øÀ§¸¦ µÎµµ·Ï ÇÑ´Ù. */
358        if (DHL_DBG_QuerySymbol(str, (void **)&calladdr, &type) == DHL_OK && 
359                type == DHL_SYM_FN) {
360
361                if (pType) *pType = type;
362
363                return (void *)calladdr;
364        }
365       
366#if SHELL_USE_OS_SYMBOL
367        calladdr = dhl_dbg_find_sym_by_name(str);
368
369        if (calladdr)
370        {
371                if (pType)
372                {
373                        if (dhl_dbg_is_text_symbol(calladdr))
374                                *pType = DHL_SYM_FN;
375                        else if (dhl_dbg_is_data_symbol(calladdr))
376                                *pType = DHL_SYM_V4;
377                        else
378                                *pType = DHL_SYM_NONE;
379                }
380                return (void *)calladdr;
381        }
382#endif // SHELL_USE_OS_SYMBOL
383
384        return NULL;
385       
386}
387
388
389
390#if COMMENT
391____Parser____(){}
392#endif
393
394
395/*
396        shell command line ÆÄ¼­ µðÀÚÀÎ.
397
398        1. string ÀÔ·ÂÀ» Áö¿øÇÑ´Ù.
399                ex) print "this is test" -> arg[0] "print", arg[1] "this is test"
400
401        2. string ³»ÀÇ escape sequence¸¦ Áö¿øÇÑ´Ù.
402       
403        3. comma in string is treated as it is..
404
405        return
406                ¸Ç ¾Õ command ºÎºÐÀ» Æ÷ÇÔÇÏ¿©, ºÐ¸®µÈ Àüü token °¹¼ö¸¦ ¸®ÅÏ.
407*/
408
409static int shell_parse_line_to_tokens(char *buf, DebugShellToken *tokens, int maxtoken)
410{
411        //int i, n;
412        char *p = buf;
413        BOOL inside_quote = FALSE;
414        DebugShellToken *t = tokens;
415
416        // ÅäÅ« ÀÎÅØ½º (¸î ¹ø ° ÅäÅ«ÀÎÁö?)
417        int num_tokens = 0;
418        // ÇöÀç ÅäÅ« ¾È¿¡¼­ÀÇ writer pointer index (ÇöÀç Æ®Å«ÀÇ ±æÀÌ)
419        int len = 0;
420
421        DHL_ASSERT(tokens!=NULL, "token should be non-null");
422
423        #define NEW_TOKEN()  \
424                num_tokens=0; len=0; memset(t, 0, sizeof(*t));
425       
426        #define NEXT_TOKEN()  \
427                t->text[len] = 0; t++; num_tokens++; len=0; \
428                if (num_tokens>=DHL_SHELL_MAX_TOKEN) goto label_end; \
429                memset(t, 0, sizeof(*t));
430
431        #define END_TOKEN()  \
432                t->text[len] = 0; t++; num_tokens++; len=0;
433
434        #define INPUT_CH(c) \
435                if (len<DHL_SHELL_MAX_TOKEN_LEN) { t->text[len]=(c); len++;}
436
437
438        NEW_TOKEN();
439
440        while (*p)
441        {
442                if (*p == '"') 
443                {
444                        if (inside_quote) // string ó¸® ÁßÀ̸é string Á¾·á.
445                        {
446                                INPUT_CH(*p);
447                                inside_quote = FALSE;
448
449                                NEXT_TOKEN();
450                        }
451                        else 
452                        {
453                                // »õ·Ó°Ô stringÀ» ½ÃÀÛÇÑ´Ù.
454                                // ¸¸¾à ±× ÀÌÀü tokenÀÌ Á¾·á°¡ ¾ÈµÈ °Å¶ó¸é
455                                // ¿©±â¼­ ¸ÕÀú Á¾·áÇÏ°í »õ token ÁøÇà.
456                                // ¿¹:  test"code" -> arg1 'test' arg2 'code'
457                               
458                                if (len) {
459                                        NEXT_TOKEN();
460                                }
461
462                                inside_quote = TRUE;
463                                INPUT_CH(*p);
464                        }
465                       
466                        p++;
467                        continue;
468                }
469
470                if (inside_quote)
471                {
472                        if (*p == '\\' && *(p+1) == '"') {
473                                // escape sequence ³»ÀÇ quote ±âÈ£´Â ±×´ë·Î Åë°ú½ÃŲ´Ù.
474                                INPUT_CH('\\');
475                                INPUT_CH('"');
476                        }
477                        else {
478                                INPUT_CH(*p);
479                        }
480                }
481                else
482                {
483                        if (*p == ' ' || *p == '\r' || *p == '\n' || *p == ',') {
484                                if (len) {
485                                        NEXT_TOKEN();
486                                }
487                        }
488                        else if (*p == ';') {  // cafrii 070124 add
489                                // it is comment from this..
490                                break;
491                        }
492                        else {
493                                INPUT_CH(*p);
494                        }
495                }
496               
497                p++;
498        }
499
500label_end:
501
502        if (len) {
503                END_TOKEN();
504        }
505       
506        return num_tokens;
507}
508
509
510//
511//  ´Ü¾î ÇØ¼®ÇÏ´Â ÇÔ¼ö. 
512//
513//  ÇöÀç ÀÎ½Ä °¡´ÉÇÑ ´Ü¾î´Â string, 10Áø¼ö, 16Áø¼ö, symbol ÀÌ´Ù.
514// 
515//  10Áø¼ö, 16Áø¼öÀÇ °æ¿ì - ±âÈ£¸¦ Áö¿øÇϰí overflow check´Â ÇÏÁö ¾Ê´Â´Ù.
516//
517static void shell_translate_one_token(int idx, DebugShellToken *token)
518{
519        char *text;
520        int value;
521       
522        if (token == NULL) return;
523
524        text = token->text;
525
526        if (text[0] == 0) {
527                token->type = ShellToken_Unknown;
528                token->u.value = 0;
529                return;
530        }
531
532        if (text[0] == '"') { // this token is probably string.
533
534                token->type = ShellToken_String;
535                token->u.string = &text[1];  // skip quote sign..
536
537                // trim last trailing quote sign
538                if (token->u.string[strlen(token->u.string)-1] == '"') {
539                        token->u.string[strlen(token->u.string)-1] = 0;
540                }
541                else
542                        DHL_OS_Printf("!! token[%d] (%s) trailing quote sign not found\n", idx, text);
543                return;
544        }
545
546        if (1)  // check if digit.. 
547        {
548                // ÇöÀç overflow üũ´Â ÇÏÁö ¾Ê´Â´Ù.
549                //
550                int i, len, negative = 0;
551                value = 0;
552
553                if (text[0] == '-') {
554                        negative = 1;
555                        text++;
556                }
557               
558                if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) {
559                        token->type = ShellToken_HexDigit;
560                        text += 2;
561                }
562                else
563                        token->type = ShellToken_Digit;
564
565                len = strlen(text);
566                for (i=0; i<len; i++) 
567                {
568                        if (token->type == ShellToken_HexDigit) {
569                                if (
570                                        !((text[i] >= '0' && text[i] <= '9') ||
571                                        (text[i] >= 'A' && text[i] <= 'F') ||
572                                        (text[i] >= 'a' && text[i] <= 'f')))
573                                {
574                                        //DHL_OS_Printf("!! token[%d] '%s' not hex digit\n", idx, text);
575                                        token->type = ShellToken_Unknown;
576                                        break;
577                                }
578                                value = (value << 4UL) + (
579                                        (text[i] >= '0' && text[i] <= '9') ? (text[i] - '0') :
580                                        (text[i] >= 'A' && text[i] <= 'F') ? (text[i] - 'A' + 10) :
581                                        (text[i] >= 'a' && text[i] <= 'f') ? (text[i] - 'a' + 10) : 0);
582                        }
583                        else {
584                                if (!(text[i] >= '0' && text[i] <= '9')) {
585                                        //DHL_OS_Printf("!! token[%d] '%s' not decimal digit\n", idx, text);
586                                        token->type = ShellToken_Unknown;
587                                        break;
588                                }
589                                value = value * 10 + (text[i] - '0');
590                        }
591                }
592
593                if (token->type != ShellToken_Unknown) {
594                        token->u.value = negative ? -1*value : value;
595                        return;
596                }
597        }
598
599        // symbol °¡´É¼º üũ..
600        //
601        if (1)
602        {
603                void *addr = shell_lookup_symbol(token->text, 0);
604
605                //printf("lookup symtab (%s) return %d\n", token->text, addr);
606               
607                if (addr == NULL) {
608                        DHL_OS_Printf("!! token[%d] '%s' not symbol\n", idx, text);
609                                // ÀÌ·± °æ°í¸¦ º¸±â ½ÈÀ¸¸é Ç×»ó stringÀº quote ¸¶Å·À» ÇÏ¸é µÈ´Ù.
610                                // ex:
611                                //  Shell> symlkup dbg    --> error message and symbol lookup.
612                                //  Shell> symlkup "dbg"  --> symbol lookup without error message
613                               
614                }
615                else {
616                        token->u.addr = addr;
617                        token->type = ShellToken_Symbol;
618                        return;
619                }
620        }
621
622        // ¸¶Áö¸· ³²Àº °ÍÀº string »ÓÀÌ´Ù.
623
624        token->u.string = token->text;
625        token->type = ShellToken_String;
626
627        return;
628       
629}
630
631
632static void shell_translate_tokens(DebugShellToken *token, int nToken)
633{
634        int i;
635       
636        // ¸Ç óÀ½ tokenÀº command ¶ó¼­
637        for (i=0; i<nToken; i++) {
638                shell_translate_one_token(i, &token[i]);
639        }
640
641#if SHELL_DEBUG
642        if (dprintable(2))
643        {
644                char buf2[100];
645                sprintf(buf2, "== %d tokens: ", nToken);
646                for (i=0; i<nToken; i++) {
647                        sprintf(buf2 + strlen(buf2), "%c[%s] ", 
648                        token[i].type == ShellToken_Digit ? 'd' :
649                        token[i].type == ShellToken_HexDigit ? 'h' :
650                        token[i].type == ShellToken_Symbol ? 'm' :
651                        token[i].type == ShellToken_String ? 's' : '?',
652                        token[i].type == ShellToken_String ? token[i].u.string : token[i].text);
653                }               
654                strcat(buf2, "\n");
655                DHL_OS_Printf(buf2);
656        }
657#endif
658       
659}
660
661
662
663
664
665
666#if COMMENT
667____Cmds____(){}
668#endif
669
670struct dispatch_tbl_t
671{
672        char *name;
673        void (*fnptr)(DebugShellToken *, int);
674        char *help;
675};
676static struct dispatch_tbl_t *shell_get_dispatch_table(void);
677
678static void shell_cmd_help(DebugShellToken *tokens, int nToken)
679{
680        int i;
681        struct dispatch_tbl_t *dpt = shell_get_dispatch_table();
682
683        DHL_UNUSED(tokens);
684        DHL_UNUSED(nToken);
685       
686        DHL_OS_Printf("help:\n");
687
688        for (i=0; ; i++) {
689                if (dpt[i].name == NULL) break;
690                DHL_OS_Printf(" %-8s - %s\n", dpt[i].name, dpt[i].help);
691        }
692}
693
694
695#if SHELL_ECHO_TEST
696
697static void shell_cmd_echo(DebugShellToken *tokens, int nToken)
698{
699        // this is previously KeyCodeSampler().
700
701        UINT32 key, prev_key = 0xffffffff, repeat = 0;
702
703        DHL_UNUSED(tokens);
704        DHL_UNUSED(nToken);
705       
706        DHL_OS_Printf("EchoTest: press same key 5 times to exit\n");
707
708        while (1) 
709        {
710                while ((key = DHL_OS_GetChar()) == DHL_EXTKEY_NONE) 
711                        DHL_OS_Delay(20);
712
713                DHL_OS_Printf("Incoming key: 0x%08x\n", key);
714
715                if (key == prev_key) {
716                        if (++repeat > 5)
717                                break;
718                }
719                else {
720                        repeat = 0;
721                        prev_key = key;
722                }
723        }
724
725        DHL_OS_Printf("EchoTest end\n");
726       
727}
728
729#endif // SHELL_ECHO_TEST
730
731
732
733
734
735static void shell_cmd_set(DebugShellToken *tokens, int nToken)
736{
737        char *string;
738        UINT32 value;
739       
740        UINT32 ptr;
741        int type;
742
743        // sanity check.
744        // if (strcmp(tokens[0].text, "set") != 0) return;
745
746#if SHELL_DEBUG
747        dprint(1, "set command, %d tokens\n", nToken);
748#endif
749        if (nToken-1 < 2) {
750                DHL_OS_Printf("!! too few arguments\n");
751                return;
752        }
753       
754        // ¸Ç óÀ½ tokenÀº "set" ÀÌ¶ó¼­ skip. [1], [2] ¸¸ º¯È¯...
755        shell_translate_tokens(&tokens[1], 2);
756
757        string = tokens[1].text;
758        value = tokens[2].u.value;
759
760        //bCmdMatched = TRUE;
761
762       
763        if (string[0] == 0)
764                return;
765       
766        // ¸ÕÀú symbol tableÀ» µÚÁ®¼­ ±×°÷¿¡ µî·ÏÀÌ µÇ¾î ÀÖÀ¸¸é ±× Á¤º¸¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ.
767        //
768        if (DHL_DBG_QuerySymbol(string, (void **)&ptr, &type) == DHL_OK)
769        {
770                // type º°·Î Àß °ü¸®ÇØ¾ß ÇÑ´Ù. ¾È±×·¯¸é access violation ³¯ ¼öµµ ÀÖÀ½..
771                //
772                if (type == DHL_SYM_V1 && (ptr)) {     // no alignment required for byte addressing
773                        *(UINT8 *)ptr = (UINT8) value;
774                        DHL_OS_Printf("set '%s' value = 0x%02x (%d, %uU)\n", 
775                                string, (int)*(UINT8 *)ptr, (int)*(UINT8 *)ptr, (UINT32)*(UINT8 *)ptr);
776                }
777                else if (type == DHL_SYM_V2 && (ptr & 1) == 0) {
778                        *(UINT16 *)ptr = (UINT16) value;
779                        DHL_OS_Printf("set '%s' value = 0x%04x (%d, %uU)\n", 
780                                string, (int)*(UINT16 *)ptr, (int)*(UINT16 *)ptr, (UINT32)*(UINT16 *)ptr);
781                }
782                else if (type == DHL_SYM_V4 && (ptr & 3) == 0) {
783                        *(UINT32 *)ptr = (UINT32) value;
784                        DHL_OS_Printf("set '%s' value = 0x%08x (%d, %uU)\n", 
785                                string, *(int *)ptr, *(int *)ptr, *(UINT32 *)ptr);
786                }               
787                else
788                        DHL_OS_Printf("!! alignment err: 0x%x, type %d\n", ptr, type);
789                       
790                return;
791        }
792       
793        DHL_OS_Printf("set: var symbol '%s' not found\n", string);
794}
795
796
797/*
798        alias variable symbol
799*/
800static void shell_cmd_show(DebugShellToken *tokens, int nToken)
801{
802        char *string;
803        int value;
804        UINT32 ptr;
805        int type;
806
807
808        if (nToken <= 1)
809                string = NULL; // show all
810       
811        else {
812                shell_translate_tokens(&tokens[1], 1);
813                string = tokens[1].text;
814        }
815       
816        if (string && string[0])
817        {
818                if (DHL_DBG_QuerySymbol(string, (void **)&ptr, &type) == DHL_OK)
819                {
820                        value = type==DHL_SYM_V1 ? *(INT8*)ptr : type==DHL_SYM_V2 ? *(INT16*)ptr : *(INT32*)ptr;
821       
822                        DHL_OS_Printf("'%s' size %d, value = 0x%x (%d, %uU)\n", 
823                                        string, type, value, value, value);
824                        return;
825                }
826                DHL_OS_Printf("show: symbol '%s' not found\n\n", string);
827               
828                DHL_DBG_PrintSymbolTable(DHL_SYM_FN | DHL_SYM_V1 | DHL_SYM_V2 | DHL_SYM_V4, string);
829                DHL_OS_Printf("\n");
830                return;
831        }
832       
833        DHL_DBG_PrintSymbolTable(DHL_SYM_FN | DHL_SYM_V1 | DHL_SYM_V2 | DHL_SYM_V4, NULL);
834        DHL_OS_Printf("\n");
835}
836
837
838
839/*
840        usage:
841                assign my_symbol_name 0x123456
842
843        my_symbol_name À̶ó´Â symbolÀ» ÁÖ¼Ò 0x123456 À¸·Î µî·ÏÇÑ´Ù.
844        0x123456 ÁÖ¼Ò´Â valid ÇÑ ÁÖ¼ÒÀ̾î¾ß ÇÑ´Ù.
845
846        param:
847                max token: 3 fixed.
848*/
849static void shell_cmd_assign(DebugShellToken *tokens, int nToken)
850{
851        if (nToken < 3) return;
852
853        shell_translate_tokens(&tokens[1], 2);
854
855        // »õ·Î¿î symbolÀ» µî·ÏÇÑ´Ù.
856       
857        // symbol ºÎºÐ üũ..
858        if (tokens[1].text == NULL || strlen(tokens[1].text) < 1) {
859                DHL_OS_Printf("!! invalid symbol '%s'\n", tokens[1].text);
860                return;
861        }
862
863        // address ºÎºÐ üũ..
864        if (!DHL_VALID_ADDR(tokens[2].u.value) || 
865                !DHL_VALID_HEX_ADDR(tokens[2].text))
866        {
867                DHL_OS_Printf("!! addr 0x%x '%s' invalid\n", tokens[2].u.value, tokens[2].text);
868                return;
869        }
870
871        DHL_OS_Printf("assign symbol '%s' to 0x%x\n", tokens[1].text, tokens[2].u.value);
872
873        DHL_DBG_RegisterFunctionSymbol(tokens[1].text, (void *)tokens[2].u.value);
874}
875
876
877#if SHELL_AUTHORIZED_ACCESS
878static BOOL shell_check_authorized(char *passwd)
879{
880        return s_buser_authorized;
881}
882
883static void shell_cmd_passwd(DebugShellToken *tokens, int nToken)
884{
885        int n;
886        char buf[32];
887
888        DHL_UNUSED(tokens);
889        DHL_UNUSED(nToken);
890
891        if (shell_check_authorized(NULL)) {
892                DHL_OS_Printf("already authorized. no passwd required\n");
893                return;
894        }
895
896        n = dhl_os_get_line(buf, sizeof(buf), eDHL_OS_GLF_PASSWD);
897
898        if (n > 0 && shell_check_authorized(buf)) {
899                DHL_OS_Printf("ok\n");
900        }
901        else {
902                DHL_OS_Printf("not authorized user!!\n");
903        }
904}
905#endif /* SHELL_AUTHORIZED_ACCESS */
906
907
908
909void shell_cmd_which(DebugShellToken *tokens, int nToken)
910{
911        if (nToken < 2) {
912                DHL_OS_Printf(" usage: which substring   // search cmds\n");
913                DHL_OS_Printf(" usage: which *           // all cmds\n");
914        }
915        else
916                dhl_dbg_print_symtab(tokens[1].text);
917}
918
919
920#if COMMENT
921____Call____(){}
922#endif
923
924
925#if SHELL_SUPPORT_BG_EXE
926//
927// User°¡ Shell ¿¡¼­ ¸í·ÉÀ» ÀÔ·ÂÇϸé Shell task¿¡¼­ ¹Ù·Î ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ ¾Æ´Ï°í
928// º°µµÀÇ executer task¸¦ ¸¸µé¾î¼­ ½ÇÇàÇϵµ·Ï ÇÑ´Ù.
929//
930// ±×·¯¸é ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ¸í·É (ex: autoscan) À» ½ÇÇà½ÃŲ ÈÄ¿¡µµ
931// Prompt°¡ ´Ù½Ã ¶ß±â ¶§¹®¿¡ ´Ù½Ã ´Ù¸¥ ¸í·ÉÀ» ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
932//
933//
934static void shell_bgtask(DebugShellParam *param)
935{
936        int i;
937        SHELL_CMD_HANDLER_TYPE fn;
938        int n_arg, arg[MAX_CALL_ARG];
939        UINT32 result;
940
941        memset(arg, 0, sizeof(arg));
942
943        // copy all params to local variables..
944        fn = (SHELL_CMD_HANDLER_TYPE)(int)param->fn;
945        n_arg = param->n_arg;
946       
947        for (i=0; i<param->n_arg; i++)
948                arg[i] = param->args[i];
949        for (; i<MAX_CALL_ARG; i++) // cafrii 070130 add for safety
950                arg[i] = 0;
951
952        // free param block
953        DHL_OS_Free((void **)&param);
954       
955        //result = fn(args[0], args[1], args[2], args[3],
956        //                      args[4], args[5], args[6], args[7]);
957
958        if (n_arg <= 8)
959                result = (*fn)(
960                        arg[ 0], arg[ 1], arg[ 2], arg[ 3], arg[ 4], arg[ 5], arg[ 6], arg[ 7]);
961        else
962                result = (*fn)(
963                        arg[ 0], arg[ 1], arg[ 2], arg[ 3], arg[ 4], arg[ 5], arg[ 6], arg[ 7],
964                        arg[ 8], arg[ 9], arg[10], arg[11], arg[12], arg[13], arg[14], arg[15],
965                        arg[16], arg[17], arg[18], arg[19], arg[20], arg[21], arg[22], arg[23],
966                        arg[24], arg[25], arg[26], arg[27], arg[28], arg[29], arg[30], arg[31]);
967
968       
969        DHL_OS_Printf("call 0x%x result = 0x%x (%u %d)\n", (UINT32)fn, result, result, result);
970       
971        DHL_OS_Delay(100);
972       
973        DHL_OS_SelfDeleteTask();
974}
975
976#endif // SHELL_SUPPORT_BG_EXE
977
978static void shell_exec_cmd(void *fn, int n_arg, DebugShellToken *arglist, BOOL bSpawn)
979{
980#if SHELL_SUPPORT_BG_EXE
981        DebugShellParam *param;
982        char pTaskNameBuf[30];
983        static UINT32 nShellExeCount;
984        DHL_OS_TASK_ID tid;
985#endif
986
987        int i;
988        UINT32 result;
989        int arg[MAX_CALL_ARG];
990       
991        if (n_arg > MAX_CALL_ARG) {
992                DHL_OS_Printf("!! call arg number %d exceed limit %d..\n", n_arg, MAX_CALL_ARG);
993                //n_arg = MAX_CALL_ARG;
994                return;
995        }
996
997        // cafrii 070306 bugfix. move position
998        memset(arg, 0, sizeof(arg));
999
1000        for (i=0; i<n_arg; i++)
1001                arg[i] = arglist[i].u.value;
1002        for (; i<MAX_CALL_ARG; i++) // cafrii 070130 add for safety
1003                arg[i] = 0;
1004
1005#if SHELL_SUPPORT_BG_EXE
1006
1007        if (bSpawn) {
1008                param = (DebugShellParam *) DHL_OS_Malloc(SIZE_OF_DEBUG_SHELL_PARAM(n_arg));
1009                if (param == NULL)
1010                        DHL_OS_Printf("!! ShellSpawn requested but out of mem. normal execution\n");
1011        }
1012       
1013        if (bSpawn && param)
1014        {
1015                param->fn = fn;
1016                //param->n_arg = n_arg - 1; // ¸Ç ¸¶Áö¸· arg´Â '&' À̹ǷΠÁ¦¿Ü.
1017                param->n_arg = n_arg;  // ÀÌ¹Ì ¾Õ¿¡¼­ Á¦¿Ü ÇßÀ¸¹Ç·Î ±×´ë·Î »ç¿ë.
1018
1019                for (i=0; i<n_arg; i++)
1020                        param->args[i] = arg[i];
1021               
1022                sprintf(pTaskNameBuf, "Shl%02x", nShellExeCount++);
1023               
1024                tid = DHL_OS_CreateTask((DHL_OS_TASKFUNCTION) shell_bgtask, 
1025                                pTaskNameBuf, DHL_SHELL_BG_TASK_PRIORITY, 
1026                                DHL_SHELL_BG_TASK_STACKSIZE, (int)param);
1027                if (tid == 0)
1028                        DHL_OS_Free((void **)&param);
1029
1030                return;
1031        }
1032#endif // SHELL_SUPPORT_BG_EXE
1033
1034        if (n_arg <= 8)
1035                result = (*(SHELL_CMD_HANDLER_TYPE)(int)fn)(
1036                        arg[ 0], arg[ 1], arg[ 2], arg[ 3], arg[ 4], arg[ 5], arg[ 6], arg[ 7]);
1037        else
1038                result = (*(SHELL_CMD_HANDLER_TYPE)(int)fn)(
1039                        arg[ 0], arg[ 1], arg[ 2], arg[ 3], arg[ 4], arg[ 5], arg[ 6], arg[ 7],
1040                        arg[ 8], arg[ 9], arg[10], arg[11], arg[12], arg[13], arg[14], arg[15],
1041                        arg[16], arg[17], arg[18], arg[19], arg[20], arg[21], arg[22], arg[23],
1042                        arg[24], arg[25], arg[26], arg[27], arg[28], arg[29], arg[30], arg[31]);
1043
1044        DHL_OS_Printf("call 0x%x result = 0x%x (%u)\n", (UINT32)fn, result, result);
1045
1046}
1047
1048
1049/*
1050
1051        symbolÀº ¾ø°í Á÷Á¢ symbol address¸¦ ÀÔ·ÂÇØ¼­ ½ÇÇàÇÏ´Â °æ¿ì¿¡ À¯¿ë..
1052
1053        usage:
1054                call symbol_name arg1, arg2, ..
1055                call 0x80203040  arg1, arg2, ..
1056
1057        ÃÖ¼ÒÇÑ ÅäÅ« 2°³ ÇÊ¿ä.
1058               
1059*/
1060void shell_cmd_call(DebugShellToken *tokens, int nToken)
1061{
1062        BOOL bShellSpawn = FALSE;
1063       
1064        if (nToken < 2) {
1065                DHL_OS_Printf("!! too few arguments for cmd '%s'\n", tokens[0].text);
1066                return;
1067        }
1068
1069        // ¸Ç ¸¶Áö¸· word°¡ '&' À̸é background run flagÀÓ.
1070        if (nToken > 1 &&
1071                tokens[nToken-1].text[0] == '&' && 
1072                tokens[nToken-1].text[1] == 0) {
1073                // this is background spawn flag
1074                //DHL_OS_Printf("&& shell spawn specified\n");
1075                bShellSpawn = TRUE;
1076                nToken--;
1077        }
1078
1079       
1080        // ¸Ç óÀ½ tokenÀº "call" ÀÌ¶ó¼­ skip
1081        shell_translate_tokens(&tokens[1], nToken-1);
1082
1083        if (tokens[1].type != ShellToken_HexDigit &&
1084                tokens[1].type != ShellToken_Symbol) 
1085        {
1086                DHL_OS_Printf("!! invalid call address 0x%x\n", tokens[1].u.value);
1087                return;
1088        }
1089
1090        DHL_OS_Printf("call function of '0x%08x' %s\n", 
1091                tokens[1].u.value, bShellSpawn ? "in separate task.." : "");
1092
1093#if 0
1094        // Á÷Á¢ ÀÔ·ÂÇÑ function addressÀ̹ǷΠÀ߸øµÈ °ªÀÌ ÀÔ·ÂµÈ °ÍÀÎÁö üũ¸¦ ÇØ º¼ Çʿ䰡 ÀÖ´Ù.
1095        //
1096        if (tokens[1].type == ShellToken_Symbol &&
1097                dhl_dbg_in_text_range(tokens[1].u.value))
1098        {
1099                // text ¿µ¿ª¿¡ ÇØ´çÇÏ´Â ÁÖ¼ÒÀÌ´Ù. Á¤È®È÷ ÇÔ¼ö start ÁÖ¼ÒÀÎÁö´Â ¾Ë¼ö ¾øÀ¸³ª,
1100                // static function °ú °°Àº °ÍµéÀ» ½ÇÇà½Ãų ¼ö ÀÖµµ·Ï symtab ¿¡ ¾ø´Â ÁÖ¼Òµµ Çã¿ëÇÑ´Ù.
1101                //
1102                shell_exec_cmd((void *)tokens[1].u.value,
1103                                nToken-2, &tokens[2], bShellSpawn);
1104        }
1105        else if (tokens[1].type == ShellToken_HexDigit &&
1106                dhl_dbg_in_text_range(tokens[1].u.value))
1107        {
1108                // digitÀ¸·Î ÀԷ¹ÞÀº call address´Â ¹Ýµå½Ã 0x·Î ½ÃÀÛÇϵµ·Ï ÇÏÀÚ.
1109                // Áï hex digit¸¸ Çã¿ëÇÑ´Ù.
1110                shell_exec_cmd((void *)tokens[1].u.value,
1111                                nToken-2, &tokens[2], bShellSpawn);
1112        }
1113        else
1114        {
1115                DHL_OS_Printf("!! err: call address/symbol '%s' invalid\n", tokens[1].text);
1116        }
1117#else
1118        // 090909 cafrii bugfix
1119        // shared lib ÀÎ °æ¿ì symbol table¿¡µµ µî·ÏÀÌ ¾ÈµÉ ¼ö ÀÖ´Ù.
1120        // ¶ÇÇÑ address rangeµµ ±â´ëÇÏ´Â ¿µ¿ªÀÌ ¾Æ´Ò ¼ö ÀÖ´Ù.
1121        // Á÷Á¢ "call" ¸í·ÉÀ» »ç¿ëÇÏ´Â °æ¿ì¿¡´Â ¹«Á¶°Ç ½ÇÇàÇϵµ·Ï ÇÏÀÚ.
1122
1123        shell_exec_cmd((void *)tokens[1].u.value, 
1124                        nToken-2, &tokens[2], bShellSpawn);
1125#endif
1126
1127}
1128
1129
1130BOOL shell_default(DebugShellToken *tokens, int nToken)
1131{
1132        BOOL bCmdMatched = FALSE;
1133        BOOL bShellSpawn = FALSE;
1134       
1135        // DHL command table¿¡¼­ ã¾Æ¼­ ÇØ´ç functionÀ» ½ÇÇà½ÃŲ´Ù.
1136        //
1137        int type;
1138        void *addr;
1139       
1140        // ¸Ç ¸¶Áö¸· word°¡ '&' À̸é background run flagÀÓ.
1141        if (nToken > 1 &&
1142                tokens[nToken-1].text[0] == '&' && 
1143                tokens[nToken-1].text[1] == 0) {
1144                // this is background spawn flag
1145                //DHL_OS_Printf("&& shell spawn specified\n");
1146                bShellSpawn = TRUE;
1147                nToken--;
1148        }
1149
1150        if (DHL_DBG_QuerySymbol(tokens[0].text, (void **)&addr, &type) == DHL_OK && 
1151                type == DHL_SYM_FN) 
1152        {
1153                bCmdMatched = TRUE;
1154                DHL_OS_Printf("call function of '0x%08x' (aliased)\n", addr);
1155
1156                // dhl_dbg_in_text_range() ÇÔ¼ö´Â ¼ýÀÚ ¹üÀ§¸¸ üũÇÏ´Â ÇÔ¼ö.
1157                // ¿©±â¼­´Â Á¤È®ÇÏ°Ô symbol °ú ÀÏÄ¡ÇÏ´ÂÁö ¿©ºÎ°¡ Áß¿äÇÔ.
1158                if (!dhl_dbg_is_text_symbol((UINT32)addr))
1159                        DHL_OS_Printf("!! err: call address invalid\n");
1160                        // µî·ÏµÈ symbol ÀÓ¿¡µµ ÀÌ·± ¹®Á¦°¡ »ý±â´Â °æ¿ì´Â ¾î¶² °æ¿ì??
1161                else {
1162                        // ¸Ç óÀ½ tokenÀº command ¶ó¼­ skip
1163                        shell_translate_tokens(&tokens[1], nToken-1);
1164
1165                        shell_exec_cmd((void *)addr,
1166                                        nToken-1, &tokens[1], bShellSpawn);
1167                }
1168                goto end;
1169        }
1170
1171       
1172#if 1
1173        // call ¾øÀ̵µ ½ÇÇàÀÌ °¡´ÉÇϵµ·Ï º¯°æ..
1174        // Á¶±Ý À§ÇèÇÒ ¼öµµ ÀÖÀ¸³ª °³¹ß Áß¿¡´Â ÀÌ°Ô ÆíÇÔ..
1175
1176        addr = shell_lookup_symbol(tokens[0].text, &type);
1177        if (addr && type == DHL_SYM_FN)
1178        {
1179                bCmdMatched = TRUE;
1180                DHL_OS_Printf("build symbol found: '%s' = 0x%08x. executing..\n", 
1181                        tokens[0].text, (UINT32)addr);
1182
1183                // ¸Ç óÀ½ tokenÀº command ¶ó¼­ skip
1184                shell_translate_tokens(&tokens[1], nToken-1);
1185
1186                shell_exec_cmd((void *)addr, 
1187                                nToken-1, &tokens[1], bShellSpawn);
1188
1189                goto end;
1190        }
1191#endif
1192
1193        if (addr) {
1194                DHL_OS_Printf("entry found: %s (type %d) = 0x%08x, but invalid\n", 
1195                                tokens[0].text, tokens[0].type, (UINT32)addr);
1196        }
1197        else
1198                DHL_OS_Printf("unknown command '%s'\n", tokens[0].text);
1199
1200end:
1201        return bCmdMatched;
1202
1203}
1204
1205
1206#if COMMENT
1207____Dispatcher____(){}
1208#endif
1209
1210static struct dispatch_tbl_t s_dispatch_table[] = 
1211{
1212        { "help",   shell_cmd_help,  "show this help", },
1213        { "?",      shell_cmd_help,  "show this help", },
1214#if SHELL_ECHO_TEST
1215        { "echo",   shell_cmd_echo,  "key input echo test", },
1216#endif
1217        { "set",    shell_cmd_set,    "change alias variable with new value", },
1218        { "show",   shell_cmd_show,   "show alias symbol (var. with value. or func.)", },
1219        { "assign", shell_cmd_assign, "assign new alias symbol", },
1220#if SHELL_AUTHORIZED_ACCESS     
1221        { "passwd", shell_cmd_passwd, "authorize shell use", },
1222#endif
1223        { "which",  shell_cmd_which,  "search build symbols", },
1224        { "h",      shell_cmd_history, "show command history", },
1225        { "call",   shell_cmd_call,    "call function with symbol", },
1226        { NULL, NULL, },
1227};
1228
1229static struct dispatch_tbl_t *shell_get_dispatch_table(void)
1230{
1231        return s_dispatch_table;
1232}
1233
1234static BOOL shell_process_cmdline(char *buf)
1235{
1236        int i, nToken;
1237        BOOL bCmdMatched;
1238
1239        DebugShellToken tokens[DHL_SHELL_MAX_TOKEN];
1240
1241        struct dispatch_tbl_t *dpt = s_dispatch_table;
1242       
1243        //int arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
1244
1245        // °¢ token º°·Î ºÐ¼®.. tokens ¿¡´Ù ÀúÀå
1246        //
1247        nToken = shell_parse_line_to_tokens(buf, tokens, DHL_SHELL_MAX_TOKEN);
1248       
1249        if (nToken <= 0) 
1250                return FALSE;
1251
1252#if SHELL_DEBUG
1253        dprint(2, "== %d tokens\n", nToken);
1254        for (i=0; i<nToken; i++)
1255                dprint(2, "   (%d) %s\n", i, tokens[i].text);
1256#endif
1257
1258
1259        bCmdMatched = FALSE;
1260       
1261        if (0);
1262#if SHELL_AUTHORIZED_ACCESS
1263        // authorized µÈ °æ¿ì¿¡¸¸ »ç¿ë °¡´É.. */
1264        else if (!shell_check_authorized(NULL) && 
1265                strcmp(tokens[0].text, "passwd"))
1266        {
1267                DHL_OS_Printf("not authorized yet! use passwd first!!\n");
1268                bCmdMatched = TRUE;
1269        }
1270#endif
1271
1272#if SHELL_ALLOW_EXIT
1273        else if (strcmp(tokens[0].text, "exit") == 0)
1274        {
1275                s_request_exit = TRUE;
1276                bCmdMatched = TRUE;
1277        }
1278#endif // SHELL_ALLOW_EXIT
1279
1280        for (i=0; !bCmdMatched; i++)
1281        {
1282                if (dpt[i].name == NULL)
1283                        break;
1284               
1285                if (strcmp(tokens[0].text, dpt[i].name)==0) {
1286#if SHELL_DEBUG
1287                        dprint(1, "cmd '%s' executing, with %d args\n", dpt[i].name, nToken);
1288#endif
1289                        dpt[i].fnptr(&tokens[0], nToken);
1290                        bCmdMatched = TRUE;
1291                }       
1292        }
1293
1294        // ¾î¶°ÇÑ ¸í·É°úµµ ÀÏÄ¡ÇÏÁö ¾Ê´Â °æ¿ì..
1295        if (!bCmdMatched) {
1296                bCmdMatched = shell_default(&tokens[0], nToken);
1297        }
1298
1299//label_end:
1300
1301        if (bCmdMatched)
1302                DHL_OS_Delay(200);
1303                        // Zmon prompt, ¸Þ½ÃÁö µî°ú ¼¯¿©¼­ ³ª¿À±â ¶§¹®¿¡
1304                        // ¾à°£ÀÇ Áö¿¬½Ã°£À» µÎ¾î ¸Þ½ÃÁö°¡ ¼¯ÀÌÁö ¾Êµµ·Ï ÇÏÀÚ..
1305
1306        return bCmdMatched;  // ÀÏÄ¡ÇÑ command°¡ ÀÖÀ¸¸é TRUE
1307}
1308
1309
1310
1311
1312
1313
1314
1315#if COMMENT
1316____InputOutput____(){}
1317#endif
1318
1319#if SHELL_SUPPORT_INPUT_EMULATION
1320/**
1321        virtual input buffer for input emulation.
1322        ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼­ ¸¶Ä¡ »ç¿ëÀÚ°¡ cmd ÀÔ·ÂÀ» ÇÑ °Í°ú µ¿ÀÏÇÑ
1323        Èä³»¸¦ ³»µµ·Ï ÇÏ´Â trick.
1324*/
1325char g_shell_vibuf[200];
1326#endif
1327
1328static void shell_print(char *msg)
1329{
1330        // user interactive ÇÑ Ãâ·Â ±¸¹®À̹ǷΠ¹Ù·Î¹Ù·Î flush µÇµµ·Ï ÇÑ´Ù.
1331        //
1332        // cafrii 081014,
1333        // console_flush´Â interrupt disableÀ» À¯¹ßÇϹǷΠ°¡´ÉÇÏ¸é »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.
1334        //
1335        if (msg[0])
1336        {
1337                // kjkam
1338                // ¾î¶² ÄÄÆÄÀÏ·¯ stdio ¶óÀ̺귯¸®´Â msg[0]ÀÌ null À϶§
1339                // ÀÌ»óÇÏ°Ô Ã³¸®ÇÏ´Â °Íµµ ÀÖÀ¸¹Ç·Î Çѹø °Ë»ç¸¦ ÇØÁØ´Ù.
1340                _DHL_OS_Printf(msg);
1341        }
1342       
1343        //console_flush();
1344}
1345static void shell_putc(char c)
1346{
1347        char msg[2];
1348        msg[0] = c; msg[1] = 0;
1349        _DHL_OS_Printf(msg);
1350}
1351
1352/*
1353
1354*/
1355static void shell_input_command(char *buf, int size)
1356{
1357        char *p;
1358        int pos; // ÇöÀç Ä¿¼­ À§Ä¡. »õ·Î ÀÔ·ÂÇÑ Å°°¡ ÀúÀåµÉ À§Ä¡.
1359        UINT32 key; // cafrii UINT16 -> UINT32
1360        int idx_history = -1;
1361        int i;
1362
1363label_start:
1364
1365        idx_history = -1;
1366        pos = 0;
1367        memset(buf, 0, size);
1368        shell_print("Shell> ");
1369
1370#if SHELL_SUPPORT_INPUT_EMULATION
1371        if (g_shell_vibuf[0]) 
1372        {
1373                UINT32 flag = DHL_OS_DisableInterrupts();
1374                        strncpy(buf, g_shell_vibuf, size-1);
1375                        buf[size-1] = 0;
1376                        g_shell_vibuf[0] = 0;
1377                DHL_OS_RestoreInterrupts(flag);
1378
1379                // cafrii 090119, move printf to outside of Lock/Unlock task region.
1380                shell_print(g_shell_vibuf);
1381                shell_print("\n");
1382
1383                goto input_end;
1384        }
1385#endif
1386       
1387        while (1)
1388        {
1389                // ZMon ÀÌ enable µÇ¾î ÀÖÁö ¾ÊÀ» ¶§¿¡, ZTCP°¡ ¾øÀ» ¶§ µîµîÀÇ °æ¿ì¿¡ ´ëÇØ
1390                // UART¿¡¼­ µ¥ÀÌÅ͸¦ ÀÔ·Â ¹Þ´Â ¹æ¹ýÀÌ °¢±â ´Ù¸¦ ¼ö ÀÖÀ½..
1391
1392                key = DHL_OS_GetChar();
1393               
1394                // DbgGetChar´Â Ű ÀԷ¿¡ ½ÇÆÐÇϸé 0xFFFF ¸®ÅÏÇÑ´Ù.
1395                if (key == (UINT32)0)
1396                        continue;
1397
1398                if (key == DHL_EXTKEY_CR) {
1399                        #if SHELL_INTERNAL_ECHO
1400                                shell_print("\n");
1401                        #endif
1402                        break;
1403                }
1404                else if (key == DHL_EXTKEY_ESC) { // ESC key
1405                        shell_print("\n");
1406                        goto label_start;
1407                }
1408        #if SHELL_SUPPORT_EXT_KEY
1409                else if (key == DHL_EXTKEY_UP || key == DHL_EXTKEY_DN)
1410                {
1411                        char **his = g_dhl_pShellHistory;
1412                       
1413                        if (0);
1414                        else if (key == DHL_EXTKEY_UP) {
1415                                if (idx_history+1 >= MAX_SHELL_HISTORY ||
1416                                        his[idx_history+1] == NULL ||
1417                                        his[idx_history+1][0] == 0) {
1418                                        continue; // ignore this key input.
1419                                }
1420                                idx_history++;
1421                        }
1422                        else if (key == DHL_EXTKEY_DN) {
1423                                if (idx_history-1 < 0 ||
1424                                        his[idx_history-1] == NULL ||
1425                                        his[idx_history-1][0] == 0)
1426                                        continue; // ignore this key input.
1427                                idx_history--;
1428                        }
1429                        for (i=0; i<pos; i++)
1430                                shell_print("\b \b");
1431
1432                        strcpy(buf, his[idx_history]);
1433                       
1434                        //DHL_OS_Printf("[%d]\n", idx_history);
1435
1436                        shell_print(buf);
1437                        pos = strlen(buf);
1438                       
1439                        continue;
1440                }
1441        #endif
1442
1443                // ¾Æ¹« ÀÏ¹Ý Å°°¡ ÀԷµǸé hist buf´Â óÀ½ºÎÅÍ..
1444                idx_history = -1;
1445               
1446                // process input key
1447                //
1448                if (0);
1449        #if SHELL_SUPPORT_EXT_KEY
1450                else if (key == DHL_EXTKEY_LF)  {
1451                        if (pos > 0) {
1452                        #if SHELL_INTERNAL_ECHO
1453                                shell_print("\b");
1454                        #endif
1455                                pos--;
1456                        }
1457                }
1458                else if (key == DHL_EXTKEY_RG) {
1459                        if (pos < strlen(buf)) {
1460                        #if SHELL_INTERNAL_ECHO
1461                                shell_putc(buf[pos]);
1462                        #endif
1463                                pos++;
1464                        }
1465                }
1466                else if (key == DHL_EXTKEY_HOME) {
1467                        if (pos > 0) {
1468                        #if SHELL_INTERNAL_ECHO
1469                                for (i=0; i<pos; i++) shell_putc('\b');
1470                        #endif
1471                                pos = 0;
1472                        }
1473                }
1474                else if (key == DHL_EXTKEY_END) {
1475                        if (pos < strlen(buf)) {
1476                        #if SHELL_INTERNAL_ECHO
1477                                shell_print(&buf[pos]);
1478                        #endif
1479                                pos = strlen(buf);
1480                        }
1481                }
1482                else if (key == DHL_EXTKEY_DEL)
1483                {
1484                        if (pos < strlen(buf)) {
1485                                memmove(&buf[pos], &buf[pos+1], strlen(&buf[pos+1])+1);
1486                        #if SHELL_INTERNAL_ECHO
1487                                shell_print(&buf[pos]); shell_putc(' ');
1488                                for (i=0; i<strlen(&buf[pos])+1; i++) shell_putc('\b');
1489                        #endif
1490                        }
1491                }
1492        #endif /* SHELL_SUPPORT_EXT_KEY */
1493
1494                else if (key == '\b' || key == 0x7F)  // backspace is treated as special
1495                {
1496                        if (pos > 0) {   // go back ÇÒ ±ÛÀÚ°¡ ÀÖ´Â °æ¿ì¿¡¸¸..
1497                                memmove(&buf[pos-1], &buf[pos], strlen(&buf[pos])+1);
1498                                pos--;
1499                        #if SHELL_INTERNAL_ECHO
1500                                shell_putc('\b'); 
1501                                shell_print(&buf[pos]); shell_putc(' ');
1502                                for (i=0; i<strlen(&buf[pos])+1; i++)   shell_putc('\b');
1503                        #endif
1504                        }
1505                }
1506                else if (key >= 0x20 && key < 0x7F)
1507                {
1508                        if (strlen(buf) < size-1) {
1509                                memmove(&buf[pos+1], &buf[pos], strlen(&buf[pos])+1);
1510                                buf[pos++] = key;
1511                        #if SHELL_INTERNAL_ECHO
1512                                shell_putc(key); // at [pos-1]
1513                                shell_print(&buf[pos]);
1514                                for (i=0; i<strlen(&buf[pos]); i++)
1515                                        shell_putc('\b');
1516                        #endif
1517                        }
1518                }
1519                else {
1520                        // do nothing, just ignore key.. buffer full
1521                }
1522        }
1523        goto input_end;
1524
1525input_end:
1526
1527        // trim trailing spaces
1528
1529        p = buf + strlen(buf) - 1;
1530
1531        while (p >= buf && (*p == ' ' || *p == '\t')) {
1532                *p-- = 0;
1533                //n_trim++;
1534        }
1535
1536        // skip head spaces
1537        p = buf;
1538        while (*p == ' ' || *p == '\t') p++;
1539        if (p != buf)
1540                memmove(buf, p, strlen(p)+1);
1541
1542}
1543
1544
1545#if COMMENT
1546____Group2____(){}
1547#endif
1548
1549
1550static void shell_task_main(UINT32 arg)
1551{
1552        DebugShellContext context;
1553        char buf[256];
1554        BOOL bExecuted, bExit=FALSE;
1555
1556        DHL_UNUSED(arg);
1557       
1558        DHL_OS_Printf("Mini Shell Task Spawned..\n");
1559       
1560#if SHELL_ALLOW_EXIT
1561        s_request_exit = 0;
1562#endif
1563
1564#if 0
1565        if (g_dbg_tokens == NULL) {
1566                // ÀÌ ¸Þ¸ð¸®´Â ¸Ç óÀ½ Çѹø¸¸ »ý¼ºµÈ´Ù.
1567                g_dbg_tokens = DHL_OS_Malloc(DHL_SHELL_MAX_TOKEN * sizeof(DebugShellToken));
1568        }       
1569#endif
1570        memset(&context, 0, sizeof(context));
1571       
1572        while (!bExit)
1573        {       
1574                //DHL_OS_Delay(1);
1575               
1576                memset(buf, 0, sizeof(buf));
1577                shell_input_command(context.cmdline, sizeof(context.cmdline));
1578
1579                if (context.cmdline[0] == 0) // just blank..
1580                        continue;
1581
1582#if SHELL_DEBUG
1583                dprint(2, "cmd input [%s]\n", context.cmdline);
1584#endif
1585
1586                bExecuted = shell_process_cmdline(context.cmdline);
1587
1588                /* ¹æ±Ý Àü ÀÔ·ÂÇÑ ¸í·ÉÀ» history¿¡ Ãß°¡..
1589                */
1590                if (!(buf[0] == 'h' && buf[1] == 0))
1591                        shell_add_to_history(context.cmdline);
1592               
1593                if (bExecuted == FALSE) {
1594                        //DHL_OS_Printf("\nInvalid command\n");
1595                }
1596                DHL_OS_Printf("\n");
1597
1598#if SHELL_ALLOW_EXIT
1599                if (s_request_exit)
1600                        bExit = TRUE;
1601#endif
1602
1603        }
1604
1605        DHL_OS_Printf("shell exit\n");
1606
1607#if SHELL_ALLOW_EXIT
1608        s_shell_tid = 0;
1609#endif
1610
1611}
1612
1613
1614
1615
1616#if COMMENT
1617____Debug____(){}
1618#endif
1619
1620
1621
1622
1623
1624#if COMMENT
1625____Symbol____(){}
1626#endif
1627
1628
1629#if DHL_REGISTER_DEUBG_SYMBOLS
1630
1631static DHL_SymbolTable _symbols[] =
1632{
1633        /* however, if you want typing short-cut, it is good usage.
1634        DHL_FNC_SYM_ENTRY2("epg_start", App_EpgUpdateStart),
1635        DHL_FNC_SYM_ENTRY2("epg_stop", App_EpgUpdateCancel),
1636        DHL_FNC_SYM_ENTRY2("epg_list", Dmc_EpgPrintAllTables),
1637        DHL_FNC_SYM_ENTRY2("epg_delete", App_EpgDeleteAll),
1638
1639        DHL_VAR_SYM_ENTRY(g_XX_TestMode),
1640        */
1641        0,
1642};
1643
1644#endif  /* DHL_REGISTER_DEUBG_SYMBOLS */
1645
1646
1647// shell ±â´ÉÀÇ ´ëºÎºÐÀ» disable ½ÃŰ·Á¸é ¾Æ·¡ Ç÷¡±×¸¦ 1·Î ¼³Á¤Ç϶ó.
1648#endif /* SUPPORT_DBG_SHELL */
1649
1650
1651#if COMMENT
1652____Init____(){}
1653#endif
1654
1655
1656void DHL_DBG_StartDbgShell(void)
1657{
1658#if SUPPORT_DBG_SHELL
1659        /* °¢Á¾ init code.. */
1660
1661#if SHELL_USE_SHELL_TASK
1662        if (1) 
1663        {
1664                DHL_OS_TASK_ID tid;
1665
1666                DHL_OS_Printf("Starting MiniShell, priority %d ...\n", DHL_SHELL_TASK_PRIORITY);
1667
1668                tid = s_shell_tid = DHL_OS_CreateTask((DHL_OS_TASKFUNCTION)shell_task_main, "Shell", 
1669                                                DHL_SHELL_TASK_PRIORITY, DHL_SHELL_TASK_STACKSIZE, 0);
1670
1671                if (tid == DHL_INVALID_TASK_ID)
1672                        DHL_OS_Printf("!! Shell task spawn error!\n");
1673                else
1674                        DHL_OS_Printf("Minishell TID 0x%x running\n", tid);
1675        }
1676#elif SHELL_ALLOW_EXIT
1677        DHL_OS_Printf("enter debug shell. this will block calling thread.\n");
1678        DHL_OS_Printf("type 'exit' to return.\n");
1679
1680        shell_task_main(0);
1681       
1682#endif
1683
1684
1685#if DHL_REGISTER_DEUBG_SYMBOLS
1686        DHL_DBG_RegisterSymbols(_symbols, DHL_NUMSYMBOLS(_symbols));
1687#endif
1688
1689#endif /* SUPPORT_DBG_SHELL */
1690}
1691
1692
1693/*
1694        debug minishellÀÇ °¢Á¾ Á¤º¸ query.
1695*/
1696void DHL_DBG_GetDbgShellInfo(DHL_DBG_SHELL_INFO *pInfo)
1697{
1698#if SUPPORT_DBG_SHELL
1699        if (s_shell_tid) {
1700                pInfo->started = TRUE;
1701                pInfo->tid = s_shell_tid;
1702        }
1703        else {
1704                pInfo->started = FALSE;
1705        }
1706#else
1707        DHL_UNUSED(pInfo);
1708#endif
1709}
1710/*
1711        return TRUE if current task is debug shell task
1712*/
1713BOOL DHL_DBG_IsDbgShell(void)
1714{
1715#if SUPPORT_DBG_SHELL
1716        DHL_DBG_SHELL_INFO si;
1717        DHL_DBG_GetDbgShellInfo(&si);
1718       
1719        return si.tid == DHL_OS_GetTaskID() ? TRUE : FALSE;
1720#else
1721        return FALSE;
1722#endif
1723}
1724
1725/*
1726        debug command emulation ÇÔ¼ö.
1727        debug shell¿¡ ÀÔ·ÂµÈ °Íó·³ ó¸®ÇÑ´Ù.
1728*/
1729void DHL_DBG_EmulateCommand(const char *cmd)
1730{
1731#if SUPPORT_DBG_SHELL && SHELL_SUPPORT_INPUT_EMULATION
1732        if (cmd && *cmd)
1733        {
1734                UINT32 flag;
1735                flag = DHL_OS_DisableInterrupts();
1736                strncpy(g_shell_vibuf, cmd, sizeof(g_shell_vibuf));
1737                g_shell_vibuf[sizeof(g_shell_vibuf)-1] = 0;
1738                DHL_OS_RestoreInterrupts(flag);
1739        }
1740#else
1741        DHL_UNUSED(cmd);
1742#endif
1743}
1744
1745
1746
1747/* end of file */
1748
Note: See TracBrowser for help on using the repository browser.