comparison src/cs/services/cst/cst_exts.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children fa22012c4a39
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1 /*
2 +--------------------------------------------------------------------+
3 | PROJECT: GSM-F&D (8411) $Workfile:: CST_EXTS.C $|
4 | $Author:: Sa $ CONDAT GmbH $Revision:: 7 $|
5 | CREATED: 03.08.99 $Modtime:: 14.02.00 16:06 $|
6 | STATE : code |
7 +--------------------------------------------------------------------+
8
9
10 MODULE : CST_EXTS
11
12 PURPOSE : This Modul defines the custom specific AT commands
13 */
14
15 #ifndef CST_EXTS_C
16 #define CST_EXTS_C
17 #endif
18
19
20 #include "config/swconfig.cfg"
21 #include "config/chipset.cfg"
22 #include "config/l1sw.cfg"
23
24
25
26 #define ENTITY_CST
27 /*==== INCLUDES ===================================================*/
28
29 #include <stdlib.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include "typedefs.h"
33 #include "m_sms.val"
34 #include "m_fac.h"
35 #include "p_mnsms.h"
36 #include "p_mmreg.h"
37 #include "p_mncc.h"
38 #include "aci_cmh.h"
39 #include "vsi.h"
40 #include "gsm.h"
41 #include "p_cst.h"
42 #include "cst/cst.h"
43 #include "custom.h"
44
45 #ifdef ALR
46 #include "main/sys_ver.h"
47 #endif
48
49 /*==== MELODY TEST ==================================================*/
50
51 #define MELODY_E1 0
52
53 extern void enable_tch_vocoder(BOOL vocoder);
54
55 #if (MELODY_E1)
56 extern void audio_melo_e1_demo1_start(void);
57 extern void audio_melo_e1_demo1_stop(void);
58 extern void audio_melo_e1_demo2_start(void);
59 extern void audio_melo_e1_demo2_stop(void);
60 #endif
61
62 #if (MELODY_E2)
63 extern void audio_melo_e2_load_lsi(void);
64 extern void audio_melo_e2_demo1_start(void);
65 extern void audio_melo_e2_demo1_stop(void);
66 extern void audio_melo_e2_demo2_start(void);
67 extern void audio_melo_e2_demo2_stop(void);
68 #endif
69
70
71
72 /*==== CONSTANTS ==================================================*/
73
74 #define EXT_ATD "EXT: D, I"
75 #define EXT_ATCFUN "EXT: +CFUN, I"
76 #define EXT_ATCOPS_START "EXT: +COPS, I"
77 #define EXT_ATCOPS_STOP "EXT: +COPS, O"
78 #define EXT_ENTER "EXT: I"
79 #define EXT_LEAVE "EXT: O"
80 #define EXT_UNEXPCTD "EXT: E"
81
82 #define EXT_DIAL_VOICE_PASS "DVCP"
83
84 #define EXT_MAX_BUF_LEN 41
85
86 #define EXT_VOICE_DELIMITER ';'
87
88 /*==== EXPORT =====================================================*/
89
90 /*==== TYPES ======================================================*/
91
92 #ifndef WIN32
93 extern USHORT IQ_GetBuild(void);
94 #ifndef ALR
95 extern USHORT IQ_GetPoleStarVersion(void);
96 #endif
97 extern USHORT IQ_GetJtagId(void);
98 extern USHORT IQ_GetRevision(void);
99 extern void l1dmacro_init_hw(void);
100
101 extern BOOL SER_WriteConfig (char *new_config,
102 BOOL write_to_flash);
103 extern BOOL SER_ImmediateSwitch (void);
104 #endif
105
106 LOCAL CHAR* percentCFG ( CHAR* cmd );
107 LOCAL CHAR* percentDBG ( CHAR* cmd );
108 LOCAL void ext_LeaveEXT ( BOOL final );
109 LOCAL void ext_CreatePString ( CHAR* buffer,
110 CHAR* text );
111 GLOBAL void ext_ContinueTest ( CHAR* id );
112
113 /*==== VARIABLES ==================================================*/
114
115 LOCAL CHAR* extCmd; /* remaining unparsed command string, */
116 /* will be needed in case of asynchronous */
117 /* command handling */
118 LOCAL USHORT extCmdLen; /* length of command string, will be */
119 /* needed in case of asynchronous */
120 /* command handling */
121 LOCAL CHAR extBuffer[EXT_MAX_BUF_LEN]; /* outbut buffer */
122
123 LOCAL CHAR extDialNum[MAX_PHB_NUM_LEN];
124 /* number to be dialled during testing */
125 GLOBAL SHORT extCallId = ACI_NumParmNotPresent;
126 /* identifier of the call which was */
127 /* set-up using AT extension mechansim */
128 GLOBAL T_ACI_AT_CMD currExtCmd = AT_CMD_NONE;
129 /* used for indicating asynchronous */
130 /* command handling */
131 LOCAL T_ACI_AT_CMD currAbrtCmd = AT_CMD_NONE;
132 /* used for indicating abort of */
133 /* asynchronous command handling */
134
135 /*==== FUNCTIONS ==================================================*/
136
137 USHORT * csf_return_adc (void);
138
139 /*
140 +--------------------------------------------------------------------+
141 | PROJECT : GSM-PS (8403) MODULE : TIL_CSF |
142 | STATE : code ROUTINE : cmh_show_version |
143 +--------------------------------------------------------------------+
144
145 PURPOSE : Trace Layer 1 DSP version numbers
146
147 */
148
149 #ifndef WIN32
150
151
152 static void jtagid_to_chipset (USHORT jtagid, CHAR *chipset)
153 {
154
155 switch (jtagid) {
156
157 case 0xB268:
158
159 strcpy (chipset, "Hercules");
160 break;
161
162 case 0xB2B5:
163
164 strcpy (chipset, "Ulysse 1Mbits rev. B");
165 break;
166
167 case 0xB335:
168
169 strcpy (chipset, "Ulysse 1Mbits rev. A");
170 break;
171
172 case 0xB334:
173
174 strcpy (chipset, "Ulysse 2Mbits");
175 break;
176
177 case 0xB393:
178
179 strcpy (chipset, "Ulysse G1");
180 break;
181
182
183 case 0xB396:
184
185 strcpy (chipset, "Calypso rev. B");
186 break;
187
188 case 0xB2AC:
189
190 // Samson and Calypso rev. A share the same JTAG ID.
191 #if (CHIPSET != 7)
192 strcpy (chipset, "Samson");
193 #else
194 strcpy (chipset, "Calypso rev. A");
195 #endif
196 break;
197
198 case 0xB217:
199
200 strcpy (chipset, "Ulysse C035");
201 break;
202
203 case 0xB496:
204
205 strcpy (chipset, "Calypso C035");
206 break;
207
208 case 0xB4FB:
209
210 strcpy (chipset, "Calypso Lite C035");
211 break;
212
213 default:
214
215 strcpy (chipset, "Unknown");
216 break;
217 }
218 }
219
220 GLOBAL void cmh_show_version (
221 CHAR *command,
222 USHORT *len,
223 CHAR *output
224 )
225 {
226 #ifndef ALR
227 CHAR buf[80];
228 USHORT build, hw, rev;
229 #else
230 CHAR buf[160];
231 CHAR chipset[25];
232 #endif
233 USHORT jtag;
234 UCHAR size;
235
236 /*
237 * Retrieve hardware JTAG ID info
238 */
239 jtag = IQ_GetJtagId();
240
241 #ifndef ALR
242 /*
243 * Retrieve others hardware info and build from library
244 */
245 build = IQ_GetBuild();
246 hw = IQ_GetPoleStarVersion();
247 rev = IQ_GetRevision();
248
249 sprintf (buf, "Build %d, Silicon Revision %04X/%04X/%04X",
250 build, hw, jtag, rev);
251 #else
252
253 /*
254 * Retrieve CHIPSET name from JTAG ID
255 */
256 jtagid_to_chipset (jtag, chipset);
257
258 sprintf (buf,
259 "Chipset Version:\n\r\t%s\n\rS/W Versions:\n\n\r\tLayer1\t%4X_%3X\n\r\tLayer2-3 %3XBERLIN_S420\n\r\tNICE\t %3X_I64",
260 chipset,
261 OFFICIAL_VERSION,
262 INTERNAL_VERSION,
263 G23VERSION,
264 SYSTEMVERSION);
265 #endif
266
267 // Format output as a list of Pascal-like strings
268 size = strlen(buf);
269 output[0] = size;
270 strcpy(&(output[1]), buf);
271 output[size+1] = (CHAR) 0xFF; // terminate list of strings
272 }
273
274 #endif /* #ifndef WIN32 */
275
276
277
278 /*
279 +--------------------------------------------------------------------+
280 | PROJECT : GSM-PS (8403) MODULE : TIL_CSF |
281 | STATE : code ROUTINE : show_adc_conversion |
282 +--------------------------------------------------------------------+
283
284 PURPOSE : Trace Layer 1 AD conversions results
285
286 */
287
288 GLOBAL void show_adc_conversion (CHAR *output)
289 {
290 USHORT * adc_conversion;
291 #ifdef ALR
292 CHAR buf[160];
293 #else
294 CHAR buf[80];
295 #endif
296 UCHAR size;
297
298 adc_conversion = csf_return_adc ();
299 #if 1 /* FreeCalypso change */
300 sprintf (buf, "VBAT=%u, VCHG=%u, ICHG=%u, VBACKUP=%u, ADIN1=%u, ADIN2=%u, ADIN3=%u, RFTEMP=%u, ADIN5=%u",
301 adc_conversion[0], adc_conversion[1], adc_conversion[2],
302 adc_conversion[3], adc_conversion[4], adc_conversion[5],
303 adc_conversion[6], adc_conversion[7], adc_conversion[8]);
304 #elif defined(ALR)
305 sprintf (buf, "ADC 0 = %x, ADC 1 = %x, ADC 2 = %x, ADC 3 = %x, ADC 4 = %x, ADC 5 = %x, ADC 6 = %x, ADC 7 = %x, ADC 8 = %x",
306 *adc_conversion++, *adc_conversion++, *adc_conversion++,
307 *adc_conversion++, *adc_conversion++, *adc_conversion++,
308 *adc_conversion++, *adc_conversion++, *adc_conversion);
309 #else
310 sprintf (buf, "ADC 0 = %x, ADC 1 = %x, ADC 2 = %x, ADC 3 = %x, ADC 4 = %x",
311 *adc_conversion++, *adc_conversion++, *adc_conversion++,
312 *adc_conversion++, *adc_conversion);
313 #endif
314
315 // Format output as a list of Pascal-like strings
316 size = strlen(buf);
317 output[0] = size;
318 strcpy(&(output[1]), buf);
319 output[size+1] = (CHAR) 0xFF; // terminate list of strings
320 }
321
322
323 /*
324 +--------------------------------------------------------------------+
325 | PROJECT : GSM-PS (8403) MODULE : CST_EXTS |
326 | STATE : code ROUTINE : AEC_Enable |
327 +--------------------------------------------------------------------+
328
329 PURPOSE : activate the Acoustic Echo Cancelation
330
331 */
332
333 GLOBAL void AEC_Enable (CHAR *command, CHAR *output)
334 {
335
336 /* -------------------------------------------------------------------------- */
337 /* MMI_AEC_REQ : 0283 = Long AEC, 105 = SPENH, 187 = AEC+SPENH, 1 = STOP */
338 /* aec_control register bits | 0 0 Sa t2|t1 g3 g2 g1|g0 e2 e1 ak| */
339 /* bit 0 : ACK bit : set to 1 in order to warn DSP that a new command */
340 /* is present. */
341 /* bit 1 : enable AEC */
342 /* bit 2 : enable SPENH (= Speech Enhancement = noise reduction) */
343 /* bit 3 : additionnal AEC gain attenuation (lsb) */
344 /* bit 4 : additionnal AEC gain attenuation (msb) */
345 /* bit 5 : additionnal SPENH gain attenuation (lsb) */
346 /* bit 6 : additionnal SPENH gain attenuation (msb) */
347 /* bit 7 : reset trigger for AEC */
348 /* bit 8 : reset trigger for SPENH */
349 /* bit 9 : AEC selector 0 : short AEC, 1 : long AEC */
350 /* */
351 /* for Short AEC 0083 */
352 /* for long AEC 0283 */
353 /* for long AEC -6 dB 028B */
354 /* for long AEC -12 dB 0293 */
355 /* for long AEC -18 dB 029B */
356 /* for SPENH 0105 */
357 /* for SPENH -6 dB 0125 */
358 /* for SPENH -12 dB 0145 */
359 /* for SPENH -18 dB 0165 */
360 /* for BOTH 0187 */
361 /* for STOP ALL 0001 (all bits reset + ACK to 1 to warn the DSP) */
362 /* -------------------------------------------------------------------------- */
363
364
365 command++; /* increment command pointer to point on the hexa value of the command */
366
367
368 if (!strncmp(command, "0083", 4))
369 {
370 output[0] = strlen ("Short AEC is active");
371 memcpy (&output[1], "Short AEC is active", 19);
372
373 /* end of string list */
374 output [20] = (CHAR) 0xff;
375 csf_aec_enable(0x0083);
376 }
377
378 else if (!strncmp(command, "0283", 4))
379 {
380 output[0] = strlen ("Long AEC is active");
381 memcpy (&output[1], "Long AEC is active", 18);
382
383 /* end of string list */
384 output [19] = (CHAR) 0xff;
385 csf_aec_enable(0x0283);
386 }
387
388 else if (!strncmp(command, "028B", 4))
389 {
390 output[0] = strlen ("Long AEC -6 dB is active");
391 memcpy (&output[1], "Long AEC -6 dB is active", 24);
392
393 /* end of string list */
394 output [25] = (CHAR) 0xff;
395 csf_aec_enable(0x028B);
396 }
397
398 else if (!strncmp(command, "0293", 4))
399 {
400 output[0] = strlen ("Long AEC -12 dB is active");
401 memcpy (&output[1], "Long AEC -12 dB is active", 25);
402
403 /* end of string list */
404 output [26] = (CHAR) 0xff;
405 csf_aec_enable(0x0293);
406 }
407
408 else if (!strncmp(command, "029B", 4))
409 {
410 output[0] = strlen ("Long AEC -18 dB is active");
411 memcpy (&output[1], "Long AEC -18 dB is active", 25);
412
413 /* end of string list */
414 output [26] = (CHAR) 0xff;
415 csf_aec_enable(0x029B);
416 }
417
418 else if (!strncmp(command, "0105", 4))
419 {
420 output[0] = strlen ("Noise reduction is active");
421 memcpy (&output[1], "Noise reduction is active", 25);
422
423 /* end of string list */
424 output [26] = (CHAR) 0xff;
425 csf_aec_enable(0x0105);
426 }
427
428 else if (!strncmp(command, "0125", 4))
429 {
430 output[0] = strlen ("Noise reduction -6 dB is active");
431 memcpy (&output[1], "Noise reduction -6 dB is active", 31);
432
433 /* end of string list */
434 output [32] = (CHAR) 0xff;
435 csf_aec_enable(0x0125);
436 }
437
438 else if (!strncmp(command, "0145", 4))
439 {
440 output[0] = strlen ("Noise reduction -12 dB is active");
441 memcpy (&output[1], "Noise reduction -12 dB is active", 32);
442
443 /* end of string list */
444 output [33] = (CHAR) 0xff;
445 csf_aec_enable(0x0145);
446 }
447
448 else if (!strncmp(command, "0165", 4))
449 {
450 output[0] = strlen ("Noise reduction -18 dB is active");
451 memcpy (&output[1], "Noise reduction -18 dB is active", 32);
452
453 /* end of string list */
454 output [33] = (CHAR) 0xff;
455 csf_aec_enable(0x0165);
456 }
457
458 else if (!strncmp(command, "0187", 4))
459 {
460 output[0] = strlen ("Both AEC and Noise reduction are active");
461 memcpy (&output[1], "Both AEC and Noise reduction are active", 39);
462
463 /* end of string list */
464 output [40] = (CHAR) 0xff;
465 csf_aec_enable(0x0187);
466 }
467
468 else if (!strncmp(command, "0001", 4))
469 {
470 output[0] = strlen ("AEC and Noise reduction are unactivated");
471 memcpy (&output[1], "AEC and Noise reduction are unactivated", 39);
472
473 /* end of string list */
474 output [40] = (CHAR) 0xff;
475 csf_aec_enable(0x0001);
476 }
477
478 else
479 {
480 output[0] = strlen ("Bad AT command");
481 memcpy (&output[1], "Bad AT command", 14);
482
483 /* end of string list */
484 output [15] = (CHAR) 0xff;
485 }
486
487 }
488
489
490
491
492 /*
493 +--------------------------------------------------------------------+
494 | PROJECT : GSM-PS (6147) MODULE : CST_EXTS |
495 | STATE : code ROUTINE : rAT_EXT |
496 +--------------------------------------------------------------------+
497
498 PURPOSE : This function is called by the interpreter part of the
499 ACI in case of the detection of an unknown command.
500
501 <cmd> : remaining unparsed command string.
502 <cmdLen> : length of command string. This value must be
503 incremented by the amount of parsed characters
504 by this function.
505 <out> : this parameter can be used to display some
506 strings at the AT command interface.
507 The first char of one string must contain
508 the length of the following string. The
509 special length 0xff must be used to define
510 the end of the string list.
511 <outLen> : maximum length of output buffer referenced
512 by parameter <out>.
513
514 */
515
516 GLOBAL T_ACI_RETURN rAT_EXT (
517 CHAR* cmd,
518 USHORT* cmdLen,
519 CHAR* out,
520 USHORT outLen
521 )
522 {
523 /*
524 * store command string in case it will be needed later on, when
525 * result code of this function is equal to AT_EXCT
526 */
527 extCmd = cmd;
528 extCmdLen = *cmdLen;
529
530 /*
531 * example how to send an unsolicited result code via the AT interface
532 */
533 ext_CreatePString ( extBuffer, EXT_ENTER );
534
535 sAT_URC ( extBuffer );
536
537 /*
538 * example how to process the command AT%H
539 */
540 if (*cmd == '%')
541 {
542 cmd++;
543
544 switch (*cmd)
545 {
546 case 'A':
547 /*
548 * Display AD conversions results
549 */
550 *cmdLen -= 2;
551 show_adc_conversion(out);
552 return( AT_CMPL );
553
554 case 'C':
555 case 'c':
556 case 'D':
557 case 'd':
558 {
559 CHAR* nextCmd;
560
561 *cmdLen -= 2;
562
563 switch ( *cmd )
564 {
565 case 'C':
566 case 'c':
567 /* dynamic configuration via AT command interface */
568 nextCmd = percentCFG ( ++cmd );
569
570 break;
571
572 case 'D':
573 case 'd':
574 /* set debug pin for reset purposes */
575 nextCmd = percentDBG ( ++cmd );
576
577 break;
578 }
579
580 *out = ( CHAR ) 0xFF;
581
582 if ( nextCmd EQ NULL )
583 {
584 return ( AT_FAIL );
585 }
586 else
587 {
588 *cmdLen -= ( nextCmd - cmd );
589
590 return ( AT_CMPL );
591 }
592 }
593
594 case 'N':
595 /*
596 * Enables the AEC by sending a primitive to L1A
597 */
598 *cmdLen -= 6;
599 AEC_Enable(cmd, out);
600 return( AT_CMPL );
601
602 //---------------------------------------------------------------------------//
603 // Added by Matthieu Vanin for the test of melody E2/E1
604 //---------------------------------------------------------------------------//
605
606
607
608 // End
609 //---------------------------------------------------------------------------//
610 case 'S':
611 case 's':
612 {
613 cmd++;
614
615 switch (*cmd) {
616
617 case 'e':
618 case 'E':
619 /* 's''e' already detected => assume the command is at%ser. */
620 {
621 cmd += 3; /* Discard the following characters */
622 *cmdLen -= 9;
623 if (SER_WriteConfig (cmd, (BOOL) (*(cmd + 3) - '0')))
624 return( AT_CMPL );
625 else
626 return( AT_FAIL );
627 }
628
629 case 'w':
630 case 'W':
631 /* 's''w' already detected => assume the command is at%switch. */
632 {
633 *cmdLen -= 7;
634 if (SER_ImmediateSwitch())
635 return( AT_CMPL );
636 else
637 return( AT_FAIL );
638 }
639
640 case 'l':
641 case 'L':
642 /* 's''l' already detected => assume the command is at%sleep. */
643 {
644 cmd += 5; /* Discard the following characters */
645 *cmdLen -= 8;
646 /*
647 * Checks if the parameter is valid:
648 * 0 -> NO_SLEEP
649 * 1 -> SMALL_SLEEP
650 * 2 -> BIG_SLEEP
651 * 3 -> DEEP_SLEEP
652 * 4 -> ALL_SLEEP
653 * 5 -> BIG_SMALL_SLEEP
654 */
655
656 if (((*cmd - '0') >= 0) && ((*cmd - '0') <= 5))
657 {
658 power_down_config ((UBYTE) (*cmd - '0'), UWIRE_CLK_CUT);
659 return( AT_CMPL );
660 }
661 else
662 return( AT_FAIL );
663 }
664
665 default:
666 *cmdLen -= 2;
667 return ( AT_FAIL );
668
669 }
670 }
671
672 case 'H':
673 *cmdLen -= 2;
674
675 /*
676 * here you can perform some actions with drivers etc.
677 */
678
679 /*
680 * and create some additional output at the AT interface
681 * The strings:
682 *"Hello"
683 *""
684 *"World"
685 * will be displayed at the terminal.
686 *
687 * first string Hello
688 */
689 out[0] = strlen ("Hello");
690 memcpy (&out[1], "Hello", 5);
691 /*
692 * add a spare line with an empty string
693 */
694 out [6] = 0;
695 /*
696 * second string World
697 */
698 out [7] = strlen ("World");
699 memcpy (&out[8], "World", 5);
700
701 /*
702 * end of string list
703 */
704 out [13] = (CHAR) 0xff;
705 return( AT_CMPL );
706
707 #ifndef WIN32
708 case 'R':
709 case 'r':
710 *cmdLen -= 2;
711 l1dmacro_init_hw();
712 out[0] = 0;
713 out[1] = (CHAR) 0xFF;
714 return( AT_CMPL );
715 #endif
716
717 #ifndef WIN32
718 case 'V':
719 case 'v':
720 *cmdLen -= 2;
721
722 /*
723 * Display version numbers
724 */
725
726 cmh_show_version (cmd, cmdLen, out);
727 return( AT_CMPL );
728 #endif
729 #if defined (ALR)
730 case 'T':
731 case 't':
732 /*
733 * Enables RTC or AUDIO tests
734 */
735 cmd++;
736 *cmdLen -= 3;
737 if (!strncmp(cmd, "A", 1) || !strncmp(cmd, "a", 1))
738 {
739 //audio_test_misc();
740 out[0] = 22;
741 memcpy (&out[1], "Performing Audio Tests", 22);
742 out [23] = (CHAR) 0xff;
743 }
744 else
745 {
746 if (!strncmp(cmd, "R", 1) || !strncmp(cmd, "r", 1))
747 {
748 //rtc_test_misc();
749 out[0] = 20;
750 memcpy (&out[1], "Performing RTC Tests", 20);
751 out [21] = (CHAR) 0xff;
752 }
753 else
754 return( AT_FAIL );
755 }
756 return( AT_CMPL );
757 #endif
758 default:
759 *cmdLen -= 2;
760 return ( AT_FAIL );
761 }
762 }
763 else if ( *cmd EQ 'D' )
764 {
765 T_ACI_RETURN rslt;
766
767 /*
768 * this is only a test implementation. As soon as a "ATD" command
769 * string is detected in the AT interpreter and the mobile is not
770 * yet registered (neither limited nor full service is availbale)
771 * this function is called. Then instead of dialling immediately
772 * an activation of the mobile is performed in advance.
773 */
774 strncpy ( extDialNum, cmd + 1, MINIMUM ( MAX_PHB_NUM_LEN - 1,
775 *cmdLen - 1 ) );
776 extDialNum[MINIMUM ( MAX_PHB_NUM_LEN - 1, *cmdLen - 1 )] = '\0';
777
778 extCmdLen = 0;
779 *cmdLen = 0;
780
781 rslt = sAT_PlusCFUN ( CMD_SRC_LCL,
782 CFUN_FUN_Full,
783 CFUN_RST_NotPresent );
784
785 if ( rslt EQ AT_EXCT )
786 {
787 /*
788 * generate some output at the AT interface
789 */
790 ext_CreatePString ( out, EXT_ATCFUN );
791
792 /*
793 * indicating that an extended AT command is still in progress
794 */
795 currExtCmd = AT_CMD_CFUN;
796 }
797 else
798 {
799 ext_LeaveEXT ( TRUE );
800 rCI_PlusCME ( AT_CMD_EXT, CME_ERR_Unknown );
801 }
802
803 return ( rslt );
804 }
805 else
806 return( AT_FAIL );
807 }
808
809 /*
810 +--------------------------------------------------------------------+
811 | PROJECT : GSM-PS (6147) MODULE : CST_EXTS |
812 | STATE : code ROUTINE : percentCFG |
813 +--------------------------------------------------------------------+
814
815 PURPOSE : %CFG command (enables dynamic configuration of the
816 protocol stack using the AT command interface)
817 */
818
819 EXTERN char *parse (char *b, char *f, ...);
820
821 GLOBAL SHORT cc_pei_config (char * inString,
822 char * outString);
823 GLOBAL SHORT cst_pei_config (char * inString,
824 char * outString);
825 GLOBAL SHORT dl_pei_config (char * inString,
826 char * outString);
827 GLOBAL SHORT mm_pei_config (char * inString,
828 char * outString);
829 GLOBAL SHORT rr_pei_config (char * inString,
830 char * outString);
831 GLOBAL SHORT sim_pei_config (char * inString,
832 char * outString);
833 GLOBAL SHORT sms_pei_config (char * inString,
834 char * outString);
835 GLOBAL SHORT ss_pei_config (char * inString,
836 char * outString);
837 GLOBAL SHORT pl_pei_config (char * inString,
838 char * outString);
839
840 #ifdef FAX_AND_DATA
841 GLOBAL SHORT fad_pei_config (char * inString,
842 char * outString);
843 GLOBAL SHORT l2r_pei_config (char * inString,
844 char * outString);
845 GLOBAL SHORT ra_pei_config (char * inString,
846 char * outString);
847 GLOBAL SHORT rlp_pei_config (char * inString,
848 char * outString);
849 GLOBAL SHORT t30_pei_config (char * inString,
850 char * outString);
851 #endif
852
853 GLOBAL CHAR* percentCFG ( CHAR* cl )
854 {
855 CHAR entity[5];
856 CHAR config[40];
857 CHAR dummy;
858
859 TRACE_FUNCTION ( "percentCFG()" );
860
861 switch ( *cl )
862 {
863 case('='):
864 {
865 cl++;
866
867 cl = parse ( cl, "ss", ( LONG )sizeof(entity), entity,
868 ( LONG )sizeof(config), config );
869
870 if( !cl OR
871 *entity EQ '\0' OR
872 *config EQ '\0' )
873 {
874 return ( NULL );
875 }
876
877 break;
878 }
879
880 default:
881 {
882 return ( NULL );
883 }
884 }
885
886 if ( strcmp ( entity, CC_NAME ) EQ 0 )
887 {
888 cc_pei_config ( config, &dummy );
889 }
890 else if ( strcmp ( entity, CST_NAME ) EQ 0 )
891 {
892 cst_pei_config ( config, &dummy );
893 }
894 else if ( strcmp ( entity, DL_NAME ) EQ 0 )
895 {
896 dl_pei_config ( config, &dummy );
897 }
898 else if ( strcmp ( entity, MM_NAME ) EQ 0 )
899 {
900 mm_pei_config ( config, &dummy );
901 }
902 else if ( strcmp ( entity, RR_NAME ) EQ 0 )
903 {
904 rr_pei_config ( config, &dummy );
905 }
906 else if ( strcmp ( entity, SIM_NAME ) EQ 0 )
907 {
908 sim_pei_config ( config, &dummy );
909 }
910 else if ( strcmp ( entity, SMS_NAME ) EQ 0 )
911 {
912 sms_pei_config ( config, &dummy );
913 }
914 else if ( strcmp ( entity, SS_NAME ) EQ 0 )
915 {
916 ss_pei_config ( config, &dummy );
917 }
918 else if ( strcmp ( entity, PL_NAME ) EQ 0 )
919 {
920 pl_pei_config ( config, &dummy );
921 }
922
923 #ifdef FAX_AND_DATA
924
925 else if ( strcmp ( entity, FAD_NAME ) EQ 0 )
926 {
927 fad_pei_config ( config, &dummy );
928 }
929 else if ( strcmp ( entity, L2R_NAME ) EQ 0 )
930 {
931 l2r_pei_config ( config, &dummy );
932 }
933 else if ( strcmp ( entity, RA_NAME ) EQ 0 )
934 {
935 ra_pei_config ( config, &dummy );
936 }
937 else if ( strcmp ( entity, RLP_NAME ) EQ 0 )
938 {
939 rlp_pei_config ( config, &dummy );
940 }
941 else if ( strcmp ( entity, T30_NAME ) EQ 0 )
942 {
943 t30_pei_config ( config, &dummy );
944 }
945
946 #endif
947
948 else
949 {
950 return ( NULL );
951 }
952
953 return ( cl );
954 }
955
956 /*
957 +--------------------------------------------------------------------+
958 | PROJECT : GSM-PS (6147) MODULE : CST_EXTS |
959 | STATE : code ROUTINE : percentDBG |
960 +--------------------------------------------------------------------+
961
962 PURPOSE : %RST command (simulates pressing the reset button
963 of the ASample)
964 */
965
966 #ifndef TRACE_PORT_TIMING
967 #ifdef _TMS470
968 #if (CHIPSET == 0)
969 EXTERN void l1s_set_debug_pin ( UBYTE, UBYTE );
970 #endif
971 #endif
972 #endif
973
974 GLOBAL CHAR* percentDBG ( CHAR* cl )
975 {
976 SHORT line = 1;
977 SHORT polarity = 1;
978 SHORT delay = 650;
979
980 TRACE_FUNCTION ( "atPercentDBG()" );
981
982 switch ( *cl )
983 {
984 case( '\0' ):
985 {
986 break;
987 }
988
989 case('='):
990 {
991 cl++;
992
993 cl = parse ( cl, "rrr", &line, &polarity, &delay );
994
995 if( !cl OR
996 polarity < 0 OR polarity > 1 OR
997 line < 0 OR line > 7 OR
998 delay < 0 )
999 {
1000 return ( NULL );
1001 }
1002
1003 break;
1004 }
1005
1006 default:
1007 {
1008 return ( NULL );
1009 }
1010 }
1011
1012 #ifndef TRACE_PORT_TIMING
1013 #ifdef _TMS470
1014 #if (CHIPSET == 0)
1015 #if defined (NEW_FRAME)
1016 vsi_t_sleep ( VSI_CALLER ( T_TIME ) delay );
1017 #else
1018 vsi_t_sleep ( VSI_CALLER ( T_VSI_TVALUE ) delay );
1019 #endif
1020
1021 l1s_set_debug_pin ( ( UBYTE ) line, ( UBYTE ) polarity );
1022 #endif
1023 #endif
1024 #endif
1025
1026 return ( cl );
1027 }
1028
1029 /*
1030 +--------------------------------------------------------------------+
1031 | PROJECT : GSM-PS (6147) MODULE : CMH_EXTS |
1032 | STATE : code ROUTINE : rAT_ACP |
1033 +--------------------------------------------------------------------+
1034
1035 PURPOSE : This function is called by the interpreter part of the
1036 ACI in case of aborting a pending extension command.
1037
1038 <out> : this parameter can be used to display some
1039 strings at the AT command interface.
1040 The first char of one string must contain
1041 the length of the following string. The
1042 special length 0xff must be used to define
1043 the end of the string list.
1044 <outLen> : maximum length of output buffer referenced
1045 by parameter <out>.
1046
1047 */
1048
1049 GLOBAL T_ACI_RETURN rAT_ACP (
1050 CHAR* out,
1051 USHORT outLen
1052 )
1053 {
1054 T_ACI_RETURN rslt = AT_CMPL;
1055
1056 /* call the abort function if necessary */
1057 if ( currExtCmd NEQ AT_CMD_NONE )
1058 rslt = sAT_Abort (CMD_SRC_LCL, currExtCmd );
1059
1060 switch ( rslt )
1061 {
1062 case ( AT_CMPL ):
1063 {
1064 currExtCmd = AT_CMD_NONE;
1065
1066 ext_LeaveEXT ( TRUE );
1067 }
1068 break;
1069
1070 case ( AT_EXCT ):
1071 {
1072 currExtCmd = AT_CMD_ABRT;
1073 }
1074 break;
1075
1076 default:
1077 {
1078 /* do nothing */
1079 }
1080 break;
1081 }
1082
1083 return rslt;
1084 }
1085
1086 /*
1087 +--------------------------------------------------------------------+
1088 | PROJECT : GSM-PS (6147) MODULE : CMH_EXTS |
1089 | STATE : code ROUTINE : ext_OK |
1090 +--------------------------------------------------------------------+
1091
1092 PURPOSE : This function is called by the MMI in case the positive
1093 result of the asynchronous command handling is available.
1094
1095 <cmdId>: command identity
1096
1097 */
1098 GLOBAL void ext_OK ( T_ACI_AT_CMD cmdId )
1099 {
1100 T_ACI_RETURN rslt;
1101
1102 if ( cmdId EQ AT_CMD_CFUN AND currAbrtCmd EQ AT_CMD_NONE )
1103 {
1104 rslt = sAT_PlusCOPS ( CMD_SRC_LCL,
1105 COPS_MOD_Auto,
1106 COPS_FRMT_NotPresent,
1107 NULL );
1108
1109 if ( rslt EQ AT_EXCT )
1110 {
1111 /*
1112 * generate some output at the AT interface
1113 */
1114 ext_CreatePString ( extBuffer, EXT_ATCOPS_START );
1115
1116 sAT_URC ( extBuffer );
1117
1118 /*
1119 * indicating that an extended AT command is still in progress
1120 */
1121 currExtCmd = AT_CMD_COPS;
1122 }
1123 else
1124 {
1125 ext_LeaveEXT ( TRUE );
1126 rCI_PlusCME ( AT_CMD_EXT, CME_ERR_Unknown );
1127 }
1128 }
1129 else if ( cmdId EQ AT_CMD_COPS AND currAbrtCmd EQ AT_CMD_NONE )
1130 {
1131 currExtCmd = AT_CMD_NONE;
1132
1133 /*
1134 * generate some output at the AT interface
1135 */
1136 ext_CreatePString ( extBuffer, EXT_ATCOPS_STOP );
1137
1138 sAT_URC ( extBuffer );
1139
1140 #ifndef WIN32
1141 ext_ContinueTest ( EXT_DIAL_VOICE_PASS );
1142 #endif
1143 }
1144 else if ( cmdId EQ AT_CMD_D AND currAbrtCmd EQ AT_CMD_NONE )
1145 {
1146 extCallId = 1;
1147
1148 ext_LeaveEXT ( TRUE );
1149 rCI_OK ( AT_CMD_EXT );
1150 }
1151 else if ( currAbrtCmd NEQ AT_CMD_NONE )
1152 {
1153 currAbrtCmd = AT_CMD_NONE;
1154
1155 ext_LeaveEXT ( TRUE );
1156 rCI_OK ( AT_CMD_EXT );
1157 }
1158 else
1159 {
1160 /*
1161 * generate some output at the AT interface
1162 */
1163 ext_CreatePString ( extBuffer, EXT_UNEXPCTD );
1164
1165 sAT_URC ( extBuffer );
1166 }
1167 }
1168
1169 /*
1170 +--------------------------------------------------------------------+
1171 | PROJECT : GSM-PS (6147) MODULE : CMH_EXTS |
1172 | STATE : code ROUTINE : ext_LeaveExtension |
1173 +--------------------------------------------------------------------+
1174
1175 PURPOSE : This function is called in case the extensin mechansim
1176 should be left finally.
1177
1178 <final>: indicates whether final result code should be
1179 sent explicitly
1180
1181 */
1182 LOCAL void ext_LeaveEXT ( BOOL final )
1183 {
1184 /*
1185 * generate some output at the AT interface
1186 */
1187 ext_CreatePString ( extBuffer, EXT_LEAVE );
1188
1189 /*
1190 * indicating that no extended AT command is still in progress
1191 */
1192 currExtCmd = AT_CMD_NONE;
1193
1194 /*
1195 * indicate end of extended command handling to the AT interpreter
1196 */
1197 sAT_URC ( extBuffer );
1198
1199 if ( final )
1200 {
1201 sAT_FRI ( extCmdLen );
1202 }
1203 }
1204
1205 /*
1206 +--------------------------------------------------------------------+
1207 | PROJECT : GSM-PS (6147) MODULE : CMH_EXTS |
1208 | STATE : code ROUTINE : ext_ContinueTest |
1209 +--------------------------------------------------------------------+
1210
1211 PURPOSE : This function is called in case the AT extension
1212 procedure should be continued.
1213
1214 <id>: identifies the specific procedure to be continued
1215
1216 */
1217 GLOBAL void ext_ContinueTest ( CHAR* id )
1218 {
1219 T_ACI_RETURN rslt;
1220
1221 if ( strcmp ( id, EXT_DIAL_VOICE_PASS ) EQ 0 )
1222 {
1223 T_ACI_D_TOC callType = D_TOC_Data;
1224
1225 if ( extDialNum [strlen ( extDialNum ) - 1] EQ EXT_VOICE_DELIMITER )
1226 callType = D_TOC_Voice;
1227
1228 extDialNum[strlen ( extDialNum ) - 1] = '\0';
1229
1230 rslt = sAT_Dn ( CMD_SRC_LCL,
1231 extDialNum,
1232 D_CLIR_OVRD_Default,
1233 D_CUG_CTRL_NotPresent,
1234 callType );
1235
1236 if ( rslt EQ AT_EXCT )
1237 {
1238 /*
1239 * generate some output at the AT interface
1240 */
1241 ext_CreatePString ( extBuffer, EXT_ATD );
1242
1243 sAT_URC ( extBuffer );
1244
1245 /*
1246 * indicating that an extended AT command is still in progress
1247 */
1248 currExtCmd = AT_CMD_D;
1249 }
1250 else
1251 {
1252 ext_LeaveEXT ( TRUE );
1253 rCI_PlusCME ( AT_CMD_EXT, CME_ERR_Unknown );
1254 }
1255 }
1256 }
1257
1258 /*
1259 +--------------------------------------------------------------------+
1260 | PROJECT : GSM-PS (6147) MODULE : CMH_EXTS |
1261 | STATE : code ROUTINE : ext_CreatePString |
1262 +--------------------------------------------------------------------+
1263
1264 PURPOSE :
1265
1266 */
1267 LOCAL void ext_CreatePString ( CHAR* buffer, CHAR* text )
1268 {
1269 buffer[0] = strlen (text);
1270 memcpy (&buffer[1], text, buffer[0]);
1271 buffer [buffer[0]+1] = (CHAR) 0xff;
1272 }