blob: cb16222c79bb0b405aff400b3ebf55b3501e6b19 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*****************************************************************************
37 *
38 * Filename:
39 * ---------
40 * dcl_sim.c
41 *
42 * Project:
43 * --------
44 * Maui_Software
45 *
46 * Description:
47 * ------------
48 * This Module defines DCL (Driver Common Layer) of the SIM card driver.
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 * removed!
60 * removed!
61 *
62 * removed!
63 * removed!
64 * removed!
65 *
66 * removed!
67 * removed!
68 * removed!
69 *
70 * removed!
71 * removed!
72 * removed!
73 *
74 * removed!
75 * removed!
76 * removed!
77 *
78 * removed!
79 * removed!
80 * removed!
81 *
82 * removed!
83 * removed!
84 * removed!
85 *
86 * removed!
87 * removed!
88 * removed!
89 * removed!
90 *------------------------------------------------------------------------------
91 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
92 *============================================================================
93 ****************************************************************************/
94#include "drv_features.h"
95#include "drv_comm.h"
96#include "dcl.h"
97#include "dma_sw.h"
98#include "sim_al.h"
99#include "sim_drv_HW_reg_MTK.h"
100#include "sim_drv_HW_def_MTK.h"
101#include "sim_drv_SW_struct.h"
102#include "sim_drv_SW_function.h"
103#include "sim_drv_SW_API.h"
104
105
106#include "intrCtrl.h"
107
108#include "cache_sw.h"
109#include "init.h"
110
111#ifdef DCL_SIM_INTERFACE
112
113#if !defined(DRV_SIM_OFF)
114/**************************************************************************
115following defines static global variables used in this file
116***************************************************************************/
117static kal_bool fgSIMInit = KAL_FALSE;
118static kal_semid dclSimArb;
119
120
121#define SIM_RESOURCE_HEAD 0x5a5a5a5a
122#define SIM_RESOURCE_TAIL 0xa5a5a5a5
123
124#define SIM_RSC_HANDLE_UDEF 0xffffffff
125
126typedef struct{
127 kal_uint32 guardHead;
128 kal_bool assigned;
129 kal_uint32 thdId;
130 kal_uint32 allocatedPoint;
131 DCL_SIMDriver_t *driver;
132 DCL_SIM_HW_CB driverHandle;
133 kal_uint32 guardTail;
134} DCL_SIM_RESOURCE;
135
136static DCL_SIM_RESOURCE simResource[DCL_SIM_MAX_INTERFACE];
137
138/******************************************************************************************
139*following are extern variables from other file
140******************************************************************************************/
141extern sim_ctrlDriver sim_ctrlDriver_All;
142/***************************************************************************************
143followings are DCL SD API exported
144*****************************************************************************************/
145/*************************************************************************
146* FUNCTION
147* DclSD_Initialize
148*
149* DESCRIPTION
150* This function is to initialize the SD driver related resource.
151* This function should be called in system initialization before tasks are scheduling.
152*
153* PARAMETERS
154* N/A
155*
156* RETURNS
157* STATUS_OK : this should be the only return value since MSDC_initialize returns nothing.
158*
159*************************************************************************/
160DCL_STATUS DclSIM_Initialize(void)
161{
162 kal_uint32 maskedValue;
163 kal_uint32 loopIndex;
164
165 maskedValue = SaveAndSetIRQMask();
166 if(KAL_FALSE == fgSIMInit){
167 fgSIMInit = KAL_FALSE;
168 RestoreIRQMask(maskedValue);
169 kal_mem_set(simResource, 0, sizeof(DCL_SIM_RESOURCE) * DCL_SIM_MAX_INTERFACE);
170 dclSimArb = kal_create_sem("SIM_DCL", 1);
171 for(loopIndex = 0; DCL_SIM_MAX_INTERFACE > loopIndex; loopIndex ++){
172 simResource[loopIndex].guardHead = SIM_RESOURCE_HEAD;
173 simResource[loopIndex].guardTail = SIM_RESOURCE_TAIL;
174 simResource[loopIndex].driverHandle = SIM_RSC_HANDLE_UDEF;
175 }
176 }
177 else{
178 RestoreIRQMask(maskedValue);
179 }
180
181 return STATUS_OK;
182}
183
184/*************************************************************************
185* FUNCTION
186* DclSD_Initialize
187*
188* DESCRIPTION
189* This function is to get SD DCL handler.
190*
191* PARAMETERS
192* eDev - only valid for DCL_SD.
193* flags -following bit stand for specific meaning.
194* DCL_SD_FLAGS_CARD1: to get a handle for card 1
195* DCL_SD_FLAGS_CARD2: to get a handle for card 2
196* DCL_SD_FLAGS_SIMPLUS: to get a handle for sim plus
197* Other values are prohibited
198* RETURNS
199* DCL_HANDLE_INVALID - Open failed.
200* other value - a valid handle
201*
202*************************************************************************/
203DCL_HANDLE DclSIM_Open(DCL_DEV dev, DCL_FLAGS flags)
204{
205 kal_uint32 retAddr = 0;
206 kal_uint32 thdId;
207 kal_uint32 loopIndex;
208
209
210 if (dev != DCL_SIM)
211 {
212 ASSERT(0);
213 return DCL_HANDLE_INVALID;
214 }
215
216#if defined(__RVCT__)
217 /* RVCT doesn't support inline assemlber; bypass temporarily */
218 retAddr = 0;
219#else /* __RVCT__ */
220 /* get the return address */
221 __asm {
222 MOV retAddr,lr
223 }
224#endif /* __RVCT__ */
225 thdId = (kal_uint32)kal_get_current_thread_ID();
226
227
228 /*
229 In SIM DCL open, we only mark control block as assigned and return handle to user.
230 We don't support one resource used by multiple applications, so the control block will be not re-assigned.
231 Every time this function is called, we just find an unused control block, mark it assigned, and return the handle.
232 */
233
234 kal_take_sem(dclSimArb, 1);
235 for(loopIndex = 0; DCL_SIM_MAX_INTERFACE > loopIndex; loopIndex ++){
236 if (KAL_FALSE == simResource[loopIndex].assigned){
237 simResource[loopIndex].assigned = KAL_TRUE;
238 simResource[loopIndex].thdId = thdId;
239 simResource[loopIndex].allocatedPoint = retAddr;
240 kal_give_sem(dclSimArb);
241 return (DCL_HANDLE)(&simResource[loopIndex]);
242 }
243 }
244 kal_give_sem(dclSimArb);
245 return 0;
246}
247
248DCL_STATUS DclSIM_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
249{
250 ASSERT(0);
251 return STATUS_UNSUPPORTED;
252}
253DCL_STATUS DclSIM_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
254{
255 ASSERT(0);
256 return STATUS_UNSUPPORTED;
257}
258
259/*************************************************************************
260* FUNCTION
261* DclSIM_Configure
262*
263* DESCRIPTION
264* This function is to configure SIM interface. This is an important funciton since we rely on this function to hook correct function table.
265*
266* PARAMETERS
267* handle - a valid handle return by DclSIM_Open()
268* configure - a ponter to SIM_CONFIG_T structure which is a member of union
269* DCL_CONFIGURE_T.
270* RETURNS
271* STATUS_OK - the configuration is done correctly.
272* STATUS_INVALID_HANDLE - It's a invalid handle.
273* STATUS_NOT_OPENED - The module has not been opened.
274* STATUS_INVALID_CONFIGURATION - the configuration is not valid.
275*
276*************************************************************************/
277DCL_STATUS DclSIM_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
278{
279 SIM_CONFIG_T *prConfg;
280 DCL_SIM_RESOURCE *resource;
281 DCL_STATUS status;
282
283 /*check the handle*/
284 if(0 == handle)
285 ASSERT(0);
286 resource = (DCL_SIM_RESOURCE *)handle;
287 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
288 ASSERT(0);
289
290 /*state check*/
291 if (SIM_RSC_HANDLE_UDEF != resource->driverHandle || NULL != resource->driver)
292 ASSERT(0);
293
294 /*configure to use sim_ctrlDriver_Single for single SIM platform*/
295 prConfg = (SIM_CONFIG_T *)configure;
296
297 switch(prConfg->apType){
298 case SIM_CONFIG_AP_TYPE_PHONE1:
299 resource->driver = (DCL_SIMDriver_t *)&sim_ctrlDriver_All;
300 /*driver handle will be the pointer to hw control block in the future, but before we finish SMD, we fix a workable uint32 here*/
301 resource->driverHandle = 0;
302 status = STATUS_OK;
303 break;
304 default:
305 ASSERT(0);
306 status = STATUS_INVALID_CONFIGURATION;
307 break;
308 }
309
310 return status;
311}
312DCL_STATUS DclSIM_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
313{
314 ASSERT(0);
315 return STATUS_UNSUPPORTED;
316}
317
318typedef DCL_STATUS (*DCL_SIM_CTRL_API) (DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data);
319
320DCL_STATUS DCL_SIM_CTRL_API_RST(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
321{
322 DCL_SIM_STATUS status;
323 SIM_CTRL_RST_T *prRst;
324 DCL_SIM_RESOURCE *resource;
325
326 /*check the handle*/
327 if(0 == handle)
328 ASSERT(0);
329 resource = (DCL_SIM_RESOURCE *)handle;
330 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
331 ASSERT(0);
332
333 /*state check*/
334 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
335 ASSERT(0);
336
337 prRst = &(data->rSIMRst);
338 status = resource->driver->rst(prRst->ExpectVolt, prRst->ResultVolt, prRst->warm, resource->driverHandle);
339 prRst->rstResult = status;
340
341 return STATUS_OK;
342}
343
344DCL_STATUS DCL_SIM_CTRL_API_CMD(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
345{
346 kal_uint32 status;
347 SIM_CTRL_CMD_T *prCmd;
348 DCL_SIM_RESOURCE *resource;
349
350 /*check the handle*/
351 if(0 == handle)
352 ASSERT(0);
353 resource = (DCL_SIM_RESOURCE *)handle;
354 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
355 ASSERT(0);
356
357 /*state check*/
358 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
359 ASSERT(0);
360
361 prCmd = &(data->rSIMCmd);
362 status = resource->driver->cmd(prCmd->txData, prCmd->txSize, prCmd->rxData, prCmd->rxSize, resource->driverHandle);
363 *prCmd->statusWord = status;
364
365 return STATUS_OK;
366}
367
368DCL_STATUS DCL_SIM_CTRL_API_PWOFF(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
369{
370 DCL_SIM_RESOURCE *resource;
371
372 /*check the handle*/
373 if(0 == handle)
374 ASSERT(0);
375 resource = (DCL_SIM_RESOURCE *)handle;
376 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
377 ASSERT(0);
378
379 /*state check*/
380 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
381 ASSERT(0);
382
383 resource->driver->pwOff(resource->driverHandle);
384
385 return STATUS_OK;
386}
387
388DCL_STATUS DCL_SIM_CTRL_API_GET_CARD_INFO(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
389{
390 SIM_CTRL_GET_CARD_INFO_T *prInfo;
391 DCL_SIM_RESOURCE *resource;
392
393 /*check the handle*/
394 if(0 == handle)
395 ASSERT(0);
396 resource = (DCL_SIM_RESOURCE *)handle;
397 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
398 ASSERT(0);
399
400 /*state check*/
401 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
402 ASSERT(0);
403
404 prInfo = &(data->rSIMGetCardInfo);
405 resource->driver->getCardInfo(prInfo->info, resource->driverHandle);
406
407 return STATUS_OK;
408}
409
410DCL_STATUS DCL_SIM_CTRL_API_SET_SPEED(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
411{
412 SIM_CTRL_SET_MAX_SPEED_T *prSetSpeed;
413 DCL_SIM_RESOURCE *resource;
414
415 /*check the handle*/
416 if(0 == handle)
417 ASSERT(0);
418 resource = (DCL_SIM_RESOURCE *)handle;
419 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
420 ASSERT(0);
421
422 /*state check*/
423 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
424 ASSERT(0);
425
426 prSetSpeed = &(data->rSIMSetMaxSpeed);
427 resource->driver->setSpeed(prSetSpeed->speed, resource->driverHandle);
428
429 return STATUS_OK;
430}
431
432DCL_STATUS DCL_SIM_CTRL_API_SET_PREFER_PROTOCOL(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
433{
434 SIM_CTRL_SET_PREFER_PROTOCOL_T *prSetT;
435 DCL_SIM_RESOURCE *resource;
436
437 /*check the handle*/
438 if(0 == handle)
439 ASSERT(0);
440 resource = (DCL_SIM_RESOURCE *)handle;
441 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
442 ASSERT(0);
443
444 /*state check*/
445 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
446 ASSERT(0);
447
448 prSetT = &(data->rSIMSetPreferProtocol);
449 resource->driver->setPreferT(prSetT->T, resource->driverHandle);
450
451 return STATUS_OK;
452}
453
454DCL_STATUS DCL_SIM_CTRL_API_SET_CLK_STOP_MODE(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
455{
456 SIM_CTRL_SET_CLK_STOP_MODE_T *prSetClkStop;
457 DCL_SIM_RESOURCE *resource;
458
459 /*check the handle*/
460 if(0 == handle)
461 ASSERT(0);
462 resource = (DCL_SIM_RESOURCE *)handle;
463 if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
464 ASSERT(0);
465
466 /*state check*/
467 if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
468 ASSERT(0);
469
470 prSetClkStop = &(data->rSIMSetClkStopMode);
471 resource->driver->setClockStopMode(prSetClkStop->mode, resource->driverHandle);
472
473 return STATUS_OK;
474}
475
476DCL_SIM_CTRL_API DclSIM_APITbl[] =
477{
478 DCL_SIM_CTRL_API_RST,
479 DCL_SIM_CTRL_API_CMD,
480 DCL_SIM_CTRL_API_PWOFF,
481 DCL_SIM_CTRL_API_GET_CARD_INFO,
482 DCL_SIM_CTRL_API_SET_SPEED,
483 DCL_SIM_CTRL_API_SET_PREFER_PROTOCOL,
484 DCL_SIM_CTRL_API_SET_CLK_STOP_MODE,
485};
486
487
488DCL_STATUS DclSIM_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
489{
490 DCL_STATUS status;
491
492 /*dispatch*/
493 if(SIM_CTRL_CMD_DUMMY_END > cmd){
494 status = DclSIM_APITbl[cmd](handle, cmd, data);
495 }
496 else{
497 ASSERT(0);
498 status = STATUS_INVALID_CMD;
499 }
500
501
502
503 return status;
504}
505#else /*!defined(DRV_SIM_OFF)*/
506
507
508DCL_STATUS DclSIM_Initialize(void)
509{
510 return STATUS_FAIL;
511}
512
513DCL_HANDLE DclSIM_Open(DCL_DEV dev, DCL_FLAGS flags)
514{
515 return DCL_HANDLE_INVALID;
516}
517
518DCL_STATUS DclSIM_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
519{
520 return STATUS_UNSUPPORTED;
521}
522
523DCL_STATUS DclSIM_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
524{
525 return STATUS_UNSUPPORTED;
526}
527
528DCL_STATUS DclSIM_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
529{
530 return STATUS_UNSUPPORTED;
531}
532
533DCL_STATUS DclSIM_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
534{
535 return STATUS_FAIL;
536}
537
538DCL_STATUS DclSIM_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
539{
540 return STATUS_FAIL;
541}
542
543DCL_STATUS DclSIM_Close(DCL_HANDLE handle)
544{
545 return STATUS_FAIL;
546}
547
548#endif /*!defined(DRV_SIM_OFF)*/
549
550#endif /*DCL_SIM_INTERFACE*/