FreeCalypso > hg > leo2moko-debug
comparison chipsetsw/services/cst/cst_pei.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 /* | |
2 +--------------------------------------------------------------------+ | |
3 /* | |
4 +-------------------------------------------------------------------+ | |
5 | PROJECT: GSM-F&D (8411) $Workfile:: cst_pei.c $| | |
6 | $Author:: Be $ CONDAT GmbH $Revision:: 14 $| | |
7 | CREATED: 01.02.99 $Modtime:: 14.02.00 12:14 $| | |
8 | STATE : code | | |
9 +--------------------------------------------------------------------+ | |
10 | |
11 MODULE : CST_PEI | |
12 | |
13 PURPOSE : This Modul defines the process body interface for the | |
14 component CST of the mobile station. | |
15 | |
16 EXPORT : pei_create - Create the Protocol Stack Entity | |
17 pei_init - Initialize Protocol Stack Entity | |
18 pei_primitive - Process Primitive | |
19 pei_timeout - Process Timeout | |
20 pei_exit - Close resources and terminate | |
21 pei_run - Process Primitive | |
22 pei_config - Dynamic Configuration | |
23 pei_monitor - Monitoring of physical Parameters | |
24 */ | |
25 | |
26 #ifndef CST_PEI_C | |
27 #define CST_PEI_C | |
28 #endif | |
29 | |
30 #include "config/swconfig.cfg" | |
31 #include "config/chipset.cfg" | |
32 | |
33 | |
34 #define ENTITY_CST | |
35 | |
36 /*==== INCLUDES ===================================================*/ | |
37 | |
38 #include <string.h> | |
39 #include <stdlib.h> | |
40 #include <ctype.h> | |
41 #include "typedefs.h" | |
42 #include "vsi.h" | |
43 #include "custom.h" | |
44 #include "gsm.h" | |
45 #include "prim.h" | |
46 #include "cst/cnf_cst.h" | |
47 #include "cst/cus_cst.h" | |
48 #include "cst/mon_cst.h" | |
49 #include "tok.h" | |
50 #include "p_cst.h" | |
51 #include "cst/cst.h" | |
52 #include "rx.h" | |
53 #include "audio.h" | |
54 | |
55 /*==== CONSTANTS ==================================================*/ | |
56 | |
57 // token processing | |
58 #define ERROR -1 | |
59 #define EOS 1 | |
60 #define COMMA 2 | |
61 #define EQUAL 3 | |
62 #define IDENT 4 | |
63 #define STRING 5 | |
64 #define LBRACK 6 | |
65 #define RBRACK 7 | |
66 | |
67 /*==== EXPORT =====================================================*/ | |
68 extern void CST_stack_trace(void); | |
69 int cst_gsm_parameters(TOK_DCB *dcb); | |
70 extern void l1_cst_l1_parameters(char*); | |
71 extern void csf_adc_start (UBYTE tx_flag, UBYTE traffic_period, UBYTE idle_period); | |
72 extern void spi_adc_on (void); | |
73 | |
74 GLOBAL T_HANDLE t_adc_timer = VSI_ERROR; | |
75 GLOBAL T_HANDLE hCommPL = VSI_ERROR; /* PL Communication */ | |
76 GLOBAL T_HANDLE hCommL1 = VSI_ERROR; /* L1 Communication */ | |
77 T_HANDLE cst_handle; | |
78 GLOBAL UBYTE extDisplay = 0; | |
79 | |
80 EXTERN UBYTE audio_is_free; | |
81 /*==== PRIVATE ====================================================*/ | |
82 | |
83 LOCAL const void pei_not_supported (void *data); | |
84 | |
85 #ifdef OPTION_RELATIVE | |
86 LOCAL ULONG offset; | |
87 #endif | |
88 | |
89 /*==== VARIABLES ==================================================*/ | |
90 | |
91 LOCAL USHORT t_flag = 0; | |
92 LOCAL BOOL exit_flag = FALSE; | |
93 LOCAL BOOL first_access = TRUE; | |
94 LOCAL T_MONITOR cst_mon; | |
95 | |
96 /*==== FUNCTIONS ==================================================*/ | |
97 LOCAL const T_FUNC cst_table[] = | |
98 { | |
99 MAK_FUNC_0 ( csf_adc_process , CST_ADC_IND ) | |
100 }; | |
101 | |
102 /*==== PROTOTYPES==================================================*/ | |
103 | |
104 #if defined (_TMS470) | |
105 | |
106 static SHORT cst_tok_gettok (TOK_DCB *dcb, char ** token); | |
107 static SHORT cst_tok_value (TOK_DCB *dcb, char * value []); | |
108 static int cst_tokenizer_has_more_data(const TOK_DCB *dcb); | |
109 static SHORT cst_tok_issep (char c); | |
110 static void cst_tok_init (char * s, TOK_DCB *dcb, char *buf, int buf_len); | |
111 static SHORT cst_get_values(TOK_DCB *dcb, char *value[]); | |
112 static int cst_getbyte(TOK_DCB *dcb); | |
113 | |
114 #endif | |
115 | |
116 /* | |
117 +--------------------------------------------------------------------+ | |
118 | PROJECT : XXX MODULE : CST_PEI | | |
119 | STATE : code ROUTINE : pei_primitive | | |
120 +--------------------------------------------------------------------+ | |
121 | |
122 PURPOSE : This function processes protocol specific primitives. | |
123 */ | |
124 LOCAL SHORT pei_primitive (void * ptr) | |
125 { | |
126 T_PRIM *prim = ptr; | |
127 | |
128 if (prim NEQ NULL) | |
129 { | |
130 USHORT opc = prim->custom.opc; | |
131 USHORT n; | |
132 const T_FUNC *table; | |
133 | |
134 VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__); | |
135 | |
136 switch (opc & OPC_MASK) | |
137 { | |
138 case CST_DL: table = cst_table; n = TAB_SIZE (cst_table); break; | |
139 default : table = NULL; n = 0; break; | |
140 } | |
141 | |
142 if (table != NULL ) | |
143 { | |
144 if ((opc & PRM_MASK) < n) | |
145 { | |
146 table += opc & PRM_MASK; | |
147 #ifdef PALLOC_TRANSITION | |
148 P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0; | |
149 P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER); | |
150 #endif | |
151 JUMP (table->func) (P2D(prim)); | |
152 } | |
153 else | |
154 { | |
155 pei_not_supported (P2D(prim)); | |
156 } | |
157 return PEI_OK; | |
158 } | |
159 | |
160 #ifdef GSM_ONLY | |
161 PFREE (P2D(prim)) | |
162 return PEI_ERROR; | |
163 #else | |
164 if (opc & SYS_MASK) | |
165 { | |
166 vsi_c_primitive (VSI_CALLER prim); | |
167 } | |
168 else | |
169 { | |
170 PFREE (P2D(prim)) | |
171 return PEI_ERROR; | |
172 } | |
173 #endif | |
174 } | |
175 return PEI_OK; | |
176 } | |
177 | |
178 /* | |
179 +--------------------------------------------------------------------+ | |
180 | PROJECT : XXX MODULE : CST_PEI | | |
181 | STATE : code ROUTINE : pei_not_supported | | |
182 +--------------------------------------------------------------------+ | |
183 | |
184 PURPOSE : This function handles an unsupported primitive. | |
185 */ | |
186 LOCAL const void pei_not_supported (void *data) | |
187 { | |
188 TRACE_FUNCTION ("pei_not_supported()"); | |
189 | |
190 PFREE (data); | |
191 } | |
192 | |
193 | |
194 /* | |
195 +--------------------------------------------------------------------+ | |
196 | PROJECT : XXX MODULE : CST_PEI | | |
197 | STATE : code ROUTINE : pei_init | | |
198 +--------------------------------------------------------------------+ | |
199 | |
200 PURPOSE : This function initializes the protocol stack entity | |
201 | |
202 */ | |
203 | |
204 LOCAL SHORT pei_init (T_HANDLE handle) | |
205 { | |
206 cst_handle = handle; | |
207 | |
208 TRACE_FUNCTION ("pei_init()"); | |
209 | |
210 exit_flag = FALSE; | |
211 | |
212 if (hCommPL < VSI_OK) | |
213 { | |
214 if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK) | |
215 { | |
216 return PEI_ERROR; | |
217 } | |
218 } | |
219 | |
220 if (hCommL1 < VSI_OK) | |
221 { | |
222 if ((hCommL1 = vsi_c_open (VSI_CALLER L1_NAME)) < VSI_OK) | |
223 { | |
224 return PEI_ERROR; | |
225 } | |
226 } | |
227 | |
228 vsi_t_start (VSI_CALLER CST_ADC_TIMER, 230); // equal to 50 TDMA frames | |
229 | |
230 #if defined (_TMS470) | |
231 // Set the sleep mode authorized for the layer1 synchronous. | |
232 // Possible modes are : | |
233 // for CHIPSET = 0 : NO_SLEEP, SMALL_SLEEP, BIG_SLEEP. | |
234 // It is necessary to indicate in the prototype of power_down_config() | |
235 // function which clocks (amongst ARMIO_CLK, UWIRE_CLK, SIM_CLK and UART_CLK) | |
236 // to be stopped in case of BIG_SLEEP mode. | |
237 // With this default init, ARMIO_CLK, UWIRE_CLK, SIM_CLK and UART_CLK will be stopped | |
238 // in case of BIG_SLEEP mode, but it can be changed here. | |
239 | |
240 // other CHIPSETs : NO_SLEEP, SMALL_SLEEP, BIG_SLEEP, DEEP_SLEEP, ALL_SLEEP. | |
241 // It is necessary to indicate in the prototype of power_down_config() | |
242 // function which clocks to be stopped in case of BIG_SLEEP mode, | |
243 // amongst ARMIO and UWIRE clocks. | |
244 // With this default init, UWIRE_CLK will always be stopped | |
245 // in case of BIG_SLEEP mode, but it can be changed here. | |
246 | |
247 // The default configuration is ALL SLEEP. It can be changed in this init. | |
248 | |
249 // WARNING !! THE SLEEP MODE SHOULD NOT BE MODIFIED ONCE THE SYSTEM INIT IS FINISHED !! | |
250 | |
251 #if !defined (TI_VERSION) | |
252 #if (CHIPSET == 0) | |
253 power_down_config(NO_SLEEP, ARMIO_CLK | UWIRE_CLK | SIM_CLK | UART_CLK); | |
254 #elif ((CHIPSET == 2) || (CHIPSET == 3) || \ | |
255 (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11)) | |
256 power_down_config(ALL_SLEEP, UWIRE_CLK_CUT); | |
257 #elif ((CHIPSET == 4) || (CHIPSET == 9)) | |
258 power_down_config(NO_SLEEP, UWIRE_CLK_CUT); | |
259 #endif | |
260 #endif | |
261 #endif | |
262 | |
263 return PEI_OK; | |
264 } | |
265 | |
266 /* | |
267 +--------------------------------------------------------------------+ | |
268 | PROJECT : XXX MODULE : CST_PEI | | |
269 | STATE : code ROUTINE : pei_timeout | | |
270 +--------------------------------------------------------------------+ | |
271 | |
272 PURPOSE : This function processes timeouts. | |
273 */ | |
274 | |
275 LOCAL SHORT pei_timeout (USHORT index) | |
276 { | |
277 rx_timeout (index); | |
278 audio_timeout (index); | |
279 | |
280 if (index EQ CST_ADC_TIMER) | |
281 { | |
282 // start the AD conversions in layer1 synchronous | |
283 // this function will send MMI_ADC_REQ primitive to L1A for test reason. | |
284 // The user has to implement it by himself in the MMI. | |
285 // The parameters are : tx_flag, traffic_period, idle_period. | |
286 // Please refer to the ADC specification for details. | |
287 | |
288 // WCS Patch : Schedule ADC on RX and TX | |
289 #if (OP_WCP == 1) | |
290 csf_adc_start(1, 10, 1); | |
291 #else | |
292 csf_adc_start(0, 10, 1); | |
293 #endif | |
294 | |
295 spi_adc_on(); | |
296 } | |
297 | |
298 return PEI_OK; | |
299 } | |
300 | |
301 | |
302 /* | |
303 +--------------------------------------------------------------------+ | |
304 | PROJECT : XXX MODULE : CST_PEI | | |
305 | STATE : code ROUTINE : pei_exit | | |
306 +--------------------------------------------------------------------+ | |
307 | |
308 PURPOSE : This function closes all resources and terminates. | |
309 */ | |
310 | |
311 LOCAL SHORT pei_exit (void) | |
312 { | |
313 TRACE_FUNCTION ("pei_exit()"); | |
314 | |
315 /* | |
316 * clean up communication | |
317 */ | |
318 | |
319 vsi_c_close (VSI_CALLER hCommPL); | |
320 hCommPL = VSI_ERROR; | |
321 | |
322 vsi_c_close (VSI_CALLER hCommL1); | |
323 hCommL1 = VSI_ERROR; | |
324 | |
325 exit_flag = TRUE; | |
326 | |
327 return PEI_OK; | |
328 } | |
329 | |
330 /* | |
331 +--------------------------------------------------------------------+ | |
332 | PROJECT : XXX MODULE : CST_PEI | | |
333 | STATE : code ROUTINE : pei_config | | |
334 +--------------------------------------------------------------------+ | |
335 | |
336 PURPOSE : Dynamic Configuration | |
337 | |
338 */ | |
339 | |
340 #if !defined (NCONFIG) | |
341 LOCAL KW_DATA kwtab[] = { | |
342 CST_CONFIG, ID_CONFIG, | |
343 CST_MUTE, ID_MUTE, | |
344 CST_GSM_PARAMETERS, ID_GSM_PARAMETERS, | |
345 CST_L1_PARAMETERS, ID_L1_PARAMETERS, | |
346 "", 0 | |
347 }; | |
348 | |
349 GLOBAL KW_DATA partab[] = { | |
350 "", 0 | |
351 }; | |
352 #endif | |
353 | |
354 | |
355 GLOBAL SHORT pei_config (T_PEI_CONFIG inString) | |
356 { | |
357 #if !defined (NCONFIG) | |
358 char * s = inString; | |
359 SHORT valno; | |
360 USHORT keyno; | |
361 char * keyw; | |
362 char * val [10]; | |
363 TOK_DCB tokenizer; | |
364 char token_buf[80]; | |
365 SHORT token_type; | |
366 int error; /* terminate processing */ | |
367 | |
368 TRACE_FUNCTION ("pei_config()"); | |
369 | |
370 TRACE_FUNCTION (s); | |
371 | |
372 cst_tok_init(s, &tokenizer, &token_buf[0], sizeof(token_buf)); | |
373 | |
374 /* | |
375 * Parse next keyword and number of variables | |
376 */ | |
377 error = 0; | |
378 while (!error && cst_tokenizer_has_more_data(&tokenizer)) | |
379 { | |
380 token_type = cst_tok_gettok(&tokenizer, &keyw); | |
381 if (token_type != IDENT) | |
382 { | |
383 error = 1; | |
384 } | |
385 else | |
386 { | |
387 switch ((keyno = tok_key((KW_DATA *)kwtab, keyw))) | |
388 { | |
389 case ID_CONFIG: | |
390 valno = cst_get_values(&tokenizer, val); | |
391 if (valno EQ 3) | |
392 { | |
393 extDisplay = 1; | |
394 } | |
395 break; | |
396 case ID_MUTE: | |
397 valno = cst_get_values(&tokenizer, val); /* eat up rest of line */ | |
398 /* | |
399 * FTA testcase 26.6.3.4 needs the the MS is in audio free | |
400 * environment. This config disables opening of the audio | |
401 * path. | |
402 */ | |
403 audio_is_free = FALSE; | |
404 break; | |
405 case ID_GSM_PARAMETERS: | |
406 cst_gsm_parameters(&tokenizer); | |
407 break; | |
408 case ID_L1_PARAMETERS: | |
409 /* pass parameters to L1 function for further process */ | |
410 l1_cst_l1_parameters(s); | |
411 valno = cst_get_values(&tokenizer, val); /* eat up rest of line */ | |
412 break; | |
413 default: | |
414 TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword"); | |
415 break; | |
416 } | |
417 } | |
418 } | |
419 #endif | |
420 return PEI_OK; | |
421 } | |
422 | |
423 /* | |
424 +--------------------------------------------------------------------+ | |
425 | PROJECT : GSM-PS (6147) MODULE : CST_PEI | | |
426 | STATE : code ROUTINE : cst_pei_config | | |
427 +--------------------------------------------------------------------+ | |
428 | |
429 PURPOSE : Dynamic Configuration | |
430 | |
431 */ | |
432 | |
433 GLOBAL SHORT cst_pei_config ( char * inString, char * dummy ) | |
434 { | |
435 pei_config ( inString ); | |
436 } | |
437 | |
438 | |
439 /* | |
440 +--------------------------------------------------------------------+ | |
441 | PROJECT : XXX MODULE : CST_PEI | | |
442 | STATE : code ROUTINE : pei_monitor | | |
443 +--------------------------------------------------------------------+ | |
444 | |
445 PURPOSE : This function monitors physical parameters. | |
446 */ | |
447 LOCAL SHORT pei_monitor (void ** monitor) | |
448 { | |
449 TRACE_FUNCTION ("pei_monitor()"); | |
450 | |
451 cst_mon.version = VERSION_CST; | |
452 | |
453 *monitor = &cst_mon; | |
454 | |
455 return PEI_OK; | |
456 } | |
457 | |
458 /* | |
459 +--------------------------------------------------------------------+ | |
460 | PROJECT : XXX MODULE : CST_PEI | | |
461 | STATE : code ROUTINE : pei_create | | |
462 +--------------------------------------------------------------------+ | |
463 | |
464 PURPOSE : This function creates the protocol stack entity. | |
465 */ | |
466 | |
467 GLOBAL SHORT cst_pei_create (T_PEI_INFO **info) | |
468 { | |
469 static const T_PEI_INFO pei_info = | |
470 { | |
471 "CST", | |
472 { | |
473 pei_init, | |
474 pei_exit, | |
475 pei_primitive, | |
476 pei_timeout, | |
477 NULL, /* no signal function */ | |
478 NULL, /* no run function */ | |
479 pei_config, | |
480 pei_monitor, | |
481 }, | |
482 1536, /* Stack Size */ | |
483 10, /* Queue Entries */ | |
484 55, /* Priority */ | |
485 MAX_CST_TIMER, /* number of timer */ | |
486 0x03 /* flags */ | |
487 }; | |
488 | |
489 TRACE_FUNCTION ("pei_create()"); | |
490 | |
491 /* | |
492 * Close Resources if open | |
493 */ | |
494 | |
495 if (first_access) | |
496 first_access = FALSE; | |
497 else | |
498 pei_exit (); | |
499 | |
500 /* | |
501 * Export startup configuration data | |
502 */ | |
503 | |
504 *info = (T_PEI_INFO *)&pei_info; | |
505 | |
506 return PEI_OK; | |
507 } | |
508 | |
509 | |
510 /* | |
511 +--------------------------------------------------------------------+ | |
512 | PROJECT : XXX MODULE : CST_PEI | | |
513 | STATE : code ROUTINE : cst_tok_init | | |
514 +--------------------------------------------------------------------+ | |
515 | |
516 PURPOSE : Initialize token scanner. | |
517 | |
518 */ | |
519 static void cst_tok_init (char * s, TOK_DCB *dcb, char *buf, int buf_len) | |
520 { | |
521 int i; | |
522 dcb->nexttok = dcb->tokbuf = buf; | |
523 // can't use strcpy since it stops at 0s | |
524 for (i=0; i<buf_len-1; i++) | |
525 { | |
526 dcb->tokbuf[i] = s[i]; | |
527 } | |
528 dcb->tokbuf[buf_len-1] = '\0'; | |
529 dcb->lastchar = 0; | |
530 } | |
531 | |
532 /* | |
533 +--------------------------------------------------------------------+ | |
534 | PROJECT : XXX MODULE : CST_PEI | | |
535 | STATE : code ROUTINE : cst_get_values | | |
536 +--------------------------------------------------------------------+ | |
537 */ | |
538 static SHORT cst_get_values(TOK_DCB *dcb, char *value[]) | |
539 { | |
540 char * val; /* not identifier, so thrown away */ | |
541 /* | |
542 * Check next token | |
543 */ | |
544 switch (cst_tok_gettok (dcb, &val)) | |
545 { | |
546 /* | |
547 * No value present | |
548 */ | |
549 case COMMA: | |
550 return (0); | |
551 /* | |
552 * Value(s) follows | |
553 */ | |
554 case EQUAL: | |
555 return (cst_tok_value (dcb, value)); | |
556 /* | |
557 * No value present and EOS | |
558 */ | |
559 case EOS: | |
560 dcb->nexttok = NULL; | |
561 return (0); | |
562 /* | |
563 * Syntax error | |
564 */ | |
565 default: | |
566 dcb->nexttok = NULL; | |
567 return (TOK_EOCS); | |
568 } | |
569 } | |
570 | |
571 /* | |
572 +--------------------------------------------------------------------+ | |
573 | PROJECT : XXX MODULE : CST_PEI | | |
574 | STATE : code ROUTINE : cst_tok_value | | |
575 +--------------------------------------------------------------------+ | |
576 */ | |
577 static SHORT cst_tok_value (TOK_DCB *dcb, char * value []) | |
578 { | |
579 SHORT count; | |
580 SHORT tok; | |
581 SHORT inbrack; | |
582 char * val; | |
583 char * val2; | |
584 | |
585 inbrack = 0; | |
586 /* | |
587 * Get next token | |
588 */ | |
589 tok = cst_tok_gettok (dcb, &val); | |
590 | |
591 switch (tok) | |
592 { | |
593 case LBRACK: | |
594 inbrack++; | |
595 break; | |
596 | |
597 case IDENT : | |
598 case STRING : | |
599 tok = cst_tok_gettok (dcb, &val2); /* val2 ignored since next tok */ | |
600 if ((tok == COMMA) || (tok == EOS)) /* shouldn't be an IDENT */ | |
601 { | |
602 /* just single value, return */ | |
603 value[0] = val; | |
604 return (1); | |
605 } | |
606 else | |
607 { | |
608 /* error */ | |
609 dcb->nexttok = NULL; | |
610 return (0); | |
611 } | |
612 | |
613 case EOS : | |
614 default : | |
615 dcb->nexttok = NULL; | |
616 return (0); | |
617 } | |
618 | |
619 /* | |
620 * Get first token of list | |
621 */ | |
622 | |
623 tok = cst_tok_gettok (dcb, &val); | |
624 count = 0; | |
625 while (1) | |
626 { | |
627 if ((tok == IDENT) || (tok == STRING)) | |
628 { | |
629 value[count++] = val; | |
630 } | |
631 else | |
632 { | |
633 dcb->nexttok = NULL; | |
634 return (0); | |
635 } | |
636 | |
637 tok = cst_tok_gettok (dcb, &val); | |
638 switch (tok) | |
639 { | |
640 case COMMA: | |
641 break; | |
642 | |
643 case RBRACK : | |
644 if (inbrack) | |
645 { | |
646 if (((tok = cst_tok_gettok (dcb, &val)) == COMMA) || | |
647 (tok == EOS)) | |
648 { | |
649 return (count); | |
650 } | |
651 } | |
652 /* | |
653 * Fall through | |
654 */ | |
655 default: | |
656 dcb->nexttok = NULL; | |
657 return (0); | |
658 } | |
659 tok = cst_tok_gettok (dcb, &val); | |
660 } | |
661 return (0); | |
662 } | |
663 | |
664 /* | |
665 +--------------------------------------------------------------------+ | |
666 | PROJECT : XXX MODULE : CST_PEI | | |
667 | STATE : code ROUTINE : cst_tok_gettok | | |
668 +--------------------------------------------------------------------+ | |
669 | |
670 PURPOSE : Get list of values for token. | |
671 Return number of values found. | |
672 | |
673 Formats: Value | |
674 (Value) | |
675 (Value, Value,...) | |
676 () | |
677 */ | |
678 static SHORT cst_tok_gettok (TOK_DCB *dcb, char ** token) | |
679 { | |
680 SHORT tok; | |
681 /* if previous token was IDENT, a '\0' was placed afterwards | |
682 * for string processing and the overwritten character was | |
683 * placed in lastchar. We now replace this character. | |
684 */ | |
685 if (dcb->lastchar) | |
686 { | |
687 *(dcb->nexttok) = dcb->lastchar; | |
688 dcb->lastchar = 0; | |
689 } | |
690 /* | |
691 * Skip leading white space | |
692 */ | |
693 while (isspace (*(dcb->nexttok))) | |
694 { | |
695 dcb->nexttok++; | |
696 } | |
697 | |
698 * token = dcb->nexttok++; | |
699 | |
700 switch (** token) | |
701 { | |
702 case '\0': /* End of string */ | |
703 case '\n': | |
704 tok = EOS; | |
705 break; | |
706 | |
707 case ',': | |
708 ** token = '\0'; | |
709 tok = COMMA; | |
710 break; | |
711 | |
712 case '=': | |
713 ** token = '\0'; | |
714 tok = EQUAL; | |
715 break; | |
716 | |
717 case '(': | |
718 case '<': | |
719 case '[': | |
720 ** token = '\0'; | |
721 tok = LBRACK; | |
722 break; | |
723 | |
724 case ')': | |
725 case '>': | |
726 case ']': | |
727 ** token = '\0'; | |
728 tok = RBRACK; | |
729 break; | |
730 | |
731 case '"': | |
732 /* | |
733 * Get first char of string | |
734 */ | |
735 * token = dcb->nexttok; | |
736 while ((*(dcb->nexttok) != '\0') && (*(dcb->nexttok) != '"')) | |
737 { | |
738 dcb->nexttok++; | |
739 } | |
740 | |
741 if (*(dcb->nexttok) != '\0') | |
742 { | |
743 *(dcb->nexttok++) = '\0'; | |
744 } | |
745 | |
746 tok = STRING; | |
747 break; | |
748 | |
749 default: | |
750 /* | |
751 * Read an identifier | |
752 */ | |
753 while ( !cst_tok_issep (*(dcb->nexttok)) ) | |
754 { | |
755 dcb->nexttok++; | |
756 } | |
757 | |
758 dcb->lastchar = *(dcb->nexttok); | |
759 *(dcb->nexttok) = '\0'; | |
760 | |
761 if (*token == dcb->nexttok) | |
762 { | |
763 /* no characters in identifier. Error in code! */ | |
764 tok = ERROR; | |
765 } | |
766 else | |
767 { | |
768 tok = IDENT; | |
769 } | |
770 break; | |
771 } | |
772 return (tok); | |
773 } | |
774 | |
775 /* | |
776 +--------------------------------------------------------------------+ | |
777 | PROJECT : XXX MODULE : CST_PEI | | |
778 | STATE : code ROUTINE : cst_tok_issep | | |
779 +--------------------------------------------------------------------+ | |
780 | |
781 PURPOSE : Return 1 if special character. | |
782 */ | |
783 static SHORT cst_tok_issep (char c) | |
784 { | |
785 switch (c) | |
786 { | |
787 case '\0' : | |
788 case '\n' : | |
789 case ',' : | |
790 case '=' : | |
791 case '(' : | |
792 case '<' : | |
793 case '[' : | |
794 case ')' : | |
795 case '>' : | |
796 case ']' : | |
797 case '"' : return (1); | |
798 | |
799 default : return (isspace (c)); | |
800 } | |
801 } | |
802 | |
803 /* if string in tokenizer state has unprocessed tokens return 1 */ | |
804 /* | |
805 +--------------------------------------------------------------------+ | |
806 | PROJECT : XXX MODULE : CST_PEI | | |
807 | STATE : code ROUTINE : cst_tokenizer_has_more_data | | |
808 +--------------------------------------------------------------------+ | |
809 | |
810 PURPOSE : Return 1 if string in tokenizer state has unprocessed tokens. | |
811 */ | |
812 static int cst_tokenizer_has_more_data(const TOK_DCB *dcb) | |
813 { | |
814 return (dcb->nexttok != NULL); | |
815 } | |
816 | |
817 /* | |
818 +--------------------------------------------------------------------+ | |
819 | PROJECT : XXX MODULE : CST_PEI | | |
820 | STATE : code ROUTINE : cst_getbyte | | |
821 +--------------------------------------------------------------------+ | |
822 */ | |
823 | |
824 static int cst_getbyte(TOK_DCB *dcb) | |
825 { | |
826 if (dcb->nexttok) | |
827 { | |
828 return *(dcb->nexttok++); | |
829 } | |
830 else | |
831 { | |
832 return -1; | |
833 } | |
834 } | |
835 | |
836 /* | |
837 +--------------------------------------------------------------------+ | |
838 | PROJECT : XXX MODULE : CST_PEI | | |
839 | STATE : code ROUTINE : cst_gsm_parameters | | |
840 +--------------------------------------------------------------------+ | |
841 */ | |
842 | |
843 int cst_gsm_parameters(TOK_DCB *dcb) | |
844 { | |
845 unsigned char id; | |
846 char str[80]; | |
847 int i; | |
848 | |
849 // STRIP FIRST TWO DELIMITERS | |
850 { | |
851 char *tok_string; | |
852 | |
853 if (cst_tok_gettok(dcb, &tok_string) != EQUAL) | |
854 { | |
855 return (0); | |
856 } | |
857 if (cst_tok_gettok(dcb, &tok_string) != LBRACK) | |
858 { | |
859 return (0); | |
860 } | |
861 } | |
862 | |
863 // GET CONTROL ID | |
864 if ((id = cst_getbyte(dcb)) == -1) | |
865 { | |
866 // vsi_o_trace("CST", 0x08, "gsm_parameters() parser error: out of bytes"); | |
867 return (0); | |
868 } | |
869 | |
870 // STACK TRACE | |
871 else if (id == '1') | |
872 { | |
873 CST_stack_trace(); | |
874 } //end else if (id == '1') | |
875 | |
876 // Crash Me | |
877 else if (id == '2') | |
878 { | |
879 // No instruction before setting the reset vector | |
880 void (*reset_vector)() = (void (*)()) 0x3000000; | |
881 (*reset_vector)(); | |
882 } //end else if (id == '2') | |
883 #if defined (ALR) | |
884 // Print Reg Copy | |
885 else if (id == '3') | |
886 { | |
887 extern int xdump_buffer; | |
888 int *xp = &xdump_buffer; | |
889 int magic_word; | |
890 | |
891 // displays the 16 User mode 32bits registers saved on exception | |
892 // vsi_o_trace("CST", 0x08, "User mode registers [r0-r15] = ..."); | |
893 for (i=0; i<4; i++) | |
894 { | |
895 sprintf(str, "%08x %08x %08x %08x", *(xp++), *(xp++), | |
896 *(xp++), *(xp++)); | |
897 // vsi_o_trace("CST", 0x08, str); | |
898 } | |
899 | |
900 // displays the User mode CPSR saved on exception | |
901 sprintf(str, "User mode CPSR = %08x", *(xp++)); | |
902 // vsi_o_trace("CST", 0x08, str); | |
903 | |
904 // displays the magic word and the index of vector taken | |
905 magic_word = *(xp++); | |
906 sprintf(str, "Magic Word + Index of Vector = %08x", magic_word); | |
907 // vsi_o_trace("CST", 0x08, str); | |
908 | |
909 // displays the cause of the exception | |
910 magic_word &= 0x000F; | |
911 | |
912 switch (magic_word) { | |
913 | |
914 case 1: | |
915 // vsi_o_trace("CST", 0x08, "Exception: Undefined Instruction"); | |
916 break; | |
917 | |
918 case 2: | |
919 // vsi_o_trace("CST", 0x08, "Exception: Unexpected Software Interrupt"); | |
920 break; | |
921 | |
922 case 3: | |
923 // vsi_o_trace("CST", 0x08, "Exception: Abort Prefetch"); | |
924 break; | |
925 | |
926 case 4: | |
927 // vsi_o_trace("CST", 0x08, "Exception: Abort Data"); | |
928 break; | |
929 | |
930 case 5: | |
931 // vsi_o_trace("CST", 0x08, "Exception: Reserved"); | |
932 break; | |
933 | |
934 default: | |
935 break; | |
936 } | |
937 | |
938 // displays the bottom 20 words of user mode stack saved on exception | |
939 // vsi_o_trace("CST", 0x08, "Bottom 20 words of User mode stack = ..."); | |
940 for (i=0; i<5; i++) | |
941 { | |
942 sprintf(str, "%08x %08x %08x %08x", *(xp++), *(xp++), | |
943 *(xp++), *(xp++)); | |
944 // vsi_o_trace("CST", 0x08, str); | |
945 } | |
946 } //end else if (id == '3') | |
947 | |
948 // Clear Reg Copy | |
949 else if (id == '4') | |
950 { | |
951 extern int xdump_buffer; | |
952 int *xp = &xdump_buffer; | |
953 // Clears the 38 32bits registers saved on exception | |
954 for (i=0; i<38; i++) | |
955 { | |
956 *(xp+i) = 0; | |
957 } | |
958 // vsi_o_trace("CST", 0x08, "Registers Copy cleared ..."); | |
959 } //end else if (id == '4') | |
960 #endif | |
961 #if (OP_WCP == 1) | |
962 #if (WCP_PROF == 1) | |
963 // Enable/disable MC profiler | |
964 else if (id == '5') | |
965 { | |
966 PR_EnableProfiler(0); | |
967 } | |
968 else if (id == '6') | |
969 { | |
970 PR_EnableProfiler(1); | |
971 power_down_config(0, 0x5ff); // disable sleep, which interferes with profiler | |
972 } | |
973 | |
974 // Enable/disable CPU Meter | |
975 else if (id == '7') | |
976 { | |
977 PR_EnableCpuMeter(0); | |
978 } | |
979 else if (id == '8') | |
980 { | |
981 PR_EnableCpuMeter(1); | |
982 power_down_config(0, 0x5ff); // disable sleep, which interferes with CPU meter | |
983 } | |
984 #endif | |
985 #endif | |
986 | |
987 // STRIP LAST DELIMITER | |
988 { | |
989 char *tok_string; | |
990 | |
991 if (cst_tok_gettok(dcb, &tok_string) != RBRACK) | |
992 { | |
993 return (0); | |
994 } | |
995 } | |
996 } // end cst_gsm_parameters | |
997 | |
998 /* | |
999 * Reach here if unexpected event occurs (e.g. Undefined instruction, Abort, | |
1000 * out of memory); choose whether to restart or stay in datadump mode to find | |
1001 * out cause of problem | |
1002 */ | |
1003 void exception_handler(void) | |
1004 { | |
1005 void (*jump_address)() = (void (*)()) ((unsigned)0x0); | |
1006 | |
1007 (*jump_address)(); | |
1008 } |