comparison src/g23m-aci/aci/psa_simf.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : PSA_SIMF
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module defines the functions for the protocol
18 | stack adapter for the subscriber identity module.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef PSA_SIMF_C
23 #define PSA_SIMF_C
24 #endif
25
26 #include "aci_all.h"
27
28 #undef TRACING
29
30 /*==== INCLUDES ===================================================*/
31 #include "aci_cmh.h"
32 #include "ati_cmd.h"
33 #include "aci_cmd.h"
34 #include "aci.h"
35 #include "psa.h"
36 #include "psa_sim.h"
37 #include "psa_util.h"
38
39 #ifdef UART
40 #include "dti.h"
41 #include "dti_conn_mng.h"
42 #endif
43
44 #ifdef SIM_TOOLKIT
45 #include "psa_cc.h"
46 #include "psa_sat.h"
47 #include "aci_fd.h" /* necessary for cmh.h */
48 #include "cmh.h" /* necessary for cmh_sat.h */
49 #include "cmh_sat.h"
50 #include "cmh_sim.h"
51 #endif /* SIM_TOOLKIT */
52
53 /*==== CONSTANTS ==================================================*/
54
55 #ifdef TRACING
56 #define ITM_WDT (14) /* item width in chars */
57 #define HDR_WDT (10) /* header width in chars */
58 #endif /* TRACING */
59
60 /*==== TYPES ======================================================*/
61
62 /*==== EXPORT =====================================================*/
63
64 /*==== VARIABLES ==================================================*/
65
66 /*==== FUNCTIONS ==================================================*/
67
68 /*
69 +-------------------------------------------------------------------+
70 | PROJECT : GSM-PS (6147) MODULE : SAT |
71 | ROUTINE : psaSIM_ChkSIMSrvSup |
72 +-------------------------------------------------------------------+
73
74 PURPOSE : Check if the SIM service is supported or not.
75
76 */
77
78 GLOBAL BOOL psaSIM_ChkSIMSrvSup( UBYTE srvNr )
79 {
80 srvNr--;
81
82 if( srvNr/4 >= SRV_TAB_LEN ) return ( FALSE );
83
84 if( ((simShrdPrm.srvTab[srvNr/4] >> ((srvNr%4)*2))&0x03) EQ
85 SRV_ALLOC_ACTIV )
86
87 return( TRUE );
88
89 return( FALSE );
90 }
91
92 /*
93 +-------------------------------------------------------------------+
94 | PROJECT : GSM-PS (6147) MODULE : PSA_SIMF |
95 | ROUTINE : psaSIM_atbNewEntry |
96 +-------------------------------------------------------------------+
97
98 PURPOSE : returns the access table index for an entry that is
99 free to use. -1 indicates that the access table is full.
100 */
101
102 GLOBAL SHORT psaSIM_atbNewEntry ( void )
103 {
104 SHORT atbIdx; /* holds access table index */
105
106 for( atbIdx = 0; atbIdx < ACC_MAX; atbIdx++ )
107 {
108 if( simShrdPrm.atb[atbIdx].ntryUsdFlg EQ FALSE )
109 {
110 psaSIM_InitAtbNtry( atbIdx );
111
112 #if defined _SIMULATION_
113 TRACE_EVENT_P1("SIM table ID = %d", atbIdx);
114 #endif
115 return( atbIdx );
116 }
117 }
118
119 TRACE_ERROR("[psaSIM_atbNewEntry]: did not find a new SIM table entry");
120 return( -1 );
121 }
122
123 /*
124 +-------------------------------------------------------------------+
125 | PROJECT : GSM-PS (6147) MODULE : PSA_SIMF |
126 | ROUTINE : psaSIM_CloseAtb |
127 +-------------------------------------------------------------------+
128
129 PURPOSE : close all ATB entries with the provided SIM error code.
130
131 */
132
133 GLOBAL void psaSIM_CloseAtb ( USHORT error )
134 {
135 int atbIdx; /* holds access table index */
136
137 for( atbIdx = 0; atbIdx < ACC_MAX; atbIdx++ )
138 {
139 if( simShrdPrm.atb[atbIdx].ntryUsdFlg )
140 {
141 simShrdPrm.atb[atbIdx].errCode = error;
142
143 if( simShrdPrm.atb[atbIdx].rplyCB )
144 simShrdPrm.atb[atbIdx].rplyCB( (SHORT)atbIdx );
145
146 simShrdPrm.atb[atbIdx].ntryUsdFlg = FALSE;
147 }
148 }
149 }
150 /*
151 +-------------------------------------------------------------------+
152 | PROJECT : GSM-PS (6147) MODULE : PSA_SIMF |
153 | ROUTINE : psaSIM_InitAtbNtry |
154 +-------------------------------------------------------------------+
155
156 PURPOSE : initialize the indexed access table entry.
157
158 */
159
160 GLOBAL void psaSIM_InitAtbNtry ( SHORT idx )
161 {
162
163 /*
164 *-------------------------------------------------------------------
165 * initialize access table entry
166 *-------------------------------------------------------------------
167 */
168 simShrdPrm.atb[idx].ntryUsdFlg = FALSE;
169 simShrdPrm.atb[idx].accType = NO_VLD_ACT;
170 simShrdPrm.atb[idx].v_path_info = FALSE;
171 simShrdPrm.atb[idx].reqDataFld = 0;
172 simShrdPrm.atb[idx].dataOff = 0;
173 simShrdPrm.atb[idx].recNr = 0;
174 simShrdPrm.atb[idx].check_dataLen = FALSE; /* in case of read record operation,
175 datalen passed to SIM in the rquest will always be 0xFF. However when a buffer
176 has been passed, the size of data received from SIM to be copied in it has to
177 be checked...*/
178 simShrdPrm.atb[idx].dataLen = 0;
179 simShrdPrm.atb[idx].exchData = NULL;
180 simShrdPrm.atb[idx].recMax = 0;
181 simShrdPrm.atb[idx].errCode = SIM_NO_ERROR;
182 simShrdPrm.atb[idx].rplyCB = NULL;
183 }
184
185
186 /*
187 +-------------------------------------------------------------------+
188 | PROJECT : GSM-PS (6147) MODULE : PSA_SIMF |
189 | ROUTINE : psaSIM_cnvrtIMSI2ASCII |
190 +-------------------------------------------------------------------+
191
192 PURPOSE : converts the IMSI into ASCII representation and returns
193 pointer to IMSI ASCII string.
194 */
195
196 GLOBAL CHAR* psaSIM_cnvrtIMSI2ASCII ( CHAR * imsiBuf )
197 {
198 psaSIM_decodeIMSI ( simShrdPrm.imsi.field,
199 simShrdPrm.imsi.c_field,
200 imsiBuf);
201 return( imsiBuf );
202 }
203
204
205 /*
206 PURPOSE : convert imsi (packed bcd to ASCIIZ; ->11.11)
207 */
208 GLOBAL void psaSIM_decodeIMSI (UBYTE* imsi_field,
209 UBYTE imsi_c_field,
210 CHAR* imsi_asciiz)
211 {
212 UBYTE imsi_len;
213 UBYTE i;
214 UBYTE digit;
215
216 TRACE_FUNCTION ("aci_slock_sim_decodeIMSI()");
217
218 /*
219 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
220 +---+---+---+---+---+---+---+---+
221 imsi_c_field = | Length indicator |
222 imsi_field[0] = | IMSI digit 1 | p | 0 | 0 | 1 |
223 imsi_field[1] = | IMSI digit 3 | IMSI digit 2 |
224
225
226 imsi_c_field = length indicator:
227 The length indicator refers to the number of significant bytes,
228 not including this length byte, required for the IMSI.
229 p = parity
230 0: Even number of IMSI digits
231 1: Odd number of IMSI digits
232
233 If the number of IMSI digits is even then bits 5 to 8 of the last octet
234 shall be filled with an end mark coded as 1111b
235 */
236
237 /*
238 * Check length
239 */
240 if ((imsi_c_field EQ 0) OR (imsi_c_field > (MAX_IMSI-1))) /* maybe 0xFF on some testcards */
241 {
242 TRACE_EVENT_P1("[WRN] imsi_c_field = %d is not valid", imsi_c_field);
243 imsi_asciiz[0] = '\0'; /* return empty string in case of error */
244 return;
245 }
246
247 /*
248 * calculate number of digits
249 */
250 imsi_len = (imsi_c_field)*2-1; /* -1 goes off for parity nibble */
251
252 /*
253 * if even number of digits then last upper nibble is an end mark '1111'
254 */
255 if ((imsi_field[0] & 0x08) EQ 0)
256 {
257 imsi_len--;
258 }
259
260 /*
261 * extract all digits
262 */
263 for (i=0; i<imsi_len; i++)
264 {
265 if ((i & 1) EQ 0)
266 {
267 /* process IMSI digit 1,3,5,... at i=0,2,4,...*/
268 digit = (imsi_field[(i+1)/2] & 0xf0) >> 4; /* +1 is to skip parity nibble */
269 }
270 else
271 {
272 /* process IMSI digit 2,4,6,... at i=1,3,5,...*/
273 digit = (imsi_field[(i+1)/2] & 0x0f);
274 }
275
276 if (digit > 9) /* 3.03/2.3 IMSI shall consist of numerical characters (0 through 9) only.*/
277 {
278 TRACE_EVENT("[WRN] invalid BCD digit found in IMSI, aborting");
279 imsi_asciiz[0] = '\0'; /* return empty string in case of error */
280 return;
281 }
282 else
283 {
284 imsi_asciiz[i] = '0' + digit;
285 }
286 }
287 imsi_asciiz[i] = '\0';
288 return;
289 }
290
291 /*
292 PURPOSE : convert imsi (ASCIIZ to packed bcd; ->11.11)
293 */
294 GLOBAL void psaSIM_encodeIMSI (CHAR* imsi_asciiz,
295 UBYTE* imsi_c_field,
296 UBYTE* imsi_field)
297 {
298 UBYTE i;
299 UBYTE digit;
300 UBYTE imsi_len;
301
302 TRACE_FUNCTION ("aci_slock_sim_encodeIMSI()");
303 imsi_len = strlen(imsi_asciiz);
304 if (imsi_len > 15) /* 3.03/2.3 The overall number of digits in IMSI shall not exceed 15 digits. */
305 {
306 TRACE_EVENT_P1("[WRN] imsi_len shall not exceed 15 digits, but is %d, truncating!", imsi_len);
307 imsi_len = 15;
308 }
309
310 /* Calculate the Length indicator */
311 *imsi_c_field = (imsi_len+1+1)/2; /* +1 for parity nibble and +1 to round up */
312 imsi_field[0] = (imsi_len%2 ? 0x09:0x01); /* fill parity and some default bits */
313 for (i=0; i<MAX_IMSI_LEN; i++) /* fill the whole EF field, pad remaining with 0xf */
314 {
315 if (i<imsi_len)
316 {
317 digit = imsi_asciiz[i];
318 if (digit >= '0' OR digit <= '9')
319 {
320 digit-= '0';
321 }
322 else
323 {
324 TRACE_EVENT_P1("[WRN] invalid digit in IMSI \"%d\", skipping!", digit);
325 digit = 0x0f;
326 }
327 }
328 else
329 {
330 digit = 0x0f; /* 11.11/10.3.2 If a network operator chooses an IMSI of less than 15 digits,
331 unused nibbles shall be set to 'F'. */
332 }
333
334 if ((i & 1) EQ 0)
335 {
336 /* process IMSI digit 1,3,5,... at i=0,2,4,...*/
337 imsi_field[(i+1)/2] |= digit << 4; /* first +1 is to skop parity nibble */
338 }
339 else
340 {
341 /* process IMSI digit 2,4,6,... at i=1,3,5,...*/
342 imsi_field[(i+1)/2] = digit;
343 }
344 }
345 }
346
347
348
349
350 /*
351 +-------------------------------------------------------------------+
352 | PROJECT : GSM-PS (6147) MODULE : PSA_SIM |
353 | ROUTINE : psaSIM_Init |
354 +-------------------------------------------------------------------+
355
356 PURPOSE : initialize the protocol stack adapter for SIM.
357
358 */
359
360 /* MACRO: initializer for set parameter */
361 #define INIT_SIM_SET_PARM( dest, def )\
362 for( LpCnt = 0; LpCnt < OWN_SRC_MAX; LpCnt++ )\
363 simShrdPrm.setPrm[LpCnt].dest = def
364
365 GLOBAL void psaSIM_Init (T_ACI_INIT_TYPE init_type)
366 {
367 UBYTE LpCnt; /* holds loop counter for macro */
368 UBYTE atbIdx; /* holds index to access table */
369
370 #ifdef SIM_TOOLKIT
371 T_ACI_CMD_SRC cmd_src; /* for setting up SIMEF mode */
372 UBYTE idx; /* holds profile index */
373 #endif
374
375 /*
376 *-------------------------------------------------------------------
377 * initialize access table
378 *-------------------------------------------------------------------
379 */
380 for( atbIdx = 0; atbIdx < ACC_MAX; atbIdx++ )
381 {
382 psaSIM_InitAtbNtry( atbIdx );
383 }
384
385 /*
386 *-------------------------------------------------------------------
387 * set default parms
388 *-------------------------------------------------------------------
389 */
390 memset( simShrdPrm.setPrm, 0, sizeof(T_SIM_SET_PRM));
391 memset( simShrdPrm.imsi.field, 0, MAX_IMSI);
392 simShrdPrm.rslt = SIM_NO_ERROR;
393 simShrdPrm.pn1Cnt = 0;
394 simShrdPrm.pn2Cnt = 0;
395 simShrdPrm.pk1Cnt = 0;
396 simShrdPrm.pk2Cnt = 0;
397 simShrdPrm.PINStat = NO_VLD_PS;
398 simShrdPrm.pn1Stat = NO_VLD_PS;
399 simShrdPrm.pn2Stat = NO_VLD_PS;
400 simShrdPrm.PINQuery = 0;
401 simShrdPrm.crdPhs = 0xFF;
402 simShrdPrm.SIMStat = NO_VLD_SS;
403 simShrdPrm.PEDStat = NO_VLD_PEDS;
404 simShrdPrm.imsi.c_field = 0;
405 simShrdPrm.PLMN_Mode_Bit = NOT_PRESENT_8BIT;
406 simShrdPrm.crdFun = SIM_NO_OPERATION;
407 simShrdPrm.ciSIMEnabled = TRUE;
408 simShrdPrm.imei_blocked = FALSE;
409 simShrdPrm.opl_list.opl_status = FALSE;
410 simShrdPrm.pnn_list.pnn_status = FALSE;
411 memset( simShrdPrm.srvTab, 0, SRV_TAB_LEN );
412 #ifdef FF_SAT_E
413 simShrdPrm.sat_class_e_dti_id = DTI_DTI_ID_NOTPRESENT;
414 #endif /*FF_SAT_E*/
415 #ifdef TI_PS_FF_AT_P_CMD_ATR
416 simShrdPrm.atr.len = 0;
417 #endif /* TI_PS_FF_AT_P_CMD_ATR */
418 #ifdef FF_DUAL_SIM
419 simShrdPrm.SIM_Powered_on = 0;
420 simShrdPrm.SIM_Selection = FALSE;
421 #endif /*FF_DUAL_SIM*/
422 INIT_SIM_SET_PARM( actProc, SIM_INITIALISATION );
423 INIT_SIM_SET_PARM( PINType, 0 );
424
425 for( LpCnt = 0; LpCnt < OWN_SRC_MAX; LpCnt++ )
426 {
427 memset( simShrdPrm.setPrm[LpCnt].curPIN, NOT_PRESENT_CHAR, PIN_LEN );
428 memset( simShrdPrm.setPrm[LpCnt].newPIN, NOT_PRESENT_CHAR, PIN_LEN );
429 memset( simShrdPrm.setPrm[LpCnt].unblkKey, NOT_PRESENT_CHAR, PUK_LEN );
430
431 #ifdef TI_PS_FF_AT_P_CMD_CUST
432 simShrdPrm.setPrm[LpCnt].cust_mode = (UBYTE)CUST_NORMAL_BEHAVIOUR;
433 #endif /* TI_PS_FF_AT_P_CMD_CUST */
434 simShrdPrm.setPrm[LpCnt].sat_cc_mode = SATCC_CONTROL_BY_SIM_ACTIVE;
435 }
436
437 #ifdef TI_PS_FF_AT_P_CMD_CUST
438 simShrdPrm.overall_cust_mode = (UBYTE)CUST_NORMAL_BEHAVIOUR;
439 #endif /* TI_PS_FF_AT_P_CMD_CUST */
440 simShrdPrm.pb_stat = PB_STAT_Blocked;
441
442 #ifdef SIM_TOOLKIT
443
444 for (cmd_src=CMD_SRC_LCL;cmd_src<CMD_SRC_MAX;cmd_src++)
445 {
446 simShrdPrm.SIMEFMode[cmd_src]=SIMEF_MODE_OFF;
447 }
448 for( idx = 0; idx < MAX_STK_PRF; idx++ )
449 {
450 INIT_SIM_SET_PARM( STKprof[idx], satDefPrfl[idx] );
451 }
452
453 if (init_type EQ ACI_INIT_TYPE_ALL)
454 {
455 if (!psaSAT_FURegister (cmhSIM_AD_Update))
456 {
457 TRACE_EVENT ("FAILED to register the handler cmhSIM_AD_Update() for FU");
458 }
459 if (!psaSAT_FURegister (cmhSIM_OpUpdate))
460 {
461 TRACE_EVENT ("FAILED to register the handler cmhSIM_OpUpdate() for FU");
462 }
463 if (!psaSAT_FURegister (cmhSIM_CSP_Update))
464 {
465 TRACE_EVENT ("FAILED to register the handler cmhSIM_CSP_Update() for FU");
466 }
467 if (!psaSAT_FURegister (cmhSIM_ONS_Update))
468 {
469 TRACE_EVENT ("FAILED to register the handler cmhSIM_ONS_Update() for FU");
470 }
471 }
472 else
473 {
474 cmhSAT_CBMDestroyList();
475 }
476 #endif
477
478 }
479
480 /*
481 +-------------------------------------------------------------------+
482 | PROJECT : GSM-PS (6147) MODULE : PSA_SIMF |
483 | ROUTINE : psaSIM_shrPrmDump |
484 +-------------------------------------------------------------------+
485
486 PURPOSE : this function dumps the shared parameter to the debug
487 output.
488 */
489
490 #ifdef TRACING
491 GLOBAL void psaSIM_shrPrmDump ( void )
492 {
493 char lnBuf [80]; /* holds buffer for output line */
494 char pinBuf [PIN_LEN+1]; /* holds buffer for pin */
495 SHORT chrNr; /* holds number of processed chars */
496
497 /* --- PIN type -------------------------------------------------*/
498 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " PIN type" );
499 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
500 simShrdPrm.setPrm[0].PINType );
501 TRACE_EVENT( lnBuf );
502
503 /* --- current PIN ----------------------------------------------*/
504 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " curr. PIN" );
505 sprintf( pinBuf, "%*.*s", PIN_LEN, PIN_LEN, simShrdPrm.setPrm[0].curPIN );
506 chrNr += sprintf( lnBuf+chrNr, "%*.*s", ITM_WDT, ITM_WDT, pinBuf );
507 TRACE_EVENT( lnBuf );
508
509 /* --- new PIN --------------------------------------------------*/
510 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " new PIN" );
511 sprintf( pinBuf, "%*.*s", PIN_LEN, PIN_LEN, simShrdPrm.setPrm[0].newPIN );
512 chrNr += sprintf( lnBuf+chrNr, "%*.*s", ITM_WDT, ITM_WDT, pinBuf );
513 TRACE_EVENT( lnBuf );
514
515 /* --- unblock key ----------------------------------------------*/
516 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "unblck.key" );
517 sprintf( pinBuf, "%*.*s", PIN_LEN, PIN_LEN, simShrdPrm.setPrm[0].unblkKey );
518 chrNr += sprintf( lnBuf+chrNr, "%*.*s", ITM_WDT, ITM_WDT, pinBuf );
519 TRACE_EVENT( lnBuf );
520
521 /* --- PIN status -----------------------------------------------*/
522 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "PIN status" );
523 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
524 simShrdPrm.PINStat );
525 TRACE_EVENT( lnBuf );
526
527 /* --- result ---------------------------------------------------*/
528 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " result" );
529 chrNr += sprintf( lnBuf+chrNr, "%*X", ITM_WDT,
530 simShrdPrm.rslt );
531 TRACE_EVENT( lnBuf );
532
533 /* --- PIN 1 count ----------------------------------------------*/
534 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " PIN 1 cnt" );
535 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
536 simShrdPrm.pn1Cnt );
537 TRACE_EVENT( lnBuf );
538
539 /* --- PIN 2 count ----------------------------------------------*/
540 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " PIN 2 cnt" );
541 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
542 simShrdPrm.pn2Cnt );
543 TRACE_EVENT( lnBuf );
544
545 /* --- PUK 1 count ----------------------------------------------*/
546 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " PUK 1 cnt" );
547 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
548 simShrdPrm.pk1Cnt );
549 TRACE_EVENT( lnBuf );
550
551 /* --- PUK 2 count ----------------------------------------------*/
552 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " PUK 2 cnt" );
553 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
554 simShrdPrm.pk2Cnt );
555 TRACE_EVENT( lnBuf );
556
557 /* --- card phase -----------------------------------------------*/
558 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "card phase" );
559 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
560 simShrdPrm.crdPhs );
561 TRACE_EVENT( lnBuf );
562
563 /* --- SIM status -----------------------------------------------*/
564 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "SIM status" );
565 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
566 simShrdPrm.SIMStat );
567 TRACE_EVENT( lnBuf );
568
569 /* --- card functionality ---------------------------------------*/
570 chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "card funct" );
571 chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT,
572 simShrdPrm.crdFun );
573 TRACE_EVENT( lnBuf );
574 }
575 #endif /* of #ifdef TRACING */
576
577 #ifdef SIM_PERS_OTA
578 /*
579 +----------------------------------------------------------+
580 | PROJECT : GSM-PS (6147) MODULE : PSA_SIMF |
581 | ROUTINE : aci_slock_ota_init |
582 +----------------------------------------------------------+
583
584 PURPOSE : this function registers the ccmhSIM_Register_Read_DCKduring init
585 and also reads the contents of EF_DCK at the init
586 */
587
588 /*
589 +------------------------------------------------------------------------------
590 | Function : aci_slock_ota_init
591 +------------------------------------------------------------------------------
592 | Description : this function registers the ccmhSIM_Register_Read_DCKduring init
593 | and also reads the contents of EF_DCK at the init
594 |
595 | Parameters : None
596 |
597 | Return : None
598 |
599 +------------------------------------------------------------------------------
600 */
601
602 GLOBAL void aci_slock_ota_init()
603 {
604 TRACE_FUNCTION("aci_slock_ota_init()");
605 psaSAT_FURegister(cmhSIM_Register_Read_DCK);
606 }
607 #endif
608 /*==== EOF ========================================================*/