[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/custom/protocol/common/ps/custom_em.c b/mcu/custom/protocol/common/ps/custom_em.c
new file mode 100644
index 0000000..eeb7f65
--- /dev/null
+++ b/mcu/custom/protocol/common/ps/custom_em.c
@@ -0,0 +1,1774 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * custom_em.c
+ *
+ * Project:
+ * --------
+ * MAUI
+ *
+ * Description:
+ * ------------
+ * This file is for engineer mode.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by ClearCase. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * $Log$
+ *
+ * 08 02 2021 tongkun.zhang
+ * [MOLY00678004] [M80][FM350-GL][harvey.cheng][DIPC][NA][NA][NA]Dipc_config process consultation
+ *
+ * dipc enhance for security
+ *
+ * 07 29 2021 tongkun.zhang
+ * [MOLY00678004] [M80][FM350-GL][harvey.cheng][DIPC][NA][NA][NA]Dipc_config process consultation
+ *
+ * DIPC
+ *
+ * 07 27 2021 tongkun.zhang
+ * [MOLY00678004] [M80][FM350-GL][harvey.cheng][DIPC][NA][NA][NA]Dipc_config process consultation
+ *
+ * DIPC change for pcie control
+ *
+ * 11 10 2020 tongkun.zhang
+ * [MOLY00593154] [L5] patch back L5 from NR15.R3.MD700.MP to NR15.R3.MD700.MP
+ *
+ * [L5][OA]
+ *
+ * 08 06 2020 tongkun.zhang
+ * [MOLY00555238] [L5] patch back L5 to NR15.R3.T700.MP
+ *
+ * [L5][OA]Custom
+ *
+ * 07 19 2020 mingchun.cheng
+ * [MOLY00545496] [L5] patch back L5 to NR15.R3.MT6880.MP
+ * .
+ *
+ * 07 14 2020 tongkun.zhang
+ * [MOLY00545496] [L5] patch back L5 to NR15.R3.MT6880.MP
+ *
+ * L5 OA
+ * 06 23 2020 titi.wu
+ * [MOLY00536776] 97 LG ePDG new CHANNEL
+ * titi-RD
+ *
+ * 07 09 2020 mingchun.cheng
+ * [MOLY00533417] [L5] patch back L5 to NR15.R3.COLGIN.SB.SMT.DEV]
+ *
+ * .
+ *
+ * 09 18 2019 victoria.wang
+ * [MOLY00416922] DHL Legacy Wrapper migration and phase-out
+ * [Remove][DHL] phase out legacy wrapper API
+ *
+ * 07 31 2019 lucien.li
+ * [MOLY00408908] [CODE SYNC] Modem??SAR Sensor??έSARݨD? (VMOLY)
+ *
+ * (SWRD)[SAR Sensor][L4C]
+ *
+ * 05 24 2018 hong.yu
+ * [MOLY00325228] [UMOLYE] Remove NVRAM group header file
+ * include dhl_nvram_def.h
+ *
+ * 06 05 2017 hong.yu
+ * [MOLY00255008] [Gen93] fix build warning
+ * fix build warning
+ *
+ * 12 28 2016 hong.yu
+ * [MOLY00221317] [Gen93] L4 Integration M1 check in
+ * ATP,L4B and L4C M1 check in
+ *
+ * 11 24 2016 allen.hsu
+ * sync MOLY00212575.
+ *
+ * 03 04 2016 bart.liang
+ * [MOLY00164802] [L4C] Revise l4c for klocwork and coverity check
+ * For MSBB activity.
+ *
+ * 09 30 2015 bart.liang
+ * [MOLY00137572] [PS8] 2015 Q3 Build Warning Fix Activity
+ * .
+ *
+ * 07 22 2015 eason.lai
+ * [MOLY00130157] [TK6291][DHL] smart logging migration
+ * .
+ *
+ * 06 23 2015 lexel.yu
+ * [MOLY00123397] [MT6755][BRINGUP_FIRSTCALL] Replace compile option for speech port
+ * .
+ *
+ * 01 14 2015 bart.liang
+ * [MOLY00092425] Revise RF init status in L4C_init
+ *
+ * 11 13 2014 jerry.chang
+ * [MOLY00084326] checkin common custom file to MOLY.W14.42.LTE.p2
+ * rollback to MOLY.W14.42.LTE.p2
+ *
+ * 08 29 2014 xuejing.chen
+ * [MOLY00077547] [SGLTE DSDS] AT+EGMR write IMEI change
+ * .
+ *
+ * 05 19 2014 bart.liang
+ * [MOLY00065517] [MT6290] Add API for L4 to query the status of RF_init.
+ *
+ * 03 30 2014 xuejing.chen
+ * [MOLY00061326] [CMCC_SGLTE_P1] [MT6592][SGLTE][Free][EE]Externel (EE),0,0,99,/data/core/,1,modem,
+ * .
+ *
+ * 03 19 2014 lexel.yu
+ * [MOLY00059647] [MT6290E2] SAR feature support for 4G LTE
+ * 4G TX power reduction
+ *
+ * 12 31 2013 vend_bob.chiang
+ * [MOLY00051916] ??G750-T00?�读?�IMEI?�失败�?跟ALPS01209771 ?�象?��?
+ * .
+ *
+ * 12 13 2013 vend_bob.chiang
+ * [MOLY00046566] [Need Patch] [Volunteer Patch] low battery protect
+ * .
+ *
+ * 11 15 2013 ken.liu
+ * [MOLY00046623] [MT6290E1][DHL] Add filter on/off control for META tool
+ * add filter on/off control for META tool.
+ *
+ * 11 14 2013 lexel.yu
+ * [MOLY00013956] [MT6290 Bring-up][MT6290E1][FirstCall] Submit L4 revise for bring up
+ * Disable uart3
+ *
+ * 07 01 2013 lexel.yu
+ * [MOLY00028040] Customized AT command port setting
+ * PS Port setting refined
+ *
+ * 06 13 2013 lexel.yu
+ * [MOLY00013956] [MT6290 Bring-up][MT6290E1][FirstCall] Submit L4 revise for bring up
+ * Port setting revise for SP boot up.
+ * MBCI revise for MBIM.
+ *
+ * 03 14 2013 xuejing.chen
+ * [MOLY00010058] Remove Driver FakeAPI
+ * Wrap pwm driver related codes with compile option.
+ *
+ * 02 04 2013 xuejing.chen
+ * [MOLY00009887] Rename MT7208 to MT6290
+ * .
+ *
+ * 12 06 2012 danny.kuo
+ * [MOLY00005824] [NVRAM][MT6280][Change Feature] Support modem switch between RNDIS and HOSTED_DONGLE
+ * Integration change.
+ *
+ * 11 12 2012 chin-chieh.hung
+ * [MOLY00005322] TATAKA merge to MOLY
+ * add thumb2 instruction support & remove uart_port3 in MT7208 project
+ *
+ * 09 20 2012 mingtsung.sun
+ * [MOLY00000284] [PPP][MT6280] 3 PPP Dialup Support
+ * Integration change. - 3PPP + Voice call configuration of USB
+ *
+ * 08 21 2012 lexel.yu
+ * [MOLY00002426] KAL API replacement
+ * Integration change.
+ *
+ * 08 13 2012 lexel.yu
+ * [MOLY00001791] [MT6280] USB 5VCOM port setting
+ * Integration change.
+ *
+ * 08 02 2012 chenhao.gong
+ * [MOLY00000729] [L4C]Fix Moly compile warning
+ * .
+ *
+ * 07 19 2012 chenhao.gong
+ * [MOLY00000729] [L4C]Fix Moly compile warning
+ * .
+ *
+ * 07 10 2012 mingtsung.sun
+ * [MOLY00000284] [PPP][MT6280] 3 PPP Dialup Support
+ * Update port setting for 5VCOM
+ *
+ * 07 06 2012 mingtsung.sun
+ * [MOLY00000284] [PPP][MT6280] 3 PPP Dialup Support
+ * Auto camp on and generate USB COMs when bootup
+ *
+ * 06 01 2012 ray.lin-wang
+ * removed!
+ * .
+ *
+ * 05 30 2012 lexel.yu
+ * removed!
+ * <saved by Perforce>
+ *
+ * 05 25 2012 chenhao.gong
+ * removed!
+ * .
+ *
+ * 05 24 2012 wcpuser_integrator
+ * removed!
+ * Qinghua Yu check in global enum (MSG & SAP) at modem_dev.
+ *
+ * 05 24 2012 wcpuser_integrator
+ * removed!
+ * Qinghua Yu check in global enum (MSG & SAP) at modem_dev.
+ *
+ * 05 24 2012 wcpuser_integrator
+ * removed!
+ * Qinghua Yu check in global enum (MSG & SAP) at modem_dev.
+ *
+ * 05 21 2012 lexel.yu
+ * removed!
+ * 5VCOM - MODEM_DEV
+ *
+ * 05 18 2012 shyla.lan
+ * removed!
+ * Sync with MT6280_DVT_DEV
+ *
+ * 05 04 2012 chenhao.gong
+ * removed!
+ * .
+ *
+ * 04 24 2012 wcpuser_integrator
+ * removed!
+ * .
+ *
+ * 12 27 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 13 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 08 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 08 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 11 24 2011 shengkai.lin
+ * removed!
+ * .
+ *
+ * 11 17 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 11 15 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 11 15 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 11 08 2011 lexel.yu
+ * removed!
+ * MSBB Check in
+ *
+ * 11 04 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 08 04 2011 lexel.yu
+ * removed!
+ * Integration change.
+ *
+ * 08 02 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 08 02 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 06 02 2011 lexel.yu
+ * removed!
+ * Integration change.
+ *
+ * 05 23 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 05 18 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 04 19 2011 pohan.chu
+ * removed!
+ * CUSTOM CODEC PRIORITY
+ *
+ * 03 03 2011 chelun.tsai
+ * removed!
+ * .
+ *
+ * 03 03 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 02 17 2011 xiaojian.long
+ * removed!
+ * Check in TDD EM BLER Statistic
+ *
+ * 02 16 2011 hongwei.zhang
+ * removed!
+ * .SRNC ID display
+ *
+ * 02 15 2011 cylen.yao
+ * removed!
+ * [HAL] MAUI custom module split
+ *
+ * 01 31 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 01 20 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 01 10 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 01 06 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 01 05 2011 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 30 2010 jinxing.hu
+ * removed!
+ * .
+ *
+ * 12 28 2010 jianhua.zhao
+ * removed!
+ * removed!
+ * .
+ *
+ * 12 28 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 24 2010 gordonjc.kuo
+ * removed!
+ * .
+ *
+ * 12 22 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 20 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 17 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 17 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 16 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 16 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 15 2010 lexel.yu
+ * removed!
+ * Integration change.
+ *
+ * 12 13 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 13 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 12 01 2010 yanfei.ding
+ * removed!
+ * [make c,r uas]Merge UL2 EM code backup MAUI.
+ *
+ * 11 30 2010 yongtuan.qiao
+ * removed!
+ * add TDD128 handover sequence info in EM.
+ *
+ * 11 30 2010 lexel.yu
+ * removed!
+ * <saved by Perforce>
+ *
+ * 11 30 2010 lexel.yu
+ * removed!
+ * remove swdbg_sw.h
+ *
+ * 11 28 2010 lexel.yu
+ * removed!
+ * Integration change.
+ *
+ * 11 27 2010 gordonjc.kuo
+ * removed!
+ * .
+ *
+ * 11 26 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 09 26 2010 jianhua.zhao
+ * removed!
+ * .
+ *
+ * 09 03 2010 shengkai.lin
+ * removed!
+ * .
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * remove compile option
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * volatile type
+ *
+ * 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!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * Apply new EM architecture for 3G
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * add plutommi compile option
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * Move secure time into custom folder.
+ *
+ * removed!
+ * removed!
+ * Add custom_config_rlc_timer() for customer can set rlc timer value, default = 3 second.
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * compile error
+ *
+ * removed!
+ * removed!
+ * Let customer can configure ACM boundary, if acm is exceed the reasonable boundary, turn off ACM check and will not disconnect MO/MT call.
+ *
+ * removed!
+ * rebase maintrunk.MAUI_MSZ on 03/17/2007 11:19:34 PM.
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * Network Events notification mech. support.
+ *
+ * removed!
+ * removed!
+ * Fix MoDIS compile warning.
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * download folder name customization
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by ClearCase. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#include "kal_general_types.h"
+//#include "lcm_if.h"
+#include "kal_public_api.h"
+#include "string.h"
+#include "nvram_data_items.h"
+#include "kal_public_defs.h"
+//#include "stack_common.h"
+#include "dcl.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+#include "nvram_interface.h"
+//#include "lcd_if.h"
+#include "custom_em.h"
+#include "device.h"
+#include "l1audio.h"
+#include "em_struct.h"
+#include "dcl.h"
+#include "drv_comm.h"
+#include "l4c_em.h"
+#include "dhl_cc_public.h"
+#include "ps_public_utility.h"
+#include "dhl_nvram_def.h"
+
+#include "svc_sap.h"
+#include "custom_port.h"
+
+typedef struct
+{
+ kal_uint32 freq[CUSTOM_EM_PWM_TYPE_MAX];
+ kal_uint32 duty_cycle[CUSTOM_EM_PWM_TYPE_MAX];
+} custom_em_pwm_param_set_struct;
+
+typedef struct
+{
+ custom_em_pwm_param_set_struct custom_em_pwm_param; /* PWM Current Setting */
+ custom_em_pwm_param_set_struct custom_em_pwm_level_param[CUSTOM_EM_PWM_LEVEL_MAX]; /* PWM Level */
+} custom_em_param_context_struct;
+
+#ifndef __L1_STANDALONE__
+static void custom_em_gpio_writeIO(kal_uint8 data, kal_uint8 port);
+static void custom_em_gpo_writeIO(kal_uint8 data,kal_uint8 port);
+#endif
+
+extern UART_PORT atp_custom_ps_uart_port(void);
+
+#ifndef __L1_STANDALONE__
+
+kal_bool g_is_custom_em_init = KAL_FALSE;
+custom_em_param_context_struct g_em_context;
+
+extern void PWM_level(kal_uint8 level);
+
+#ifndef DRV_PWM_NOT_EXIST
+static kal_bool custom_em_init(kal_bool is_reset)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+ //kal_uint32 Ret, len;
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+ kal_mem_set(&g_em_context, 0, sizeof(custom_em_param_context_struct));
+ g_is_custom_em_init = KAL_TRUE;
+ return KAL_TRUE;
+}
+#endif
+
+kal_uint8 custom_em_pwm_get_hw_current_level(CUSTOM_EM_PWM_TYPE type)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ DCL_HANDLE pwm_handle;
+ DCL_CTRL_DATA_T data;
+ switch (type)
+ {
+ case (CUSTOM_EM_PWM_TYPE_1):
+ pwm_handle=DclPWM_Open(DCL_PWM1,MOD_UEM);
+ DclPWM_Control(pwm_handle,PWM_CMD_GET_CURRENT_LEVEL,&data);
+ DclPWM_Close(pwm_handle);
+ return data.rPWMSaveData.pwm_level;
+
+ case (CUSTOM_EM_PWM_TYPE_2):
+ return 0;
+
+ case (CUSTOM_EM_PWM_TYPE_3):
+ pwm_handle=DclPWM_Open(DCL_PWM3, MOD_UEM);
+ DclPWM_Control(pwm_handle,PWM_CMD_GET_CURRENT_LEVEL,&data);
+ DclPWM_Close(pwm_handle);
+ return data.rPWMSaveData.pwm_level;
+ default:
+ ASSERT(0);
+ break;
+ }
+#endif
+ return 0;
+}
+
+kal_bool custom_em_pwm_get_level_value(
+ CUSTOM_EM_PWM_TYPE type,
+ CUSTOM_EM_PWM_LEVEL level,
+ kal_uint16 *freq,
+ kal_uint8 *duty_cycle)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ if (g_is_custom_em_init != KAL_TRUE)
+ {
+ custom_em_init(KAL_FALSE);
+ }
+
+ if (level >= CUSTOM_EM_PWM_LEVEL_MAX || type >= CUSTOM_EM_PWM_TYPE_MAX)
+ {
+ return KAL_FALSE;
+ }
+
+ *freq = g_em_context.custom_em_pwm_level_param[level].freq[type];
+ *duty_cycle = g_em_context.custom_em_pwm_level_param[level].duty_cycle[type];
+
+ return KAL_TRUE;
+#else
+ return KAL_FALSE;
+#endif
+}
+
+extern void PWM3_level(kal_uint8 level);
+void custom_em_pwm_set_level(CUSTOM_EM_PWM_TYPE type, kal_uint8 level)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ switch (type)
+ {
+ case (CUSTOM_EM_PWM_TYPE_1):
+ PWM_level(level);
+ break;
+ case (CUSTOM_EM_PWM_TYPE_2):
+ break;
+ case (CUSTOM_EM_PWM_TYPE_3):
+ PWM3_level(level);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+#endif
+}
+
+kal_bool custom_em_pwm_set_level_value(
+ CUSTOM_EM_PWM_TYPE type,
+ CUSTOM_EM_PWM_LEVEL level,
+ kal_uint16 freq,
+ kal_uint8 duty_cycle)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ if (g_is_custom_em_init != KAL_TRUE)
+ {
+ custom_em_init(KAL_FALSE);
+ }
+
+ if (level >= CUSTOM_EM_PWM_LEVEL_MAX || type >= CUSTOM_EM_PWM_TYPE_MAX)
+ {
+ return KAL_FALSE;
+ }
+
+ g_em_context.custom_em_pwm_level_param[level].freq[type] = freq;
+ g_em_context.custom_em_pwm_level_param[level].duty_cycle[type] = duty_cycle;
+
+
+ return KAL_TRUE;
+#else
+ return KAL_FALSE;
+#endif
+}
+
+void custom_em_pwm_start(CUSTOM_EM_PWM_TYPE type, kal_uint32 freq, kal_uint32 duty)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ DCL_HANDLE pwm_handle;
+ PWM_CMD_CONFIG_OLD_T old_config;
+ //ALERTER_CONFIGURE_T alerter_config;
+ if (g_is_custom_em_init != KAL_TRUE)
+ {
+ custom_em_init(KAL_FALSE);
+ }
+
+ switch (type)
+ {
+ case (CUSTOM_EM_PWM_TYPE_1):
+ pwm_handle=DclPWM_Open(DCL_PWM1,MOD_UEM);
+ old_config.freq=freq;
+ old_config.duty=duty;
+ DclPWM_Control(pwm_handle,PWM_CMD_CONFIG_OLD,(DCL_CTRL_DATA_T*)&old_config);
+ DclPWM_Control(pwm_handle,PWM_CMD_START,0);
+ DclPWM_Close(pwm_handle);
+ break;
+
+ case (CUSTOM_EM_PWM_TYPE_2):
+ break;
+
+ case (CUSTOM_EM_PWM_TYPE_3):
+ pwm_handle=DclPWM_Open(DCL_PWM3,MOD_UEM);
+ old_config.freq=freq;
+ old_config.duty=duty;
+ DclPWM_Control(pwm_handle,PWM_CMD_CONFIG_OLD,(DCL_CTRL_DATA_T*)&old_config);
+ DclPWM_Control(pwm_handle,PWM_CMD_START,0);
+ DclPWM_Close(pwm_handle);
+ break;
+
+ default:
+ ASSERT(0);
+ break;
+ }
+#endif
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_pwm_stop
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * type [IN]
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_pwm_stop(CUSTOM_EM_PWM_TYPE type)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ DCL_HANDLE pwm_handle;
+ if (g_is_custom_em_init != KAL_TRUE)
+ {
+ custom_em_init(KAL_FALSE);
+ }
+
+ switch (type)
+ {
+ case (CUSTOM_EM_PWM_TYPE_1):
+ pwm_handle=DclPWM_Open(DCL_PWM1,MOD_UEM);
+ DclPWM_Control(pwm_handle,PWM_CMD_STOP,0);
+ DclPWM_Close(pwm_handle);
+ break;
+
+ case (CUSTOM_EM_PWM_TYPE_2):
+ break;
+
+ case (CUSTOM_EM_PWM_TYPE_3):
+ pwm_handle=DclPWM_Open(DCL_PWM3,MOD_UEM);
+ DclPWM_Control(pwm_handle,PWM_CMD_STOP,0);
+ DclPWM_Close(pwm_handle);
+ break;
+
+ default:
+ ASSERT(0);
+ break;
+ }
+#endif
+}
+
+void custom_em_pwm_get_value(kal_uint16 *freq, kal_uint8 *duty_cycle)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ if (g_is_custom_em_init != KAL_TRUE)
+ {
+ custom_em_init(KAL_FALSE);
+ }
+
+ kal_mem_cpy(freq, g_em_context.custom_em_pwm_param.freq, sizeof(g_em_context.custom_em_pwm_param.freq));
+ kal_mem_cpy(
+ duty_cycle,
+ g_em_context.custom_em_pwm_param.duty_cycle,
+ sizeof(g_em_context.custom_em_pwm_param.duty_cycle));
+#endif
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_pwm_set_value
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * freq [?]
+ * duty_cycle [?]
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_pwm_set_value(kal_uint16 *freq, kal_uint8 *duty_cycle)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+#ifndef DRV_PWM_NOT_EXIST
+ if (g_is_custom_em_init != KAL_TRUE)
+ {
+ custom_em_init(KAL_FALSE);
+ }
+
+ kal_mem_cpy(g_em_context.custom_em_pwm_param.freq, freq, sizeof(g_em_context.custom_em_pwm_param.freq));
+ kal_mem_cpy(
+ g_em_context.custom_em_pwm_param.duty_cycle,
+ duty_cycle,
+ sizeof(g_em_context.custom_em_pwm_param.duty_cycle));
+#endif
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_gpio_start
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * port [IN]
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_gpio_start(kal_uint8 port)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+ custom_em_gpio_writeIO(1, port);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_gpio_stop
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * port [IN]
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_gpio_stop(kal_uint8 port)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+ custom_em_gpio_writeIO(0, port);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_gpo_writeio
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * data [IN]
+ * port [IN]
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_gpo_writeio(kal_int8 data, kal_int8 port)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+ custom_em_gpo_writeIO(data, port);
+}
+
+
+#endif /* __L1_STANDALONE__ */
+
+static kal_uint8 CTI_UART_PORT = 0;
+static UART_baudrate CTI_BAUD_RATE = 0;
+
+kal_bool High_Speed_SIM = KAL_FALSE;
+kal_uint8 UART_POWER_SETTING = 0;
+
+kal_uint8 g_usb_cdrom_config;
+
+#ifdef __TST_MODULE__
+extern UART_PORT TST_PORT;
+extern UART_baudrate TST_BAUDRATE;
+
+extern UART_PORT TST_PORT_L1;
+extern UART_baudrate TST_BAUDRATE_L1;
+
+#if defined(__DSP_FCORE4__)
+ extern UART_PORT TST_PORT_DSP;
+ extern UART_baudrate TST_BAUDRATE_DSP;
+#endif //#if defined(__DSP_FCORE4__)
+
+/* This macro can be located at the makefile */
+#ifdef __TST_WRITE_TO_FILE__
+extern kal_uint8 TST_OUTPUT_MODE;
+#endif
+
+#ifndef L4_NOT_PRESENT
+extern UART_PORT PS_UART_PORT;
+extern UART_PORT PS_UART_PORT_2;
+extern UART_PORT PS_EPDG_CMD_PORT;
+extern UART_PORT PS_EPDG_URC_PORT;
+extern UART_PORT PS_EPDG_CMD_PORT_2;
+extern UART_PORT PS_EPDG_URC_PORT_2;
+extern UART_baudrate PS_BAUDRATE;
+#endif /* L4_NOT_PRESENT */
+#endif /* __TST_MODULE__ */
+extern kal_uint8 SWDBG_Profile;
+extern kal_uint32 BytesPerCluster; /* will be set to exact value in nvram_get_disk_file_info */
+
+
+#ifdef __DATA_CARD_SPEECH__
+#ifdef __MTK_TARGET__
+extern UART_PORT SPEECH_PORT;
+#endif
+#endif
+
+extern void UART_TurnOnPower(UART_PORT port, kal_bool enable);
+#ifndef __L1_STANDALONE__
+static kal_bool custom_em_is_uart_used(UART_PORT port);
+#endif
+
+extern boot_mode_type stack_query_boot_mode(void);
+
+#ifndef __MAUI_BASIC__
+
+static void custom_em_uart_turnon_power(UART_PORT port, kal_bool on);
+
+
+/*****************************************************************************
+ * FUNCTION
+ * nvram_config_com_port
+ * DESCRIPTION
+ * To init COM port setting
+ * PARAMETERS
+ * void
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_nvram_config_com_port(void)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+ kal_uint8 *buffer = NULL;
+ kal_bool result;
+#if defined(__BOOT_FOR_USBAT__) && defined(__MTK_TARGET__)
+ kal_bool for_usbat = KAL_FALSE;
+#endif
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+ buffer = (kal_uint8*) get_ctrl_buffer(NVRAM_EF_PORT_SETTING_SIZE);
+
+ if (buffer)
+ {
+ port_setting_struct *port_setting;
+
+ result = nvram_external_read_data(NVRAM_EF_PORT_SETTING_LID, 1, buffer, NVRAM_EF_PORT_SETTING_SIZE);
+
+ /* Ok, now config UART/IrCOMM ports for L4 and TST, and filters to TST */
+ if (result)
+ {
+ #if defined(__BOOT_FOR_USBAT__) && defined(__MTK_TARGET__)
+ for_usbat = INT_IsBootForUSBAT();
+ #endif
+
+
+ port_setting = (port_setting_struct*) buffer;
+
+ #ifdef __TST_MODULE__
+
+ #ifdef __IRDA_SUPPORT__
+ if ( (uart_port_irda == (UART_PORT) port_setting->tst_port_ps) ||
+ (uart_port_irda == (UART_PORT) port_setting->tst_port_l1))
+ {
+ init_ircomm_module();
+ IRDA_Open();
+ }
+ #endif /* __IRDA_SUPPORT__ */
+
+ #if defined(__BOOT_FOR_USBAT__) && defined(__MTK_TARGET__)
+ if (for_usbat)
+ {
+ TST_PORT = (UART_PORT) uart_port1;
+ TST_PORT_L1 = (UART_PORT) uart_port1;
+ }
+ else
+ #endif
+ {
+ TST_PORT = (UART_PORT) port_setting->tst_port_ps;
+ TST_PORT_L1 = (UART_PORT) port_setting->tst_port_l1;
+ }
+
+ TST_BAUDRATE = port_setting->tst_baudrate_ps;
+ TST_BAUDRATE_L1 = port_setting->tst_baudrate_l1;
+
+ #ifndef L4_NOT_PRESENT
+ #if defined(__BOOT_FOR_USBAT__) && defined(__MTK_TARGET__)
+ if (for_usbat)
+ {
+ PS_UART_PORT = (UART_PORT) uart_port_usb;
+ }
+ else
+ #endif
+ {
+ kal_uint8 port_mode = CUSTOM_PORT_GET_MODE(CUSTOM_PORT_USER_AT);
+ switch (port_mode) {
+ case PORT_MODE_USB:
+ PS_UART_PORT = (UART_PORT) uart_port_usb;
+ break;
+ case PORT_MODE_PCIE:
+ if(0 != CUSTOM_PORT_GET_PCIE_ENABLE(CUSTOM_PORT_USER_AT)) {
+ PS_UART_PORT = (UART_PORT) uart_port_at_ccci;
+ } else {
+ PS_UART_PORT = (UART_PORT) uart_port_null;
+ }
+ break;
+ default:
+ PS_UART_PORT = (UART_PORT) port_setting->ps_port;
+ }
+ PS_UART_PORT_2 = (UART_PORT) port_setting->ndis_port;
+ PS_EPDG_CMD_PORT = (UART_PORT) port_setting->epdg_cmd_port;
+ PS_EPDG_URC_PORT = (UART_PORT) port_setting->epdg_urc_port;
+ PS_EPDG_CMD_PORT_2 = (UART_PORT) port_setting->epdg_cmd_port_2;
+ PS_EPDG_URC_PORT_2 = (UART_PORT) port_setting->epdg_urc_port_2;
+ }
+ PS_BAUDRATE = port_setting->ps_baudrate;
+
+ #endif /* L4_NOT_PRESENT */
+
+ #if defined(__DSP_FCORE4__)
+ TST_PORT_DSP = (UART_PORT) port_setting->tst_port_dsp;
+ TST_BAUDRATE_DSP = port_setting->tst_baud_rate_dsp;
+ #endif //#if defined(__DSP_FCORE4__)
+
+ #endif /* __TST_MODULE__ */
+
+ High_Speed_SIM = port_setting->High_Speed_SIM_Enabled;
+
+ if (High_Speed_SIM)
+ {
+ // remove
+ }
+
+ SWDBG_Profile = port_setting->swdbg;
+ UART_POWER_SETTING = port_setting->uart_power_setting;
+ CTI_UART_PORT = port_setting->cti_uart_port;
+ CTI_BAUD_RATE = port_setting->cti_baudrate;
+
+ #ifdef __TST_WRITE_TO_FILE__
+ TST_OUTPUT_MODE = port_setting->tst_output_mode;
+ #endif
+
+
+ #ifdef __MTK_TARGET__
+ #ifndef __L1_STANDALONE__
+ /* To determine if in META mode */
+ if (FACTORY_BOOT != kal_query_boot_mode())
+ {
+ //kal_bool enable;
+
+ if (custom_em_is_uart_used(uart_port1))
+ {
+ custom_em_uart_turnon_power(uart_port1, KAL_TRUE);
+ }
+ else
+ {
+ custom_em_uart_turnon_power(uart_port1, KAL_FALSE);
+ }
+ #ifndef __SMART_PHONE_MODEM__
+ if (custom_em_is_uart_used(uart_port2))
+ {
+ custom_em_uart_turnon_power(uart_port2, KAL_TRUE);
+ }
+ else
+ {
+ custom_em_uart_turnon_power(uart_port2, KAL_FALSE);
+ }
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ #endif
+ }
+ else /* In META Mode, Turn on every UART power */
+ #endif /* __L1_STANDALONE__ */
+ {
+ #ifndef __SMART_PHONE_MODEM__
+ custom_em_uart_turnon_power(uart_port1, KAL_TRUE);
+ custom_em_uart_turnon_power(uart_port2, KAL_TRUE);
+#if 0
+/* under construction !*/
+#endif
+ #endif
+ }
+ #endif /* __MTK_TARGET__ */
+
+ g_usb_cdrom_config = port_setting->usb_cdrom_config;
+
+ #ifdef __DATA_CARD_SPEECH__
+ #ifdef __MTK_TARGET__
+ SPEECH_PORT = port_setting->speech_port;
+ #endif
+ #endif
+ }
+
+ free_ctrl_buffer(buffer);
+ }
+
+ buffer = NULL;
+}
+
+
+#ifndef __L1_STANDALONE__
+static kal_bool custom_em_is_uart_used(UART_PORT port)
+{
+#if defined(__TST_MODULE__)
+ if (TST_PORT == port ||
+ TST_PORT_L1 == port
+ #if !defined(L4_NOT_PRESENT)
+ || PS_UART_PORT == port
+ || PS_UART_PORT_2 == port
+ || PS_EPDG_CMD_PORT == port
+ || PS_EPDG_URC_PORT == port
+ || PS_EPDG_CMD_PORT_2 == port
+ || PS_EPDG_URC_PORT_2 == port
+ || atp_custom_ps_uart_port() == port
+ #endif
+ #if defined(__DSP_FCORE4__)
+ || TST_PORT_DSP == port
+ #endif
+ )
+ {
+ return KAL_TRUE;
+ }
+ else
+#endif //#if defined(__TST_MODULE__)
+ {
+ return KAL_FALSE;
+ }
+}
+#endif
+
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_get_usb_cdrom_config
+ * DESCRIPTION
+ * To get USB CDROM configure value
+ * PARAMETERS
+ * void
+ * RETURNS
+ * 0 for CDROM, 1 for COM
+ *****************************************************************************/
+kal_uint8 custom_em_get_usb_cdrom_config(void)
+{
+ return g_usb_cdrom_config;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_set_usb_cdrom_config
+ * DESCRIPTION
+ * To set USB CDROM configure value
+ * PARAMETERS
+ * value
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_set_usb_cdrom_config(kal_uint8 cdrom_config)
+{
+ g_usb_cdrom_config = cdrom_config;
+}
+
+#endif /* #ifndef __MAUI_BASIC__*/
+
+/*****************************************************************************
+ * FUNCTION
+ * nvram_get_cti
+ * DESCRIPTION
+ * To get CTI_UART_PORT
+ * PARAMETERS
+ * void
+ * RETURNS
+ * kal_uint8 [OUT] CTI
+ *****************************************************************************/
+void nvram_get_cti(kal_uint8 *port, kal_uint32 *baudrate)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+
+ *port = CTI_UART_PORT;
+ *baudrate = (kal_uint32) CTI_BAUD_RATE;
+ return;
+}
+
+
+
+/*****************************************************************************
+ * FUNCTION
+ * nvram_get_speech
+ * DESCRIPTION
+ * To get SPEECH_PORT
+ * PARAMETERS
+ * void
+ * RETURNS
+ * kal_uint8 [OUT] CTI
+ *****************************************************************************/
+void nvram_get_speech(kal_uint8 *port, kal_uint32 *baudrate)
+{
+#ifdef __DATA_CARD_SPEECH__
+#ifdef __MTK_TARGET__
+ *port = SPEECH_PORT;
+ *baudrate = 0;
+#endif
+#endif
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * nvram_get_swdbg
+ * DESCRIPTION
+ * To get SWDBG_Profile
+ * PARAMETERS
+ * void
+ * RETURNS
+ * kal_uint8 [OUT] swdbg_profile
+ *****************************************************************************/
+void nvram_get_swdbg(kal_uint8 *swdbg_profile)
+{
+ /*----------------------------------------------------------------*/
+ /* Local Variables */
+ /*----------------------------------------------------------------*/
+
+ /*----------------------------------------------------------------*/
+ /* Code Body */
+ /*----------------------------------------------------------------*/
+
+ *swdbg_profile = SWDBG_Profile;
+}
+
+void custom_em_uart_turnon_power(UART_PORT port, kal_bool on)
+{
+ DCL_HANDLE handle;
+ UART_CTRL_POWERON_T data;
+
+ handle = DclSerialPort_Open(port, 0);
+ data.bFlag_Poweron = on;
+ DclSerialPort_Control(handle, UART_CMD_POWER_ON, (DCL_CTRL_DATA_T*)&data);
+
+ DclSerialPort_Close(handle);
+}
+
+#ifndef __L1_STANDALONE__
+static void custom_em_gpio_writeIO(kal_uint8 data, kal_uint8 port)
+{
+ DCL_HANDLE handle;
+
+ handle=DclGPIO_Open(DCL_GPIO, port);
+
+ if(0 == data)
+ DclGPIO_Control(handle,GPIO_CMD_WRITE_LOW,0);
+ else if(1 == data)
+ DclGPIO_Control(handle,GPIO_CMD_WRITE_HIGH,0);
+
+ DclGPIO_Close(handle);
+}
+
+static void custom_em_gpo_writeIO(kal_uint8 data,kal_uint8 port)
+{
+ DCL_HANDLE handle;
+
+ handle=DclGPIO_Open(DCL_GPO,port);
+
+ if(0 == data)
+ DclGPIO_Control(handle,GPO_CMD_WRITE_LOW,0);
+ else if(1 == data)
+ DclGPIO_Control(handle,GPO_CMD_WRITE_HIGH,0);
+
+ DclGPIO_Close(handle);
+}
+#endif /* #ifndef __L1_STANDALONE__ */
+
+#ifdef __SP_RIL_SUPPORT__
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_thermal_red_ccci_hisr_callback
+ * DESCRIPTION
+ * reduce TX power
+ * PARAMETERS
+ * value [IN] tx reduction unit, byte 3: reserved, byte 2: reserved, byte 1: 3G, byte 0: 2G
+ * RETURNS
+ * void
+ *****************************************************************************/
+void custom_em_thermal_red_ccci_hisr_callback(kal_uint32 value)
+{
+
+ if (kal_query_boot_mode() == NORMAL_BOOT)
+ {
+ kal_uint8 gsm_tx_pwr_reduction_tbl[4][2][4];
+ kal_uint8 umts_tx_pwr_reduction_tbl[20][2];
+ kal_uint8 gsm_tx_pwr_reduction_tbl_tas[4][2][4];
+ kal_uint8 umts_tx_pwr_reduction_tbl_tas[20][2];
+
+ kal_mem_set((void*)gsm_tx_pwr_reduction_tbl, (value & 0x000000FF), 4*2*4);
+ kal_mem_set((void*)umts_tx_pwr_reduction_tbl, ((value & 0x0000FF00) >> 8), 20*2);
+ kal_mem_set((void*)gsm_tx_pwr_reduction_tbl_tas, (value & 0x000000FF), 4*2*4);
+ kal_mem_set((void*)umts_tx_pwr_reduction_tbl_tas, ((value & 0x0000FF00) >> 8), 20*2);
+
+ l4c_l1_max_tx_pwr_red_req((kal_uint8)0, 1, KAL_TRUE, (kal_uint8***)gsm_tx_pwr_reduction_tbl, (kal_uint8***)gsm_tx_pwr_reduction_tbl_tas,
+ KAL_TRUE, (kal_uint8**)umts_tx_pwr_reduction_tbl, (kal_uint8**)umts_tx_pwr_reduction_tbl_tas, KAL_FALSE, 0, NULL);
+ }
+}
+#endif /* __SP_RIL_SUPPORT__ */
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_em_get_imei_rec_by_sim
+ * DESCRIPTION
+ * get mapping based on SIM slot or 3g switched protocol
+ * if defined: SIM slot
+ * if not defined: 3g switched protocol (default)
+ * PARAMETERS
+ * op [IN] 0 for read, 1 for write
+ * slot [IN] SIM slot
+ * RETURNS
+ * sim_interface_enum
+ *****************************************************************************/
+sim_interface_enum custom_em_get_imei_rec_by_sim(kal_uint8 op, sim_interface_enum slot)
+{
+ sim_interface_enum idx;
+
+#if defined(__CUSTOM_MAP_SIM_SLOT__)
+ idx = slot;
+#else
+ idx = l4c_gemini_get_switched_sim_id(slot);
+#endif /* __CUSTOM_MAP_SIM_SLOT__ */
+
+ return idx;
+}
+
+#ifdef __SAR_SENSOR_SUPPORT__
+/*****************************************************************************
+ * FUNCTION
+ * custom_sar_mapping
+ *
+ * DESCRIPTION
+ * Needs to be updated by customer.
+ *
+ * PARAMETERS
+ * g_sar_sensor_state [IN]
+ * 0x00 : Far
+ * 0x01 : Near
+ * 0xFD : SAR sensor state disable
+ * 0xFE : SAR sensor state enable
+ * 0xFF : SAR sensor state not support
+ * g_scenario_index [IN]
+ * 1~20: Range of valid values of Scenario index
+ *
+ * RETURNS
+ * scenario_index: kal_int16
+ * -1: combined scenario index disable
+ * 1~20: Range of valid values of combined scenario index
+ *****************************************************************************/
+kal_int16 custom_sar_mapping(kal_uint8 g_sar_sensor_state, kal_uint16 g_scenario_index)
+{
+ if((g_sar_sensor_state == 255)||(g_sar_sensor_state == 254)||(g_sar_sensor_state == 253))
+ {
+ return (kal_int16)g_scenario_index;// if the g_sar_sensor_state is unknown then combined scenario index will equal to g_scenario_index
+ }
+ else//customer can modify here
+ {
+ return (1); // Please note that the return value should be -1 or between 1~20
+ }
+
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * custom_extant_by_sar_sensor_state
+ *
+ * DESCRIPTION
+ * Needs to be updated by customer.
+ *
+ * PARAMETERS
+ * src_id [IN] Use it as it is in the function l4c_force_tx_ant_req.
+ *
+ * g_sar_sensor_state [IN]
+ * 0xFF: SAR sensor state unknown, or disable
+ * 0x00: Far
+ * 0x01: Near
+ * 0xFD : SAR sensor state disable
+ * 0xFE : SAR sensor state enable
+ * 0xFF : SAR sensor state not support
+ *
+ * g_scenario_index [IN]
+ * 0xFFFF: g_scenario_index unknown, or disable
+ * 1~20: Range of valid values of Scenario index
+ *
+ * is_test_sim [IN]
+ * KAL_TRUE: yes it is a Test SIM
+ * KAL_FALSE: It is a real SIM
+ *
+ * md_product_model_id [IN]
+ * 0xFFFFFFFF : If invalid MD Product Model ID
+ * Any valid 32 bit integer.
+ *
+ * RETURNS
+ * Nothing
+ *****************************************************************************/
+void custom_extant_by_sar_sensor_state(kal_uint8 src_id, kal_uint8 g_sar_sensor_state, kal_uint16 g_scenario_index,
+ kal_bool is_test_sim, kal_uint32 md_product_model_id)
+{
+/*
+kal_bool l4c_force_tx_ant_req(kal_uint8 src_id, kal_uint8 mode, kal_uint8 rat, kal_uint8 ant_state, kal_uint8 band, kal_uint8 nvram_write)
+
+<mode>: kal_uint8 (0~5)
+ 0: diable force TX antenna
+ 1: enable force TX antenna
+ 2: query antenna
+ 3: restore by band TAS default value in NVRAM (both real SIM and test SIM)
+ 4: force TX antenna by band (both real SIM and test SIM)
+ 5: query
+
+<rat>: kal_uint8 (1~4)
+ 1: GSM
+ 2: UMTS
+ 3: LTE
+ 4: C2K
+
+<ant_state>: kal_uint8 (0~7)
+ 0: TX_ANTENNA_STATE_0,
+ 1: TX_ANTENNA_STATE_1,
+ 2: TX_ANTENNA_STATE_2,
+ 3: TX_ANTENNA_STATE_3,
+ 4: TX_ANTENNA_STATE_4,
+ 5: TX_ANTENNA_STATE_5,
+ 6: TX_ANTENNA_STATE_6,
+ 7: TX_ANTENNA_STATE_7,
+ 8: TX_ANTENNA_STATE_NUM,
+ 255: TX_ANTENNA_INVALID = 0xFF
+
+<band>: kal_uint8
+
+<nvram_write>: kal_uint8 (0~1)
+ 0: No need to save the settings to NVRAM
+ 1: Need to save the settings to NVRAM
+
+*/
+
+/* example : for mode = 0, or 1 */
+/* enable force TX antenna 0 for LTE, and NW write enable */
+// l4c_force_tx_ant_req(src_id,1/*mode*/,3/*rat = LTE*/,TX_ANTENNA_STATE_0,0xff,1);
+/* enable force TX antenna 1 for WCDMA, and NW write disable */
+// l4c_force_tx_ant_req(src_id,1/*mode*/,2/*rat = UMTS*/,TX_ANTENNA_STATE_1,0xff,0);
+/* disable force TX antenna for LTE, and NW write enable */
+// l4c_force_tx_ant_req(src_id,0/*mode*/,3/*rat = LTE*/,0xff,0xff,1);
+/* disable force TX antenna for LTE, and NW write disable */
+// l4c_force_tx_ant_req(src_id,0/*mode*/,3/*rat = LTE*/,0xff,0xff,0);
+
+
+/* example : for mode = 3, or 4 */
+/* enable force TX antenna 1 for LTE band 3, does not support NV write, and this action only valid when the serving cell RAT & Band is equal */
+// l4c_force_tx_ant_req(src_id,4/*mode*/,3/*rat = LTE*/,TX_ANTENNA_STATE_1,0x03,0);
+/* enable force TX antenna 0 for LTE band 7, does not support NV write, and this action only valid when the serving cell RAT & Band is equal */
+// l4c_force_tx_ant_req(src_id,4/*mode*/,3/*rat = LTE*/,TX_ANTENNA_STATE_0,0x07,0);
+/* restore by band TAS default value in NVRAM (both real SIM and test SIM) for LTE band 3, and this action only valid when the serving cell RAT & Band is equal */
+// l4c_force_tx_ant_req(src_id,3/*mode*/,3/*rat = LTE*/,0xff,0x03,0);
+ kal_uint8 count = 0, ret_val = KAL_FALSE;
+
+ count = l4c_sar_get_tx_ant_req_count();
+
+ if (count > 0)
+ {
+ /*this means previous SAR update is ongoing
+ So wait until the previous operation is not finished and then again start the update procedure*/
+ l4c_sar_set_txant_update_needed();
+ return;
+ }
+ /*******Customer should call the function l4c_force_tx_ant_req() after this ************/
+ /* please store the return value of function call l4c_force_tx_ant_req() in ret_val for every call */
+ //ret_val = l4c_force_tx_ant_req(src_id,4/*mode*/,3/*rat = LTE*/,TX_ANTENNA_STATE_1,0x03,0);
+ //ret_val = l4c_force_tx_ant_req(src_id,4/*mode*/,4/*rat = C2K*/,TX_ANTENNA_STATE_1,0x03,0);
+ /*******Customer should call the function l4c_force_tx_ant_req() before this ************/
+
+ if(ret_val == KAL_FALSE)
+ {
+ /*This means AT+ETXANT from the AP is received and modem is making changes corresponding to it.
+ So wait until the previous operation is not finished and then again start the update procedure*/
+ l4c_sar_set_txant_update_needed();
+ return;
+ }
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * customer_is_sar_sensor_enable
+ *
+ * DESCRIPTION
+ * Needs to be updated by customer.
+ *
+ * PARAMETERS
+ * md_product_model_id [IN]
+ * 0xFFFFFFFF : If invalid MD Product Model ID
+ * Any valid 32 bit integer.
+ *
+ * RETURNS
+ * custom_sar_setting: kal_int16
+ * -1: L4C_SAR_IGNORE_ACTION
+ * 0: L4C_SAR_MODEM_TO_AP_DISABLE_ACTION
+ * 1: L4C_SAR_MODEM_TO_AP_ENABLE_ACTION
+ *****************************************************************************/
+kal_int8 customer_is_sar_sensor_enable(kal_uint32 md_product_model_id)
+{
+ //customer can implement this function
+ return -1;//return -1 to ignore sar or sar sensor not supported
+}
+#endif
+