[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/drv/src/dcl_sim.c b/mcu/driver/drv/src/dcl_sim.c
new file mode 100644
index 0000000..cb16222
--- /dev/null
+++ b/mcu/driver/drv/src/dcl_sim.c
@@ -0,0 +1,550 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * dcl_sim.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This Module defines DCL (Driver Common Layer) of the SIM card driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#include "drv_features.h"
+#include "drv_comm.h"
+#include "dcl.h"
+#include "dma_sw.h"
+#include "sim_al.h"
+#include "sim_drv_HW_reg_MTK.h"
+#include "sim_drv_HW_def_MTK.h"
+#include "sim_drv_SW_struct.h"
+#include "sim_drv_SW_function.h"
+#include "sim_drv_SW_API.h"
+
+
+#include "intrCtrl.h"
+
+#include "cache_sw.h"
+#include "init.h"
+
+#ifdef DCL_SIM_INTERFACE
+
+#if !defined(DRV_SIM_OFF)
+/**************************************************************************
+following defines static global variables used in this file
+***************************************************************************/
+static kal_bool fgSIMInit = KAL_FALSE;
+static kal_semid dclSimArb;
+
+
+#define SIM_RESOURCE_HEAD 0x5a5a5a5a
+#define SIM_RESOURCE_TAIL 0xa5a5a5a5
+
+#define SIM_RSC_HANDLE_UDEF 0xffffffff
+
+typedef struct{
+ kal_uint32 guardHead;
+ kal_bool assigned;
+ kal_uint32 thdId;
+ kal_uint32 allocatedPoint;
+ DCL_SIMDriver_t *driver;
+ DCL_SIM_HW_CB driverHandle;
+ kal_uint32 guardTail;
+} DCL_SIM_RESOURCE;
+
+static DCL_SIM_RESOURCE simResource[DCL_SIM_MAX_INTERFACE];
+
+/******************************************************************************************
+*following are extern variables from other file
+******************************************************************************************/
+extern sim_ctrlDriver sim_ctrlDriver_All;
+/***************************************************************************************
+followings are DCL SD API exported
+*****************************************************************************************/
+/*************************************************************************
+* FUNCTION
+* DclSD_Initialize
+*
+* DESCRIPTION
+* This function is to initialize the SD driver related resource.
+* This function should be called in system initialization before tasks are scheduling.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_OK : this should be the only return value since MSDC_initialize returns nothing.
+*
+*************************************************************************/
+DCL_STATUS DclSIM_Initialize(void)
+{
+ kal_uint32 maskedValue;
+ kal_uint32 loopIndex;
+
+ maskedValue = SaveAndSetIRQMask();
+ if(KAL_FALSE == fgSIMInit){
+ fgSIMInit = KAL_FALSE;
+ RestoreIRQMask(maskedValue);
+ kal_mem_set(simResource, 0, sizeof(DCL_SIM_RESOURCE) * DCL_SIM_MAX_INTERFACE);
+ dclSimArb = kal_create_sem("SIM_DCL", 1);
+ for(loopIndex = 0; DCL_SIM_MAX_INTERFACE > loopIndex; loopIndex ++){
+ simResource[loopIndex].guardHead = SIM_RESOURCE_HEAD;
+ simResource[loopIndex].guardTail = SIM_RESOURCE_TAIL;
+ simResource[loopIndex].driverHandle = SIM_RSC_HANDLE_UDEF;
+ }
+ }
+ else{
+ RestoreIRQMask(maskedValue);
+ }
+
+ return STATUS_OK;
+}
+
+/*************************************************************************
+* FUNCTION
+* DclSD_Initialize
+*
+* DESCRIPTION
+* This function is to get SD DCL handler.
+*
+* PARAMETERS
+* eDev - only valid for DCL_SD.
+* flags -following bit stand for specific meaning.
+* DCL_SD_FLAGS_CARD1: to get a handle for card 1
+* DCL_SD_FLAGS_CARD2: to get a handle for card 2
+* DCL_SD_FLAGS_SIMPLUS: to get a handle for sim plus
+* Other values are prohibited
+* RETURNS
+* DCL_HANDLE_INVALID - Open failed.
+* other value - a valid handle
+*
+*************************************************************************/
+DCL_HANDLE DclSIM_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+ kal_uint32 retAddr = 0;
+ kal_uint32 thdId;
+ kal_uint32 loopIndex;
+
+
+ if (dev != DCL_SIM)
+ {
+ ASSERT(0);
+ return DCL_HANDLE_INVALID;
+ }
+
+#if defined(__RVCT__)
+ /* RVCT doesn't support inline assemlber; bypass temporarily */
+ retAddr = 0;
+#else /* __RVCT__ */
+ /* get the return address */
+ __asm {
+ MOV retAddr,lr
+ }
+#endif /* __RVCT__ */
+ thdId = (kal_uint32)kal_get_current_thread_ID();
+
+
+ /*
+ In SIM DCL open, we only mark control block as assigned and return handle to user.
+ We don't support one resource used by multiple applications, so the control block will be not re-assigned.
+ Every time this function is called, we just find an unused control block, mark it assigned, and return the handle.
+ */
+
+ kal_take_sem(dclSimArb, 1);
+ for(loopIndex = 0; DCL_SIM_MAX_INTERFACE > loopIndex; loopIndex ++){
+ if (KAL_FALSE == simResource[loopIndex].assigned){
+ simResource[loopIndex].assigned = KAL_TRUE;
+ simResource[loopIndex].thdId = thdId;
+ simResource[loopIndex].allocatedPoint = retAddr;
+ kal_give_sem(dclSimArb);
+ return (DCL_HANDLE)(&simResource[loopIndex]);
+ }
+ }
+ kal_give_sem(dclSimArb);
+ return 0;
+}
+
+DCL_STATUS DclSIM_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
+{
+ ASSERT(0);
+ return STATUS_UNSUPPORTED;
+}
+DCL_STATUS DclSIM_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
+{
+ ASSERT(0);
+ return STATUS_UNSUPPORTED;
+}
+
+/*************************************************************************
+* FUNCTION
+* DclSIM_Configure
+*
+* DESCRIPTION
+* This function is to configure SIM interface. This is an important funciton since we rely on this function to hook correct function table.
+*
+* PARAMETERS
+* handle - a valid handle return by DclSIM_Open()
+* configure - a ponter to SIM_CONFIG_T structure which is a member of union
+* DCL_CONFIGURE_T.
+* RETURNS
+* STATUS_OK - the configuration is done correctly.
+* STATUS_INVALID_HANDLE - It's a invalid handle.
+* STATUS_NOT_OPENED - The module has not been opened.
+* STATUS_INVALID_CONFIGURATION - the configuration is not valid.
+*
+*************************************************************************/
+DCL_STATUS DclSIM_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+ SIM_CONFIG_T *prConfg;
+ DCL_SIM_RESOURCE *resource;
+ DCL_STATUS status;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF != resource->driverHandle || NULL != resource->driver)
+ ASSERT(0);
+
+ /*configure to use sim_ctrlDriver_Single for single SIM platform*/
+ prConfg = (SIM_CONFIG_T *)configure;
+
+ switch(prConfg->apType){
+ case SIM_CONFIG_AP_TYPE_PHONE1:
+ resource->driver = (DCL_SIMDriver_t *)&sim_ctrlDriver_All;
+ /*driver handle will be the pointer to hw control block in the future, but before we finish SMD, we fix a workable uint32 here*/
+ resource->driverHandle = 0;
+ status = STATUS_OK;
+ break;
+ default:
+ ASSERT(0);
+ status = STATUS_INVALID_CONFIGURATION;
+ break;
+ }
+
+ return status;
+}
+DCL_STATUS DclSIM_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+ ASSERT(0);
+ return STATUS_UNSUPPORTED;
+}
+
+typedef DCL_STATUS (*DCL_SIM_CTRL_API) (DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data);
+
+DCL_STATUS DCL_SIM_CTRL_API_RST(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ DCL_SIM_STATUS status;
+ SIM_CTRL_RST_T *prRst;
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ prRst = &(data->rSIMRst);
+ status = resource->driver->rst(prRst->ExpectVolt, prRst->ResultVolt, prRst->warm, resource->driverHandle);
+ prRst->rstResult = status;
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_SIM_CTRL_API_CMD(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ kal_uint32 status;
+ SIM_CTRL_CMD_T *prCmd;
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ prCmd = &(data->rSIMCmd);
+ status = resource->driver->cmd(prCmd->txData, prCmd->txSize, prCmd->rxData, prCmd->rxSize, resource->driverHandle);
+ *prCmd->statusWord = status;
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_SIM_CTRL_API_PWOFF(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ resource->driver->pwOff(resource->driverHandle);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_SIM_CTRL_API_GET_CARD_INFO(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ SIM_CTRL_GET_CARD_INFO_T *prInfo;
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ prInfo = &(data->rSIMGetCardInfo);
+ resource->driver->getCardInfo(prInfo->info, resource->driverHandle);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_SIM_CTRL_API_SET_SPEED(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ SIM_CTRL_SET_MAX_SPEED_T *prSetSpeed;
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ prSetSpeed = &(data->rSIMSetMaxSpeed);
+ resource->driver->setSpeed(prSetSpeed->speed, resource->driverHandle);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_SIM_CTRL_API_SET_PREFER_PROTOCOL(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ SIM_CTRL_SET_PREFER_PROTOCOL_T *prSetT;
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ prSetT = &(data->rSIMSetPreferProtocol);
+ resource->driver->setPreferT(prSetT->T, resource->driverHandle);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_SIM_CTRL_API_SET_CLK_STOP_MODE(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ SIM_CTRL_SET_CLK_STOP_MODE_T *prSetClkStop;
+ DCL_SIM_RESOURCE *resource;
+
+ /*check the handle*/
+ if(0 == handle)
+ ASSERT(0);
+ resource = (DCL_SIM_RESOURCE *)handle;
+ if(SIM_RESOURCE_HEAD != resource->guardHead || SIM_RESOURCE_TAIL != resource->guardTail)
+ ASSERT(0);
+
+ /*state check*/
+ if (SIM_RSC_HANDLE_UDEF == resource->driverHandle)
+ ASSERT(0);
+
+ prSetClkStop = &(data->rSIMSetClkStopMode);
+ resource->driver->setClockStopMode(prSetClkStop->mode, resource->driverHandle);
+
+ return STATUS_OK;
+}
+
+DCL_SIM_CTRL_API DclSIM_APITbl[] =
+{
+ DCL_SIM_CTRL_API_RST,
+ DCL_SIM_CTRL_API_CMD,
+ DCL_SIM_CTRL_API_PWOFF,
+ DCL_SIM_CTRL_API_GET_CARD_INFO,
+ DCL_SIM_CTRL_API_SET_SPEED,
+ DCL_SIM_CTRL_API_SET_PREFER_PROTOCOL,
+ DCL_SIM_CTRL_API_SET_CLK_STOP_MODE,
+};
+
+
+DCL_STATUS DclSIM_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ DCL_STATUS status;
+
+ /*dispatch*/
+ if(SIM_CTRL_CMD_DUMMY_END > cmd){
+ status = DclSIM_APITbl[cmd](handle, cmd, data);
+ }
+ else{
+ ASSERT(0);
+ status = STATUS_INVALID_CMD;
+ }
+
+
+
+ return status;
+}
+#else /*!defined(DRV_SIM_OFF)*/
+
+
+DCL_STATUS DclSIM_Initialize(void)
+{
+ return STATUS_FAIL;
+}
+
+DCL_HANDLE DclSIM_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+ return DCL_HANDLE_INVALID;
+}
+
+DCL_STATUS DclSIM_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclSIM_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclSIM_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclSIM_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+ return STATUS_FAIL;
+}
+
+DCL_STATUS DclSIM_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ return STATUS_FAIL;
+}
+
+DCL_STATUS DclSIM_Close(DCL_HANDLE handle)
+{
+ return STATUS_FAIL;
+}
+
+#endif /*!defined(DRV_SIM_OFF)*/
+
+#endif /*DCL_SIM_INTERFACE*/