FreeCalypso > hg > ffs-editor
comparison src/cs/services/cst/cst_exts.c @ 0:92470e5d0b9e
src: partial import from FC Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 15 May 2020 01:28:16 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:92470e5d0b9e |
---|---|
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 } |