[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/custom/protocol/common/atci/include/at_custom_cmd_op01.h b/mcu/custom/protocol/common/atci/include/at_custom_cmd_op01.h
new file mode 100644
index 0000000..ab500e6
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/include/at_custom_cmd_op01.h
@@ -0,0 +1,119 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * at_custom_cmd_op01.def
+ *
+ * Project:
+ * --------
+ * MT6208
+ *
+ * Description:
+ * ------------
+ * This file is intends for ....
+ *
+ * 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!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/********************************************************************************
+* Copyright Statement:
+* --------------------
+*
+* This product has been developed using a protocol stack
+* developed by Sasken Communication Technologies Limited.
+*
+********************************************************************************/
+
+/* Please add EXTEND_CMD() in the following*/
+EXTEND_CMD("scpbr", 119040566, 0, "", RMMI_CMD_ATSCPBR, rmmi_cpbr_hdlr)
+EXTEND_CMD("scpbw", 119040571, 0, "", RMMI_CMD_ATSCPBW, rmmi_cpbw_hdlr)
+
+EXTEND_CMD("dsci", 79482215, 0, "^DSCI: (0,1)", RMMI_CMD_ATDSCI, rmmi_dsci_hdlr)
+EXTEND_CMD("mtv", 79254722, 0, "", RMMI_CMD_ATMTV, rmmi_mtv_hdlr)
+EXTEND_CMD("sysinfo", 120252344, 243, "", RMMI_CMD_ATSYSINFO, rmmi_sysinfo_hdlr)
+EXTEND_CMD("sysconfig", 120252117, 777221, "", RMMI_CMD_ATSYSCONFIG, rmmi_sysconfig_hdlr)
+EXTEND_CMD("cardmode", 85571605, 21817, "^CARDMODE: (0,1)", RMMI_CMD_ATCARDMODE, rmmi_cardmode_hdlr)
+EXTEND_CMD("rfsw", 80232273, 0, "", RMMI_CMD_ATRFSW, rmmi_rfsw_hdlr)
+EXTEND_CMD("spn", 79263226, 0, "^SPN: (0,1)", RMMI_CMD_ATSPN, rmmi_spn_hdlr)
+EXTEND_CMD("hver", 79706120, 0, "", RMMI_CMD_ATHVER, rmmi_hver_hdlr)
+EXTEND_CMD("cmdver", 86210529, 18, "", RMMI_CMD_ATCMDVER, rmmi_cmdver_hdlr)
+EXTEND_CMD("off", 21894, 0, "", RMMI_CMD_ATOFF, rmmi_off_hdlr)
+
+/* Please add CMD_ENUM() in the following and do not wrap with compile option*/
+CMD_ENUM(RMMI_CMD_ATSCPBR)
+CMD_ENUM(RMMI_CMD_ATSCPBW)
+CMD_ENUM(RMMI_CMD_ATDSCI)
+CMD_ENUM(RMMI_CMD_ATMTV)
+CMD_ENUM(RMMI_CMD_ATSYSINFO)
+CMD_ENUM(RMMI_CMD_ATSYSCONFIG)
+CMD_ENUM(RMMI_CMD_ATCARDMODE)
+CMD_ENUM(RMMI_CMD_ATRFSW)
+CMD_ENUM(RMMI_CMD_ATSPN)
+CMD_ENUM(RMMI_CMD_ATHVER)
+CMD_ENUM(RMMI_CMD_ATCMDVER)
+CMD_ENUM(RMMI_CMD_ATOFF)
+
diff --git a/mcu/custom/protocol/common/atci/include/at_custom_cmd_tc01.h b/mcu/custom/protocol/common/atci/include/at_custom_cmd_tc01.h
new file mode 100644
index 0000000..b707a52
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/include/at_custom_cmd_tc01.h
@@ -0,0 +1,201 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * AT_CUSTOM_CMD.DEF
+ *
+ * Project:
+ * --------
+ * MAUI
+ *
+ * Description:
+ * ------------
+ * This file is intends for implementing custom commands for some customers
+ * which should not be released to other customers
+ *
+ * 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!
+ *
+ * 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!
+ *
+ * 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!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifdef __TC01__
+CUSTOM_CMD("custom", 7435931, 13, "+CUSTOM: This is a sample", RMMI_CMD_ATCUSTOM, rmmi_custom_hdlr)
+
+CUSTOM_CMD("sltype", 40305894, 5, "", RMMI_CMD_SLTYPE, rmmi_sltype_hdlr )
+CUSTOM_CMD("vslt3", 46933678, 0, "", RMMI_CMD_VSLT3, rmmi_vslt3_hdlr )
+CUSTOM_CMD("vslt2", 46933677, 0, "", RMMI_CMD_VSLT2, rmmi_vslt2_hdlr )
+CUSTOM_CMD("vslt", 1235096, 0, "", RMMI_CMD_VSLT, rmmi_vslt_hdlr )
+CUSTOM_CMD("simimsi", 40130559, 731, "", RMMI_CMD_SIMIMSI, rmmi_simimsi_hdlr )
+CUSTOM_CMD("rfdevchk", 37867668, 4647, "", RMMI_CMD_RFDEVCHK, rmmi_rfdevchk_hdlr )
+CUSTOM_CMD("sbp", 27528, 0, "", RMMI_CMD_SBP, rmmi_sbp_hdlr )
+CUSTOM_CMD("pgcheck", 33750921, 125, "", RMMI_CMD_PGCHECK, rmmi_pgcheck_hdlr )
+CUSTOM_CMD("pgcheckext", 33750921, 6867152, "", RMMI_CMD_PGCHECKEXT, rmmi_pgcheckext_hdlr )
+CUSTOM_CMD("cgatt", 6641736, 0, "", RMMI_CMD_LGCGATT, rmmi_lgcgatt_hdlr )
+CUSTOM_CMD("detach", 8643825, 8, "", RMMI_CMD_DETACH, rmmi_detach_hdlr )
+CUSTOM_CMD("ltecall", 26126407, 468, "", RMMI_CMD_LTECALL, rmmi_ltecall_hdlr )
+CUSTOM_CMD("datastatic", 8424353, 41786817, "", RMMI_CMD_DATASTATIC, rmmi_dataStatic_hdlr )
+CUSTOM_CMD("mimoantcheck", 27619959, 1151171433, "", RMMI_CMD_MIMOANTCHECK, rmmi_mimoantcheck_hdlr )
+CUSTOM_CMD("rxmrd", 38868836, 0, "", RMMI_CMD_RXMRD, rmmi_rxmrd_hdlr )
+CUSTOM_CMD("simtray", 40130982, 63, "", RMMI_CMD_SIMTRAY, rmmi_simtray_hdlr )
+CUSTOM_CMD("inisim", 19548159, 13, "", RMMI_CMD_INISIM, rmmi_inisim_hdlr )
+CUSTOM_CMD("issim", 19836583, 0, "", RMMI_CMD_ISSIM, rmmi_issim_hdlr )
+CUSTOM_CMD("simid", 40130550, 0, "", RMMI_CMD_SIMID, rmmi_simid_hdlr )
+CUSTOM_CMD("bndi", 130121, 0, "", RMMI_CMD_BNDI, rmmi_bndi_hdlr )
+CUSTOM_CMD("ecall", 10592208, 0, "", RMMI_CMD_ECALL, rmmi_ecall_hdlr )
+CUSTOM_CMD("flight", 13182550, 20, "", RMMI_CMD_FLIGHT, rmmi_flight_hdlr )
+#ifdef __VSIM__
+CUSTOM_CMD("simoff", 40130780, 6, "", RMMI_CMD_SIMOFF, rmmi_simoff_hdlr )
+#endif
+CUSTOM_CMD("campreq", 6329678, 207, "", RMMI_CMD_CAMPREQ, rmmi_campreq_hdlr )
+CUSTOM_CMD("camp", 166570, 0, "", RMMI_CMD_CAMP, rmmi_camp_hdlr )
+CUSTOM_CMD("lbcall", 25135758, 12, "", RMMI_CMD_LBCALL, rmmi_lbcall_hdlr )
+#endif
diff --git a/mcu/custom/protocol/common/atci/include/mtcdef.h b/mcu/custom/protocol/common/atci/include/mtcdef.h
new file mode 100644
index 0000000..bd03d03
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/include/mtcdef.h
@@ -0,0 +1,549 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * MTCDEF.H
+ *
+ * Project:
+ * --------
+ * MAUI
+ *
+ * Description:
+ * ------------
+ * This file is intends for implementing custom commands for some customers
+ * which should not be released to other customers
+ *
+ * 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!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifdef __MTK_TARGET__ /* Only support ATS test on target , not support in simulator */
+#ifndef MTCDEF_H
+#define MTCDEF_H
+
+#include "lcd_sw_inc.h"
+#include "lcd_sw.h"
+
+/*===============================================================*/
+#define MTC_CMD_CODE 0xF0
+
+
+/******************************************************************************
+ * *
+ * Integrate RFWS library - ia_raw.h *
+ * *
+ ******************************************************************************/
+#define RGB565_REDMASK (0xf800)
+#define RGB565_REDSHIFT (11)
+#define RGB565_GREENMASK (0x07e0)
+#define RGB565_GREENSHIFT (5)
+#define RGB565_BLUEMASK (0x001f)
+#define RGB565_BLUESHIFT (0)
+
+#define RGB_PLANE_RED (1)
+#define RGB_PLANE_GREEN (2)
+#define RGB_PLANE_BLUE (3)
+
+
+/******************************************************************************
+ * *
+ * Integrate RFWS library - ia_simple_dpcm.h *
+ * *
+ ******************************************************************************/
+#define DPCM_MINIMAL_QUANTIZER (1)
+#define DPCM_MAXIMAL_QUANTIZER (7)
+
+#define DPCM_INITIAL_PREDICTION (128)
+
+
+typedef enum
+{
+ MTC_SCREEN_INFO_REQ_CMD = 0x00, /* Screen Info Request */
+ MTC_CAPTURE_REQ_CMD = 0x01, /* Screen Capture Request */
+ MTC_KEY_LOG_MASK_CMD = 0x07,
+ MTC_KEY_LOG_DATA_IND = 0x08,
+ MTC_PHONE_RESTART_REQ_CMD = 0x10, /* Phone Restart Request */
+ MTC_PHONE_FACTORY_RST_CMD = 0x11, /* Phone Factory Reset Request*/
+ MTC_PHONE_REPORT_REQ_CMD = 0x20, /* Phone Report request */
+ MTC_PHONE_STATE_REQ_CMD = 0x21, /* Phone status request*/
+ MTC_DATA_TRANSFER_SETUP_CMD = 0x22, /* Request to setup data transfer parameters*/
+ MTC_KEY_REPORT_EN_REQ_CMD = 0x30, /* Enable/Disable key press notification*/
+ MTC_KEY_EVENT_REQ_CMD = 0x33, /* Key Event notification or key press emulation */
+ MTC_FAST_KEY_EVENT_REQ_CMD = 0x35, /* Fast key event request cmd */
+ MTC_MEMORY_DUMP_REQ_CMD = 0x40, /* Memory Dump Request*/
+ MTC_BATTERY_LEVEL_REQ_CMD = 0x41, /* Battery Level Request*/
+ MTC_BACKLIGHT_REQ_CMD = 0x42, /* Backlight State Request*/
+ MTC_FLEX_DATA_REQ_CMD = 0x50,
+ MTC_ERROR_CMD = 0x7F,
+ MTC_CURRENT_CELL_REQ_CMD = 0x80 /*Current cell, codec and data transfer quality information*/
+}mtc_sub_cmd_type;
+
+typedef enum
+{
+ MTC_MAIN_LCD = 0,
+ MTC_SUB_LCD,
+ MTC_LCD_PADDING = 0x7F
+}mtc_scrn_id_type;
+
+
+typedef struct
+{
+ kal_uint8 sw_ver[45];
+ kal_uint8 hw_ver[16];
+ kal_uint8 sw_sub_ver;
+} mtcVersion_type;
+
+/*================================================================*/
+typedef __packed struct
+{
+ kal_uint8 cmd_code;
+ kal_uint8 sub_cmd;
+}mtc_req_hdr_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ mtc_scrn_id_type screen_id;
+}mtc_info_req_type;
+
+/*=================================================================*/
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ mtc_scrn_id_type screen_id;
+ kal_uint16 left; /* Upper left X-Coord */
+ kal_uint16 top; /* Upper left Y-Coord */
+ kal_uint16 width; /* Width of the capture screen */
+ kal_uint16 height; /* Height of the capture screen */
+}mtc_capture_req_type;
+
+/*=================================================================*/
+
+typedef __packed struct
+{
+ kal_uint16 left; /* Upper left X-Coord */
+ kal_uint16 top; /* Upper left Y-Coord */
+ kal_uint16 width; /* Width of the area */
+ kal_uint16 height; /* Height of the area */
+} mtc_ats_capture_rect_type;
+
+
+typedef __packed struct
+{
+ kal_uint8 mask_type;
+ mtc_ats_capture_rect_type rect; /* masked area */
+}mtc_ats_capture_mask_req_type;
+
+#define MTC_ATS_NMASK_MAX (5)
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ mtc_scrn_id_type screen_id;
+ mtc_ats_capture_rect_type base_area;
+ kal_uint8 refresh;
+ kal_uint8 data_type;
+ kal_uint8 pack_type;
+ kal_uint8 quantizer;
+ kal_uint8 threshold;
+ mtc_ats_capture_mask_req_type masks[MTC_ATS_NMASK_MAX];
+}mtc_ats_capture_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 request_area;
+ kal_uint8 value;
+}mtc_ats_key_report_en_req_type;
+
+#if 1 /* LGE_L1_NUGUYU_20091119 */
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint32 log_mask;
+}mtc_ats_key_log_mask_req_type;
+#endif
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint32 address;
+ kal_uint32 reserved;
+ kal_uint8 size;
+}mtc_ats_memory_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+}mtc_ats_battery_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 request_area;
+}mtc_ats_backlight_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 request_cell;
+}mtc_ats_cell_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint16 packet_size;
+ kal_uint16 transfer_delay;
+}mtc_ats_transfer_setup_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 KeyHoldType; /* Press or Depress */
+ kal_uint8 KeyCode; /* Virtual key Code */
+}mtc_key_event_req_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 KeyCode; /* Virtual key Code */
+ kal_uint16 Delay; /* delay measured in 1\10 of a second */
+}mtc_fast_key_event_req_type;
+
+typedef __packed union
+{
+ mtc_info_req_type info;
+ mtc_capture_req_type capture;
+ mtc_ats_capture_req_type ats_capture;
+ mtc_ats_key_report_en_req_type ats_key_report_en;
+ mtc_ats_key_log_mask_req_type ats_key_log_mask;
+ mtc_ats_memory_req_type ats_dump;
+ mtc_ats_battery_req_type ats_battery;
+ mtc_ats_backlight_req_type ats_backlight;
+ mtc_ats_cell_req_type ats_cell_info;
+ mtc_ats_transfer_setup_req_type ats_setup;
+ mtc_key_event_req_type keyevent;
+ mtc_fast_key_event_req_type fastkeyevent;
+}mtc_req_type;
+
+typedef __packed union
+{
+ mtc_req_hdr_type hdr;
+ mtc_req_type mtc_req;
+}diag_mtc_req_type;
+
+/*==============================================================*/
+
+#define MTC_262K_CMASK_RED 0x0000FC00
+#define MTC_262K_CMASK_GREEN 0x000003F0
+#define MTC_262K_CMASK_BLUE 0xC000000F
+
+#define MTC_65K_CMASK_RED 0xF800
+#define MTC_65K_CMASK_GREEN 0x07E0
+#define MTC_65K_CMASK_BLUE 0x001F
+
+typedef enum
+{
+ MTC_BIT_UNDEF = 0,
+ MTC_BIT_MONO = 1,
+ MTC_BIT_4 = 2,
+ MTC_BIT_16 = 4,
+ MTC_BIT_256 = 8,
+ MTC_BIT_65K = 16,
+ MTC_BIT_262K = 18,
+ MTC_BIT_RGB24 = 24,
+ MTC_BIT_RGB_32 = 32,
+ MTC_BIT_PADDING = 0x7F
+}mtc_bits_pixel_type;
+
+typedef unsigned long mtc_pixel_18_type; /* 4 kal_uint8 */
+typedef unsigned short mtc_pixel_16_type; /* 2 kal_uint8 */
+
+/*
+ We have to make sure that MTC_SCRN_BUF_SIZE_MAX is set correctly in various project .
+ The only thing we can confirm is that bpp of MAIN_LCD_16BIT_MODE is displayed 2 bytes length,
+ the other cases MTC_SCRN_BUF_SIZE_MAX is set to maximum size
+ It may be revised in later projects
+*/
+#if defined (MAIN_LCD_16BIT_MODE)
+ #define MTC_SCRN_BUF_SIZE_MAX (LCD_WIDTH*LCD_HEIGHT*(sizeof(mtc_pixel_16_type)))
+#else
+ #define MTC_SCRN_BUF_SIZE_MAX (LCD_WIDTH*LCD_HEIGHT*(sizeof(mtc_pixel_18_type)))
+#endif
+
+
+/*=========================================================*/
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+typedef mtc_req_hdr_type mtc_rsp_hdr_type;
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ mtc_scrn_id_type scrn_id;
+ kal_uint16 scrn_width; /* Screen Width in Pixels */
+ kal_uint16 scrn_height; /* Screen Height in Pixcels */
+ mtc_bits_pixel_type bits_pixel; /* Color bits for each Pixel */
+}mtc_screen_info_rsp_type;
+
+typedef __packed struct
+{
+ kal_uint32 blue;
+ kal_uint32 green;
+ kal_uint32 red;
+}mtc_mask_type;
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ mtc_scrn_id_type scrn_id;
+ kal_uint16 bmp_width; /* Width of the BMP */
+ kal_uint16 bmp_height; /* Height of the BMP */
+ mtc_bits_pixel_type bits_pixel; /* Color bits for each pixel */
+ mtc_mask_type mask;
+//// kal_uint8 bmp_data[MTC_SCRN_BUF_SIZE_MAX];
+//mtk01616_091217: we output data directly ,without keeping all bmp_data in a buffer first.
+}mtc_capture_rsp_type;
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ mtc_scrn_id_type scrn_id;
+ kal_uint16 bmp_width; /* Width of the BMP */
+ kal_uint16 bmp_height; /* Height of the BMP */
+ mtc_bits_pixel_type bits_pixel; /* must be zero */
+ kal_uint8 data_type;
+ kal_uint8 pack_type;
+ kal_uint8 quantizer;
+ kal_uint8 threshold;
+ kal_uint32 bmp_size;
+//// kal_uint8 bmp_data[ MTC_SCRN_BUF_SIZE_MAX ];
+//mtk01616_091217: we output data directly ,without keeping all bmp_data in a buffer first.
+}mtc_ats_capture_rsp_type;
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ kal_uint8 keyState;
+ kal_uint8 keyCode;
+}mtc_ats_key_report_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 model_name[10];
+ kal_uint32 release_date;
+ kal_uint8 software_ver[40];
+ kal_uint8 IMEI[15];
+ kal_uint8 phone_num[15];
+ kal_uint16 enabled_functions;
+}mtc_ats_phone_report_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint16 phone_state;
+}mtc_ats_phone_state_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 request_area;
+ kal_uint8 value;
+}mtc_ats_key_report_en_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint32 log_mask;
+}mtc_ats_key_log_mask_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint32 *reserved;
+ kal_uint32 *address;
+ kal_uint8 size;
+ kal_uint8 data[64];
+}mtc_ats_memory_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 isCharging;
+ kal_uint8 capacity;
+}mtc_ats_battery_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint8 value;
+}mtc_ats_backlight_rsp_type;
+
+typedef __packed struct
+{
+ mtc_req_hdr_type hdr;
+ kal_uint16 packet_size;
+ kal_uint16 transfer_delay;
+}mtc_ats_transfer_setup_rsp_type;
+
+
+/*==========================================================*/
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ kal_uint8 KeyHoldType; /* Press or Release */
+ kal_uint8 KeyCode; /* Virtual key Code */
+}mtc_key_event_rsp_type;
+
+typedef mtc_key_event_rsp_type mtc_key_event_ind_type;
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ kal_uint8 log_id; /* Press or Release */
+ kal_uint16 log_len; /* Virtual key Code */
+ kal_uint64 time;
+ kal_uint8 press;
+ kal_uint8 key_code;
+ kal_uint64 active_UIID;
+}mtc_ats_key_log_event_rsp_type;
+
+typedef mtc_ats_key_log_event_rsp_type mtc_ats_key_log_event_ind_type;
+
+typedef __packed struct
+{
+ mtc_rsp_hdr_type hdr;
+ kal_uint8 KeyCode; /* Virtual key Code */
+ short Delay; /* delay measured in 1\10 of a second */
+}mtc_fast_key_event_resp;
+
+/*==========================================================*/
+
+typedef __packed union
+{
+ mtc_screen_info_rsp_type info;
+ mtc_capture_rsp_type capture;
+ mtc_ats_capture_rsp_type ats_capture;
+ mtc_ats_memory_rsp_type ats_dump;
+ mtc_ats_battery_rsp_type ats_battery;
+ mtc_ats_backlight_rsp_type ats_backlight;
+ mtc_ats_transfer_setup_rsp_type ats_setup;
+ mtc_key_event_rsp_type keyevent;
+ mtc_ats_key_log_event_rsp_type ats_keylogevent;
+ mtc_fast_key_event_resp fastkeyevent;
+}mtc_rsp_type;
+
+typedef __packed union
+{
+ mtc_rsp_hdr_type hdr;
+ mtc_rsp_type mtc_rsp;
+}diag_mtc_rsp_type;
+
+/*============================================================*/
+
+typedef struct
+{
+ mtc_scrn_id_type id; /* lcd id: MAIN, SUB */
+ int width_max; /* max width in current rotation mode */
+ int height_max; /* max height in current rotation mode */
+ int degrees; /* LCD degrees of rotation: 0, 90, 180 */
+ mtc_bits_pixel_type bits_pixel; /* Color Bit: 16, 18 */
+ mtc_mask_type mask; /* Color mask: R, G, B */
+}mtc_lcd_info_type;
+
+typedef struct
+{
+ int start_x; /* Start X-Coord for capture area */
+ int start_y; /* Start Y- Coord for capture area */
+ int width; /* Width of the capture area */
+ int height; /* Height of the capture area */
+}mtc_capture_type;
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/*=================================================*/
+
+#endif
+#endif /* __MTK_TARGET__ */
+
diff --git a/mcu/custom/protocol/common/atci/include/rmmi_custom_inc.h b/mcu/custom/protocol/common/atci/include/rmmi_custom_inc.h
new file mode 100644
index 0000000..017469d
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/include/rmmi_custom_inc.h
@@ -0,0 +1,186 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * RMMI_CUSTOM_INC.H
+ *
+ * Project:
+ * --------
+ * MAUI
+ *
+ * Description:
+ * ------------
+ *
+ *
+ * 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!
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#if defined(__TC01__) /* at%ltecall */
+#include "l4c2rac_struct.h"
+#endif
+
+#if defined(__MTK_TARGET__)
+#include "kal_general_types.h"
+#include "rmmi_context.h"
+
+
+/* l1audio driver function is only built on target load */
+extern kal_bool AcousticLoopbackStatus(void);
+extern void AcousticLoopbackOn(void);
+extern void AcousticLoopbackOff(void);
+extern void AcousticLoopbackLength (kal_uint32 u4Length);
+#else
+/* Dummy functions for simulator */
+#define AcousticLoopbackStatus(void) NULL
+#define AcousticLoopbackOn(void) NULL
+#define AcousticLoopbackOff(void) NULL
+#define AcousticLoopbackLength(u4Length) NULL
+#endif
+
+#ifdef __TC01__
+//AT_FRST
+typedef enum{
+ RMMI_CUSTOM_FRST_NONE,
+ RMMI_CUSTOM_FRST_FROM_MTC,
+ RMMI_CUSTOM_FRST_FROM_FRST
+} rmmi_custom_frst_cmd_enum;
+extern kal_uint16 rmmi_fast_string_print_custom(kal_uint8 * buff_ptr, kal_uint8 * fmt, void * arg_list [ ], kal_uint8 nos_arg);
+/* AT%LTECALL */
+extern custom_factory_band_context_struct *cust_fac_ptr_global;
+extern rat_enum l4c_get_factory_rat_mode(void);
+/* AT%LTECALL */
+#endif
+
+extern void ws_key_event_notification(kal_uint8 key_code ,kal_uint8 key_type,kal_uint32 time_stamp);
+extern void ws_output_screen_capture_info(kal_uint8* screen_capture_buf,kal_uint32 length);
+
+extern void rmmi_mtc_hdlr(rmmi_string_struct *source_string_ptr);
+extern void rmmi_bt_test_mode_req(kal_uint8 mode,kal_uint8* bd_addr);
+extern void rmmi_ecall_result_rrsp(kal_uint8 src_id,kal_bool result); //mtk01616_100317
+extern void rmmi_bttm_result_rrsp(kal_uint8 src_id,kal_bool result);
+
+#define rmmi_output_screen_capture_info ws_output_screen_capture_info
+
+extern kal_uint8 * get_LCD_buffer(kal_uint8 screen_id);
+
diff --git a/mcu/custom/protocol/common/atci/include/rmmi_msgbased_at.h b/mcu/custom/protocol/common/atci/include/rmmi_msgbased_at.h
new file mode 100644
index 0000000..d4b0864
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/include/rmmi_msgbased_at.h
@@ -0,0 +1,105 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * RMMI_MSGBASED_AT.C
+ *
+ * Project:
+ * --------
+ *
+ *
+ * Description:
+ * ------------
+ * This file is intended to handle the message based AT APIs
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *****************************************************************************/
+
+#ifndef _RMMI_MSGBASED_AT_C_
+#define _RMMI_MSGBASED_AT_C_
+#if defined(__MESSAGE_BASED_AT_SUPPORT__)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+#include "sysconf_statistics.h"
+
+
+//mtk02514_zte
+
+
+extern kal_uint8 rmmi_msgbased_cid_2_srcid(kal_uint8 cid);
+extern kal_uint8 rmmi_msgbased_srcid_2_cid(kal_uint8 src_id);
+extern kal_uint8 rmmi_msgbased_cid_2_port(kal_uint8 cid);
+extern kal_uint8 rmmi_msgbased_port_2_cid(kal_uint8 port);
+
+extern kal_bool rmmi_msgbased_is_valid_src(kal_uint8 src_id);
+
+extern void rmmi_msgbased_write_urc(kal_uint8 *buffer, kal_uint16 length, kal_bool stuff);
+extern void rmmi_msgbased_write_response(kal_uint8 *buffer, kal_uint16 length, kal_bool stuff, kal_uint8 src_id);
+
+
+#endif /* __MESSAGE_BASED_AT_SUPPORT__ */
+#endif /*_RMMI_MSGBASED_AT_C_*/
+
diff --git a/mcu/custom/protocol/common/atci/src/rmmi_msgbased_at.c b/mcu/custom/protocol/common/atci/src/rmmi_msgbased_at.c
new file mode 100644
index 0000000..fca7ee5
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/src/rmmi_msgbased_at.c
@@ -0,0 +1,1010 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * RMMI_MSGBASED_AT.C
+ *
+ * Project:
+ * --------
+ *
+ *
+ * Description:
+ * ------------
+ * This file is intended to handle the message based AT APIs
+ *
+ * Author:
+ * -------
+ * -------
+ *****************************************************************************/
+//mtk02514_zte
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "kal_public_defs.h" //MSBB change #include "stack_common.h"
+#include "kal_public_api.h"
+#include "sysconf_statistics.h"
+#include "task_config.h"
+#include "kal_trace.h"
+#include "ps_public_l4_msgid.h"
+#include "tst_sap.h"
+
+#if defined(__MESSAGE_BASED_AT_SUPPORT__)
+
+#include "rmmi_common_enum.h"
+#include "l4c_common_enum.h"
+
+#include "rmmi_msghdlr.h"
+#include "rmmi_utility.h"
+#include "rmmi_struct.h"
+#include "tst_msgid.h"
+
+#include "rmmi_msgbased_at.h"
+
+#define TP_PS_NDEBUG 1
+
+#if TP_PS_NDEBUG
+#define kal_prompt_trace(...)
+#endif
+
+// ATCI messge based AT command relative definition
+#define RMMI_MSG_BASED_CUSTOM_AT_CHANNEL 20 // This value could not exceed 20
+#define RMMI_MSG_BASED_URC_CHANNEL 0
+#define RMMI_MSG_BASED_PORT_BEGIN 100
+#define RMMI_MSG_BASED_REQUEST_MODULE MOD_MMI
+#define RMMI_MSG_BASED_HANDLER_MODULE MOD_ATCI
+#define RMMI_MSG_BASED_CHANNEL_OFFSET 10
+
+#define RMMI_MSGBASED_CR 0x0d
+#define RMMI_MSGBASED_LF 0x0a
+#define RMMI_MSGBASED_ESC 0x1b
+#define RMMI_MSGBASED_CTRLZ 0x1a
+
+typedef enum
+{
+ RMMI_MSGBASED_RESPONSE,
+ RMMI_MSGBASED_URC
+} rmmi_msgbased_ind_type;
+
+
+kal_uint8 rmmi_msgbased_port[RMMI_MSG_BASED_CUSTOM_AT_CHANNEL];
+kal_uint8 rmmi_msgbased_src[RMMI_MSG_BASED_CUSTOM_AT_CHANNEL];
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_send_ilm
+ * DESCRIPTION
+ * This function is used to send ILM to dest_id using the msg_id with data local_param_ptr and peer_buf_ptr
+ *
+ * PARAMETERS
+ * dest_id [IN]
+ * msg_id [IN]
+ * local_param_ptr [IN]
+ * peer_buf_ptr [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void rmmi_msgbased_send_ilm(module_type dest_id, kal_uint16 msg_id, void *local_param_ptr, void *peer_buf_ptr)
+{
+ module_type module = stack_get_active_module_id();
+
+
+ msg_send6(module, dest_id, ATCI_SAP, (msg_type)msg_id, (local_para_struct *) local_param_ptr, (peer_buff_struct*) peer_buf_ptr);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_write_data
+ * DESCRIPTION
+ * This function is used to send AT data back to the task who register channels
+ *
+ * PARAMETERS
+ * buffer [IN] output data
+ * length [IN] the length of output data
+ * stuff [IN] if we need to add <CR><LF> to the header and tailer or not
+ * src_id [IN] the output source ID
+ * type [IN] output is URC or response
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void rmmi_msgbased_write_data(kal_uint8 *buffer, kal_uint16 length, kal_bool stuff, kal_uint8 src_id, rmmi_msgbased_ind_type type)
+{
+ kal_uint16 pdu_len, tmp_len;
+ peer_buff_struct *peer_ptr;
+ kal_uint8 *data, offset, port;
+ rmmi_response_at_ind_struct *resposne_ptr;
+ rmmi_urc_at_ind_struct *urc_ptr;
+ void *local_ptr;
+ msg_type msg;
+
+ peer_ptr = (peer_buff_struct*) construct_peer_buff(length+5, 0, 0, TD_RESET); // +5: <CR>*2,<LF>*2,'\0'*1
+ data = (kal_uint8 *)get_peer_buff_pdu(peer_ptr, &pdu_len);
+ port = rmmi_msgbased_cid_2_port(rmmi_msgbased_srcid_2_cid(src_id));
+
+ tmp_len = length;
+ if (stuff == KAL_TRUE)
+ {
+ offset = 2;
+ data[0] = RMMI_MSGBASED_CR;
+ data[1] = RMMI_MSGBASED_LF;
+ data[length+offset] = RMMI_MSGBASED_CR;
+ data[length+offset+1] = RMMI_MSGBASED_LF;
+ data[length+offset+2] = '\0';
+
+ length += 4;
+ }
+ else
+ {
+ offset = 0;
+ data[length] = '\0';
+ }
+ kal_mem_cpy(data+offset, buffer, tmp_len);
+
+ if (type == RMMI_MSGBASED_RESPONSE)
+ {
+ resposne_ptr = (rmmi_response_at_ind_struct*)
+ construct_local_para((kal_uint16) sizeof(rmmi_response_at_ind_struct), TD_RESET);
+ resposne_ptr->length = length;
+ resposne_ptr->port_id = port;
+
+ local_ptr = resposne_ptr;
+ msg = MSG_ID_RMMI_RESPONSE_AT_IND;
+ }
+ else
+ {
+ urc_ptr = (rmmi_urc_at_ind_struct*)
+ construct_local_para((kal_uint16) sizeof(rmmi_urc_at_ind_struct), TD_RESET);
+ urc_ptr->length = length;
+
+ local_ptr = urc_ptr;
+ msg = MSG_ID_RMMI_URC_AT_IND;
+ }
+
+ rmmi_msgbased_send_ilm(
+ RMMI_MSG_BASED_REQUEST_MODULE,
+ msg, local_ptr, peer_ptr);
+
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_write_urc
+ * DESCRIPTION
+ * This function is used to send AT URC back to the task who register channels
+ *
+ * PARAMETERS
+ * buffer [IN] output data
+ * length [IN] the length of output data
+ * stuff [IN] if we need to add <CR><LF> to the header and tailer or not
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_msgbased_write_urc(kal_uint8 *buffer, kal_uint16 length, kal_bool stuff)
+{
+ rmmi_msgbased_write_data(buffer, length, stuff, 0xff, RMMI_MSGBASED_URC);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_write_response
+ * DESCRIPTION
+ * This function is used to send AT response back to the task who register channels
+ *
+ * PARAMETERS
+ * buffer [IN] output data
+ * length [IN] the length of output data
+ * stuff [IN] if we need to add <CR><LF> to the header and tailer or not
+ * src_id [IN] the output source ID
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_msgbased_write_response(kal_uint8 *buffer, kal_uint16 length, kal_bool stuff, kal_uint8 src_id)
+{
+ rmmi_msgbased_write_data(buffer, length, stuff, src_id, RMMI_MSGBASED_RESPONSE);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_cid_2_srcid
+ * DESCRIPTION
+ * This function is used to transfer from channel ID to source ID by table lookup
+ * The source ID begins from RMMI_MSG_AT_SRC
+ * If we could not find the source ID, we will return INVALID_SRC
+ * PARAMETERS
+ * cid [IN]
+ * RETURNS
+ * source ID
+ *****************************************************************************/
+kal_uint8 rmmi_msgbased_cid_2_srcid(kal_uint8 cid)
+{
+ cid -= RMMI_MSG_BASED_CHANNEL_OFFSET;
+ if (cid >= RMMI_MSG_BASED_CUSTOM_AT_CHANNEL)
+ return INVALID_SRC;
+ else
+ return rmmi_msgbased_src[cid];
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_srcid_2_cid
+ * DESCRIPTION
+ * This function is used to transfer source id to channel id
+ * The channel ID is begin from RMMI_MSG_BASED_CHANNEL_OFFSET
+ * If we could not find the channel ID, we will return 0xff
+ * PARAMETERS
+ * src_id [IN]
+ * RETURNS
+ * channel ID
+ *****************************************************************************/
+kal_uint8 rmmi_msgbased_srcid_2_cid(kal_uint8 src_id)
+{
+ kal_uint8 cid;
+
+ for (cid = 0; cid < RMMI_MSG_BASED_CUSTOM_AT_CHANNEL; cid++)
+ {
+ if (rmmi_msgbased_src[cid] == src_id)
+ {
+ return cid+RMMI_MSG_BASED_CHANNEL_OFFSET;
+ }
+ }
+ return 0xff;
+
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_cid_2_port
+ * DESCRIPTION
+ * This function is used to transfer from channel ID to port ID by table lookup
+ * The port ID begins from RMMI_MSG_BASED_PORT_BEGIN
+ * If we could not find the port ID, we will return uart_port_null
+ * PARAMETERS
+ * cid [IN]
+ * RETURNS
+ * port ID
+ *****************************************************************************/
+kal_uint8 rmmi_msgbased_cid_2_port(kal_uint8 cid)
+{
+ cid-=RMMI_MSG_BASED_CHANNEL_OFFSET;
+ if (cid >= RMMI_MSG_BASED_CUSTOM_AT_CHANNEL)
+ return uart_port_null;
+ else
+ return rmmi_msgbased_port[cid];
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_port_2_cid
+ * DESCRIPTION
+ * This function is used to transfer port id to channel id
+ * The channel ID is begin from RMMI_MSG_BASED_CHANNEL_OFFSET
+ * If we could not find the channel ID, we will return 0xff
+ * PARAMETERS
+ * port [IN]
+ * RETURNS
+ * channel ID
+ *****************************************************************************/
+kal_uint8 rmmi_msgbased_port_2_cid(kal_uint8 port)
+{
+ kal_uint8 cid;
+
+ for (cid = 0; cid < RMMI_MSG_BASED_CUSTOM_AT_CHANNEL; cid++)
+ {
+ if (rmmi_msgbased_port[cid] == port)
+ {
+ return cid+RMMI_MSG_BASED_CHANNEL_OFFSET;
+ }
+ }
+ return 0xff;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_is_valid_src
+ * DESCRIPTION
+ * This function is used to judge if the input src_id is a valid ID for "message based AT ocmmand" or not
+ * PARAMETERS
+ * src_id [IN]
+ * RETURNS
+ * KAL_TRUE or KAL_FALSE
+ *****************************************************************************/
+kal_bool rmmi_msgbased_is_valid_src(kal_uint8 src_id)
+{
+ kal_uint8 cid;
+
+ cid = rmmi_msgbased_srcid_2_cid(src_id);
+ return cid == 0xff ? KAL_FALSE : KAL_TRUE;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_msgbased_register_channel
+ * DESCRIPTION
+ * This function is used to init source/port mapping accroding the ch_num
+ * PARAMETERS
+ * ch_num [IN]
+ * RETURNS
+ * RMMI_MSG_BASED_PORT_BEGIN
+ *****************************************************************************/
+kal_uint8 rmmi_msgbased_register_channel(kal_uint8 ch_num)
+{
+ kal_uint8 i, src;
+
+ src = RMMI_MSG_AT_SRC;
+ for (i=0; i<ch_num; i++)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Reg] Register channel(%d): source: %d, port: %d",
+ i, src, RMMI_MSG_BASED_PORT_BEGIN+i);
+
+ rmmi_msgbased_port[i] = RMMI_MSG_BASED_PORT_BEGIN + i;
+ rmmi_msgbased_src[i] = src++;
+ }
+
+ return RMMI_MSG_BASED_PORT_BEGIN;
+}
+
+/*****************
+* The following is for ZTE
+******************/
+
+#define MAX_TP_QUEUE_LENGTH 2048
+#define MAX_TP_URC_BUFFER_LENGTH 2048
+
+typedef kal_int32 (*PS_CALLBACK) (kal_uint8 channelId, kal_char *buf, kal_uint16 iDataLen, kal_uint8 iFlag);
+
+typedef struct
+{
+ kal_uint16 length;
+ kal_char data[MAX_TP_QUEUE_LENGTH];
+ kal_bool is_sms_cmd;
+} tp_queue_struct;
+
+typedef enum
+{
+ TP_ERROR = -1,
+ TP_SUCCESS
+} tp_result;
+
+/* If you want to modify the number of channels,
+ Please modify the constant RMMI_MSG_BASED_CUSTOM_AT_CHANNEL
+ But our modem could only support max 20 channels
+*/
+tp_queue_struct tp_buffer[RMMI_MSG_BASED_CUSTOM_AT_CHANNEL];
+
+PS_CALLBACK tp_callback = NULL;
+
+kal_int32 tp_port_begin = -1;
+kal_int8 tp_channelNum = 0;
+
+kal_char tp_urc_buffer[MAX_TP_URC_BUFFER_LENGTH];
+kal_uint16 tp_urc_buffer_len = 0;
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_start
+ * DESCRIPTION
+ * This function is used to start message based AT command mechanism by customer
+ *
+ * PARAMETERS
+ * buffer [IN] output data
+ *
+ * RETURNS
+ * TP_SUCCESS or TP_ERROR
+ *****************************************************************************/
+kal_int32 tp_ps_start(kal_int8 channelNum)
+{
+ kal_uint8 i;
+ rmmi_register_channel_req_struct *req_ptr;
+
+ if(channelNum > RMMI_MSG_BASED_CUSTOM_AT_CHANNEL)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Start] Register channel number(%d) is larger than the maximum supported number: %d",
+ channelNum, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL);
+ return TP_ERROR;
+ }
+ else if (tp_channelNum != 0)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Start] We have already been started");
+ return TP_ERROR;
+ }
+
+ tp_channelNum = channelNum;
+
+ //init buffers
+ for(i=0; i<channelNum; i++)
+ {
+ tp_buffer[i].length = 0;
+ tp_buffer[i].data[0] = '\0';
+ tp_buffer[i].is_sms_cmd = KAL_FALSE;
+ }
+
+ //send MSG_ID_ATCI_REGISTER_CHANNEL_REQ
+ req_ptr = (rmmi_register_channel_req_struct*)
+ construct_local_para((kal_uint16) sizeof(rmmi_register_channel_req_struct), TD_RESET);
+
+ req_ptr->ch_num = channelNum;
+
+ rmmi_msgbased_send_ilm(
+ RMMI_MSG_BASED_HANDLER_MODULE,
+ MSG_ID_RMMI_REGISTER_CHANNEL_REQ,
+ req_ptr, NULL);
+
+ return TP_SUCCESS;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_reg_callback
+ * DESCRIPTION
+ * This function is used to callback function which is used to send AT data back to register
+ *
+ * PARAMETERS
+ * callback_func [IN]
+ *
+ * RETURNS
+ * TP_SUCCESS or TP_ERROR
+ *****************************************************************************/
+kal_int32 tp_ps_reg_callback(PS_CALLBACK callback_func)
+{
+ tp_callback = callback_func;
+
+ if ( !(tp_callback == NULL || tp_port_begin == -1))
+ {
+ if (tp_urc_buffer_len > 0)
+ {
+ tp_callback(
+ RMMI_MSG_BASED_URC_CHANNEL,
+ tp_urc_buffer,
+ tp_urc_buffer_len, 1);
+ }
+ }
+
+ return TP_SUCCESS;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_Send
+ * DESCRIPTION
+ * This function is used to send AT command to MOD_ATCI
+ * Return success means that the command is sent, not the command is executed successfully
+ * PARAMETERS
+ * iFlag [IN] always be 1
+ * channelId [IN]
+ * pDataPtr [IN]
+ * iDataLen [IN]
+ *
+ * RETURNS
+ * TP_SUCCESS or TP_ERROR
+ *****************************************************************************/
+kal_int32 tp_ps_Send(kal_uint8 iFlag, kal_uint8 channelId, kal_uint8 *pDataPtr, kal_uint16 iDataLen)
+{
+ kal_uint16 i;
+ kal_int32 result = TP_ERROR;
+ module_type type;
+ tp_queue_struct *buffer;
+ rmmi_exe_at_req_struct *req_ptr;
+ peer_buff_struct *peer_ptr;
+ kal_uint8 *data_ptr;
+ kal_uint8 cmd_string[10];
+ kal_char input_hint_string[] = "\r\n> ";
+
+ type = stack_get_active_module_id();
+ if (iFlag != 1)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] Warning: iFlag shoulbe be 1: %d", iFlag);
+ }
+
+ if (tp_port_begin == -1)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] ERROR: havn't start PS, please call tp_ps_start first");
+ }
+ else if(pDataPtr == NULL)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] ERROR: input data pointer is NULL!!!");
+ }
+ else if (tp_callback == NULL)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] ERROR: havn't register TP callback function");
+ }
+ else if(channelId >= tp_channelNum)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] ERROR: invalid channelID: ch:%d, max:%d ", channelId, tp_channelNum);
+ }
+ else
+ {
+ buffer = &tp_buffer[channelId];
+
+ if ( (buffer->length + iDataLen) > MAX_TP_QUEUE_LENGTH)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] ERROR: buffer[%d] is full, clean the buffer!!! Org:%d, New:%d, Max: %d",
+ channelId, buffer->length, iDataLen,
+ MAX_TP_QUEUE_LENGTH);
+ buffer->length = 0;
+ buffer->is_sms_cmd = KAL_FALSE;
+ }
+ else
+ {
+ result = TP_SUCCESS;
+
+ //Put the data into the buffer
+ kal_mem_cpy(buffer->data+buffer->length, pDataPtr, iDataLen);
+
+ //Update buffer length
+ buffer->length += iDataLen;
+
+ //check if the data is a complete command according to the <CR><LF>
+ for(i=0; i<buffer->length;i++)
+ {
+ if (buffer->is_sms_cmd == KAL_FALSE &&
+ (buffer->data[i] == RMMI_MSGBASED_CR || buffer->data[i] == RMMI_MSGBASED_LF) )
+ {
+ kal_mem_cpy(cmd_string, buffer->data, 10);
+ toUpper(cmd_string);
+ if (is_sms_command(cmd_string, 10) == KAL_TRUE)
+ {
+ buffer->is_sms_cmd = KAL_TRUE;
+
+ // send hint string
+ tp_callback(channelId, input_hint_string, strlen(input_hint_string), 1);
+ buffer->data[i] = RMMI_MSGBASED_LF;
+
+ kal_prompt_trace(
+ type,
+ "[Send] INFO: Enter SMS input mode");
+ }
+ break;
+ }
+ else if (buffer->is_sms_cmd == KAL_TRUE &&
+ (buffer->data[i] == RMMI_MSGBASED_CTRLZ || buffer->data[i] == RMMI_MSGBASED_ESC) )
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] INFO: Leave SMS input mode");
+
+ buffer->is_sms_cmd = KAL_FALSE;
+
+ if (buffer->data[i] == RMMI_MSGBASED_ESC)
+ {
+ tp_callback(channelId, "\r\nOK\r\n", 6, 1);
+ //clean the buffer
+ buffer->length = 0;
+ return;
+ }
+ break;
+ }
+ }
+
+
+ if (i != buffer->length)
+ {
+ if (buffer->is_sms_cmd == KAL_TRUE)
+ {
+ kal_prompt_trace(
+ type,
+ "[Send] INFO: in SMS input mode, length: %d",
+ buffer->length);
+ }
+ else
+ {
+ // send the command
+ req_ptr = (rmmi_exe_at_req_struct*)
+ construct_local_para((kal_uint16) sizeof(rmmi_exe_at_req_struct), TD_RESET);
+ peer_ptr = (peer_buff_struct*) construct_peer_buff(buffer->length, 0, 0, TD_RESET);
+ data_ptr= (kal_uint8 *)get_peer_buff_pdu(peer_ptr, &i);
+
+ req_ptr->length = buffer->length;
+ req_ptr->port_id = channelId + tp_port_begin;
+
+ kal_mem_cpy(data_ptr, buffer->data, buffer->length);
+
+ rmmi_msgbased_send_ilm(
+ RMMI_MSG_BASED_HANDLER_MODULE,
+ MSG_ID_RMMI_EXE_AT_REQ,
+ req_ptr, peer_ptr);
+
+ //clean the buffer
+ buffer->length = 0;
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_test_callback
+ * DESCRIPTION
+ * This function is the test purpose callback function for testing
+ *
+ * PARAMETERS
+ * channelId [IN] always be 1
+ * buf [IN]
+ * iDataLen [IN]
+ * iFlag [IN]
+ *
+ * RETURNS
+ * TP_SUCCESS or TP_ERROR
+ *****************************************************************************/
+static kal_int32 tp_ps_test_callback(kal_uint8 channelId, kal_char *buf, kal_uint16 iDataLen, kal_uint8 iFlag)
+{
+ /*This function is used to test the tp ps functions*/
+ module_type type;
+
+ type = stack_get_active_module_id();
+
+ kal_prompt_trace(
+ type,
+ "[Callback] Ch: %d, length: %d, flag: %d, buf:%s",
+ channelId, iDataLen, iFlag, buf);
+
+ return 0;
+}
+
+/******************************************
+* the following is used to handle the primitives from ATCI *
+*******************************************/
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_register_channel_cnf_hdlr
+ * DESCRIPTION
+ * This function is used to handle the message MSG_ID_RMMI_REGISTER_CHANNEL_CNF
+ *
+ * PARAMETERS
+ * local_para_ptr [IN]
+ * peer_buff_ptr [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void tp_ps_register_channel_cnf_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
+{
+ rmmi_register_channel_cnf_struct *cnf_ptr;
+
+ cnf_ptr = (rmmi_register_channel_cnf_struct*) local_para_ptr;
+ tp_port_begin = cnf_ptr->begin_port_id;
+
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] Receive register channel confirm, result:%d, begin_port:%d",
+ cnf_ptr->result, tp_port_begin);
+
+ if ( !(tp_callback == NULL || tp_port_begin == -1))
+ {
+ if (tp_urc_buffer_len > 0)
+ {
+ tp_callback(
+ RMMI_MSG_BASED_URC_CHANNEL,
+ tp_urc_buffer,
+ tp_urc_buffer_len, 1);
+ }
+ }
+
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_exe_at_cnf_hdlr
+ * DESCRIPTION
+ * This function is used to handle the message MSG_ID_RMMI_EXE_AT_CNF
+ *
+ * PARAMETERS
+ * local_para_ptr [IN]
+ * peer_buff_ptr [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void tp_ps_exe_at_cnf_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
+{
+ rmmi_exe_at_cnf_struct *cnf_ptr;
+
+ cnf_ptr = (rmmi_exe_at_cnf_struct*) local_para_ptr;
+
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] ATCI has received the request, result:%d, from port:%d",
+ cnf_ptr->result, cnf_ptr->port_id);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_handling_at_indication
+ * DESCRIPTION
+ * This function is used to handle the response/URC data from MOD_ATCI
+ *
+ * PARAMETERS
+ * channelId [IN]
+ * buf [IN]
+ * iDataLen [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void tp_ps_handling_at_indication(kal_uint8 channelId, kal_char *buf, kal_uint16 iDataLen)
+{
+ kal_char *data;
+
+ if (tp_callback == NULL || tp_port_begin == -1)
+ {
+ if (tp_callback == NULL)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] ERROR: havn't register TP callback function");
+ }
+ else if (tp_port_begin == -1)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] ERROR: havn't start PS, please call tp_ps_start first");
+ }
+
+ // buffer the URC
+ if (channelId == RMMI_MSG_BASED_URC_CHANNEL)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] Buffer the URC: %s", buf);
+ if ( (tp_urc_buffer_len + iDataLen) > MAX_TP_URC_BUFFER_LENGTH)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] URC buffer is full, clean the buffer", buf);
+
+ tp_urc_buffer_len = 0;
+ }
+
+ if (iDataLen > MAX_TP_URC_BUFFER_LENGTH)
+ {
+ kal_prompt_trace(
+ stack_get_active_module_id(),
+ "[Hdlr] ERROR: the URC is too large, please increase the URC buffer");
+ }
+ else
+ {
+ kal_mem_cpy(tp_urc_buffer+tp_urc_buffer_len, buf, iDataLen);
+ tp_urc_buffer_len += iDataLen;
+ }
+ }
+ }
+ else
+ {
+
+ data = get_ctrl_buffer(iDataLen);
+ kal_mem_cpy(data, buf, iDataLen);
+
+ tp_callback(channelId, data, iDataLen, 1);
+
+ free_ctrl_buffer(data);
+ }
+
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_response_at_ind_hdlr
+ * DESCRIPTION
+ * This function is used to handle the message MSG_ID_RMMI_RESPONSE_AT_IND
+ *
+ * PARAMETERS
+ * local_para_ptr [IN]
+ * peer_buff_ptr [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void tp_ps_response_at_ind_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
+{
+ rmmi_response_at_ind_struct *cnf_ptr;
+ kal_uint16 data_length;
+ kal_char *pdu_ptr;
+
+ cnf_ptr = (rmmi_response_at_ind_struct*) local_para_ptr;
+ pdu_ptr = (kal_char*) get_peer_buff_pdu(peer_buff_ptr, &data_length);
+
+ tp_ps_handling_at_indication(
+ cnf_ptr->port_id - tp_port_begin,
+ pdu_ptr,
+ cnf_ptr->length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_urc_at_ind_hdlr
+ * DESCRIPTION
+ * This function is used to handle the message MSG_ID_RMMI_URC_AT_IND
+ *
+ * PARAMETERS
+ * local_para_ptr [IN]
+ * peer_buff_ptr [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void tp_ps_urc_at_ind_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
+{
+ rmmi_urc_at_ind_struct *cnf_ptr;
+ kal_uint16 data_length;
+ kal_char *pdu_ptr;
+
+ cnf_ptr = (rmmi_urc_at_ind_struct*) local_para_ptr;
+ pdu_ptr = (kal_char*) get_peer_buff_pdu(peer_buff_ptr, &data_length);
+
+ tp_ps_handling_at_indication(
+ RMMI_MSG_BASED_URC_CHANNEL,
+ pdu_ptr,
+ cnf_ptr->length);
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * tp_ps_urc_at_ind_hdlr
+ * DESCRIPTION
+ * This function is used to handle the message relative to message based AT command mechanism
+ *
+ * PARAMETERS
+ * ilm_ptr [IN]
+ *
+ * RETURNS
+ * void
+ *****************************************************************************/
+void tp_ps_message_handler(ilm_struct *ilm_ptr)
+{
+ kal_prompt_trace(MOD_ATCI, "Enter TP Handler");
+ if (ilm_ptr->msg_id == MSG_ID_RMMI_REGISTER_CHANNEL_CNF)
+ {
+ tp_ps_register_channel_cnf_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
+ }
+ else if (ilm_ptr->msg_id == MSG_ID_RMMI_EXE_AT_CNF)
+ {
+ tp_ps_exe_at_cnf_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
+ }
+ else if (ilm_ptr->msg_id == MSG_ID_RMMI_RESPONSE_AT_IND)
+ {
+ tp_ps_response_at_ind_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
+ }
+ else if (ilm_ptr->msg_id == MSG_ID_RMMI_URC_AT_IND)
+ {
+ tp_ps_urc_at_ind_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
+ }
+ #ifdef TP_PS_NDEBUG
+
+ else if (ilm_ptr->msg_id == MSG_ID_TST_INJECT_STRING)
+ {
+ kal_int8 num;
+ tst_module_string_inject_struct *msg_ptr;
+ msg_ptr = (tst_module_string_inject_struct*) ilm_ptr->local_para_ptr;
+
+
+ switch(msg_ptr->index)
+ {
+ case 0: //reg_callback
+ tp_ps_reg_callback(tp_ps_test_callback);
+ break;
+ case 1: //start
+ num = atoi((kal_char *)msg_ptr->string);
+ kal_prompt_trace(stack_get_active_module_id(), "NUM: %d", num);
+ tp_ps_start(num);
+ break;
+ case 2: // send
+ tp_ps_Send(1, 0, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
+ break;
+ case 3: // send <CR>
+ tp_ps_Send(1, 0, "\r", 1);
+ break;
+ case 4: // send <CTRL+Z>
+ num = RMMI_MSGBASED_CTRLZ;
+ tp_ps_Send(1, 0, (kal_uint8*) &num, 1);
+ break;
+ case 5: // send <ESC>
+ num = RMMI_MSGBASED_ESC;
+ tp_ps_Send(1, 0, (kal_uint8*) &num, 1);
+ break;
+ case 6: // send with invalid iFlag
+ tp_ps_Send(0, 0, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
+ break;
+ case 7: // send with invalid channel
+ tp_ps_Send(1, 25, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
+ break;
+ case 8: // send with invalid pointer
+ tp_ps_Send(1, 0, NULL, strlen((kal_char*)msg_ptr->string));
+ break;
+ case 9: // send to max channel
+ tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
+ break;
+ case 10: // send <CR>
+ tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, "\r", 1);
+ break;
+ case 11: // send <CTRL+Z>
+ num = RMMI_MSGBASED_CTRLZ;
+ tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, (kal_uint8*) &num, 1);
+ break;
+ case 12: // send <ESC>
+ num = RMMI_MSGBASED_ESC;
+ tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, (kal_uint8*) &num, 1);
+ break;
+ case 13: // send <ESC>
+ tp_ps_Send(1, 0, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
+ tp_ps_Send(1, 0, "\r", 1);
+ break;
+ case 14: // send <ESC>
+ tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
+ tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, "\r", 1);
+ break;
+
+
+ default:
+ break;
+ }
+
+ }
+ #endif
+
+}
+
+#endif
+
diff --git a/mcu/custom/protocol/common/atci/src/rmmi_validator_custom_op01.c b/mcu/custom/protocol/common/atci/src/rmmi_validator_custom_op01.c
new file mode 100644
index 0000000..e02b862
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/src/rmmi_validator_custom_op01.c
@@ -0,0 +1,983 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * RMMI_VALIDATOR_CUSTOM_OP01.C
+ *
+ * Project:
+ * --------
+ * MAUI
+ *
+ * Description:
+ * ------------
+ * This file is intends for implementing custom commands for some customers
+ * which should not be released to other customers
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ ****************************************************************************/
+
+#include "kal_general_types.h"
+#include "kal_public_api.h"
+#include <stdio.h>
+#include <string.h>
+#include "kal_public_api.h" //MSBB change #include "kal_release.h"
+
+#if (!defined(__L1_STANDALONE__) && !defined(__MAUI_BASIC__))
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
+#include "syscomp_config.h"
+#include "task_config.h"
+#include "stacklib.h" /* Basic type for dll, evshed, stacktimer */
+
+#include "l4c_common_enum.h"
+
+#ifdef __MOD_SMU__
+#include "sim_common_enums.h"
+#endif /* __MOD_SMU__ */
+#include "rmmi_common_enum.h"
+#include "rmmi_context.h"
+#include "l4c_context.h"
+#include "l3_inc_enums.h"
+#include "l4c_utility.h"
+#include "l4_trc.h"
+#include "l4c_sim_cmd.h"
+#include "ps_public_utility.h"
+#include "gmss_public.h"
+#include "mml1_nvram_def.h"
+
+extern kal_uint16 rmmi_fast_string_print(kal_uint8 *buff_ptr, kal_uint8 *fmt, void *arg_list[], kal_uint8 nos_arg);
+extern kal_uint32 rmmi_int_validator_range_check(
+ kal_uint8 *error_cause,
+ rmmi_string_struct *source_string_ptr,
+ kal_uint8 delimiter,
+ kal_uint32 max);
+extern void rmmi_final_rsp_generator(kal_uint8 src_id, kal_bool ret_val, kal_uint8 *buffer, kal_uint16 string_length);
+extern kal_bool l4c_nw_get_attach_status_req(kal_uint8 src_id, kal_uint8 type, kal_uint8 *status);
+extern kal_bool l4c_nw_get_class_req(kal_uint8 src_id, kal_uint8 *type);
+extern kal_bool l4c_nw_get_romaing_status_req(kal_uint8 src_id, kal_bool* is_on_hplmn);
+extern kal_bool is_sim_verified(void);
+extern kal_bool l4c_nw_get_rat_mode_req(kal_uint8 src_id, kal_uint8 *rat_mode);
+extern kal_bool l4c_nw_get_prefer_rat_req(kal_uint8 *prefer_rat);
+extern kal_bool l4c_nw_get_romaing_mode_req(kal_uint8 src_id, kal_bool* support_roaming);
+extern kal_bool l4c_nw_set_sysconfig_req(kal_uint8 src_id,
+ kal_uint8 rat_mode,
+ kal_uint8 prefer_rat,
+ kal_bool support_roaming,
+ kal_uint8 mobile_class);
+extern kal_bool l4c_nw_cfun_state_req(kal_uint8 src_id, kal_uint8 cfun_state);
+extern module_type rmmi_current_mod_id;
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_dsci_hdlr
+ * DESCRIPTION
+ * This function handles the AT^DSCI input String
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_dsci_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_READ_MODE: /* AT^DSCI? */
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(RMMI_PTR->op01_report_mode.dsci);
+ string_length = rmmi_fast_string_print(buffer, (kal_uint8*) "^DSCI: %d", RMMI_PTR->arg_list, 1);
+ ret_val = KAL_TRUE;
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT^DSCI=<1 or 0> */
+ {
+ kal_uint8 mode;
+
+ mode = (kal_uint8) rmmi_int_validator_range_check(NULL,
+ source_string_ptr,
+ (kal_uint8) RMMI_PTR->s_reg.s3,
+ 1);
+ if (mode != RMMI_VALIDATOR_ERROR)
+ {
+ ret_val = KAL_TRUE;
+ RMMI_PTR->op01_report_mode.dsci = mode;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, buffer, string_length);
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_mtv_hdlr
+ * DESCRIPTION
+ * This function handles the AT^MTV input String
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_mtv_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+#ifdef __CMMB_SUPPORT__
+ const kal_uint8 mtv_func = 1;
+#else
+ const kal_uint8 mtv_func = 0;
+#endif
+#ifdef __CMMB_CAS_MBBMS_SUPPORT__
+ const kal_uint8 mbbms_func = 1;
+#else
+ const kal_uint8 mbbms_func = 0;
+#endif
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_READ_MODE: /* AT^MTV? */
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(mtv_func);
+ RMMI_PTR->arg_list[1] = (void*)&(mbbms_func);
+ string_length = rmmi_fast_string_print(buffer, (kal_uint8*) "^MTV: %d, %d", RMMI_PTR->arg_list, 2);
+ ret_val = KAL_TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, buffer, string_length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_sysinfo_hdlr
+ * DESCRIPTION
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_sysinfo_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+ l4c_context_struct *l4c_ptr = L4C_PTR;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ {
+ kal_uint8 cs_service, mobile_class;
+ kal_uint8 srv_status=0, srv_domain=0, roam_status=0, sys_mode=0, sim_state=0,sys_submode=0;
+ kal_bool is_on_hplmn;
+
+ // srv_status
+ l4c_nw_get_attach_status_req(source_string_ptr->src_id, RAC_CS, &cs_service);
+ if (l4c_check_state_is_registered(cs_service) != KAL_TRUE)
+ {
+ srv_status = 1;
+ }
+ else
+ {
+ srv_status = 2;
+ }
+
+ if (l4c_get_cfun_state() != 1)
+ {
+ srv_status = 0;
+ }
+
+ // srv_domain
+ l4c_nw_get_class_req(source_string_ptr->src_id, &mobile_class);
+ if (mobile_class == 0 || mobile_class == 1) // A , B
+ {
+ srv_domain = 3; // CS+PS
+ }
+ else if (mobile_class == 2) // CG
+ {
+ srv_domain = 2; // PS only
+ }
+ else if (mobile_class == 3) // CC
+ {
+ srv_domain = 1; // CS only
+ }
+
+ // roam_status
+ l4c_nw_get_romaing_status_req(source_string_ptr->src_id, &is_on_hplmn);
+ roam_status= (is_on_hplmn?0:1);
+
+ // sys_mode
+ switch(RMMI_PTR->cs_register_status.act)
+ {
+ case 0:
+ case 1:
+ case 3:
+ sys_mode = 3;
+ break;
+ case 2:
+ case 4:
+ case 5:
+ case 6:
+ if(KAL_TRUE == gmss_is_tdscdma_mode_activated(l4c_ptr->cur_sim_slot_id))
+ {
+ sys_mode = 15;
+ }
+ else
+ {
+ sys_mode = 5;
+ }
+ break;
+ default:
+ sys_mode = 0; // keep it as default value
+ break;
+ }
+
+ // sim_state
+ if (l4c_get_sim_status() == L4C_SIM_INSERTED)
+ {
+ if (is_sim_verified() == KAL_FALSE)
+ {
+ sim_state = 255;
+ }
+ else
+ {
+ if (srv_status == 2)
+ {
+ sim_state = 1;
+ }
+ else
+ {
+ sim_state = 0;
+ }
+ }
+ }
+ else
+ {
+ sim_state = 255;
+ roam_status = 0;
+ }
+
+ // sys_submode
+ switch(RMMI_PTR->cs_register_status.act)
+ {
+ case 0:
+ case 1:
+ sys_submode = 2;
+ break;
+ case 3:
+ sys_submode = 3;
+ break;
+ case 2:
+ sys_submode = 4;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ if(KAL_TRUE == gmss_is_tdscdma_mode_activated(l4c_ptr->cur_sim_slot_id))
+ {
+ sys_submode = 8;
+ }
+ else
+ {
+ if(RMMI_PTR->cs_register_status.act == 4)
+ {
+ sys_submode = 5;
+ }
+ else if(RMMI_PTR->cs_register_status.act == 5)
+ {
+ sys_submode = 6;
+ }
+ else
+ {
+ sys_submode = 7;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (srv_status != 2)
+ {
+ srv_domain = 0;
+ roam_status= 0;
+ sys_mode = 0;
+ sys_submode = 0;
+ }
+
+ RMMI_PTR->arg_list[0] = (void*)&srv_status;
+ RMMI_PTR->arg_list[1] = (void*)&srv_domain;
+ RMMI_PTR->arg_list[2] = (void*)&roam_status;
+ RMMI_PTR->arg_list[3] = (void*)&sys_mode;
+ RMMI_PTR->arg_list[4] = (void*)&sim_state;
+ RMMI_PTR->arg_list[5] = (void*)&sys_submode;
+ string_length = rmmi_fast_string_print(buffer, (kal_uint8*) "^SYSINFO:%d,%d,%d,%d,%d,,%d", RMMI_PTR->arg_list, 6);
+
+ ret_val = KAL_TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rsp_str = &buffer[0];
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_sysconfig_hdlr
+ * DESCRIPTION
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_sysconfig_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 error_cause;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+ l4c_context_struct *l4c_ptr = L4C_PTR;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_READ_MODE:
+ {
+ kal_uint8 mode, acqorder, roam, srv_domain;
+ kal_uint8 rat_mode, prefer_rat, mobile_class;
+ kal_bool support_roaming;
+
+ // mode
+ ret_val = l4c_nw_get_rat_mode_req(source_string_ptr->src_id, &rat_mode);
+ if (rat_mode == RAT_GSM)
+ {
+ mode = 13;
+ }
+ else if (rat_mode == RAT_UMTS)
+ {
+ if(KAL_TRUE == gmss_is_tdscdma_mode_activated(l4c_ptr->cur_sim_slot_id))
+ {
+ mode = 15;
+ }
+ else
+ {
+ mode = 14;
+ }
+ }
+ else
+ {
+ mode = 2;
+ }
+
+ // acqorder
+ ret_val = l4c_nw_get_prefer_rat_req(&prefer_rat);
+ if (prefer_rat == RAT_GSM)
+ {
+ acqorder = 1;
+ }
+ else if (prefer_rat == RAT_UMTS)
+ {
+ acqorder = 2;
+ }
+ else
+ {
+ acqorder = 0;
+ }
+
+ // roam
+ ret_val = l4c_nw_get_romaing_mode_req(source_string_ptr->src_id, &support_roaming);
+ if (support_roaming == KAL_TRUE)
+ {
+ roam = 1;
+ }
+ else
+ {
+ roam = 0;
+ }
+
+ // srvdomain
+ ret_val = l4c_nw_get_class_req(source_string_ptr->src_id, &mobile_class);
+ if (mobile_class == 0 || mobile_class == 1) // A , B
+ {
+ srv_domain = 2; // CS+PS
+ }
+ else if (mobile_class == 2) // CG
+ {
+ srv_domain = 1; // PS only
+ }
+ else if (mobile_class == 3) // CC
+ {
+ srv_domain = 0; // CS only
+ }
+ else
+ {
+ srv_domain = 3; // Any
+ }
+
+ RMMI_PTR->arg_list[0] = (void*)&mode;
+ RMMI_PTR->arg_list[1] = (void*)&acqorder;
+ RMMI_PTR->arg_list[2] = (void*)&roam;
+ RMMI_PTR->arg_list[3] = (void*)&srv_domain;
+ string_length = rmmi_fast_string_print(buffer, (kal_uint8*) "^SYSCONFIG:%d,%d,%d,%d", RMMI_PTR->arg_list, 4);
+
+ ret_val = KAL_TRUE;
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 mode, acqorder, roam, srv_domain;
+ kal_uint8 rat_mode, prefer_rat, mobile_class;
+ kal_bool support_roaming=KAL_TRUE;
+
+ mode = rmmi_int_validator_range_check(
+ &error_cause,
+ source_string_ptr,
+ (kal_uint8) RMMI_COMMA,
+ 0xff);
+
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ if (error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ mode = 16; // unchanged
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ if ((mode == 14)&&(KAL_TRUE == gmss_is_tdscdma_mode_activated(l4c_ptr->cur_sim_slot_id)))
+ {
+ break;
+ }
+ }
+
+ acqorder = (kal_uint8)rmmi_int_validator_range_check(
+ &error_cause,
+ source_string_ptr,
+ (kal_uint8) RMMI_COMMA,
+ 3);
+
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ if (error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ acqorder = 3; // unchanged
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ roam = (kal_uint8)rmmi_int_validator_range_check(
+ &error_cause,
+ source_string_ptr,
+ (kal_uint8) RMMI_COMMA,
+ 2);
+
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ if (error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ roam = 2; // unchanged
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ srv_domain = (kal_uint8)rmmi_int_validator_range_check(
+ &error_cause,
+ source_string_ptr,
+ (kal_uint8) RMMI_COMMA,
+ 4);
+
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ if (error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ srv_domain = 4; // unchanged
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ // Do nothing if totally unchaged
+ if (mode == 16 && acqorder == 3 && roam ==2 && srv_domain == 4)
+ {
+ ret_val = KAL_TRUE;
+ break;
+ }
+
+ // rat_mode
+ if (mode == 13)
+ {
+ rat_mode = RAT_GSM;
+ }
+ else if (mode == 14 || mode == 15)
+ {
+ rat_mode = RAT_UMTS;
+ }
+ else if (mode == 16)
+ {
+ l4c_nw_get_rat_mode_req(source_string_ptr->src_id, &rat_mode); // unchange
+ }
+ else
+ {
+ rat_mode = RAT_GSM_UMTS;
+ }
+
+ // prefer_rat
+ if (acqorder == 1)
+ {
+ prefer_rat = RAT_GSM;
+ }
+ else if (acqorder == 2)
+ {
+ prefer_rat = RAT_UMTS;
+ }
+ else if (acqorder == 3)
+ {
+ l4c_nw_get_prefer_rat_req(&prefer_rat); // do not change
+ }
+ else
+ {
+ prefer_rat = RAT_GSM_UMTS;
+ }
+
+ // support_roaming
+ if (roam == 0)
+ {
+ support_roaming = KAL_FALSE;
+ }
+ else if (roam == 1)
+ {
+ support_roaming = KAL_TRUE;
+ }
+ else
+ {
+ l4c_nw_get_romaing_mode_req(source_string_ptr->src_id, &support_roaming); // do not change
+ }
+
+ // mobile_class
+ if (srv_domain == 0)
+ {
+ mobile_class = 3; // CS only
+ }
+ else if (srv_domain == 1)
+ {
+ mobile_class = 2; // PS only
+ }
+ else if (srv_domain == 4)
+ {
+ l4c_nw_get_class_req(source_string_ptr->src_id, &mobile_class); // unchange
+ }
+ else if (srv_domain >= 2)
+ {
+ mobile_class = 1; // CS_PS
+ }
+
+ ret_val = l4c_nw_set_sysconfig_req(source_string_ptr->src_id, rat_mode, prefer_rat, support_roaming, mobile_class);
+ if (ret_val ==KAL_TRUE)
+ {
+ return;
+ }
+ }
+ default:
+ break;
+ }
+ }
+ rsp_str = &buffer[0];
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_cardmode_hdlr
+ * DESCRIPTION
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_cardmode_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_READ_MODE:
+ {
+ int sim_state=0;
+
+ if (is_sim_verified() == KAL_FALSE)
+ {
+ sim_state = 255;
+ }
+ else
+ {
+ if (check_is_usim() == KAL_TRUE)
+ {
+ sim_state = 2;
+ }
+ else
+ {
+ sim_state = 1;
+ }
+ }
+
+ RMMI_PTR->arg_list[0] = (void*)&sim_state;
+ string_length = rmmi_fast_string_print(buffer, (kal_uint8*) "^CARDMODE: %d", RMMI_PTR->arg_list, 1);
+ ret_val = KAL_TRUE;
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 mode, error_cause;
+
+ mode = (kal_uint8) rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ break;
+ }
+
+ RMMI_PTR->op01_report_mode.cardmode = mode;
+ ret_val = KAL_TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rsp_str = &buffer[0];
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_rfsw_hdlr
+ * DESCRIPTION
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_rfsw_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_READ_MODE:
+ {
+ int state;
+
+ if (l4c_get_cfun_state() != 1)
+ {
+ state = 0;
+ }
+ else
+ {
+ state = 1;
+ }
+
+ RMMI_PTR->arg_list[0] = (void*)&state;
+ string_length = rmmi_fast_string_print(buffer, (kal_uint8*) "^RFSW: %d", RMMI_PTR->arg_list, 1);
+ ret_val = KAL_TRUE;
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 value, error_cause;
+
+ value = (kal_uint8) rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ break;
+ }
+
+ RMMI_PTR->op01_report_mode.rfsw = value;
+ ret_val = KAL_TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rsp_str = &buffer[0];
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_spn_hdlr
+ * DESCRIPTION
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_spn_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 error_cause;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 spn_type;
+ kal_uint8 PATH_SPN[6] = {0x7F,0x20,0x6F,0x46,0x00,0x00};
+ kal_uint8 PATH_U_SPN[6] = {0x7F,0xFF,0x6F,0x46,0x00,0x00};
+
+ spn_type = (kal_uint8) rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ break;
+ }
+
+ if (spn_type == 0)
+ { // Read SIM SPN
+ ret_val = l4c_smu_read_file_info_req(source_string_ptr->src_id, FILE_NONE, PATH_SPN, 0);
+ }
+ else
+ { // Read USIM SPN
+ ret_val = l4c_smu_read_file_info_req(source_string_ptr->src_id, FILE_NONE, PATH_U_SPN, 1);
+ }
+
+ if (ret_val == KAL_TRUE)
+ {
+ return;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rsp_str = &buffer[0];
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_hver_hdlr
+ * DESCRIPTION
+ * This command is for CMCC test, and used to get hardware version.
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+ void rmmi_hver_hdlr(rmmi_string_struct *source_string_prt)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint16 string_length = 0;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 eq_id[NVRAM_EF_BARCODE_NUM_SIZE + 1];
+ kal_uint8 buffer[MAX_UART_LENGTH];
+
+ //kal_trace(TRACE_FUNC, FUNC_RMMI_HVER_HDLR_ENTRY);//change to kal_brief_trace?
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch(source_string_prt->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ {
+ /* Get Base band chip version, same as AT+EGMR=0,0 */
+ ret_val = get_ms_revision(0, (kal_uint8*)eq_id);
+ if(ret_val == KAL_TRUE)
+ {
+ RMMI_PTR->arg_list[0] = (void*)eq_id;
+ string_length = rmmi_fast_string_print(buffer,
+ (kal_uint8*) "^HVER: \"%s\"",
+ RMMI_PTR->arg_list,
+ 1);
+ rsp_str = &buffer[0];
+ }
+ break;
+ }
+ default:
+ {
+ /* Unrecognized command format */
+ break;
+ }
+
+ }
+ }
+ rmmi_final_rsp_generator(source_string_prt->src_id, ret_val, (kal_uint8*)rsp_str, string_length);
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_cmdver_hdlr
+ * DESCRIPTION
+ * This command is for CMCC test, and used to get AT CMD version.
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_cmdver_hdlr(rmmi_string_struct *source_string_prt)
+{
+ kal_uint8 main_ver = CMCC_AT_CMD_MAIN_VER;
+ kal_uint8 major_ver = CMCC_AT_CMD_MAJOR_VER;
+ kal_uint8 minor_ver = CMCC_AT_CMD_MINOR_VER;
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint16 string_length = 0;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[MAX_UART_LENGTH];
+
+ //kal_trace(TRACE_FUNC, FUNC_RMMI_CMDVER_HDLR_ENTRY);//change to brief trace?
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch(source_string_prt->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ {
+ RMMI_PTR->arg_list[0] = (void*)&main_ver;
+ RMMI_PTR->arg_list[1] = (void*)&major_ver;
+ RMMI_PTR->arg_list[2] = (void*)&minor_ver;
+ string_length = rmmi_fast_string_print(buffer,
+ (kal_uint8*) "^CMDVER: %d,%d,%d",
+ RMMI_PTR->arg_list,
+ 3);
+ rsp_str = &buffer[0];
+ ret_val = KAL_TRUE;
+ break;
+ }
+
+ default:
+ {
+ /* Unrecognized command format */
+ break;
+ }
+
+ }
+ }
+ rmmi_final_rsp_generator(source_string_prt->src_id, ret_val, (kal_uint8*)rsp_str, string_length);
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_off_hdlr
+ * DESCRIPTION
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_off_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 const *rsp_str = NULL;
+ kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+ kal_uint16 string_length = 0;
+
+ if(KAL_TRUE == sbp_query_md_feature_by_ps(SBP_OP01_AT_SUPPORT, (rmmi_current_mod_id - MOD_ATCI)))
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ {
+ ret_val = l4c_nw_cfun_state_req(source_string_ptr->src_id, 4);
+ if (ret_val == KAL_TRUE)
+ {
+ return;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ rsp_str = &buffer[0];
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+#endif /* !__L1_STANDALONE__ && !__MAUI_BASIC__*/
+
diff --git a/mcu/custom/protocol/common/atci/src/rmmi_validator_custom_tc01.c b/mcu/custom/protocol/common/atci/src/rmmi_validator_custom_tc01.c
new file mode 100644
index 0000000..7611756
--- /dev/null
+++ b/mcu/custom/protocol/common/atci/src/rmmi_validator_custom_tc01.c
@@ -0,0 +1,6473 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * RMMI_VALIDATOR_CUSTOM.C
+ *
+ * Project:
+ * --------
+ * MAUI
+ *
+ * Description:
+ * ------------
+ * This file is intends for implementing custom commands for some customers
+ * which should not be released to other customers
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include "kal_public_api.h" //MSBB change #include "kal_release.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_common.h"
+
+#ifdef __TC01__
+
+#include "uem_utility.h"
+#include "l4c_context.h"
+
+#include "rmmi_utility.h"
+#include "rmmi_msghdlr.h"
+
+/* Basic include */
+#include "rmmi_context.h"
+#include "rmmi_rspfmttr.h"
+#include "rmmi_custom_parser.h"
+/* AT%SBP RFDEVCHK */
+//#include "l4c_utility.h"
+#include "nvram_data_items.h"
+#include "nvram_struct.h"
+#include "nvram_msgid.h"
+#include "nvram_interface.h"
+//#include "ps_public_utility.h"
+//#include "l4c_sendmsg.h"
+//#include "l4c_em.h"
+#include "rmmi_rsp.h"
+/* AT%SBP RFDEVCHK */
+#if defined(__TC01__) && defined(LGE_FW_COMMON)
+#include "lge_fw_factory_data.h"
+#endif
+
+/* AT%LTECALL */ /*AT_CAMPREQ MOLY00303967*/
+#include "l4c2rac_struct.h"
+#include "nvram_interface.h"
+#include "sbp_public_utility.h" // __TC01_CUST_SBP__
+#include "l4c_sendmsg.h"
+#include "rmmi_parser.h"
+#include "l4c_utility.h"
+#include "rmmi_msghdlr.h"
+#include "rmmi_utility.h"
+/* AT%LTECALL */
+
+/* Specific Cell-search */
+#ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+#include "custom_gas_config.h"
+#include "custom_cise_config.h"
+#include "custom_eas_config.h"
+#include "rmmi_common_enum.h"
+#include "mrs_common_capability.h" // at%ltecall
+#endif
+
+/*AT+DATASTATIC */
+#include "upcm.h"
+#include "l4c_context.h"
+#include "l4c_utility.h"
+/*AT+DATASTATIC */
+
+#include "l4c_nw_cmd.h"
+
+/* AT%MIMOANTCHECK */
+#include "custom_em.h"
+#include "l4c_em.h"
+
+/* AT%ECALL */
+#include "l4c_cc_cmd.h"
+#include "l4crac_func.h"
+#include "l4crac_enums.h"
+#include "custom_ecc.h"
+/* AT%ECALL */
+
+/* AT%FLIGHT */
+#include "kal_trace.h"
+/* AT%FLIGHT */
+
+/* AT%SIMID */
+#include "custom_nvram_extra.h"
+#if defined (__MOD_SMU__)
+#define RMMI_CUST_GET_NVRAM_ICCID_INT(PS_ID_EXT, ICCID) \
+{ \
+ kal_uint8 ps_id = PS_ID_EXT; \
+ nvram_ef_ms_security_struct *pSmuSecurityInfo = smu_get_ms_security_ptr(ps_id); \
+ if (pSmuSecurityInfo->query_a == NULL) \
+ kal_mem_set(ICCID, 0xFF, sizeof(ICCID)); \
+ else \
+ (*pSmuSecurityInfo->query_a)(SMU_ICCID_A, ICCID, NUM_OF_BYTE_ICCID, ps_id); \
+}
+
+#if defined (__GEMINI__)
+#define RMMI_CUST_GET_NVRAM_ICCID(CURR_MOD_ID, ICCID) RMMI_CUST_GET_NVRAM_ICCID_INT((CURR_MOD_ID == MOD_L4C ? SIM1 : SIM2), ICCID)
+#else
+#define RMMI_CUST_GET_NVRAM_ICCID(CURR_MOD_ID, ICCID) RMMI_CUST_GET_NVRAM_ICCID_INT(SIM1, ICCID)
+#endif /* __GEMINI__ */
+#endif /*__MOD_SMU__ */
+
+/* AT%SIMOFF */
+#include "l4c_sim_cmd.h"
+
+/*****************************************************************************
+* Declareation of variables
+*****************************************************************************/
+kal_uint32 const rmmi_custom_cmd_table[RMMI_MAX_CUSTOM_CMD_NUM][2] =
+{
+#define CUSTOM_CMD(AT_NAME, HASH1, HASH2, TEST_STRING, ENUM, FUNC) {HASH1, HASH2},
+ #include "at_custom_cmd_tc01.h"
+#undef CUSTOM_CMD
+};
+
+const kal_char *const rmmi_custom_test_mode_string_table[ /* RMMI_MAX_CMD_NUM */ ] =
+{
+#define CUSTOM_CMD(AT_NAME, HASH1, HASH2, TEST_STRING, ENUM, FUNC) TEST_STRING,
+ #include "at_custom_cmd_tc01.h"
+#undef CUSTOM_CMD
+};
+
+/* AT%SIMOFF */
+#if defined(__VSIM__) && !defined(__FEATURE_TC01_SIMOFF_EXTENTION__)
+kal_uint8 switch_on = 0; // For AT%SIMOFF / 1:switch_on / 0:switch_off
+#endif
+
+/* AT%ECALL */
+kal_uint8 ecall_action = 0xff; //0xff: no ecall action 0: ecall hangup call onging , 1:ecall dial call ongoing
+kal_uint8 ecall_when_no_service = KAL_FALSE; //MAUI_02610201: this flag is used to prevent ecall setup for a long time
+/* AT%ECALL */
+
+/* AT%FLIGHT */
+kal_bool rmmi_custom_flight_state = KAL_FALSE;
+kal_bool rmmi_customCfun_state = KAL_FALSE;
+/* AT%FLIGHT */
+
+/*****************************************************************************
+ * Definition of type
+ *****************************************************************************/
+
+typedef enum {
+
+RMMI_CUST_NO_RSP,
+RMMI_CUST_RSP_ONLY,
+RMMI_CUST_RSP_WITH_OK,
+RMMI_CUST_RSP_ERROR,
+RMMI_CUST_RSP_MAX,
+RMMI_CUST_RSP_INVLAID = RMMI_CUST_RSP_MAX
+}rmmi_cust_rsp_enum;
+
+static rmmi_cust_rsp_enum resp_type = RMMI_CUST_RSP_INVLAID;
+
+#define RMMI_CUST_SET_RSP_TYPE( RSP_TYPE ) resp_type = RSP_TYPE
+#define RMMI_CUST_MAX_RSP_STR_LEN 512
+
+/* AT%LTECALL */
+custom_factory_band_context_struct cust_fac_band;
+custom_factory_band_context_struct * cust_fac_ptr_global = &cust_fac_band;
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+
+typedef int BOOL;
+
+/* Virtual SIM Lock Test */
+typedef enum {
+ LGOEM_VSLT_NONE = 0x00,
+ LGOEM_VSLT_SIM_CHECKING,
+ LGOEM_VSLT_SIM_LOCK,
+ LGOEM_VSLT_SIM_UNLOCK,
+ LGOEM_VSLT_SIM_ERROR,
+ LGOEM_VSLT_SIM_MAX = 0xff,
+}lgoem_at_vslt_sim_type;
+
+#define VSLT_SIM_3 (3)
+#define VSLT_MAX_NUM_3 (10)
+#define VSLT_MAX_LEN_3 (31*VSLT_SIM_3+10)
+
+#define VSLT_SIM_2 (2)
+#define VSLT_MAX_NUM_2 (20)
+#define VSLT_MAX_LEN_2 (31*VSLT_SIM_2+10)
+
+#define VSLT_SIM_1 (1)
+#define VSLT_MAX_NUM_1 (40)
+#define VSLT_MAX_LEN_1 (31*VSLT_SIM_1+10)
+
+#define TC01_SML_SIZE_OF_CAT_N (LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN)
+#define TC01_SML_SIZE_OF_CAT_SP (LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN +LGE_FAC_NC_GID1_LEN)
+#define TC01_SML_SIZE_OF_CAT_NS (LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN +LGE_FAC_NC_SUBSET_LEN)
+#define TC01_SML_SIZE_OF_CAT_C (LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN +LGE_FAC_NC_GID1_LEN+LGE_FAC_NC_GID2_LEN)
+ /* Virtual SIM Lock Test */
+#endif /* #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON) */
+
+#define __RMMI_CUSTOM_DEBUG_INFO__
+
+#ifdef __RMMI_CUSTOM_DEBUG_INFO__
+#define rmmi_custom_dbg_trace(x) kal_prompt_trace(rmmi_current_mod_id, x)
+#define rmmi_custom_dbg_trace_int(x,i) kal_prompt_trace(rmmi_current_mod_id, x, i)
+#else
+#define rmmi_custom_dbg_trace(x) {}
+#define rmmi_custom_dbg_trace_int(x,i) {}
+#endif
+
+/* AT%ECALL */
+#define RMMI_ECALL_NO_ACTION 0xff
+#define RMMI_ECALL_SETUP 1
+#define RMMI_ECALL_CLEAR 0
+#define RMMI_SET_ECALL_ACTION( ACT ) ecall_action = ACT
+#define RMMI_GET_ECALL_ACTION_STATE() ecall_action
+#define RMMI_ECALL_SET_NO_SRV_STATE( STATE ) ecall_when_no_service = STATE
+#define RMMI_CUST_ECC_INVOKE 1
+#define RMMI_CUST_ECC_HUP 0
+#define RMMI_INVALID_SIM_ID 0xff
+#define RMMI_L4CID_MAP2_SIMID(L4CID) (L4CID-MOD_L4C)
+#define RMMI_SIMID_MAP2_L4CID(SIMID) (SIMID + MOD_L4C)
+#define RMMI_IS_CALL_EXIST( SIMID ) (&l4c_cntxt_g[SIMID])->call_exist
+#define RMMI_IS_RAC_ACTIVATED( SIMID ) l4c_comm_ptr_g->rac_activated
+#define RMMI_CUST_SET_CMEE(ERR) RMMI_PTR->cmee_err = ERR
+#define RMMI_CUST_SET_RSP_TYPE( RSP_TYPE ) resp_type = RSP_TYPE
+/* AT%ECALL */
+
+static kal_uint8 rmmi_rsp_buf[RMMI_CUST_MAX_RSP_STR_LEN];
+/*****************************************************************************
+ * Definition of Macro
+ *****************************************************************************/
+#define RMMI_CUST_BAND_EGSM 0x02
+#define RMMI_CUST_BAND_DCS 0x08
+#define RMMI_CUST_BAND_PCS 0x10
+#define RMMI_CUST_BAND_GSM850 0x80
+#define RMMI_CUST_BNAD_NOT_SUPPORT 0
+
+#define RMMI_CUST_BNDI_PARAM_PCS 3
+#define RMMI_CUST_BNDI_PARAM_DCS 4
+#define RMMI_CUST_BNDI_PARAM_DUAL_EXT 6
+#define RMMI_CUST_BNDI_PARAM_DUAL_US 8
+
+#define RMMI_CUST_STX 0x02
+#define RMMI_CUST_ETX 0x03
+#define RMMI_CUST_PERSENT '%'
+
+#define GSM_BAND_PRESENT_BITMAP 1
+#define UMTS_BAND_PRESENT_BITMAP 2
+#define LTE_BAND_PRESENT_BITMAP 4
+#define NR_BAND_PRESENT_BITMAP 8 /* at%ltecall */
+
+#define MAX_SUPPORTED_LTE_BAND (8)
+#define MAX_SUPPORTED_NR_BAND (MRS_NR_BAND_BITMASK_SIZE / 4)
+#define CUSTOM_UMTS_BAND_OFFSET (5)
+#define CUSTOM_LTE_BAND_OFFSET (17)
+#define MAX_CAMPREQ_BAND 45
+
+//AT_CAMPREQ MOLY00303967
+#define LGE_FAC_CHAR_STX 0x02
+#define LGE_FAC_CHAR_ETX 0x03
+
+typedef struct{
+ kal_uint8 band_present_bitmap;
+ kal_uint8 gsm_band;
+ kal_uint32 umts_band;
+ kal_uint32 lte_band[MAX_SUPPORTED_LTE_BAND];
+ kal_uint32 nr_band[MAX_SUPPORTED_NR_BAND]; /* at%ltecall */
+}rmmi_band_T;
+
+/*****************************************************************************
+ * Declareation of functions
+ *****************************************************************************/
+
+/* AT%SBP RFDEVCHK */
+extern nvram_ef_sbp_modem_config_struct sbp_config;
+extern nvram_ef_sbp_modem_config_struct cust_sbp_config;
+/* AT%SBP RFDEVCHK */
+
+kal_uint16 rmmi_fast_string_print_custom(kal_uint8 * buff_ptr, kal_uint8 * fmt, void * arg_list [ ], kal_uint8 nos_arg);
+static void rmmi_cust_final_rsp_generator( kal_uint8 src_id, kal_uint8 *buffer_ptr,kal_uint16 string_length);
+/* For MOLY00165083 */
+
+static void rmmi_band_init( rmmi_band_T * band );
+static kal_uint16 rmmi_construct_band_value_and_string( kal_uint8 *rspstr_ptr,
+ kal_uint8 custom_band_value,
+ rmmi_band_T * band_ptr,
+ kal_uint32 supported_gsm_band,
+ kal_uint32 supported_umts_fdd_band,
+ kal_uint32 * supported_lte_band,
+ kal_uint32 * supported_nr_band );
+
+void set_factory_rat_mode( kal_uint8 rat_band_bitmap );
+
+static kal_uint8 rmmi_cust_band_map( kal_uint8 opcode ); /* MOLY00303943 */
+
+#ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+kal_bool rmmi_initial_campreq_with_set_rft_mode( void );
+#endif
+
+ /* AT%ECALL */
+static kal_uint8 rmmi_get_simid_call_exist( void );
+static kal_bool rmmi_is_ecc_ongoing( void );
+static void rmmi_cust_invoke_ecc_call_clearing ( l4c_source_id_enum src_id, kal_uint8 sim_id );
+static void rmmi_cust_invoke_ecc_call_setup ( l4c_source_id_enum src_id, kal_uint8 sim_id );
+static kal_bool rmmi_is_rac_activated( void );
+extern void csmcc_context_selection(kal_uint8 sim_interface);
+ /* AT%ECALL */
+
+/*****************************************************************************
+ * Declareation of variables
+ *****************************************************************************/
+ static kal_uint8 rmmi_rsp_buf[RMMI_CUST_MAX_RSP_STR_LEN];
+
+ typedef enum{
+ CUST_BAND_NONE = 0,
+ CUST_BAND_GSM900,
+ CUST_BAND_GSM850,
+ CUST_BAND_PCS,
+ CUST_BAND_DCS,
+ CUST_BAND_GSM_ONLY = 6,
+ CUST_BAND_WCDMA_I,
+ CUST_BAND_WCDMA_II,
+ CUST_BAND_WCDMA_III,
+ CUST_BAND_WCDMA_IV,
+ CUST_BAND_WCDMA_V,
+ CUST_BAND_WCDMA_VI,
+ CUST_BAND_WCDMA_VII,
+ CUST_BAND_WCDMA_VIII,
+ CUST_BAND_WCDMA_VIIII,
+ CUST_BAND_WCDMA_X,
+ CUST_BAND_WCDMA_ONLY,
+ CUST_BAND_Automatic,
+ CUST_BAND_WCDMA_XIX,
+ CUST_BAND_1X_ONLY=23,
+ CUST_BAND_HDR_ONLY,
+ CUST_BAND_TDSCDMA_ONLY,
+ CUST_BAND_GSM_WCDMA = 49,
+ CUST_BAND_LTE_ONLY,
+ CUST_BAND_LTE_I,
+ CUST_BAND_LTE_II,
+ CUST_BAND_LTE_III,
+ CUST_BAND_LTE_IV,
+ CUST_BAND_LTE_V,
+ CUST_BAND_LTE_VI,
+ CUST_BAND_LTE_VII = 57,
+ CUST_BAND_LTE_VIII,
+ CUST_BAND_LTE_IX,
+ CUST_BAND_LTE_X,
+ CUST_BAND_LTE_XI,
+ CUST_BAND_LTE_XII,
+ CUST_BAND_LTE_XIII,
+ CUST_BAND_LTE_XIV,
+ CUST_BAND_LTE_XVII = 67,
+ CUST_BAND_LTE_XVIII,
+ CUST_BAND_LTE_XIX,
+ CUST_BAND_LTE_XX,
+ CUST_BAND_LTE_XXI,
+ CUST_BAND_LTE_XXV = 75,
+ CUST_BAND_LTE_XXVIII = 78,
+ CUST_BAND_LTE_XL = 90,
+ CUST_BAND_MAX
+ }custom_band_enum;
+
+ typedef struct {
+ custom_band_enum custom_band;
+ kal_uint32 band[MAX_SUPPORTED_LTE_BAND];
+ const char * band_str;
+ }custom_band_type;
+
+ static const custom_band_type custom_band_table[] = {
+ {CUST_BAND_GSM900, {0x02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[1]GSM900"},
+ {CUST_BAND_GSM850, {0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[2]GSM850"},
+ {CUST_BAND_PCS, {0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[3]PCS"},
+ {CUST_BAND_DCS, {0x08, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[4]DCS"},
+ {CUST_BAND_GSM_ONLY,{0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[6]GSM ONLY"},
+ {CUST_BAND_WCDMA_I, {0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[7]WCDMA I"},
+ {CUST_BAND_WCDMA_II, {0x02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[8]WCDMA II"},
+ {CUST_BAND_WCDMA_III, {0x04, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[9]WCDMA III"},
+ {CUST_BAND_WCDMA_IV, {0x08, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[10]WCDMA IV"},
+ {CUST_BAND_WCDMA_V, {0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[11]WCDMA V"},
+ {CUST_BAND_WCDMA_VI, {0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[12]WCDMA VI"},
+ {CUST_BAND_WCDMA_VII, {0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[13]WCDMA VII"},
+ {CUST_BAND_WCDMA_VIII, {0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[14]WCDMA VIII"},
+ {CUST_BAND_WCDMA_VIIII, {0x0100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[15]WCDMA VIIII"},
+ {CUST_BAND_WCDMA_X, {0x0200, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[16]WCDMA X"},
+ {CUST_BAND_WCDMA_ONLY, {0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[17]WCDMA ONLY"},
+ {CUST_BAND_Automatic, {0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[18]Automatic"},
+ {CUST_BAND_WCDMA_XIX, {0x40000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[19]WCDMA XIX"},
+ {CUST_BAND_1X_ONLY, {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[23]1X Only"},
+ {CUST_BAND_HDR_ONLY, {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[24]HDR Only"},
+ {CUST_BAND_TDSCDMA_ONLY, {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[25]TDSCDMA Only"},
+ {CUST_BAND_GSM_WCDMA, {0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[49]WCDMA GSM Only"},
+ {CUST_BAND_LTE_ONLY, {0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[50]LTE Only"},
+ {CUST_BAND_LTE_I, {0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[51]LTE I"},
+ {CUST_BAND_LTE_II, {0x02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[52]LTE II"},
+ {CUST_BAND_LTE_III, {0x04, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[53]LTE III"},
+ {CUST_BAND_LTE_IV, {0x08, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[54]LTE IV"},
+ {CUST_BAND_LTE_V, {0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[55]LTE V"},
+ {CUST_BAND_LTE_VI, {0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[56]LTE VI"},
+ {CUST_BAND_LTE_VII, {0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[57]LTE VII"},
+ {CUST_BAND_LTE_VIII, {0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[58]LTE VIII"},
+ {CUST_BAND_LTE_IX, {0x0100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[59]LTE IX"},
+ {CUST_BAND_LTE_X, {0x0200, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[60]LTE X"},
+ {CUST_BAND_LTE_XI, {0x0400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[61]LTE XI"},
+ {CUST_BAND_LTE_XII, {0x0800, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[62]LTE XII"},
+ {CUST_BAND_LTE_XIII, {0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[63]LTE XIII"},
+ {CUST_BAND_LTE_XIV, {0x2000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[64]LTE XIV"},
+ {CUST_BAND_LTE_XVII, {0x010000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[67]LTE XVII"},
+ {CUST_BAND_LTE_XVIII, {0x020000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[68]LTE XVIII"},
+ {CUST_BAND_LTE_XIX, {0x040000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, "[69]LTE XIX"},
+ {CUST_BAND_LTE_XX, {0x080000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[70]LTE XX"},
+ {CUST_BAND_LTE_XXI, {0x100000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[71]LTE XXI"},
+ {CUST_BAND_LTE_XXV, {0x1000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[75]LTE XXV"},
+ {CUST_BAND_LTE_XXVIII, {0x8000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[78]LTE XXVIII"},
+ {CUST_BAND_LTE_XL, {0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},"[90]LTE XL"}
+ };
+
+#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
+extern const kal_char *const sbp_feature_string_table[];
+const kal_char *const sbp_cust_feature_string_table[]=
+{
+#define SBP_FEATURE_DEF_BEGIN(x)
+#define SBP_FEATURE_DEF(FEATURE, ATTR, DESC, DESC_V0,DESC_V1, DEFAULT_VAL) #FEATURE,
+#define SBP_FEATURE_DEF_END(x)
+
+//jglee_block //no search file. #include "sbp_feature_cust.def"
+
+#undef SBP_FEATURE_DEF_BEGIN
+#undef SBP_FEATURE_DEF
+#undef SBP_FEATURE_DEF_END
+};
+
+#define INVALID_SBP_FEATURE 0xffffffff
+#endif
+
+#if defined(__TC01__) //AT_CAMPREQ MOLY00303967
+extern l4c_rac_response_enum l4crac_get_gsm_status();
+#endif
+extern kal_bool sim_get_card_status_tc01(kal_uint32 logicalNum);
+
+/*** BEGIN *** Please Implement Custome Command Here ***/
+static void rmmi_custom_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 const *rsp_str = NULL; /* response string and initialization */
+ kal_uint16 string_length = 0; /* string length variable */
+
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ {
+ break;
+ }
+ case RMMI_ACTIVE_MODE:
+ {
+ break;
+ }
+ case RMMI_READ_MODE:
+ {
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ ret_val = KAL_TRUE;
+ break;
+ }
+ default:
+ {
+ /* unrecognized format of AT command line */
+ break;
+ }
+ } /* end of the switch */
+
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_custom_need_entry
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+kal_bool rmmi_custom_need_entry(kal_uint16 cmd_index)
+{
+ kal_bool ret = KAL_FALSE;
+
+ switch( cmd_index )
+ {
+ case RMMI_CMD_BNDI :
+ case RMMI_CMD_CAMP :
+ case RMMI_CMD_CAMPREQ :
+ case RMMI_CMD_LGCGATT :
+ case RMMI_CMD_DETACH :
+ case RMMI_CMD_INISIM :
+ case RMMI_CMD_ISSIM :
+ case RMMI_CMD_SIMID :
+ case RMMI_CMD_MIMOANTCHECK :
+ case RMMI_CMD_RXMRD :
+ case RMMI_CMD_RFDEVCHK :
+ #ifdef __VSIM__
+ case RMMI_CMD_SIMOFF :
+ #endif
+ case RMMI_CMD_SLTYPE :
+ case RMMI_CMD_VSLT3 :
+ case RMMI_CMD_VSLT2 :
+ case RMMI_CMD_VSLT :
+// case RMMI_CMD_CALCK :
+// case RMMI_CMD_CALDT :
+ case RMMI_CMD_ECALL :
+ case RMMI_CMD_SIMIMSI :
+ case RMMI_CMD_SBP :
+ case RMMI_CMD_LTECALL :
+ case RMMI_CMD_LBCALL :
+ case RMMI_CMD_FLIGHT :
+ case RMMI_CMD_DATASTATIC :
+ case RMMI_CMD_SIMTRAY :
+ ret = KAL_TRUE;
+ break;
+ default :
+ ret = KAL_FALSE;
+ }
+ return ret;
+}
+
+
+#ifdef __RMMI_EXTEND_CUSTOM_CMD__
+/****************************************/
+/* Start of Custom AT command APIs */
+/****************************************/
+
+/*****************************************************************************
+ * Definition of extra functions
+ *****************************************************************************/
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_fast_string_print_custom
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+kal_bool rmmi_is_custom_extended_cmd_character(kal_char *cmd_char)
+{
+ if ((*cmd_char == '%'))
+ {
+ return KAL_TRUE;
+ }
+ else
+ {
+ return KAL_FALSE;
+ }
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_fast_string_print_custom
+ * DESCRIPTION
+ * Locate STX, ETX , <STX><RSP string><ETX>
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+kal_uint16 rmmi_fast_string_print_custom(kal_uint8 * buff_ptr, kal_uint8 * fmt, void * arg_list [ ], kal_uint8 nos_arg)
+{
+ kal_uint8 string_length = 0;
+
+ buff_ptr[0] = 0x02; // STX
+ string_length = rmmi_fast_string_print(buff_ptr+1, fmt, arg_list, nos_arg);
+ buff_ptr[string_length+1] = 0x03; // ETX
+ buff_ptr[string_length+2] = 0x00;
+
+ return (string_length + 2);
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_get_int_ext
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+kal_uint32 rmmi_get_int_ext( kal_uint8 *error_cause, rmmi_string_struct *source_string_ptr, kal_uint8 delimiter )
+{
+ kal_uint32 ret_val = RMMI_VALIDATOR_ERROR;
+ kal_int32 value = 0;
+ kal_uint16 length;
+ kal_bool error_flag = KAL_FALSE;
+ kal_bool some_char_found = KAL_FALSE;
+
+ ASSERT(source_string_ptr != NULL);
+ length = strlen((char*)source_string_ptr->string_ptr);
+
+ /* If there are some leading white spaces, ignore them */
+ rmmi_skip_spaces(source_string_ptr);
+
+ /*
+ * we have to initial the error so that we can using again and
+ * again even if any error occur. so we dont have to init before
+ * enter this function
+ */
+ *error_cause = RMMI_PARSE_OK;
+
+ /*
+ * Start checking for the integer, till the delimiter which may
+ * * be a comma, a dot etc.
+ */
+
+ while ( ( source_string_ptr->string_ptr[source_string_ptr->index] != delimiter )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_PTR->s_reg.s3 )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_CHAR_W )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != rmmi_char_w )
+ && ( source_string_ptr->index < length) )
+ {
+ /* It means we found something between two commas(,) */
+ some_char_found = KAL_TRUE;
+
+ /*
+ * check whether the character is in 0 - 9 range. If so,
+ * * store corresponding integer value for that character
+ */
+ if ((source_string_ptr->string_ptr[source_string_ptr->index]
+ >= RMMI_CHAR_0) && (source_string_ptr->string_ptr[source_string_ptr->index] <= RMMI_CHAR_9))
+ {
+ value = value * 10 + (source_string_ptr->string_ptr[source_string_ptr->index] - RMMI_CHAR_0);
+ }
+ else if( source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_DOUBLE_QUOTE )
+ {
+ /* do nothing */
+ }
+ else /* out of range, return immediately */
+ {
+ error_flag = KAL_TRUE;
+ break;
+ }
+ /* If the character is a valid part of integer, then continue */
+ source_string_ptr->index++;
+ } /* end of the while loop */
+
+ if (error_flag == KAL_TRUE)
+ {
+ /*
+ * Value is not in the valid range. It can also be due to
+ * * white space in between two digits, because such white
+ * * spaces are not allowed
+ */
+ /* mark for solve correct input but incorrect end for 1,2,2, */
+ /* rmmi_result_code_fmttr ( RMMI_RCODE_ERROR,
+ INVALID_CHARACTERS_IN_TEXT_ERRSTRING_ERR ); */
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ else if (some_char_found == KAL_FALSE)
+ {
+ if( source_string_ptr->index == length )
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_NOT_FOUND;
+ }
+ else
+ {
+ /* Nothing is present before the delimiter */
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+
+ /*
+ * Increment the string sliding index to point to the next
+ * * character after delimiter, i.e. the next field in the
+ * * command line
+ */
+ source_string_ptr->index++;
+ }
+
+ }
+ /*
+ * If some thing is present and check for the valid range as
+ * * specified by the calling function
+ */
+ else
+ {
+ ret_val = value;
+ /*
+ * Increment the string sliding index to point to the next
+ * * character after delimiter, i.e. the next field in the
+ * * command line
+ */
+ if (source_string_ptr->string_ptr[source_string_ptr->index] == delimiter)
+ {
+ source_string_ptr->index++;
+ rmmi_skip_spaces(source_string_ptr);
+ if (source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_PTR->s_reg.s3)
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ }
+ else if ( ( source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_CHAR_W ) || ( source_string_ptr->string_ptr[source_string_ptr->index] == rmmi_char_w ) )
+ {
+ source_string_ptr->index++;
+ rmmi_skip_spaces(source_string_ptr);
+ if (source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_PTR->s_reg.s3)
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ else
+ {
+ source_string_ptr->index++;
+ }
+ }
+ else
+ {
+ source_string_ptr->index++;
+ }
+ }
+ return ret_val;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_get_hex_ext
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+kal_uint8 rmmi_get_hex_ext( kal_uint8 *error_cause, rmmi_string_struct *source_string_ptr, kal_uint8 delimiter, kal_uint16 max_length, kal_uint8 *str, kal_uint8 *readCount )
+{
+ kal_uint8 ret_val = RMMI_VALIDATOR_ERROR;
+ kal_uint8 index = 0;
+ kal_uint16 length;
+ kal_bool error_flag = KAL_FALSE;
+ kal_bool some_char_found = KAL_FALSE;
+
+ ASSERT((str != NULL) && (source_string_ptr != NULL) && (error_cause != NULL));
+ length = strlen((char*)source_string_ptr->string_ptr);
+ /* If there are some leading white spaces, ignore them */
+ rmmi_skip_spaces(source_string_ptr);
+
+ /*
+ * we have to initial the error so that we can using again and
+ * again even if any error occur. so we dont have to init before
+ * enter this function
+ */
+ *error_cause = RMMI_PARSE_OK;
+
+ /*
+ * Start checking for the integer, till the delimiter which may
+ * * be a comma, a dot etc.
+ */
+
+ toUpper(source_string_ptr->string_ptr);
+ while ( ( source_string_ptr->string_ptr[source_string_ptr->index] != delimiter )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_PTR->s_reg.s3 )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_CHAR_W )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != rmmi_char_w )
+ && ( source_string_ptr->index < length) )
+ {
+ /* It means we found something between two commas(,) */
+ some_char_found = KAL_TRUE;
+
+ /*
+ * check whether the character is in 0 - 9 or A - F range.
+ * If not, break then return.
+ */
+ if ((source_string_ptr->string_ptr[source_string_ptr->index]
+ >= RMMI_CHAR_0) && (source_string_ptr->string_ptr[source_string_ptr->index] <= RMMI_CHAR_9))
+ {
+ if (index > (max_length - 1)) /* length is too long , break */
+ {
+ error_flag = KAL_TRUE;
+ break;
+ }
+
+ *((kal_uint8*) str + index) = source_string_ptr->string_ptr[source_string_ptr->index] - RMMI_CHAR_0;
+ index++;
+ }
+ else if ((source_string_ptr->string_ptr[source_string_ptr->index]
+ >= RMMI_CHAR_A) && (source_string_ptr->string_ptr[source_string_ptr->index] <= RMMI_CHAR_F))
+ {
+ if (index > (max_length - 1)) /* length is too long , break */
+ {
+ error_flag = KAL_TRUE;
+ break;
+ }
+
+ *((kal_uint8*) str + index) = source_string_ptr->string_ptr[source_string_ptr->index] - RMMI_CHAR_A + 10;
+ index++;
+ }
+ else if( source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_DOUBLE_QUOTE )
+ {
+ /* do nothing */
+ }
+ else /* out of range, return immediately */
+ {
+ error_flag = KAL_TRUE;
+ break;
+ }
+ /* If the character is a valid part of integer, then continue */
+ source_string_ptr->index++;
+ } /* end of the while loop */
+
+ if (error_flag == KAL_TRUE)
+ {
+ /* Value is not in the valid range. */
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ else if (some_char_found == KAL_FALSE)
+ {
+ if( source_string_ptr->index == length )
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_NOT_FOUND;
+ }
+ else
+ {
+ /* Nothing is present before the delimiter */
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+
+ /*
+ * Increment the string sliding index to point to the next
+ * * character after delimiter, i.e. the next field in the
+ * * command line
+ */
+ source_string_ptr->index++;
+ }
+
+ }
+ /*
+ * If some thing is present and check for the valid range as
+ * * specified by the calling function
+ */
+ else
+ {
+ ret_val = RMMI_DEF_VALUE;
+ *readCount = index;
+
+ if (source_string_ptr->string_ptr[source_string_ptr->index] == delimiter)
+ {
+ source_string_ptr->index++;
+ rmmi_skip_spaces(source_string_ptr);
+ if (source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_PTR->s_reg.s3)
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ }
+ else if ( ( source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_CHAR_W ) || ( source_string_ptr->string_ptr[source_string_ptr->index] == rmmi_char_w ) )
+ {
+ source_string_ptr->index++;
+ rmmi_skip_spaces(source_string_ptr);
+ if (source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_PTR->s_reg.s3)
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ else
+ {
+ source_string_ptr->index++;
+ }
+ }
+ else
+ {
+ source_string_ptr->index++;
+ }
+ }
+
+ return ret_val;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_get_str_ext
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+kal_uint8 rmmi_get_str_ext( kal_uint8 *error_cause, rmmi_string_struct *source_string_ptr, kal_uint8 delimiter, kal_uint16 max_length, kal_uint8 *str )
+{
+ kal_uint8 ret_val = RMMI_VALIDATOR_ERROR;
+ kal_uint8 index = 0;
+ kal_uint16 length;
+ kal_bool error_flag = KAL_FALSE;
+ kal_bool some_char_found = KAL_FALSE;
+
+ ASSERT((str != NULL) && (source_string_ptr != NULL) && (error_cause != NULL));
+ length = strlen((char*)source_string_ptr->string_ptr);
+ /* If there are some leading white spaces, ignore them */
+ rmmi_skip_spaces(source_string_ptr);
+
+ /*
+ * we have to initial the error so that we can using again and
+ * again even if any error occur. so we dont have to init before
+ * enter this function
+ */
+ *error_cause = RMMI_PARSE_OK;
+
+ /*
+ * Start checking for the integer, till the delimiter which may
+ * * be a comma, a dot etc.
+ */
+
+ toUpper(source_string_ptr->string_ptr);
+ while ( ( source_string_ptr->string_ptr[source_string_ptr->index] != delimiter )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_PTR->s_reg.s3 )
+ && ( source_string_ptr->string_ptr[source_string_ptr->index] != RMMI_SPACE )
+ && ( source_string_ptr->index < length) )
+ {
+ /* It means we found something between two commas(,) */
+ some_char_found = KAL_TRUE;
+
+ /*
+ * check whether the character is in 0 - 9 or A - F range.
+ * If not, break then return.
+ */
+ if (index > (max_length - 1)) /* length is too long , break */
+ {
+ error_flag = KAL_TRUE;
+ break;
+ }
+
+ *((kal_uint8*) str + index) = source_string_ptr->string_ptr[source_string_ptr->index];
+ index++;
+
+ /* If the character is a valid part of integer, then continue */
+ source_string_ptr->index++;
+ } /* end of the while loop */
+
+ if (error_flag == KAL_TRUE)
+ {
+ /* Value is not in the valid range. */
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ else if (some_char_found == KAL_FALSE)
+ {
+ if( source_string_ptr->index == length || source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_PTR->s_reg.s3 )
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_NOT_FOUND;
+ }
+ else
+ {
+ /* Nothing is present before the delimiter */
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+
+ /*
+ * Increment the string sliding index to point to the next
+ * * character after delimiter, i.e. the next field in the
+ * * command line
+ */
+ source_string_ptr->index++;
+ }
+ }
+ /*
+ * If some thing is present and check for the valid range as
+ * * specified by the calling function
+ */
+ else
+ {
+ ret_val = RMMI_DEF_VALUE;
+ if( max_length > 1 )
+ {
+ *((kal_uint8*) str + index) = '\0';
+ }
+
+ if (source_string_ptr->string_ptr[source_string_ptr->index] == delimiter)
+ {
+ source_string_ptr->index++;
+ rmmi_skip_spaces(source_string_ptr);
+ if (source_string_ptr->string_ptr[source_string_ptr->index] == RMMI_PTR->s_reg.s3)
+ {
+ ret_val = RMMI_VALIDATOR_ERROR;
+ *error_cause = (kal_uint8) RMMI_PARSE_ERROR;
+ }
+ }
+ else
+ {
+ source_string_ptr->index++;
+ }
+ }
+
+ return ret_val;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_final_rsp_generator
+ * DESCRIPTION
+ * the function generates the information response and final result code to DTE.
+ * PARAMETERS
+ * src_id [IN] l4c_source_enum (channel)
+ * ret_val [IN] OK/ERROR
+ * buffer [?]
+ * string_length [IN] the length of buffer.
+ * RETURNS
+ * void
+ *****************************************************************************/
+static void rmmi_cust_final_rsp_generator
+(
+ kal_uint8 src_id,
+ kal_uint8 * buffer_ptr,
+ kal_uint16 string_length
+)
+{
+ rmmi_custom_dbg_trace_int("rmmi_cust_final_rsp_generator(), , resp_type = %d", resp_type);
+
+ if( resp_type == RMMI_CUST_RSP_ONLY || resp_type == RMMI_CUST_RSP_WITH_OK )
+ {
+ if (string_length > 0)
+ {
+ if(resp_type == RMMI_CUST_RSP_ONLY)
+ {
+ atci_l4b_result_code_fmttr(RMMI_PTR->current_src, RMMI_RCODE_OK, buffer_ptr, string_length, KAL_TRUE);
+ }
+ else
+ {
+ rmmi_write_to_uart((kal_uint8*) buffer_ptr, string_length, KAL_TRUE);
+ }
+ }
+ else
+ {
+ rmmi_custom_dbg_trace("rmmi_cust_final_rsp_generator(), response string langth is 0!");
+ }
+ if( resp_type == RMMI_CUST_RSP_WITH_OK )
+ {
+ rmmi_result_code_fmttr(RMMI_RCODE_OK, L4C_NO_CAUSE);
+ }
+ }
+ else if ( resp_type == RMMI_CUST_RSP_ERROR )
+ {
+ if (string_length > 0)
+ {
+ rmmi_write_to_uart((kal_uint8*) buffer_ptr, string_length, KAL_TRUE);
+ }
+ rmmi_result_code_fmttr(RMMI_RCODE_ERROR, RMMI_ERR_UNKNOWN);
+ }
+ else
+ {
+ rmmi_custom_dbg_trace_int("rmmi_cust_final_rsp_generator, No response, resp_type = %d", resp_type);
+ }
+ return;
+}
+
+ //-- rmmi_sprintf ----------------------------------------
+#define FLAG_ZERO (1) // Pad with zero
+#define FLAG_PLUS (4) // Show FLAG_PLUS
+#define FLAG_SPACE (8) // FLAG_SPACE if FLAG_PLUS
+#define FLAG_MINUS (16) // FLAG_MINUS justified
+#define FLAG_HASH (32) // 0x
+#define UN_SIGN (2) // Unsigned/signed long
+#define LARGE (64) // Use 'ABCDEF' instead of 'abcdef'
+
+#define is_digit(c) ((c) >= '0' && (c) <= '9') // Checking whether the character is digit or not.
+
+ static const kal_int8 lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+ static const kal_int8 upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ static size_t strn_len(const kal_int8 *s, size_t count)
+ {
+ const kal_int8 *sc;
+
+ for (sc = s; *sc != '\0' && count--; ++sc){
+ ;
+ }
+
+ return sc - s;
+ }
+
+ static kal_int32 rmmi_skip_atoi(const kal_int8 **format)
+ {
+ kal_int32 field_width = 0;
+
+ while (is_digit(**format))
+ field_width = field_width * 10 + *((*format)++) - '0';
+
+ return field_width;
+ }
+
+
+ static kal_int8 *rmmi_number(kal_int8 *str, long number, kal_int32 base, kal_int32 size, kal_int32 precision, kal_int32 type)
+ {
+ kal_int8 c = 0;
+ kal_int8 sign = 0;
+ kal_int8 tmp[66] = {0,};
+ const kal_int8 * digits = lower_digits;
+ kal_int32 i = 0;
+ kal_int32 position = 0;
+
+ if (type & LARGE)
+ digits = upper_digits;
+
+ if (type & FLAG_MINUS)
+ type &= ~FLAG_ZERO;
+
+ if (base < 2 || base > 36)
+ return 0;
+
+ c = (type & FLAG_ZERO) ? '0' : ' ';
+ sign = 0;
+
+ if (type & UN_SIGN)
+ {
+ if (number < 0)
+ {
+ sign = '-';
+ number = -number;
+ size--;
+ }
+ else if (type & FLAG_PLUS)
+ {
+ sign = '+';
+ size--;
+ }
+ else if (type & FLAG_SPACE)
+ {
+ sign = ' ';
+ size--;
+ }
+ }
+
+ if (type & FLAG_HASH)
+ {
+ if (base == 16)
+ size -= 2;
+ else if (base == 8)
+ size--;
+ }
+
+ i = 0;
+
+ if (number == 0)
+ tmp[i++] = '0';
+ else
+ {
+ while (number != 0)
+ {
+ position = ((kal_uint32) number) % (unsigned)base;
+ tmp[i++] = digits[position];
+ number = ((kal_uint32) number) / (unsigned) base;
+ }
+ }
+
+ if (i > precision)
+ precision = i;
+
+ size -= precision;
+
+ if (!(type & (FLAG_ZERO | FLAG_MINUS)))
+ {
+ while (size-- > 0)
+ *str++ = ' ';
+ }
+
+ if (sign)
+ *str++ = sign;
+
+ if (type & FLAG_HASH)
+ {
+ if (base == 8)
+ *str++ = '0';
+ else if (base == 16)
+ {
+ *str++ = '0';
+ *str++ = lower_digits[33];
+ }
+ }
+
+ if (!(type & FLAG_MINUS))
+ {
+ while (size-- > 0)
+ *str++ = c;
+ }
+
+ while (i < precision--)
+ *str++ = '0';
+
+ while (i-- > 0)
+ *str++ = tmp[i];
+
+ while (size-- > 0)
+ *str++ = ' ';
+
+ return str;
+ }
+
+ // New rmmi_vsprintf() which is made due to having limitation about argument in MOLY.
+ // It is same with vsprintf() in C
+ // It is not support 'E'/'e'/'G'/'g'/'f'
+ kal_int32 rmmi_vsprintf(kal_int8 *buffer, const kal_int8 *format, va_list argument_list )
+ {
+ kal_int32 str_len = 0;
+ kal_uint32 number = 0;
+ kal_int32 nLoop = 0;
+ kal_int32 base = 0;
+ kal_int8 * str_buf = NULL;
+ kal_int8 * s_va_arg = NULL; // To get the value by va_arg in case of 's'
+
+ kal_int32 flags = 0; // Flags for rmmi_number()
+
+ kal_int32 field_width = 0; // Width of output field
+ kal_int32 precision = 0; // Min. # of lower_digits for integers; max rmmi_number of chars for from string
+ kal_int32 output_length = 0; // The correct size of output digits. 'h', 'l', or 'L' for integer fields
+
+ // To get the argument list as format one by one.
+ for (str_buf = buffer; *format; format++)
+ {
+ if (*format != '%')
+ {
+ *str_buf++ = *format;
+ continue;
+ }
+ flags = 0;
+
+ repeat:
+ // For skipping first '%'
+ format++;
+
+ // Flags for rmmi_number()
+ switch (*format)
+ {
+ // FLAG_MINUS-aligned
+ case '-':
+ flags |= FLAG_MINUS;
+ goto repeat;
+
+ // Even if the number is positive, '+' is printed in front of the number. Ex) +2
+ case '+':
+ flags |= FLAG_PLUS;
+ goto repeat;
+
+ // If there is no sign, the spave is printed in front of the number. Ex) " 123", "-123"
+ case ' ':
+ flags |= FLAG_SPACE;
+ goto repeat;
+
+ // Case 1 : If this is used with the format 'o', 'x' and 'X', '0', '0x' and '0X' are printed in from of the number, except 0.
+ // Case 2 :If this is used with the format 'e', 'E' and 'f', the number has the point even if there is no needing point. Ex) 1 >> 1.0
+ // Case 3 : If this is used with the format 'g' and 'G', it is worked as "Case 2". But 0 under the point is not removed. Ex) 123.1200
+ case '#':
+ flags |= FLAG_HASH;
+ goto repeat;
+
+ // FLAG_MINUS-aligned and Fill 0 instead of the FLAG_SPACE.
+ case '0':
+ flags |= FLAG_ZERO;
+ goto repeat;
+ }
+
+ // Get Width of output field
+ field_width = -1;
+
+ if (is_digit(*format))
+ {
+ field_width = rmmi_skip_atoi(&format);
+ }
+ else if (*format == '*')
+ {
+ format++;
+ field_width = va_arg(argument_list, kal_int32);
+
+ if (field_width < 0)
+ {
+ field_width = -field_width;
+ flags |= FLAG_MINUS;
+ }
+ }
+
+ // Get the precision ( .number | .* )
+ precision = -1;
+
+ // Checking '.' to know the precision
+ if (*format == '.')
+ {
+ ++format;
+
+ // 'd'/'i'/'o'/'u'/'x'/'X' : Minimum number of output digits
+ // 'e'/'E'/'F' : The number of digits below the decimal point
+ // 'g'/'G' : THe number of digits which is possible output
+ // 's' : Maximum number of output digits
+ // 'c' : No effect
+ if (is_digit(*format))
+ precision = rmmi_skip_atoi(&format);
+ // Not represented in the format string precision.
+ // BUt it gives a factor behind the precision value.
+ else if (*format == '*')
+ {
+ ++format;
+ precision = va_arg(argument_list, kal_int32);
+ }
+
+ if (precision < 0)
+ precision = 0;
+ }
+
+ // Get the conversion output_length
+ output_length = -1;
+
+ // 'h' : Handle as 'short int' or 'unsigned short int'. It must be applied at 'i'/'d'/'o'/'u'/'x'/'X'
+ // 'l' : Handle as 'long int' or 'unsigned long int'. It must be applied at 'i'/'d'/'o'/'u'/'x'/'X'
+ // Handle as 'wide chracter' or 'wide string'. It must be applied at 'c'/'s'
+ // 'L' : Handle as 'long double'. It must be applied at 'e'/'E'/'f'/'g'/'G'
+ if (*format == 'h' || *format == 'l' || *format == 'L')
+ {
+ output_length = *format;
+ format++;
+ }
+
+ // Default base
+ base = 10;
+
+ switch (*format)
+ {
+ // Character
+ case 'c':
+ if (!(flags & FLAG_MINUS))
+ while (--field_width > 0)
+ *str_buf++ = ' ';
+
+ *str_buf++ = (kal_uint8) va_arg(argument_list, kal_int32);
+
+ while (--field_width > 0)
+ *str_buf++ = ' ';
+
+ continue;
+
+ // String
+ case 's':
+ s_va_arg = va_arg(argument_list, kal_int8 *);
+
+ if (!s_va_arg) s_va_arg = (kal_int8*)"<NULL>";
+
+ str_len = strn_len(s_va_arg, precision);
+
+ if (!(flags & FLAG_MINUS))
+ while (str_len < field_width--)
+ *str_buf++ = ' ';
+
+ for (nLoop = 0; nLoop < str_len; ++nLoop)
+ *str_buf++ = *s_va_arg++;
+
+ while (str_len < field_width--)
+ *str_buf++ = ' ';
+
+ continue;
+
+ // Point Address
+ case 'p':
+ if (field_width == -1)
+ {
+ field_width = 2 * sizeof(void *);
+ flags |= FLAG_ZERO;
+ }
+
+ str_buf = rmmi_number(str_buf, (kal_uint32) va_arg(argument_list, void *), 16, field_width, precision, flags);
+ continue;
+
+ // Do not print anything.
+ // Instead, the argument should have the pointer which points to a signed int.
+ // The number of written characters until now is saved in this pointer.
+ case 'n':
+ if (output_length == 'l')
+ {
+ long *ip = va_arg(argument_list, long *);
+ *ip = (str_buf - buffer);
+ }
+ else
+ {
+ kal_int32 *ip = va_arg(argument_list, kal_int32 *);
+ *ip = (str_buf - buffer);
+ }
+ continue;
+
+ // Octal digit
+ case 'o':
+ base = 8;
+ break;
+
+ // Hexadecimal digit - Large
+ case 'X':
+ flags |= LARGE;
+
+ // Hexadecimal digit - Lower
+ case 'x':
+ base = 16;
+ break;
+
+ // Decimal digit
+ case 'd':
+ case 'i':
+ flags |= UN_SIGN;
+
+ // Unsigned Decimal digit
+ case 'u':
+ break;
+
+ default:
+ if (*format != '%')
+ *str_buf++ = '%';
+
+ if (*format)
+ *str_buf++ = *format;
+ else
+ --format;
+ continue;
+ }
+
+ if (output_length == 'L')
+ {
+ number = va_arg(argument_list, long );
+ }
+ else if (output_length == 'l')
+ {
+ number = va_arg(argument_list, kal_uint32);
+
+ if (flags & UN_SIGN)
+ number = (signed long) number;
+ }
+ else if (output_length == 'Z' || output_length == 'z')
+ {
+ number = va_arg(argument_list, size_t);
+ }
+ else if (output_length == 't')
+ {
+ number = va_arg(argument_list, kal_int32);
+ }
+ else if (output_length == 'h')
+ {
+ number = (kal_uint16) va_arg(argument_list, kal_int32);
+
+ if (flags & UN_SIGN)
+ number = (kal_int16) number;
+ }
+ else
+ {
+ number = va_arg(argument_list, kal_uint32);
+
+ if (flags & UN_SIGN)
+ number = (kal_int32) number;
+ }
+
+ str_buf = rmmi_number(str_buf, number, base, field_width, precision, flags);
+ }
+
+ return 0;
+ }
+
+ // New sprintf() which is made due to having limitation about argument in MOLY.
+ // It is same with sprintf() in C
+ // It is not support 'E'/'e'/'G'/'g'/'f'
+ kal_int32 rmmi_sprintf(kal_int8 *buf, const kal_int8 *format, ...)
+ {
+ va_list arg;
+ kal_int32 done = 0; // Result : Fail - Minus / Pass - The number of string without NULL
+
+ va_start (arg, format);
+
+ // We need to have rmmi_vaprintf() API to handle variable argument.
+ done = rmmi_vsprintf(buf, format, arg);
+
+ va_end (arg);
+
+ return done;
+ }
+
+ /* MOLY00165083 */
+ void rmmi_start_specific_chennal_search( kal_uint8 src_id, kal_uint8 custom_band_value )
+ {
+ custom_factory_band_context_struct* rac_factory_ptr_g = cust_fac_ptr_global;
+
+ rmmi_band_T band;
+ kal_uint8 gsm_band = 0, supported_gsm_band = 0;
+ kal_uint32 umts_band = 0, supported_umts_fdd_band = 0;
+ kal_uint32 lte_band[MAX_SUPPORTED_LTE_BAND]={0}, supported_lte_band[MAX_SUPPORTED_LTE_BAND]={0};
+ kal_uint32 nr_band[MAX_SUPPORTED_NR_BAND]={0}, supported_nr_band[MAX_SUPPORTED_NR_BAND]={0};
+
+ rmmi_band_init( &band );
+ #ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+ gas_custom_set_specific_channel_srch( KAL_TRUE );
+ uas_custom_set_specific_channel_srch( KAL_TRUE );
+ eas_custom_set_specific_channel_srch( KAL_TRUE );
+
+ RMMI_PTR->cust_cmd_src_id = src_id;
+ /* Start MUSE - ALPS01198329 */
+ /* The device will make SIM2 flight mode in the MUSE factory test state. */
+ if( L4C_COMM_PTR->cust_rft_mode == CUST_RFT_MODE_OFF )
+ {
+ L4C_COMM_PTR->init_campreq_mode = custom_band_value;
+ if (L4C_ROOT_PTR->efun_state == SIM1_RADIO_ON)
+ {
+ L4C_COMM_PTR->cust_rft_mode = CUST_RFT_MODE_ON;
+ }
+ else
+ {
+ if ( rmmi_initial_campreq_with_set_rft_mode( ) == KAL_TRUE)
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq - Initial RFT mode");
+ return;
+ }
+ else
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq - exception - unsupported efun state :%d",
+ L4C_ROOT_PTR->efun_state);
+ return;
+ }
+ }
+ }
+ else if (L4C_COMM_PTR->cust_rft_mode == CUST_RFT_MODE_ENTERING )
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq - exception - RFT mode : %d",
+ L4C_COMM_PTR->cust_rft_mode );
+ return;
+ }
+ #endif /* __AS_SPECIFIC_CHANNEL_SRCH__ */
+
+ rmmi_band_init(&band);
+
+ if( l4c_nw_get_band_req( src_id,
+ &gsm_band,
+ &umts_band,
+ lte_band,
+ nr_band,
+ &supported_gsm_band,
+ &supported_umts_fdd_band,
+ supported_lte_band,
+ supported_nr_band) == KAL_TRUE )
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq -Supported Band GSM[%x], UMTS[%x], LTE[%x][%x]",
+ supported_gsm_band, supported_umts_fdd_band, supported_lte_band[0], supported_lte_band[1]);
+
+ rmmi_construct_band_value_and_string ( NULL,
+ custom_band_value,
+ &band,
+ supported_gsm_band,
+ supported_umts_fdd_band,
+ &supported_lte_band[0],
+ &supported_nr_band[0]);
+ }
+ else
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq -l4c_nw_get_band_req- fail!");
+ return;
+ }
+
+ if( band.band_present_bitmap )
+ {
+ rac_factory_ptr_g->factory_dynamic_band = custom_band_value;
+ set_factory_rat_mode(band.band_present_bitmap);
+
+ if(l4c_nw_set_preferred_band_req( src_id,
+ band.gsm_band,
+ band.umts_band,
+ band.lte_band,
+ band.nr_band,
+ KAL_TRUE ) == KAL_FALSE )
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq - l4c_nw_set_preferred_band_req- fail!");
+ return;
+ }
+ }
+ else
+ {
+ kal_prompt_trace(MOD_L4C, "Campreq - l4c_nw_set_preferred_band_req- fail!");
+ return;
+ }
+
+
+ return;
+ }
+ /* MOLY00165083 */
+
+ //-- rmmi_sprintf ----------------------------------------
+
+
+/****************************************/
+/* End of Custom AT command APIs */
+/****************************************/
+
+
+/****************************************/
+/* Start of Custom AT command */
+/****************************************/
+
+#if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ lgoem_at_vslt_sim_type tc01_vt_sml_Check(kal_uint8 cat, kal_uint8 *code, kal_uint8 len)
+ {
+ lgoem_at_vslt_sim_type result = LGOEM_VSLT_SIM_LOCK;
+ kal_uint8 idx = 0;
+
+ kal_uint8 sltype = 0;
+ FactoryNetworkCode ntcode[LGE_FAC_MAX_NETWORK_CODE_LIST_NUM]; // = {0x0F};
+ kal_uint16 ntcode_num = 0;
+ kal_uint8 test_NT_code1[6] = {0x04,0x05,0x00,0x00,0x00,0x0f};
+ kal_uint8 test_NT_code2[6] = {0x00,0x00,0x01,0x00,0x01,0x0f};
+
+#ifdef __CHILE_COUNTRY_SIM_LOCK__
+ kal_bool nsLockFlag = KAL_FALSE;
+#endif
+
+ kal_mem_set(ntcode, 0x0F, sizeof(ntcode));
+
+ //Check wheather test sim or not 001/01, 450 00
+ if ((0 == kal_mem_cmp(code, test_NT_code1, 6)) || (0 == kal_mem_cmp(code, test_NT_code2, 6)))
+ return LGOEM_VSLT_SIM_UNLOCK; //match
+
+ if(KAL_TRUE == LGE_FacReadSimLockType(&sltype))
+ {
+ if((cat & sltype) != cat) //disable
+ return LGOEM_VSLT_NONE;
+ }
+ else
+ return LGOEM_VSLT_SIM_ERROR;
+
+ if (KAL_FALSE == LGE_FacReadNetworkCodeListNum(&ntcode_num))
+ return LGOEM_VSLT_SIM_ERROR;
+
+ if (KAL_FALSE == LGE_FacReadNetworkCode(ntcode, ntcode_num))
+ return LGOEM_VSLT_SIM_ERROR;
+
+#ifdef __CHILE_COUNTRY_SIM_LOCK__
+ switch(cat)
+ {
+ //MCC+MNC
+ case LGE_FAC_SLTYPE_MASK_NETWORK:
+ if(TC01_SML_SIZE_OF_CAT_N == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if ((ntcode[idx].Mnc[0] == 0x0f) && (ntcode[idx].Mnc[1] == 0x0f) && (ntcode[idx].Mnc[2] == 0x0f))
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ }
+ break;
+ //MCC+MNC+SUBSET
+ case LGE_FAC_SLTYPE_MASK_NETWORK_SUBSET:
+ if(TC01_SML_SIZE_OF_CAT_NS == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ nsLockFlag = KAL_FALSE;
+ if ((ntcode[idx].Mnc[0] == 0x0f) && (ntcode[idx].Mnc[1] == 0x0f) && (ntcode[idx].Mnc[2] == 0x0f))
+ {
+ if(kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ {
+ nsLockFlag = KAL_TRUE;
+ }
+ }
+ else
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0))
+ {
+ nsLockFlag = KAL_TRUE;
+ }
+ }
+ if(nsLockFlag == KAL_TRUE)
+ {
+ if((ntcode[idx].Subset[0] == 0x0F) && (ntcode[idx].Subset[1] != 0x0F)) //just compare the digit not 0x0F
+ {
+ if(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN+1] == ntcode[idx].Subset[1])
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else if((ntcode[idx].Subset[0] != 0x0F) &&(ntcode[idx].Subset[1]== 0x0F))
+ {
+ if(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN] == ntcode[idx].Subset[0])
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else if((ntcode[idx].Subset[0] == 0x0F) &&(ntcode[idx].Subset[1]== 0x0F)) //both = 0x0F, then pass without comparison
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ else
+ {
+ if(kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),\
+ (ntcode[idx].Subset),LGE_FAC_NC_SUBSET_LEN)==0)
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+ //MCC+MNC+GID1
+ case LGE_FAC_SLTYPE_MASK_SERVICE_PROVIDER:
+ if(TC01_SML_SIZE_OF_CAT_SP == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if ((ntcode[idx].Mnc[0] == 0x0f) && (ntcode[idx].Mnc[1] == 0x0f) && (ntcode[idx].Mnc[2] == 0x0f))
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),(ntcode[idx].Gid1),LGE_FAC_NC_GID1_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),(ntcode[idx].Gid1),LGE_FAC_NC_GID1_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ }
+ break;
+ //MCC+MNC+GID1+GID2
+ case LGE_FAC_SLTYPE_MASK_COOPERATE:
+ if(TC01_SML_SIZE_OF_CAT_C == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if ((ntcode[idx].Mnc[0] == 0x0f) && (ntcode[idx].Mnc[1] == 0x0f) && (ntcode[idx].Mnc[2] == 0x0f))
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),(ntcode[idx].Gid1),LGE_FAC_NC_GID1_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN+LGE_FAC_NC_GID1_LEN]),(ntcode[idx].Gid2),LGE_FAC_NC_GID2_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),(ntcode[idx].Gid1),LGE_FAC_NC_GID1_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN+LGE_FAC_NC_GID1_LEN]),(ntcode[idx].Gid2),LGE_FAC_NC_GID2_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+#else //__CHILE_COUNTRY_SIM_LOCK__
+ switch(cat)
+ {
+ case LGE_FAC_SLTYPE_MASK_NETWORK:
+ if(TC01_SML_SIZE_OF_CAT_N == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ break;
+
+ case LGE_FAC_SLTYPE_MASK_NETWORK_SUBSET:
+ if(TC01_SML_SIZE_OF_CAT_NS == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0))
+ {
+ if((ntcode[idx].Subset[0] == 0x0F) && (ntcode[idx].Subset[1] != 0x0F)) //just compare the digit not 0x0F
+ {
+ if(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN+1] == ntcode[idx].Subset[1])
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else if((ntcode[idx].Subset[0] != 0x0F) &&(ntcode[idx].Subset[1]== 0x0F))
+ {
+ if(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN] == ntcode[idx].Subset[0])
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ else if((ntcode[idx].Subset[0] == 0x0F) &&(ntcode[idx].Subset[1]== 0x0F)) //both = 0x0F, then pass without comparison
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ else
+ {
+ if(kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),\
+ (ntcode[idx].Subset),LGE_FAC_NC_SUBSET_LEN)==0)
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case LGE_FAC_SLTYPE_MASK_SERVICE_PROVIDER:
+ if(TC01_SML_SIZE_OF_CAT_SP == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),(ntcode[idx].Gid1),LGE_FAC_NC_GID1_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ break;
+
+ case LGE_FAC_SLTYPE_MASK_COOPERATE:
+ if(TC01_SML_SIZE_OF_CAT_C == len)
+ {
+ for(idx = 0; idx < ntcode_num; idx++)
+ {
+ if((kal_mem_cmp(code,(ntcode[idx].Mcc),LGE_FAC_NC_MCC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN]),(ntcode[idx].Mnc),LGE_FAC_NC_MNC_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN]),(ntcode[idx].Gid1),LGE_FAC_NC_GID1_LEN)==0)
+ && (kal_mem_cmp(&(code[LGE_FAC_NC_MCC_LEN+LGE_FAC_NC_MNC_LEN+LGE_FAC_NC_GID1_LEN]),(ntcode[idx].Gid2),LGE_FAC_NC_GID2_LEN)==0))
+ {
+ result = LGOEM_VSLT_SIM_UNLOCK; //match
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+#endif //__CHILE_COUNTRY_SIM_LOCK__
+ return result;
+ }
+
+
+#endif /* #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON) */
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_sltype_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ void rmmi_sltype_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+#if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 simLockType = 0;
+ kal_uint8 fusgFlag = 0;
+ kal_bool isUnlockCodeValid = KAL_FALSE;
+ kal_bool isNetworkCodeValid = KAL_FALSE;
+ kal_uint8 parseError = 0;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_issim_hdlr(), source_string_ptr is NULL!!!");
+ }
+ else
+ {
+ switch(source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: /* AT%SLTYPE */
+ case RMMI_READ_MODE: /* AT%SLTYPE? */
+ case RMMI_TEST_MODE: /* AT%SLTYPE=? */
+ if( LGE_FacReadSimLockType(&simLockType) == KAL_TRUE )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&simLockType;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%d", RMMI_PTR->arg_list, 1);
+ ret_val = KAL_TRUE;
+ }
+ else
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SLTYPE READ ERROR", RMMI_PTR->arg_list, 0);
+ break;
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%SLTYPE=XXX... */
+ if( LGE_FacReadFusgFlag(&fusgFlag) == KAL_TRUE )
+ {
+ if( (fusgFlag == 0) && (LGE_FacCheckUnlockCodeValidness(&isUnlockCodeValid) == KAL_TRUE) )
+ {
+ if( isUnlockCodeValid == KAL_TRUE )
+ {
+ simLockType = (kal_uint8)rmmi_get_int_ext(&parseError, source_string_ptr, (kal_uint8)RMMI_COMMA);
+ if((parseError == RMMI_PARSE_OK) &&
+ (simLockType <= LGE_FAC_SLTYPE_VALID_MASK) &&
+ (LGE_FacCheckNetworkCodeValidness(simLockType, &isNetworkCodeValid) == KAL_TRUE) )
+ {
+ if((isNetworkCodeValid == KAL_TRUE) && (LGE_FacWriteSimLockType(simLockType, KAL_TRUE) == KAL_TRUE))
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SLTYPE OK", RMMI_PTR->arg_list, 0);
+ ret_val = KAL_TRUE;
+ }
+ }
+ }
+ }
+ }
+ if(ret_val == KAL_FALSE)
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SLTYPE ERROR", RMMI_PTR->arg_list, 0);
+ break;
+ default:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "CMD MODE FAIL", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ }
+ if(ret_val == KAL_TRUE)
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ else
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+
+#else // #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_ERROR);
+#endif // #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ return;
+ }
+
+
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_vslt3_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ void rmmi_vslt3_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+#if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ kal_bool result = KAL_TRUE;
+ kal_uint8 parseError = 0;
+ kal_uint8 readValue = 0;
+ kal_uint8 loop = 0;
+ kal_uint8 loop2 = 0;
+ kal_uint8 simLockType = 0;
+ kal_uint8 readCount = 0;
+ unsigned char rsp_str[VSLT_MAX_LEN_3] = {0x00,};
+ FactoryNetworkCode * pNetworkCode = NULL;
+ BOOL bLockCheck = FALSE;
+ kal_uint8 cat = 0;
+ kal_uint8 len = 0;
+ kal_uint8 loop_sim_num = 0;
+ rmmi_string_struct * vslt_string_ptr = NULL;
+ rmmi_string_struct tmp_vslt_string_ptr[1]; // = {NULL, };
+ kal_uint8 tempstr[VSLT_MAX_LEN_3] = {0,};
+ kal_uint8 temp = 0;
+ kal_uint8 lockCount = 0;
+
+ unsigned char code[VSLT_SIM_3][LGE_FAC_NETWORK_CODE_LEN]; // = {0x0F,};
+ lgoem_at_vslt_sim_type eReturnType[VSLT_MAX_NUM_3][VSLT_SIM_3]; // = {0,};
+ lgoem_at_vslt_sim_type temp_result[VSLT_SIM_3] = {0,};
+ unsigned char pNtCode[VSLT_MAX_NUM_3*VSLT_SIM_3][LGE_FAC_NETWORK_CODE_LEN+4]; // = {0x00,};
+ kal_uint8 index = 0;
+ unsigned char tmpStr_tmp[LGE_FAC_NETWORK_CODE_LEN+4] = {0x00,};
+
+ rmmi_custom_dbg_trace("rmmi_vslt3_hdlr()");
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ kal_mem_set(tmp_vslt_string_ptr, 0, sizeof(tmp_vslt_string_ptr));
+ kal_mem_set(code, 0, sizeof(code));
+ kal_mem_set(eReturnType, 0, sizeof(eReturnType));
+ kal_mem_set(pNtCode, 0, sizeof(pNtCode));
+
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch(source_string_ptr->cmd_mode)
+ {
+ /* AT%VSLT3 */
+ case RMMI_ACTIVE_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%VSLT3? */
+ case RMMI_READ_MODE:
+ /* AT%VSLT3=? */
+ case RMMI_TEST_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "VERIFY NTCODE", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%VSLT3=XXX... */
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ //kal_uint8 btAddr[LGE_FAC_BT_ADDR_LEN] = {0,};
+ kal_uint8 imei[LGE_FAC_IMEI_LEN] = {0,};
+ kal_uint16 networkCodeListNumber = 0;
+ kal_uint8 fusgFlag = 0;
+
+ //Check BT address / IMEI / NTCODE list number / Fusg Flag
+ if( !LGE_FacReadBtAddr (btAddr )||
+ !LGE_FacReadImei (2, imei )||
+ !LGE_FacReadNetworkCodeListNum (&networkCodeListNumber )||
+ !LGE_FacReadFusgFlag (&fusgFlag ) )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR, PREVIOUS CONDITION CHECK", RMMI_PTR->arg_list, 0);
+ break;
+ }
+
+ result = LGE_FacReadSimLockType( &simLockType );
+
+ if( result == KAL_TRUE )
+ {
+ if( ( simLockType & LGE_FAC_SLTYPE_VALID_MASK ) != 0 )
+ {
+ /* read NTCODE list number */
+ readValue = (kal_uint8)rmmi_get_int_ext(&parseError, source_string_ptr, (kal_uint8)RMMI_COMMA);
+ if( ( parseError == RMMI_PARSE_OK ) && ( readValue <= VSLT_MAX_NUM_3 ) )
+ {
+ networkCodeListNumber = readValue;
+ if( networkCodeListNumber == 0 )
+ {
+ /* Network Code List Number value is Zero*/
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR ( NETWORK CODE LIST NUMBER FAIL )", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ else
+ {
+ pNetworkCode = (FactoryNetworkCode *)get_ctrl_buffer(sizeof(FactoryNetworkCode)*networkCodeListNumber);
+ vslt_string_ptr = &tmp_vslt_string_ptr[0];
+ vslt_string_ptr->string_ptr = &tempstr[0];
+
+ if( pNetworkCode != NULL )
+ {
+ for( loop=0 ; loop<networkCodeListNumber ; loop++ )
+ {
+ if(loop > 0)
+ source_string_ptr->index = source_string_ptr->index+2; //Move to next pair
+
+ for( loop_sim_num=0 ; loop_sim_num<VSLT_SIM_3 ; loop_sim_num++ )
+ {
+ if(loop_sim_num == 0)
+ source_string_ptr->index++;
+
+ kal_mem_set(vslt_string_ptr->string_ptr, 0x0F, sizeof(vslt_string_ptr->string_ptr));
+ rmmi_get_str_ext(&parseError, source_string_ptr, (kal_uint8)RMMI_FORWARD_SLASH, LGE_FAC_NETWORK_CODE_LEN+4, vslt_string_ptr->string_ptr);
+ vslt_string_ptr->index = 0;
+
+ sprintf((char*)pNtCode[index], (char*)vslt_string_ptr->string_ptr); // to print on hyper terminal
+ ++index;
+
+ temp = loop + 1;
+
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_MCC_LEN, (pNetworkCode+loop)->Mcc, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_MCC_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( MCC-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_MNC_LEN, (pNetworkCode+loop)->Mnc, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_MNC_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( MNC-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_GID1_LEN, (pNetworkCode+loop)->Gid1, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_GID1_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( GID1-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_GID2_LEN, (pNetworkCode+loop)->Gid2, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_GID2_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( GID2-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_SUBSET_LEN, (pNetworkCode+loop)->Subset, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_SUBSET_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( SUBSET-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+
+ //init return result value
+ eReturnType[loop][loop_sim_num] = LGOEM_VSLT_NONE;
+ temp_result[loop_sim_num] = LGOEM_VSLT_NONE;
+ bLockCheck = FALSE;
+
+ kal_mem_set(code, 0x00, sizeof(code));
+ for (loop2=0; loop2 <3; loop2++)
+ {
+ code[loop_sim_num][loop2] = (pNetworkCode+loop)->Mcc[loop2];
+ code[loop_sim_num][loop2+LGE_FAC_NC_MCC_LEN] = (pNetworkCode+loop)->Mnc[loop2];
+ }
+
+ for(cat = LGE_FAC_SLTYPE_MASK_NETWORK; cat <= LGE_FAC_SLTYPE_MASK_COOPERATE; cat = cat<<1)
+ {
+ switch(cat)
+ {
+ //MCC+MNC
+ case LGE_FAC_SLTYPE_MASK_NETWORK:
+ len = TC01_SML_SIZE_OF_CAT_N;
+ break;
+ //MCC+MNC+SUBSET
+ case LGE_FAC_SLTYPE_MASK_NETWORK_SUBSET:
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_SUBSET_LEN ; loop2++)
+ code[loop_sim_num][loop2+6] = (pNetworkCode+loop)->Subset[loop2];
+ len = TC01_SML_SIZE_OF_CAT_NS;
+ break;
+ //MCC+MNC+GID1
+ case LGE_FAC_SLTYPE_MASK_SERVICE_PROVIDER:
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_GID1_LEN ; loop2++)
+ code[loop_sim_num][loop2+6] = (pNetworkCode+loop)->Gid1[loop2];
+ len = TC01_SML_SIZE_OF_CAT_SP;
+ break;
+ //MCC+MNC+GID1+GID2
+ case LGE_FAC_SLTYPE_MASK_COOPERATE:
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_GID2_LEN ; loop2++)
+ {
+ code[loop_sim_num][loop2+6] = (pNetworkCode+loop)->Gid1[loop2];
+ code[loop_sim_num][loop2+14] = (pNetworkCode+loop)->Gid2[loop2];
+ }
+ len = TC01_SML_SIZE_OF_CAT_C;
+ break;
+ default:
+ break;
+ }
+
+ //Main Check routin : comparison with VSLT input and NT code database
+ temp_result[loop_sim_num] = eReturnType[loop][loop_sim_num];
+ eReturnType[loop][loop_sim_num] = tc01_vt_sml_Check(cat, *(code+loop_sim_num), len);
+
+ if ( eReturnType[loop][loop_sim_num] == LGOEM_VSLT_NONE )
+ {
+ eReturnType[loop][loop_sim_num] = temp_result[loop_sim_num];
+ }
+ else if (eReturnType[loop][loop_sim_num] == LGOEM_VSLT_SIM_ERROR)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "Security Lock data read Error", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR (MEM ALLOC FAIL)", RMMI_PTR->arg_list, 0);
+ }
+
+ for(loop = 0; loop<networkCodeListNumber; loop++)
+ {
+ if((eReturnType[loop][0] == LGOEM_VSLT_SIM_LOCK) &&
+ (eReturnType[loop][1] == LGOEM_VSLT_SIM_LOCK) &&
+ (eReturnType[loop][2] == LGOEM_VSLT_SIM_LOCK) )
+ {
+ bLockCheck = TRUE;
+ lockCount++;
+ }
+ }
+
+ if (networkCodeListNumber > 0)
+ {
+ //All comparison result were unlock case
+ if(!bLockCheck)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM UNLOCK", RMMI_PTR->arg_list, 0);
+ }
+ //If Simlock VSLT code was detected, make response list string via AT command.
+ else
+ {
+ kal_mem_set (rsp_str, 0x00, sizeof(rsp_str));
+ sprintf((char*)rsp_str, "%c\"SIM LOCK\"", 0x02 );
+ rmmi_write_to_uart((kal_uint8*) rsp_str, strlen((char*)rsp_str), KAL_TRUE);
+
+ for(loop = 0; loop<networkCodeListNumber; loop++)
+ {
+ if((eReturnType[loop][0] == LGOEM_VSLT_SIM_LOCK) &&
+ (eReturnType[loop][1] == LGOEM_VSLT_SIM_LOCK) &&
+ (eReturnType[loop][2] == LGOEM_VSLT_SIM_LOCK) )
+ {
+ lockCount--;
+ kal_mem_set (rsp_str, 0x00, sizeof(rsp_str));
+ sprintf((char*)rsp_str, "\"");
+
+ for( loop_sim_num=0 ; loop_sim_num<VSLT_SIM_3 ; loop_sim_num++ )
+ {
+ kal_mem_set(tmpStr_tmp, 0x00, sizeof(tmpStr_tmp));
+ rmmi_sprintf((kal_int8*)tmpStr_tmp, (kal_int8*)"%c%c%c,%c%c%c,%c%c%c%c%c%c%c%c,%c%c%c%c%c%c%c%c,%c%c",
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][0], pNtCode[loop*VSLT_SIM_3+loop_sim_num][1], pNtCode[loop*VSLT_SIM_3+loop_sim_num][2], //MCC
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][4], pNtCode[loop*VSLT_SIM_3+loop_sim_num][5], pNtCode[loop*VSLT_SIM_3+loop_sim_num][6], //MNC
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][8], pNtCode[loop*VSLT_SIM_3+loop_sim_num][9], pNtCode[loop*VSLT_SIM_3+loop_sim_num][10], pNtCode[loop*VSLT_SIM_3+loop_sim_num][11], //GID1
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][12], pNtCode[loop*VSLT_SIM_3+loop_sim_num][13], pNtCode[loop*VSLT_SIM_3+loop_sim_num][14], pNtCode[loop*VSLT_SIM_3+loop_sim_num][15],
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][17], pNtCode[loop*VSLT_SIM_3+loop_sim_num][18], pNtCode[loop*VSLT_SIM_3+loop_sim_num][19], pNtCode[loop*VSLT_SIM_3+loop_sim_num][20], //GID2
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][21], pNtCode[loop*VSLT_SIM_3+loop_sim_num][22], pNtCode[loop*VSLT_SIM_3+loop_sim_num][23], pNtCode[loop*VSLT_SIM_3+loop_sim_num][24],
+ pNtCode[loop*VSLT_SIM_3+loop_sim_num][26], pNtCode[loop*VSLT_SIM_3+loop_sim_num][27] );//Subset
+
+ strncat((char*)rsp_str, (char*)tmpStr_tmp, (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+
+ if(loop_sim_num < (VSLT_SIM_3-1))
+ {
+ strncat((char*)rsp_str, "/", (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+ }
+ }
+ if(lockCount == 0)
+ {
+ sprintf((char*)tmpStr_tmp, "\"%c", 0x03 );
+ strncat((char*)rsp_str, (char*)tmpStr_tmp, (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+ }
+ else
+ {
+ strncat((char*)rsp_str, "\"", (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+ }
+ rmmi_write_to_uart((kal_uint8*) rsp_str, strlen((char*)rsp_str), KAL_TRUE);
+ }
+ }
+ }
+ }
+
+ if( pNetworkCode != NULL )
+ {
+ free_ctrl_buffer(pNetworkCode);
+ pNetworkCode = NULL;
+ }
+ }
+ }
+ else if( ( parseError == RMMI_PARSE_OK ) && ( readValue > VSLT_MAX_NUM_3 ) )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "Virtual SIM lock count over fail", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( PARSE ERROR )", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM_LOCK ERROR", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM_LOCK TYPE READ ERROR", RMMI_PTR->arg_list, 0);
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+#endif // #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ return;
+ }
+
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_vslt2_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ void rmmi_vslt2_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+#if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ kal_bool result = KAL_TRUE;
+ kal_uint8 parseError = 0;
+ kal_uint8 readValue = 0;
+ kal_uint8 loop = 0;
+ kal_uint8 loop2 = 0;
+ kal_uint8 simLockType = 0;
+ kal_uint8 readCount = 0;
+ unsigned char rsp_str[VSLT_MAX_LEN_2] = {0x00,};
+ FactoryNetworkCode * pNetworkCode = NULL;
+ BOOL bLockCheck = FALSE;
+ kal_uint8 cat = 0;
+ kal_uint8 len = 0;
+ kal_uint8 loop_sim_num = 0;
+ rmmi_string_struct * vslt_string_ptr = NULL;
+ rmmi_string_struct tmp_vslt_string_ptr[1]; // = {NULL, };
+ kal_uint8 tempstr[VSLT_MAX_LEN_2] = {0,};
+ kal_uint8 temp = 0;
+ kal_uint8 lockCount = 0;
+
+ unsigned char code[VSLT_SIM_2][LGE_FAC_NETWORK_CODE_LEN]; // = {0x0F,};
+ lgoem_at_vslt_sim_type eReturnType[VSLT_MAX_NUM_2][VSLT_SIM_2]; // = {0,};
+ lgoem_at_vslt_sim_type temp_result[VSLT_SIM_2] = {0,};
+ unsigned char pNtCode[VSLT_MAX_NUM_2*VSLT_SIM_2][LGE_FAC_NETWORK_CODE_LEN+4]; // = {0x00,};
+ kal_uint8 index = 0;
+ unsigned char tmpStr_tmp[LGE_FAC_NETWORK_CODE_LEN+4] = {0x00,};
+
+ rmmi_custom_dbg_trace("rmmi_vslt2_hdlr()");
+
+ kal_mem_set(tmp_vslt_string_ptr, 0, sizeof(tmp_vslt_string_ptr));
+ kal_mem_set(eReturnType, 0, sizeof(eReturnType));
+ kal_mem_set(pNtCode, 0, sizeof(pNtCode));
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch(source_string_ptr->cmd_mode)
+ {
+ /* AT%VSLT2 */
+ case RMMI_ACTIVE_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%VSLT2? */
+ case RMMI_READ_MODE:
+ /* AT%VSLT2=? */
+ case RMMI_TEST_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "VERIFY NTCODE", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%VSLT2=XXX... */
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ //kal_uint8 btAddr[LGE_FAC_BT_ADDR_LEN] = {0,};
+ kal_uint8 imei[LGE_FAC_IMEI_LEN] = {0,};
+ kal_uint16 networkCodeListNumber = 0;
+ kal_uint8 fusgFlag = 0;
+
+ //Check BT address / IMEI / NTCODE list number / Fusg Flag
+ if( !LGE_FacReadBtAddr (btAddr )||
+ !LGE_FacReadImei (KAL_FALSE, imei )||
+ !LGE_FacReadNetworkCodeListNum (&networkCodeListNumber )||
+ !LGE_FacReadFusgFlag (&fusgFlag ) )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR, PREVIOUS CONDITION CHECK", RMMI_PTR->arg_list, 0);
+ break;
+ }
+
+ result = LGE_FacReadSimLockType( &simLockType );
+
+ if( result == KAL_TRUE )
+ {
+ if( ( simLockType & LGE_FAC_SLTYPE_VALID_MASK ) != 0 )
+ {
+ /* read NTCODE list number */
+ readValue = (kal_uint8)rmmi_get_int_ext(&parseError, source_string_ptr, (kal_uint8)RMMI_COMMA);
+ if( ( parseError == RMMI_PARSE_OK ) && ( readValue <= VSLT_MAX_NUM_2 ) )
+ {
+ networkCodeListNumber = readValue;
+ if( networkCodeListNumber == 0 )
+ {
+ /* Network Code List Number value is Zero*/
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR ( NETWORK CODE LIST NUMBER FAIL )", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ else
+ {
+ pNetworkCode = (FactoryNetworkCode *)get_ctrl_buffer(sizeof(FactoryNetworkCode)*networkCodeListNumber);
+ vslt_string_ptr = &tmp_vslt_string_ptr[0];
+ vslt_string_ptr->string_ptr = &tempstr[0];
+
+ if( pNetworkCode != NULL )
+ {
+ kal_mem_set (pNetworkCode, 0xff, sizeof(pNetworkCode)); // wjjeon test
+
+ for( loop=0 ; loop<networkCodeListNumber ; loop++ )
+ {
+ if(loop > 0)
+ source_string_ptr->index = source_string_ptr->index+2; //Move to next pair
+
+ for( loop_sim_num=0 ; loop_sim_num<VSLT_SIM_2 ; loop_sim_num++ )
+ {
+ if(loop_sim_num == 0)
+ source_string_ptr->index++;
+
+ kal_mem_set(vslt_string_ptr->string_ptr, 0x0F, sizeof(vslt_string_ptr->string_ptr));
+ rmmi_get_str_ext(&parseError, source_string_ptr, (kal_uint8)RMMI_FORWARD_SLASH, LGE_FAC_NETWORK_CODE_LEN+4, vslt_string_ptr->string_ptr);
+ vslt_string_ptr->index = 0;
+
+ sprintf((char*)pNtCode[index], (char*)vslt_string_ptr->string_ptr); // to print on hyper terminal
+ ++index;
+
+ temp = loop + 1;
+
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_MCC_LEN, (pNetworkCode+loop)->Mcc, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_MCC_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( MCC-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_MNC_LEN, (pNetworkCode+loop)->Mnc, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_MNC_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( MNC-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_GID1_LEN, (pNetworkCode+loop)->Gid1, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_GID1_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( GID1-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_GID2_LEN, (pNetworkCode+loop)->Gid2, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_GID2_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( GID2-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)vslt_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_SUBSET_LEN, (pNetworkCode+loop)->Subset, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_SUBSET_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( SUBSET-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+
+ //init return result value
+ eReturnType[loop][loop_sim_num] = LGOEM_VSLT_NONE;
+ temp_result[loop_sim_num] = LGOEM_VSLT_NONE;
+ bLockCheck = FALSE;
+
+ kal_mem_set(code, 0x00, sizeof(code));
+ for (loop2=0; loop2 <3; loop2++)
+ {
+ code[loop_sim_num][loop2] = (pNetworkCode+loop)->Mcc[loop2];
+ code[loop_sim_num][loop2+LGE_FAC_NC_MCC_LEN] = (pNetworkCode+loop)->Mnc[loop2];
+ }
+
+ for(cat = LGE_FAC_SLTYPE_MASK_NETWORK; cat <= LGE_FAC_SLTYPE_MASK_COOPERATE; cat = cat<<1)
+ {
+ switch(cat)
+ {
+ //MCC+MNC
+ case LGE_FAC_SLTYPE_MASK_NETWORK:
+ len = TC01_SML_SIZE_OF_CAT_N;
+ break;
+ //MCC+MNC+SUBSET
+ case LGE_FAC_SLTYPE_MASK_NETWORK_SUBSET:
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_SUBSET_LEN ; loop2++)
+ code[loop_sim_num][loop2+6] = (pNetworkCode+loop)->Subset[loop2];
+ len = TC01_SML_SIZE_OF_CAT_NS;
+ break;
+ //MCC+MNC+GID1
+ case LGE_FAC_SLTYPE_MASK_SERVICE_PROVIDER:
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_GID1_LEN ; loop2++)
+ code[loop_sim_num][loop2+6] = (pNetworkCode+loop)->Gid1[loop2];
+ len = TC01_SML_SIZE_OF_CAT_SP;
+ break;
+ //MCC+MNC+GID1+GID2
+ case LGE_FAC_SLTYPE_MASK_COOPERATE:
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_GID2_LEN ; loop2++)
+ {
+ code[loop_sim_num][loop2+6] = (pNetworkCode+loop)->Gid1[loop2];
+ code[loop_sim_num][loop2+14] = (pNetworkCode+loop)->Gid2[loop2];
+ }
+ len = TC01_SML_SIZE_OF_CAT_C;
+ break;
+ default:
+ break;
+ }
+
+ //Main Check routin : comparison with VSLT input and NT code database
+ temp_result[loop_sim_num] = eReturnType[loop][loop_sim_num];
+ eReturnType[loop][loop_sim_num] = tc01_vt_sml_Check(cat, *(code+loop_sim_num), len);
+
+ if ( eReturnType[loop][loop_sim_num] == LGOEM_VSLT_NONE )
+ {
+ eReturnType[loop][loop_sim_num] = temp_result[loop_sim_num];
+ }
+ else if (eReturnType[loop][loop_sim_num] == LGOEM_VSLT_SIM_ERROR)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "Security Lock data read Error", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR (MEM ALLOC FAIL)", RMMI_PTR->arg_list, 0);
+ }
+
+ for(loop = 0; loop<networkCodeListNumber; loop++)
+ {
+ #ifndef __AUSTRALIA_OPTUS_SIM_LOCK__
+ if((eReturnType[loop][0] == LGOEM_VSLT_SIM_LOCK) &&
+ (eReturnType[loop][1] == LGOEM_VSLT_SIM_LOCK))
+ #else
+ if(eReturnType[loop][0] == LGOEM_VSLT_SIM_LOCK)
+ #endif
+ {
+ bLockCheck = TRUE;
+ lockCount++;
+ }
+ }
+
+ if (networkCodeListNumber > 0)
+ {
+ //All comparison result were unlock case
+ if(!bLockCheck)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM UNLOCK", RMMI_PTR->arg_list, 0);
+ }
+ //If Simlock VSLT code was detected, make response list string via AT command.
+ else
+ {
+ kal_mem_set (rsp_str, 0x00, sizeof(rsp_str));
+ sprintf((char*)rsp_str, "%c\"SIM LOCK\"", 0x02 );
+ rmmi_write_to_uart((kal_uint8*) rsp_str, strlen((char*)rsp_str), KAL_TRUE);
+
+ for(loop = 0; loop<networkCodeListNumber; loop++)
+ {
+ #ifndef __AUSTRALIA_OPTUS_SIM_LOCK__
+ if((eReturnType[loop][0] == LGOEM_VSLT_SIM_LOCK) &&
+ (eReturnType[loop][1] == LGOEM_VSLT_SIM_LOCK))
+ #else
+ if(eReturnType[loop][0] == LGOEM_VSLT_SIM_LOCK)
+ #endif
+ {
+ lockCount--;
+ kal_mem_set (rsp_str, 0x00, sizeof(rsp_str));
+ sprintf((char*)rsp_str, "\"");
+
+ for( loop_sim_num=0 ; loop_sim_num<VSLT_SIM_2 ; loop_sim_num++ )
+ {
+ kal_mem_set(tmpStr_tmp, 0x00, sizeof(tmpStr_tmp));
+ rmmi_sprintf((kal_int8*)tmpStr_tmp, (kal_int8*)"%c%c%c,%c%c%c,%c%c%c%c%c%c%c%c,%c%c%c%c%c%c%c%c,%c%c",
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][0], pNtCode[loop*VSLT_SIM_2+loop_sim_num][1], pNtCode[loop*VSLT_SIM_2+loop_sim_num][2], //MCC
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][4], pNtCode[loop*VSLT_SIM_2+loop_sim_num][5], pNtCode[loop*VSLT_SIM_2+loop_sim_num][6], //MNC
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][8], pNtCode[loop*VSLT_SIM_2+loop_sim_num][9], pNtCode[loop*VSLT_SIM_2+loop_sim_num][10], pNtCode[loop*VSLT_SIM_2+loop_sim_num][11], //GID1
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][12], pNtCode[loop*VSLT_SIM_2+loop_sim_num][13], pNtCode[loop*VSLT_SIM_2+loop_sim_num][14], pNtCode[loop*VSLT_SIM_2+loop_sim_num][15],
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][17], pNtCode[loop*VSLT_SIM_2+loop_sim_num][18], pNtCode[loop*VSLT_SIM_2+loop_sim_num][19], pNtCode[loop*VSLT_SIM_2+loop_sim_num][20], //GID2
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][21], pNtCode[loop*VSLT_SIM_2+loop_sim_num][22], pNtCode[loop*VSLT_SIM_2+loop_sim_num][23], pNtCode[loop*VSLT_SIM_2+loop_sim_num][24],
+ pNtCode[loop*VSLT_SIM_2+loop_sim_num][26], pNtCode[loop*VSLT_SIM_2+loop_sim_num][27] );//Subset
+
+ strncat((char*)rsp_str, (char*)tmpStr_tmp, (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+
+ if(loop_sim_num < (VSLT_SIM_2-1))
+ {
+ strncat((char*)rsp_str, "/", (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+ }
+ }
+ if(lockCount == 0)
+ {
+ sprintf((char*)tmpStr_tmp, "\"%c", 0x03 );
+ strncat((char*)rsp_str, (char*)tmpStr_tmp, (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+ }
+ else
+ {
+ strncat((char*)rsp_str, "\"", (sizeof(rsp_str) - strlen((char*)rsp_str) -1));
+ }
+ rmmi_write_to_uart((kal_uint8*) rsp_str, strlen((char*)rsp_str), KAL_TRUE);
+ }
+ }
+ }
+ }
+
+ if( pNetworkCode != NULL )
+ {
+ free_ctrl_buffer(pNetworkCode);
+ pNetworkCode = NULL;
+ }
+ }
+ }
+ else if( ( parseError == RMMI_PARSE_OK ) && ( readValue > VSLT_MAX_NUM_2 ) )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "Virtual SIM lock count over fail", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( PARSE ERROR )", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM_LOCK ERROR", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM_LOCK TYPE READ ERROR", RMMI_PTR->arg_list, 0);
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+#endif // #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ return;
+ }
+
+
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_vslt_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ void rmmi_vslt_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+#if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ kal_bool result = KAL_TRUE;
+ kal_uint8 retStr[VSLT_MAX_LEN_1] = {0};
+ kal_uint8 parseError = 0;
+ kal_uint8 readValue = 0;
+ kal_uint8 loop = 0;
+ kal_uint8 loop2 = 0;
+ kal_uint8 simLockType = 0;
+ kal_uint8 readCount = 0;
+ unsigned char tmpStr[VSLT_MAX_LEN_1] = {0x00,};
+ unsigned char rsp_str[VSLT_MAX_LEN_1] = {0x00,};
+ FactoryNetworkCode * pNetworkCode = NULL;
+ BOOL bLockCheck = FALSE;
+ kal_uint8 cat = 0;
+ kal_uint8 len = 0;
+ kal_uint8 code[LGE_FAC_NETWORK_CODE_LEN] = {0x0F};
+ kal_uint8 temp = 0;
+ kal_uint8 lockCount = 0;
+
+ lgoem_at_vslt_sim_type eReturnType[VSLT_MAX_NUM_1];
+ lgoem_at_vslt_sim_type temp_result;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ rmmi_custom_dbg_trace("rmmi_vslt_hdlr()");
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch(source_string_ptr->cmd_mode)
+ {
+ /* AT%VSLT */
+ case RMMI_ACTIVE_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%VSLT? */
+ case RMMI_READ_MODE:
+ /* AT%VSLT=? */
+ case RMMI_TEST_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "VERIFY NTCODE", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%VSLT=XXX... */
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ //kal_uint8 btAddr[LGE_FAC_BT_ADDR_LEN] = {0,};
+ kal_uint8 imei[LGE_FAC_IMEI_LEN] = {0,};
+ kal_uint16 networkCodeListNumber = 0;
+ kal_uint8 fusgFlag = 0;
+
+ //Check BT address / IMEI / NTCODE list number / Fusg Flag
+ if( !LGE_FacReadBtAddr (btAddr )||
+ !LGE_FacReadImei (KAL_TRUE, imei )||
+ !LGE_FacReadNetworkCodeListNum (&networkCodeListNumber )||
+ !LGE_FacReadFusgFlag (&fusgFlag ) )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR, PREVIOUS CONDITION CHECK", RMMI_PTR->arg_list, 0);
+ break;
+ }
+
+ result = LGE_FacReadSimLockType(&simLockType);
+
+ if( result == KAL_TRUE )
+ {
+ if( ( simLockType & LGE_FAC_SLTYPE_VALID_MASK ) != 0 )
+ {
+ /* read NTCODE list number */
+ readValue = (kal_uint8)rmmi_get_int_ext(&parseError, source_string_ptr, (kal_uint8)RMMI_COMMA);
+ if( ( parseError == RMMI_PARSE_OK ) && ( readValue <= VSLT_MAX_NUM_1 ) )
+ {
+ networkCodeListNumber = readValue;
+ if( networkCodeListNumber == 0 )
+ {
+ /* Network Code List Number value is Zero*/
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR ( NETWORK CODE LIST NUMBER FAIL )", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ else
+ {
+ pNetworkCode = (FactoryNetworkCode *)get_ctrl_buffer(sizeof(FactoryNetworkCode)*networkCodeListNumber);
+ if( pNetworkCode != NULL )
+ {
+ kal_mem_set(pNetworkCode, 0xff, sizeof(pNetworkCode));
+ for( loop=0 ; loop<networkCodeListNumber ; loop++ )
+ {
+ temp = loop + 1;
+
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)source_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_MCC_LEN, (pNetworkCode+loop)->Mcc, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_MCC_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( MCC-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)source_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_MNC_LEN, (pNetworkCode+loop)->Mnc, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_MNC_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( MNC-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)source_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_GID1_LEN, (pNetworkCode+loop)->Gid1, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_GID1_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( GID1-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)source_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_GID2_LEN, (pNetworkCode+loop)->Gid2, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_GID2_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( GID2-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+ readValue = (kal_uint8)rmmi_get_hex_ext(&parseError, (rmmi_string_struct*)source_string_ptr, (kal_uint8)RMMI_COMMA, LGE_FAC_NC_SUBSET_LEN, (pNetworkCode+loop)->Subset, &readCount);
+ if( ( parseError != RMMI_PARSE_OK ) || ( readCount != LGE_FAC_NC_SUBSET_LEN ) )
+ {
+ RMMI_PTR->arg_list[0] = (void*)&(temp);
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( SUBSET-%d )", RMMI_PTR->arg_list, 1);
+ networkCodeListNumber = 0;
+ break;
+ }
+
+ //init return result value
+ eReturnType[loop] = LGOEM_VSLT_NONE;
+ temp_result = LGOEM_VSLT_NONE;
+
+ kal_mem_set(retStr, 0x00, sizeof(retStr));
+ kal_mem_set(code, 0x00, sizeof(code));
+
+ for (loop2=0; loop2 <3; loop2++)
+ {
+ code[loop2] = (pNetworkCode+loop)->Mcc[loop2];
+ code[loop2+LGE_FAC_NC_MCC_LEN] = (pNetworkCode+loop)->Mnc[loop2];
+ }
+
+ for(cat = LGE_FAC_SLTYPE_MASK_NETWORK; cat <= LGE_FAC_SLTYPE_MASK_COOPERATE; cat = cat<<1)
+ {
+ switch(cat)
+ {
+ case LGE_FAC_SLTYPE_MASK_NETWORK: //mcc+mnc
+ len = TC01_SML_SIZE_OF_CAT_N;
+ break;
+
+ case LGE_FAC_SLTYPE_MASK_NETWORK_SUBSET: //mcc+mnc+subset
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_SUBSET_LEN ; loop2++)
+ code[loop2+6] = (pNetworkCode+loop)->Subset[loop2];
+ len = TC01_SML_SIZE_OF_CAT_NS;
+ break;
+
+ case LGE_FAC_SLTYPE_MASK_SERVICE_PROVIDER: //mcc+mnc+gid1
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_GID1_LEN ; loop2++)
+ code[loop2+6] = (pNetworkCode+loop)->Gid1[loop2];
+
+ len = TC01_SML_SIZE_OF_CAT_SP;
+ break;
+
+ case LGE_FAC_SLTYPE_MASK_COOPERATE: //mcc+mnc+gid1+gid2
+ for (loop2 =0 ; loop2 < LGE_FAC_NC_GID2_LEN ; loop2++)
+ {
+ code[loop2+6] = (pNetworkCode+loop)->Gid1[loop2];
+ code[loop2+14] = (pNetworkCode+loop)->Gid2[loop2];
+ }
+ len = TC01_SML_SIZE_OF_CAT_C;
+ break;
+
+ default:
+ break;
+ }
+
+ //Main Check routin : comparison with VSLT input and NT code database
+ temp_result = eReturnType[loop];
+ eReturnType[loop] = tc01_vt_sml_Check( cat, code, len);
+
+ if ( eReturnType[loop] == LGOEM_VSLT_NONE )
+ {
+ eReturnType[loop] = temp_result;
+ }
+ else if (eReturnType[loop] == LGOEM_VSLT_SIM_ERROR)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "Security Lock data read Error", RMMI_PTR->arg_list, 0);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR (MEM ALLOC FAIL)", RMMI_PTR->arg_list, 0);
+ }
+
+ for(loop = 0; loop<networkCodeListNumber; loop++)
+ {
+ if(eReturnType[loop] == LGOEM_VSLT_SIM_LOCK)
+ {
+ bLockCheck = TRUE;
+ lockCount++;
+ }
+ }
+
+ if (networkCodeListNumber > 0)
+ {
+ //All comparison result were unlock case
+ if(!bLockCheck)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM UNLOCK", RMMI_PTR->arg_list, 0);
+ }
+ //If Simlock VSLT code was detected, make response list string via AT command .
+ else
+ {
+ kal_mem_set (rsp_str, 0x00, sizeof(rsp_str));
+ sprintf((char*)rsp_str, "%c\"SIM LOCK\"", 0x02 );
+ rmmi_write_to_uart((kal_uint8*) rsp_str, strlen((char*)rsp_str), KAL_TRUE);
+
+ for(loop = 0; loop<networkCodeListNumber; loop++)
+ {
+ if(eReturnType[loop] != LGOEM_VSLT_SIM_UNLOCK)
+ {
+ lockCount--;
+ kal_mem_set((char*)tmpStr, 0x00, sizeof(tmpStr));
+ rmmi_sprintf((kal_int8*)tmpStr, (kal_int8*)"\"%X%X%X,%X%X%X,%X%X%X%X%X%X%X%X,%X%X%X%X%X%X%X%X,%X%X\"",
+ pNetworkCode[loop].Mcc[0], pNetworkCode[loop].Mcc[1], pNetworkCode[loop].Mcc[2],
+ pNetworkCode[loop].Mnc[0], pNetworkCode[loop].Mnc[1], pNetworkCode[loop].Mnc[2],
+ pNetworkCode[loop].Gid1[0], pNetworkCode[loop].Gid1[1], pNetworkCode[loop].Gid1[2], pNetworkCode[loop].Gid1[3],
+ pNetworkCode[loop].Gid1[4], pNetworkCode[loop].Gid1[5], pNetworkCode[loop].Gid1[6], pNetworkCode[loop].Gid1[7],
+ pNetworkCode[loop].Gid2[0], pNetworkCode[loop].Gid2[1], pNetworkCode[loop].Gid2[2], pNetworkCode[loop].Gid2[3],
+ pNetworkCode[loop].Gid2[4], pNetworkCode[loop].Gid2[5], pNetworkCode[loop].Gid2[6], pNetworkCode[loop].Gid2[7],
+ pNetworkCode[loop].Subset[0], pNetworkCode[loop].Subset[1]);
+
+ if(lockCount == 0)
+ {
+ sprintf((char*)rsp_str, "%c", 0x03 );
+ strncat((char*)tmpStr, (char*)rsp_str, (sizeof(tmpStr) - strlen((char*)tmpStr) -1));
+ }
+
+ rmmi_write_to_uart((kal_uint8*) tmpStr, strlen((char*)tmpStr), KAL_TRUE);
+ }
+ }
+ }
+ }
+ }
+ }
+ else if( ( parseError == RMMI_PARSE_OK ) && ( readValue > VSLT_MAX_NUM_1 ) )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "Virtual SIM lock count over fail", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "INPUT DATA FAIL ( PARSE ERROR )", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM_LOCK ERROR", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "SIM_LOCK TYPE READ ERROR", RMMI_PTR->arg_list, 0);
+ }
+
+ if( pNetworkCode != NULL )
+ {
+ free_ctrl_buffer(pNetworkCode);
+ pNetworkCode = NULL;
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+#endif // #if !defined(__TC01_SIM_LOCK_OFF__) && defined(LGE_FW_COMMON)
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ return;
+ }
+
+
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_calck_hdlr
+ * DESCRIPTION
+ * check whether existing NV item list is applied to phone default QCN
+ * check whether calibration data is present or not
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+ void rmmi_calck_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 const *rsp_str = NULL; /* response string and initialization */
+ kal_uint16 string_length = 0; /* string length variable */
+ //kal_uint8 buffer[RMMI_SHORT_RSP_LEN];
+
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE: //AT%CALCK=?
+ case RMMI_READ_MODE: //AT%CALCK?
+ case RMMI_ACTIVE_MODE: //AT%CALCK
+ case RMMI_SET_OR_EXECUTE_MODE: //AT%CALCK=
+ {
+ uem_get_calibration_flag_req();
+
+ return;
+ }
+ default:
+ {
+ /* unrecognized format of AT command line */
+ break;
+ }
+ } /* end of the switch */
+
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rsp_str, string_length);
+
+ return;
+
+ }
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_caldt_hdlr
+ * DESCRIPTION
+ * inquire history by recording CAL date to the board passed from Cal&Auto process
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+ void rmmi_caldt_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ rmmi_context_struct *rmmi_main_ptr = &rmmi_cntxt_g[0];
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE: //AT%CALDT=?
+ case RMMI_READ_MODE: //AT%CALDT?
+ case RMMI_ACTIVE_MODE: //AT%CALDT
+ case RMMI_SET_OR_EXECUTE_MODE: //AT%CALDT=
+ {
+ RMMI_PTR->arg_list[0] = (void*)&rmmi_main_ptr->caldt_check;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%d", RMMI_PTR->arg_list, 1);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ default:
+ {
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ /* end of the switch */
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+ return;
+ }
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_simimsi_hdlr
+ * DESCRIPTION
+ * response the value of IMSI of SIM
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+ void rmmi_simimsi_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ #ifdef __GEMINI__
+ kal_uint8 imsi_str[40] = {0,};
+ #else
+ kal_uint8 imsi_str[20] = {0,};
+ #endif
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ case RMMI_SET_OR_EXECUTE_MODE:
+ case RMMI_READ_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ case RMMI_ACTIVE_MODE:
+ {
+ if(is_sim_inserted(SIM1) == SMU_SIM_INSERTED
+ #ifdef __GEMINI__
+ || is_sim_inserted(SIM2) == SMU_SIM_INSERTED
+ #endif
+ )
+ {
+ if(l4c_cntxt_g[0].pin_lock_check == KAL_TRUE
+ #ifdef __GEMINI__
+ || l4c_cntxt_g[1].pin_lock_check == KAL_TRUE
+ #endif
+ )
+ {
+ #ifdef __GEMINI__
+ if( (l4c_cntxt_g[0].is_imsi_valid == KAL_TRUE && is_sim_inserted(SIM1) == SMU_SIM_INSERTED)
+ && (l4c_cntxt_g[1].is_imsi_valid == KAL_TRUE && is_sim_inserted(SIM2) == SMU_SIM_INSERTED))
+ {
+ rmmi_sprintf((kal_int8*)imsi_str, (kal_int8*)"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d, %d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
+ l4c_cntxt_g[SIM1].imsi_content[1]-48, l4c_cntxt_g[SIM1].imsi_content[2]-48,
+ l4c_cntxt_g[SIM1].imsi_content[3]-48, l4c_cntxt_g[SIM1].imsi_content[4]-48,
+ l4c_cntxt_g[SIM1].imsi_content[5]-48, l4c_cntxt_g[SIM1].imsi_content[6]-48,
+ l4c_cntxt_g[SIM1].imsi_content[7]-48, l4c_cntxt_g[SIM1].imsi_content[8]-48,
+ l4c_cntxt_g[SIM1].imsi_content[9]-48, l4c_cntxt_g[SIM1].imsi_content[10]-48,
+ l4c_cntxt_g[SIM1].imsi_content[11]-48, l4c_cntxt_g[SIM1].imsi_content[12]-48,
+ l4c_cntxt_g[SIM1].imsi_content[13]-48, l4c_cntxt_g[SIM1].imsi_content[14]-48,
+ l4c_cntxt_g[SIM1].imsi_content[15]-48,
+ l4c_cntxt_g[SIM2].imsi_content[1]-48, l4c_cntxt_g[SIM2].imsi_content[2]-48,
+ l4c_cntxt_g[SIM2].imsi_content[3]-48, l4c_cntxt_g[SIM2].imsi_content[4]-48,
+ l4c_cntxt_g[SIM2].imsi_content[5]-48, l4c_cntxt_g[SIM2].imsi_content[6]-48,
+ l4c_cntxt_g[SIM2].imsi_content[7]-48, l4c_cntxt_g[SIM2].imsi_content[8]-48,
+ l4c_cntxt_g[SIM2].imsi_content[9]-48, l4c_cntxt_g[SIM2].imsi_content[10]-48,
+ l4c_cntxt_g[SIM2].imsi_content[11]-48, l4c_cntxt_g[SIM2].imsi_content[12]-48,
+ l4c_cntxt_g[SIM2].imsi_content[13]-48, l4c_cntxt_g[SIM2].imsi_content[14]-48,
+ l4c_cntxt_g[SIM2].imsi_content[15]-48
+ );
+ RMMI_PTR->arg_list[0] = (void*)imsi_str;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%s", RMMI_PTR->arg_list, 1);
+ }
+ else if(l4c_cntxt_g[1].is_imsi_valid == KAL_TRUE && is_sim_inserted(SIM2) == SMU_SIM_INSERTED)
+ {
+ rmmi_sprintf((kal_int8*)imsi_str, (kal_int8*)"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
+ l4c_cntxt_g[SIM2].imsi_content[1]-48, l4c_cntxt_g[SIM2].imsi_content[2]-48,
+ l4c_cntxt_g[SIM2].imsi_content[3]-48, l4c_cntxt_g[SIM2].imsi_content[4]-48,
+ l4c_cntxt_g[SIM2].imsi_content[5]-48, l4c_cntxt_g[SIM2].imsi_content[6]-48,
+ l4c_cntxt_g[SIM2].imsi_content[7]-48, l4c_cntxt_g[SIM2].imsi_content[8]-48,
+ l4c_cntxt_g[SIM2].imsi_content[9]-48, l4c_cntxt_g[SIM2].imsi_content[10]-48,
+ l4c_cntxt_g[SIM2].imsi_content[11]-48, l4c_cntxt_g[SIM2].imsi_content[12]-48,
+ l4c_cntxt_g[SIM2].imsi_content[13]-48, l4c_cntxt_g[SIM2].imsi_content[14]-48,
+ l4c_cntxt_g[SIM2].imsi_content[15]-48
+ );
+ RMMI_PTR->arg_list[0] = (void*)imsi_str;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%s", RMMI_PTR->arg_list, 1);
+ }
+ else
+ #endif
+ if(l4c_cntxt_g[0].is_imsi_valid == KAL_TRUE && is_sim_inserted(SIM1) == SMU_SIM_INSERTED)
+ {
+ rmmi_sprintf((kal_int8*)imsi_str, (kal_int8*)"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
+ l4c_cntxt_g[SIM1].imsi_content[1]-48, l4c_cntxt_g[SIM1].imsi_content[2]-48,
+ l4c_cntxt_g[SIM1].imsi_content[3]-48, l4c_cntxt_g[SIM1].imsi_content[4]-48,
+ l4c_cntxt_g[SIM1].imsi_content[5]-48, l4c_cntxt_g[SIM1].imsi_content[6]-48,
+ l4c_cntxt_g[SIM1].imsi_content[7]-48, l4c_cntxt_g[SIM1].imsi_content[8]-48,
+ l4c_cntxt_g[SIM1].imsi_content[9]-48, l4c_cntxt_g[SIM1].imsi_content[10]-48,
+ l4c_cntxt_g[SIM1].imsi_content[11]-48, l4c_cntxt_g[SIM1].imsi_content[12]-48,
+ l4c_cntxt_g[SIM1].imsi_content[13]-48, l4c_cntxt_g[SIM1].imsi_content[14]-48,
+ l4c_cntxt_g[SIM1].imsi_content[15]-48
+ );
+ RMMI_PTR->arg_list[0] = (void*)imsi_str;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%s", RMMI_PTR->arg_list, 1);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "IMSI READ FAIL", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ }
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ }
+
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ default:
+ {
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ break;
+ } /* end of the switch */
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ return;
+ }
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_pgcheck_hdlr
+ * DESCRIPTION
+ * Check MT CS Paging
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_pgcheck_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool ret_val = KAL_FALSE;
+ rmmi_context_struct * rmmi_ptr = RMMI_PTR;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ //RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: /* AT%PGCHECK */
+ case RMMI_TEST_MODE: /* AT%PGCHECK=? */
+ case RMMI_READ_MODE: /* AT%PGCHECK? */
+ {
+ ret_val= KAL_TRUE;
+ }
+ break;
+
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%PGCHECK=X... */
+ {
+ kal_uint8 error_cause;
+ kal_uint8 rat_mode;
+
+ rat_mode = rmmi_int_validator_u8_check(&error_cause, source_string_ptr, rmmi_ptr->s_reg.s3 /* separator */);
+ if (error_cause != RMMI_PARSE_OK){
+ rmmi_custom_dbg_trace("error_cause(RMMI_RARSE) is not ok");
+ break;
+ }
+
+ if(rat_mode == 0){
+ ret_val= KAL_TRUE;
+ }else if(rat_mode == 1){
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%cGSM PG monitoring OK%c",0x02,0x03);
+ }else if(rat_mode == 2){
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%cWCDMA PG monitoring OK%c",0x02,0x03);
+ }else if(rat_mode == 3){
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%cLTE PG monitoring OK%c",0x02,0x03);
+ }else if(rat_mode == 4){
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%cALL RAT PG monitoring OK%c",0x02,0x03);
+ }else{
+ rmmi_custom_dbg_trace("PGCHECK is out of rat_mode range");
+ break;
+ }
+ ret_val = l4c_nw_set_pgcheck_req(rat_mode);
+ }
+ break;
+
+ default:
+ ret_val= KAL_FALSE;
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rspstr_ptr, rspstr_len);
+ }
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_pgcheckext_hdlr
+ * DESCRIPTION
+ * Check MT CS Paging
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_pgcheckext_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool ret_val = KAL_FALSE;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: /* AT%PGCHECKEXT */
+ case RMMI_TEST_MODE: /* AT%PGCHECKEXT=? */
+ case RMMI_READ_MODE: /* AT%PGCHECKEXT? */
+ ret_val = KAL_TRUE;
+ break;
+
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%PGCHECKEXT=X... */
+ {
+ kal_uint8 error_cause;
+ kal_uint32 rat_mode;
+ kal_uint32 cause;
+
+ /*
+ * 0: off
+ * 1: gsm
+ * 2: wcdma
+ * 3: lte
+ * 4: all
+ */
+ rat_mode = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_COMMA, 4);
+ if (error_cause == RMMI_PARSE_NOT_FOUND){
+ rmmi_custom_dbg_trace("rat_mode value not found!!");
+ break;
+ }
+ else if (error_cause != RMMI_PARSE_OK){
+ rmmi_custom_dbg_trace("rat_mode value is over max(4)");
+ break;
+ }
+
+ /*
+ * 0 or empty: (none=off),
+ * 1 (0x01): (RRC_PAGE_CAUSE_TERM_CONV_CALL)
+ * 2 (0x02): (RRC_PAGE_CAUSE_TERM_STREAM_CALL)
+ * 4 (0x04): (RRC_PAGE_CAUSE_TERM_INTERACT_CALL)
+ * 8 (0x08): (RRC_PAGE_CAUSE_TERM_BACKGND_CALL)
+ * 16 (0x10): (RRC_PAGE_CAUSE_HIGH_PRI_SIGNALLING)
+ * 32 (0x20): (RRC_PAGE_CAUSE_LOW_PRI_SIGNALLING)
+ * 64 (0x40): (RRC_PAGE_CAUSE_UNKNOWN)
+ */
+ cause = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_COMMA, 0x7f);
+ if (error_cause == RMMI_PARSE_NOT_FOUND)
+ cause = 0;
+ else if (error_cause != RMMI_PARSE_OK){
+ rmmi_custom_dbg_trace_int("cause value is over max(%d)", 0x7f);
+ break;
+ }
+
+ kal_prompt_trace(MOD_L4C, "rat_mode:%d, cause:%x", rat_mode, cause);
+ ret_val = l4c_nw_set_pgcheckext_req(rat_mode, cause);
+ }
+ break;
+
+ default:
+ ret_val = KAL_FALSE;
+ break;
+ }
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*) rspstr_ptr, rspstr_len);
+ }
+ return;
+}
+
+/* AT%LTECALL */
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_ltecall_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_ltecall_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ rmmi_context_struct * rmmi_ptr = RMMI_PTR;
+ kal_uint8 status = 2;
+ kal_uint8 rat_mode = 0xFF;
+ rat_enum prefer_rat = RAT_NONE;
+
+ /* LTE Call improvement */
+ /* Combine LTE call with specific chennel search */ /* MOLY00165083 */
+ custom_factory_band_context_struct* rac_factory_ptr_g = cust_fac_ptr_global;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: /* AT%LTECALL */
+ case RMMI_TEST_MODE: /* AT%LTECALL=? */
+ case RMMI_READ_MODE: /* AT%LTECALL? */
+ {
+ if (l4c_check_state_is_registered(rmmi_convert_atci_state_to_reg(rmmi_ptr->ps_register_status.state))){
+ status = 1;
+ }else{
+ status = 0;
+ }
+ rmmi_ptr->arg_list[0] = (void*)&status;
+
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c%d%c\n%cOK%c",0x02,status,0x03,0x02,0x03 );
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_ONLY);
+ }
+ break;
+
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%LTECALL=XXX... */
+ {
+ kal_uint8 gprs_state;
+ kal_uint8 error_cause;
+ kal_uint8 opcode;
+
+ #ifndef __IMS_SUPPORT__
+ // Not allow perform PS attach before SIM ready
+ if (is_sim_verified() == KAL_FALSE)
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ #endif
+
+ gprs_state = rmmi_ptr->ps_register_status.state;
+ opcode = rmmi_int_validator_u8_check(&error_cause, source_string_ptr, rmmi_ptr->s_reg.s3 /* separator */);
+ if (opcode == 0)
+ {
+ rmmi_ptr->cgatt_last_action = 0;
+ opcode = RAC_DETACH;
+ }
+ else if (opcode == 1)
+ {
+ if( (rac_factory_ptr_g->factory_dynamic_band != 18) || (l4c_get_active_rat() != RAT_LTE))
+ {
+ /* Save LTE call command string */
+ /* LTE Call improvement */
+ rac_factory_ptr_g->initial_lte_call = 1;
+ rmmi_start_specific_chennal_search(source_string_ptr->src_id, (kal_uint8)18 );
+ return;
+ }
+ /* To avoid CGATT delay problem, always send SET_RAT_MODE requset */
+ {
+ RMMI_PTR->action_cmd = RMMI_CMD_LTECALL;
+ l4c_nw_get_rat_mode_ext_req(source_string_ptr->src_id, &rat_mode, (kal_uint8 *)&prefer_rat);
+ rmmi_ptr->ltecall_flag = 2;
+ l4c_nw_set_rat_mode_ext_req(source_string_ptr->src_id, rat_mode, prefer_rat,1);
+ return;
+ }
+ #ifdef __SGLTE__
+ if(l4c_check_ps_attach_allowed() == KAL_FALSE)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "PS Attache is NOT allowed", rmmi_ptr->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ #endif
+
+ if (( (rmmi_ptr->cgatt_last_action == 1)
+ && (l4c_check_state_is_registered(rmmi_convert_atci_state_to_reg(gprs_state))))
+ #if 0 // at%ltecall TO-DO, #ifdef __SGLTE__ //Exclude the at+cgatt=1 for ps switch, because PS_REG_REQ must be sent to do RAU
+/* under construction !*/
+ #endif
+ )
+ {
+ //to avoid continous +CGATT=1 (for example : script )
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c[1]LTE ON%c\n%cOK%c",0x02,0x03,0x02,0x03 );
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_ONLY);
+ break;
+ }
+
+ rmmi_ptr->cgatt_last_action = 1;
+ opcode = RAC_ATTACH;
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ECALL ERROR", rmmi_ptr->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY);
+ break;
+ }
+
+ if (l4c_nw_exe_att_req(source_string_ptr->src_id, RAC_PS, opcode, KAL_FALSE) == KAL_TRUE)
+ {
+ if(opcode == RAC_ATTACH){
+ rmmi_ptr->ltecall_flag = 2;
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c[1]LTE ON%c\n%cOK%c",0x02,0x03,0x02,0x03 );
+ }else{
+ rmmi_ptr->ltecall_flag = 1;
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c[0]LTE OFF%c\n%cOK%c",0x02,0x03,0x02,0x03 );
+ }
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_ONLY);
+ break;
+ }
+ else
+ {
+ rmmi_ptr->cgatt_last_action = 0;
+ /* MOLY00186156 */
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ECALL ERROR", rmmi_ptr->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY);
+ break;
+ /* MOLY00186156 */
+ }
+ }
+ break;
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ }
+ return;
+ }
+
+/* MOLY00165083 */
+void rmmi_init_ltecall_rrsp()
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ rmmi_context_struct * rmmi_ptr = RMMI_PTR;
+ // kal_uint8 gprs_state;
+ /* LTE Call improvement */
+ /* Combine LTE call with specific chennel search */
+ custom_factory_band_context_struct* rac_factory_ptr_g = cust_fac_ptr_global;
+
+ kal_prompt_trace(MOD_L4C, "rmmi_init_ltecall_rrsp");
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ #ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+ rmmi_ptr->current_src = rmmi_ptr->cust_cmd_src_id;
+ #endif
+ rac_factory_ptr_g->initial_lte_call = 0;
+
+#ifdef __SGLTE__
+ if(l4c_check_ps_attach_allowed() == KAL_FALSE)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "PS Attache is NOT allowed", rmmi_ptr->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+#endif
+
+ rmmi_ptr->cgatt_last_action = 1;
+ rmmi_ptr->ltecall_flag = 2;
+
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c[1]LTE ON%c\n%cOK%c",0x02,0x03,0x02,0x03 );
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_ONLY);
+
+ rmmi_cust_final_rsp_generator(rmmi_ptr->current_src, (kal_uint8*) rspstr_ptr, rspstr_len );
+
+ return;
+}
+/* MOLY00165083 */
+
+/* MOLY00186156 */
+void rmmi_ltecall_rrsp()
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ rmmi_context_struct * rmmi_ptr = RMMI_PTR;
+ // kal_uint8 gprs_state;
+
+ RMMI_PTR->action_cmd = RMMI_MAX_CMD_NUM;
+
+ kal_prompt_trace(MOD_L4C, "rmmi_ltecall_rrsp");
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+#ifdef __SGLTE__
+ if(l4c_check_ps_attach_allowed() == KAL_FALSE)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "PS Attache is NOT allowed", rmmi_ptr->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+#endif
+
+ rmmi_ptr->cgatt_last_action = 1;
+
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c[1]LTE ON%c\n%cOK%c",0x02,0x03,0x02,0x03 );
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_ONLY);
+
+ rmmi_cust_final_rsp_generator(rmmi_ptr->current_src, (kal_uint8*) rspstr_ptr, rspstr_len );
+
+ return;
+}
+/* MOLY00186156 */
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_rfdevchk_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_rfdevchk_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ rmmi_context_struct * rmmi_ptr = RMMI_PTR;
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint32 i;
+ em_info_status_enum *info_request = NULL;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+ rmmi_custom_dbg_trace("rmmi_rfdevchk_hdlr()");
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_rfdevchk_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch(source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ case RMMI_ACTIVE_MODE:
+ case RMMI_READ_MODE:
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ if(rmmi_ptr->mipi_result.is_excuted == KAL_FALSE)
+ {
+ info_request = (em_info_status_enum*)get_ctrl_buffer(NUM_OF_EM_INFO * sizeof(em_info_status_enum));
+
+ for(i=0; i<NUM_OF_EM_INFO; i++)
+ {
+ info_request[i] = EM_NC;
+ }
+ info_request[108] = EM_ON;
+ RMMI_PTR->action_cmd = RMMI_CMD_RFDEVCHK;
+ l4c_em_update_req(EM_FROM_RMMI, info_request);
+ free_ctrl_buffer(info_request);
+ }
+ else
+ {
+ l4c_em_get_mipi_hw_info_rrsp();
+ }
+
+ return;
+ }
+ default:
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ return;
+}
+
+
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_sbp_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
+static kal_uint32 rmmi_sbp_str2int(kal_uint8 * string, kal_uint8 sbp_type)
+{
+ kal_uint32 ret_val = SBP_MAX_MD_FEATURE;
+ kal_uint32 i = 0;
+ kal_uint32 max_sbp_feature = SBP_MAX_MD_FEATURE;
+
+ if (sbp_type == 0)
+ {
+ max_sbp_feature = SBP_MAX_MD_FEATURE;
+ for(i = 0; i < SBP_MAX_MD_FEATURE; i++)
+ {
+ if(0 == strcmp((kal_char*)string, sbp_feature_string_table[i]))
+ break;
+ }
+
+ }
+ else if (sbp_type == 1)
+ {
+ max_sbp_feature = SBP_CUSTOM_MAX_MD_FEATURE;
+ for(i = 0; i < SBP_CUSTOM_MAX_MD_FEATURE; i++)
+ {
+ if(0 == strcmp((kal_char*)string, sbp_cust_feature_string_table[i]))
+ break;
+ }
+ }
+ else
+ {
+ return ret_val;
+ }
+
+ if(i < max_sbp_feature)
+ {
+ ret_val = i;
+ }
+
+ return ret_val;
+}
+
+
+static void rmmi_sbp_set_md_feature_by_ps_common(kal_uint8 sbp_type,
+ kal_uint32 feature,
+ kal_uint8 value,
+ kal_uint8 by_ps,
+ kal_uint8 ps_id)
+{
+ if(sbp_type == 0)
+ {
+ if (by_ps)
+ {
+ sbp_set_md_feature_by_ps((sbp_md_feature_enum)feature, (kal_bool)value, ps_id);
+ }
+ else
+ {
+ sbp_general_set_md_feature((sbp_md_feature_enum)feature, (kal_bool)value);
+ sbp_update_features_to_nvram();
+ }
+ }
+ else
+ {
+ if (by_ps)
+ {
+ sbp_set_md_feature_by_ps_custom((sbp_md_feature_custom_enum)feature, (kal_bool)value, ps_id);
+ }
+ else
+ {
+ sbp_general_set_md_feature_custom((sbp_md_feature_custom_enum)feature, (kal_bool)value);
+ sbp_update_features_to_nvram_custom();
+ }
+ }
+ return;
+}
+
+static kal_bool rmmi_validator_int_value_check(kal_uint32 value, kal_uint32 min, kal_uint32 max)
+{
+ kal_bool ret_val = KAL_TRUE;
+
+ if( (value < min) || (value > max) || (value == RMMI_VALIDATOR_ERROR))
+ {
+ ret_val = KAL_FALSE;
+ rmmi_custom_dbg_trace("Int value validate failed!");
+ }
+
+ return ret_val;
+}
+#endif
+
+ void rmmi_sbp_hdlr(rmmi_string_struct *source_string_ptr)
+{
+#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
+#define SBP_CUSTOM_MAX_MODE_STR 16
+#define SBP_FEATURE_MAX_NAME_STR 200
+
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint8 * feature_str = NULL;
+
+ feature_str = get_ctrl_buffer(SBP_FEATURE_MAX_NAME_STR+1);
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ rmmi_custom_dbg_trace("rmmi_sbp_hdlr()");
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ case RMMI_ACTIVE_MODE:
+ case RMMI_READ_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr,
+ (kal_uint8*) "%SBP=<type>,<cmd_mode>,<ps_id>, <sbpStr>[,<sbpVal>,[<ps independent>]]", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 error_cause;
+ kal_uint8 sbp_type = 0;
+ kal_uint8 cmd_mode = 0;
+ kal_uint32 ps_id = (kal_uint32)(rmmi_current_mod_id - MOD_ATCI);
+ kal_uint32 feature = SBP_MAX_MD_FEATURE;
+ kal_uint8 value = 0;
+ kal_uint8 by_ps = 0;
+
+ /* <type> 0 : mtk_sbp, 1 : custom_sbp */
+ sbp_type = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+ if (!rmmi_validator_int_value_check((kal_uint32)sbp_type, 0,1))
+ {
+ goto error_handler;
+ }
+ /* <cmd_ mod> 0 : query, 1 : set */
+ cmd_mode = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+ if (!rmmi_validator_int_value_check((kal_uint32)cmd_mode, 0,1))
+ {
+ goto error_handler;
+ }
+ /* <ps_id> 0 : PS1, 1 : PS2 */
+ ps_id = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+ if (!rmmi_validator_int_value_check((kal_uint32)ps_id, 0,(MAX_SIM_NUM-1)))
+ {
+ goto error_handler;
+ }
+ //Get feature name string
+ rmmi_string_validator_ext(&error_cause,source_string_ptr,
+ RMMI_COMMA, /* separator */
+ SBP_FEATURE_MAX_NAME_STR,
+ (kal_uint8*) feature_str);
+
+ if(error_cause != RMMI_PARSE_OK)
+ {
+ goto error_handler;
+ }
+ else
+ {
+ feature = rmmi_sbp_str2int(feature_str, sbp_type);
+ if(feature == INVALID_SBP_FEATURE)
+ {
+ rmmi_custom_dbg_trace("Invalid SBP feature!");
+ goto error_handler;
+ }
+ }
+
+ if(cmd_mode == 1) /* Set SBP */
+ {
+ /* <value> 0 : DISABLE, 1 : ENABLE */
+ value = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+ if (!rmmi_validator_int_value_check((kal_uint32)ps_id, 0,1))
+ {
+ goto error_handler;
+ }
+
+ /* <by_ps> 0 : common, 1 : for each PS ID */
+ by_ps = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+ if (!rmmi_validator_int_value_check((kal_uint32)by_ps, 0,1))
+ {
+ by_ps = 0;
+ }
+ rmmi_sbp_set_md_feature_by_ps_common(sbp_type, feature, value, by_ps, ps_id);
+ }
+ else /* SBP query */
+ {
+ if(sbp_type == 0)
+ {
+ rspstr_len = kal_sprintf((char*)rspstr_ptr, "%d",
+ sbp_query_md_feature_by_ps((sbp_md_feature_enum)feature, (protocol_id_enum)ps_id));
+ }
+ else
+ {
+ rspstr_len = kal_sprintf((char*)rspstr_ptr, "%d",
+ sbp_query_md_feature_by_ps_custom((sbp_md_feature_custom_enum)feature, (protocol_id_enum)ps_id));
+ }
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ }
+ if (feature_str != NULL)
+ {
+ free_ctrl_buffer(feature_str);
+ }
+ return;
+
+ error_handler:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+
+ if (feature_str != NULL)
+ {
+ free_ctrl_buffer(feature_str);
+ }
+#endif
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_dataStatic_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ **************************************************************************** */
+void rmmi_dataStatic_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ extern kal_bool l4c_ps_get_context_state_req(kal_uint8 src_id, kal_uint8 *num, kal_uint8 *state_list);
+
+ kal_bool ret_val = KAL_FALSE;
+ int epsb_count=0;
+ kal_uint8 *buffer=NULL;
+ kal_uint16 string_length = 0;
+
+ rmmi_custom_dbg_trace("rmmi_dataStatic_hdlr");
+
+ buffer = (kal_uint8 *)get_ctrl_buffer(128);
+
+ if (buffer == NULL)
+ {
+ ASSERT(0);
+ }
+
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_READ_MODE:
+ {
+ upcm_query_epsb_statistics_struct query_result;
+ kal_uint8 state_list[L4C_TOT_CONTEXT][2];
+ kal_uint8 num;
+ kal_uint8 context_state = 0;
+ kal_uint8 i=0;
+ kal_uint8 bearer_id[8];
+ kal_int8 validCid = -1;
+ kal_uint8 bearer = 0;
+ kal_mem_set(&query_result, 0, sizeof(upcm_query_epsb_statistics_struct));
+ kal_mem_set(state_list, 0, sizeof(state_list));
+ kal_mem_set(bearer_id, 0, sizeof(bearer_id));
+
+ context_state = l4c_ps_get_context_state_req(source_string_ptr->src_id, &num, (kal_uint8*) state_list);
+
+ if (context_state == KAL_TRUE)
+ {
+ for(i = 0; i < num; i++)
+ {
+ if ( (state_list[i][0] <= MAX_EXT_PDP_CONTEXT) && (state_list[i][1] == 1) )
+ {
+ kal_uint8 cid = state_list[i][0];
+
+ if (KAL_TRUE == l4c_get_bearer_id(cid, &bearer))
+ {
+ bearer_id[++validCid] = bearer;
+ kal_prompt_trace(rmmi_current_mod_id, "[PktStatic]:[%d,%d]", bearer, validCid);
+ }
+ }
+ }
+ }
+
+ if (validCid > -1)
+ {
+ upcm_query_epsb_txrx_statistics(&query_result, l4c_current_mod_id - MOD_L4C);
+#if 1 //multiful response.
+
+ for (epsb_count=0;epsb_count<=validCid;epsb_count++) {
+ kal_mem_set(buffer, 0, sizeof(buffer));
+ bearer = bearer_id[epsb_count];
+ kal_sprintf((kal_char*)buffer, "+PKTSTATICS:%d, %llu, %llu", bearer,
+ query_result.txrx_info[bearer].tx_bytes, query_result.txrx_info[bearer].rx_bytes);
+ string_length = (kal_uint16)strlen((char*)buffer);
+ rmmi_write_to_uart((kal_uint8*) buffer, string_length, KAL_TRUE);
+ }
+
+ ret_val = KAL_TRUE;
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, NULL, 0);
+ free_ctrl_buffer( buffer );
+ return;
+#else //single response
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+ else
+ {
+ kal_sprintf((kal_char*)buffer, "+PKTSTATICS:0,0,0");
+ string_length = (kal_uint16)strlen((char*)buffer);
+ ret_val = KAL_TRUE;
+ }
+ break;
+ };
+
+ case RMMI_SET_OR_EXECUTE_MODE :
+ case RMMI_ACTIVE_MODE:
+ case RMMI_TEST_MODE:
+ {
+ kal_sprintf((kal_char*)buffer, "+PKTSTATICS:0,0,0");
+ string_length = (kal_uint16)strlen((char*)buffer);
+ ret_val = KAL_TRUE;
+ break;
+ };
+ default:
+ {
+ /* unrecognized format of AT command line */
+ break;
+ }
+ }
+
+ rmmi_final_rsp_generator(source_string_ptr->src_id, ret_val, (kal_uint8*)buffer, string_length);
+ if (buffer != NULL)
+ free_ctrl_buffer( buffer );
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_lgcgatt_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+ void rmmi_lgcgatt_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ case RMMI_ACTIVE_MODE:
+ case RMMI_READ_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 opcode = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+
+ if (opcode == RMMI_VALIDATOR_ERROR)
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ if( opcode == 0 || opcode == 1 )
+ {
+ if( l4c_nw_exe_att_req(source_string_ptr->src_id, RAC_PS, opcode, KAL_FALSE) == KAL_TRUE )
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_NO_RSP );
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ break;
+ }
+ default:
+ {
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ } /* end of the switch */
+ }
+
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ return;
+ }
+
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_detach_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+ void rmmi_detach_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ /* AT+COPS=2 */
+ if (l4c_nw_exe_cops_req(source_string_ptr->src_id, DEREG, NULL, 0,ENDC_SEARCH_DEFAULT, 0xFFFFFFFF, 0) == KAL_TRUE)
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ else
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ case RMMI_TEST_MODE: /*AT%DETACH=?*/
+ case RMMI_READ_MODE:
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ }
+ return;
+
+ }
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_rxmrd_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+void rmmi_rxmrd_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 rx_path;
+ kal_uint8 error_cause;
+ kal_bool nvram_write = KAL_FALSE; /* Not write rx_path on NVRAM */
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+ RMMI_PTR->action_cmd = RMMI_CMD_RXMRD;
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_rxmrd_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch(source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ case RMMI_TEST_MODE:
+ case RMMI_READ_MODE:
+ {
+ if(l4c_eq_set_rx_path_req(source_string_ptr->src_id, READ_RX_PATH, 12, nvram_write) == KAL_TRUE)
+ {
+ return;
+ }
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ rx_path = rmmi_int_validator_range_check(&error_cause, source_string_ptr, (kal_uint8) RMMI_COMMA, 2);
+ if(error_cause == RMMI_PARSE_OK)
+ {
+ if(rx_path == CUSTOM_RX_BOTH) rx_path = UL1_RX_PATH_BASE + UL1_RX_BOTH;
+ else if(rx_path == CUSTOM_RX_PRI) rx_path = UL1_RX_PATH_BASE + UL1_RX_RXD_ONLY;
+ else if(rx_path == CUSTOM_RX_DIV) rx_path = UL1_RX_PATH_BASE + UL1_RX_MAIN_ONLY;
+ nvram_write = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+ if(error_cause == RMMI_PARSE_OK)
+ {
+ ret_val = KAL_TRUE;
+ }
+ else if(error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ ret_val = KAL_TRUE;
+ nvram_write = KAL_FALSE;
+ }
+ }
+ if (ret_val == KAL_TRUE)
+ {
+ if(l4c_eq_set_rx_path_req(source_string_ptr->src_id, SET_RX_PATH, rx_path, nvram_write) == KAL_TRUE)
+ {
+ return;
+ }
+ }
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ default:
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ RMMI_PTR->action_cmd = RMMI_MAX_CMD_NUM;
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_mimoantcheck_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+void rmmi_mimoantcheck_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool ret_val = KAL_FALSE;
+ kal_uint8 rx_path;
+ kal_uint8 error_cause;
+ kal_bool nvram_write = KAL_FALSE; /* Not write rx_path on NVRAM */
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+ RMMI_PTR->action_cmd = RMMI_CMD_MIMOANTCHECK;
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_mimoantcheck_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch(source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE:
+ case RMMI_TEST_MODE:
+ case RMMI_READ_MODE:
+ {
+ if(l4c_eq_set_rx_path_req(source_string_ptr->src_id, READ_RX_PATH, 0, nvram_write) == KAL_TRUE)
+ {
+ return;
+ }
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ rx_path = rmmi_int_validator_range_check(&error_cause, source_string_ptr, (kal_uint8) RMMI_COMMA, 2);
+ if(error_cause == RMMI_PARSE_OK)
+ {
+ #ifdef __SUPPORT_PRX_DRX_SWITCHING__
+ if(rx_path == RX_PATH_0) rx_path = CUSTOM_RX_PATH_1_SWAP;
+ else if(rx_path == RX_PATH_1) rx_path = CUSTOM_RX_PATH_0_SWAP;
+ #else
+ if(rx_path == RX_PATH_0) rx_path = CUSTOM_RX_PATH_0;
+ else if(rx_path == RX_PATH_1) rx_path = CUSTOM_RX_PATH_1;
+ #endif
+ nvram_write = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+ if(error_cause == RMMI_PARSE_OK)
+ {
+ ret_val = KAL_TRUE;
+ }
+ else if(error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ ret_val = KAL_TRUE;
+ nvram_write = KAL_FALSE;
+ }
+ }
+ if (ret_val == KAL_TRUE)
+ {
+ if(l4c_eq_set_rx_path_req(source_string_ptr->src_id, SET_RX_PATH, rx_path, nvram_write) == KAL_TRUE)
+ {
+ return;
+ }
+ }
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "MIMOANTCHECK ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY);
+ break;
+ }
+ default:
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ RMMI_PTR->action_cmd = RMMI_MAX_CMD_NUM;
+
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_simtray_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+void rmmi_simtray_hdlr(rmmi_string_struct *source_string_ptr)
+{
+
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+#if defined (__SIM_HOT_SWAP_SUPPORT__) && (__DUAL_SIM_HOT_SWAP_CO_DECK_SUPPORT__)
+ kal_uint8 mode = 0;
+ kal_uint8 error_cause = 0;
+#endif
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ rmmi_custom_dbg_trace("rmmi_simtray_hdlr()");
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_simtray_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE: /* AT%SIMTRAY=? */
+ case RMMI_ACTIVE_MODE: /* AT%SIMTRAY */
+ case RMMI_READ_MODE: /* AT%SIMTRAY? */
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%SIMTRAY=XXX... */
+ #if defined (__SIM_HOT_SWAP_SUPPORT__) && ((__DUAL_SIM_HOT_SWAP_CO_DECK_SUPPORT__) || (__DUAL_SIM_HOT_SWAP_SEPARATE_DECK_SUPPORT__))
+ mode = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 3);
+ if(error_cause == RMMI_PARSE_OK && mode > 0)
+ {
+ mode--;
+ if(sim_get_card_status_tc01(mode))
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "DETECT", RMMI_PTR->arg_list, 0);
+ else
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+ else
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ #else
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT SUPPORT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ #endif
+ break;
+
+ default:
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+
+ return;
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_inisim_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_inisim_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%INISIM=XXX... */
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ case RMMI_ACTIVE_MODE: /* AT%INISIM */
+ case RMMI_READ_MODE: /* AT%INISIM? */
+ case RMMI_TEST_MODE: /* AT%INISIM=? */
+ {
+ kal_uint8 status;
+ if (L4C_PTR->smu_activated == L4C_SMU_ACTIVE)
+ {
+ status = 1;
+ }
+ else
+ {
+ status = 0;
+ }
+
+ RMMI_PTR->arg_list[0] = (void*)&status;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%d", RMMI_PTR->arg_list, 1);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break; /* unrecognized format of AT command line */
+ } /* end of the switch */
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_issim_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+void rmmi_issim_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint8 check_sim_inserted = 0;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ rmmi_custom_dbg_trace("rmmi_issim_hdlr()");
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_issim_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ /* AT%ISSIM=? */
+ case RMMI_TEST_MODE:
+ /* AT%ISSIM=XXX... */
+ case RMMI_SET_OR_EXECUTE_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ /* AT%ISSIM */
+ case RMMI_ACTIVE_MODE:
+ /* AT%ISSIM? */
+ case RMMI_READ_MODE:
+ if(is_sim_inserted(SIM1) == SMU_SIM_INSERTED)
+ check_sim_inserted++;
+
+ #ifdef __GEMINI__
+ if(is_sim_inserted(SIM2) == SMU_SIM_INSERTED)
+ check_sim_inserted++;
+ #if defined(GEMINI_PLUS) && (GEMINI_PLUS == 3)
+ if(is_sim_inserted(SIM3) == SMU_SIM_INSERTED)
+ check_sim_inserted++;
+
+ if(check_sim_inserted == 3)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "3", RMMI_PTR->arg_list, 0);
+ }
+ else
+ #endif /* (GEMINI_PLUS) && (GEMINI_PLUS == 3) */
+ if(check_sim_inserted == 2)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "2", RMMI_PTR->arg_list, 0);
+ }
+ else if(check_sim_inserted == 1)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "1", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "0", RMMI_PTR->arg_list, 0);
+ }
+ #else // __GEMINI__
+ RMMI_PTR->arg_list[0] = (void*)&check_sim_inserted;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%d", RMMI_PTR->arg_list, 1);
+ #endif // __GEMINI__
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+
+
+ default:
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_simid_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+void rmmi_simid_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ /* AT%SIMID=? */
+ case RMMI_TEST_MODE:
+ /* AT%SIMID=XXX... */
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+ /* AT%SIMID */
+ case RMMI_ACTIVE_MODE:
+ /* AT%SIMID? */
+ case RMMI_READ_MODE:
+ {
+ if (L4C_PTR->sim_detected == KAL_FALSE)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NO SIM ERROR", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ kal_uint8 iccid[11] = {0,};
+ kal_uint8 iccid_str[21] = {0,};
+
+ RMMI_CUST_GET_NVRAM_ICCID(l4c_current_mod_id,iccid);
+ iccid[10] = 0xFF;
+
+ if (iccid[0] == 0xFF)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NO SIM READ ERROR", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ convert_to_digit(iccid, iccid_str);
+ RMMI_PTR->arg_list[0] = (void*)iccid_str;
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "%s", RMMI_PTR->arg_list, 1);
+ }
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ default:
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ break; /* unrecognized format of AT command line */
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+
+ return;
+}
+
+/*****************************************************************************
+* FUNCTION
+* rmmi_simoff_hdlr
+* DESCRIPTION
+*
+* PARAMETERS
+* source_string_ptr [IN] At cmd string
+* RETURNS
+* void
+*****************************************************************************/
+#ifdef __VSIM__
+#if !defined(__FEATURE_TC01_SIMOFF_EXTENTION__)
+void rmmi_simoff_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint8 error_cause = 0;
+ kal_uint8 mode = 0;
+ kal_uint8 profile_id = 0;
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+ RMMI_PTR->action_cmd = RMMI_CMD_SIMOFF;
+
+ rmmi_custom_dbg_trace("rmmi_simoff_hdlr()");
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("rmmi_simoff_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ /* ---------------------------- Start of Implementation----------------------*/
+ /* AT%SIMOFF */
+ case RMMI_ACTIVE_MODE:
+ /* AT%SIMOFF? */
+ case RMMI_READ_MODE:
+ /* AT%SIMOFF=? */
+ case RMMI_TEST_MODE:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+ /* AT%SIMOFF=XXX... */
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ /* Get the mode, 1:switch_on 0:switch_off */
+ mode = rmmi_int_validator_range_check(&error_cause, source_string_ptr, (kal_uint8) RMMI_COMMA, 2);
+ if (error_cause == RMMI_PARSE_OK)
+ {
+ if(mode == 1)
+ {
+ /* Get the profile_id, 1:UIM 0:GSM (default) */
+ profile_id = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+
+ if (error_cause == RMMI_PARSE_NOT_FOUND)
+ {
+ error_cause = RMMI_PARSE_OK;
+ profile_id = 0;
+ }
+ }
+ }
+
+ if((error_cause == RMMI_PARSE_OK) && (mode != switch_on))
+ {
+ if (l4c_sim_vsim_req(source_string_ptr->src_id, mode, profile_id, 0) == KAL_TRUE)
+ {
+ switch_on = mode;
+ if(switch_on == 1)
+ l4crac_save_auto_attach_context(KAL_TRUE);
+ return;
+ }
+ }
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+ break;
+
+ default:
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ break;
+ /* ---------------------------- End of Implementation----------------------*/
+ } /* end of the switch */
+ }
+
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ RMMI_PTR->action_cmd = RMMI_MAX_CMD_NUM;
+ return;
+}
+#else
+kal_bool rmmi_util_atoi(kal_char src, kal_uint8* dest){
+ if((src>=0x30) && (src<=0x39)){
+ *dest = (kal_uint8)(src - 0x30);
+ }
+ else{
+ return KAL_FALSE;
+ }
+ return KAL_TRUE;
+}
+kal_bool rmmi_util_atoh(kal_char src, kal_uint8* dest){
+ if((src>=0x30) && (src<=0x39)){
+ *dest = (kal_uint8)(src - 0x30);
+ }
+ else if((src>=0x41) && (src<=0x5A)){
+ *dest = (kal_uint8)(src - 0x37);
+ }
+ else if((src>=0x61) && (src<=0x7A)){
+ *dest = (kal_uint8)(src - 0x57);
+ }
+ else{
+ return KAL_FALSE;
+ }
+ return KAL_TRUE;
+}
+void rmmi_util_upper(kal_uint8* src, kal_uint16 paramstr_len){
+ kal_uint16 idx = 0;
+ for(idx=0; idx<paramstr_len; idx++){
+ if((src[idx]>=0x61) && (src[idx]<=0x7A)){
+ src[idx] = src[idx] - 0x20;
+ }
+ }
+}
+kal_uint16 rmmi_remove_space(kal_uint8* src){
+ kal_uint8* temp = NULL;
+ kal_uint16 srclen = 0;
+ kal_uint16 idx = 0;
+ kal_uint16 idx2 = 0;
+ srclen = strlen((char*)src);
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_remove_space srclen=%d", srclen);
+ temp = (kal_uint8*)get_ctrl_buffer(srclen);
+ kal_mem_set(temp, 0x00, srclen);
+ kal_mem_cpy(temp, src, srclen);
+ kal_mem_set(src, 0x00, srclen);
+ for(idx=0; idx<srclen; idx++){
+ if(temp[idx] != 0x20){
+ src[idx2++] = temp[idx];
+ }
+ }
+ free_ctrl_buffer(temp);
+ return idx2;
+}
+kal_bool rmmi_simoff_set_vsim_mode(rmmi_string_struct *source_string_ptr, kal_uint8 mode){
+ kal_uint8 profile_id = 0;
+ kal_bool result = KAL_FALSE;
+ rmmi_context_struct* rmmi_ptr = RMMI_PTR;
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_set_vsim_mode mode=%d, switch_on=%d", mode, rmmi_ptr->switch_on);
+ if(mode != rmmi_ptr->switch_on){
+ if (l4c_sim_vsim_req(source_string_ptr->src_id, mode, profile_id, 0) == KAL_TRUE){
+ rmmi_ptr->switch_on = mode;
+ if(rmmi_ptr->switch_on == 1){
+ l4crac_save_auto_attach_context(KAL_TRUE);
+ }
+ result = KAL_TRUE;
+ }
+ else{
+ kal_prompt_trace(rmmi_current_mod_id, " rmmi_simoff_set_vsim_mode l4c_sim_vsim_req fail");
+ result = KAL_FALSE;
+ }
+ }
+ else{
+ result = KAL_FALSE;
+ }
+ return result;
+}
+kal_bool rmmi_simoff_normal_process(rmmi_string_struct *source_string_ptr, kal_uint8* paramstr, kal_uint16 paramstr_len){
+ kal_char modechar = 0x00;
+ kal_uint8 mode = 0;
+ kal_bool result = 0;
+ modechar = (kal_char)paramstr[0];
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_normal_process modechar=0x%02x", modechar);
+ if(rmmi_util_atoi(modechar, &mode) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_normal_process wrong mode");
+ return KAL_FALSE;
+ }
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_normal_process mode=%d", mode);
+ if(mode > 1){ result = KAL_FALSE; }
+ else{
+ result = rmmi_simoff_set_vsim_mode(source_string_ptr, mode);
+ }
+ return result;
+}
+kal_bool rmmi_simoff_modem_reset(rmmi_string_struct *source_string_ptr, kal_uint8* paramstr, kal_uint16 paramstr_len){
+ kal_bool result = 0;
+ kal_uint8 mode[3];
+ kal_uint8 auth[256];
+
+ kal_mem_set(auth, 0, sizeof(auth));
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_modem_reset");
+ kal_mem_set(mode, 0x00, 3);
+ kal_mem_cpy(mode, paramstr, paramstr_len);
+ rmmi_util_upper(mode, paramstr_len);
+ if(strncmp((kal_char*)mode, "0RE", paramstr_len) == 0){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_modem_reset VISM off and reset");
+ RMMI_PTR->action_cmd = RMMI_CMD_SIMOFF_RESET;
+ result = rmmi_simoff_set_vsim_mode(source_string_ptr, 0);
+ }
+ else if(strncmp((kal_char*)mode, "1,1", paramstr_len) == 0){ // To set RUIM_ONLY_INSIDE profile for AT%SIMOFF=1,1
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_modem_reset set RUIM profile");
+
+ /* Set the vsim_profile profile = 2 & vsim_type = RUIM_ONLY_INSIDE*/
+ l4c_vsim_profile_write_req(source_string_ptr->src_id, 1, 7, 0, auth, 0xFF);
+
+ return KAL_TRUE;
+ }
+ else{
+ result = KAL_FALSE;
+ }
+ return result;
+}
+kal_bool rmmi_simoff_update_reset_process(rmmi_string_struct *source_string_ptr, kal_uint8* paramstr, kal_uint16 paramstr_len){
+ kal_uint8 mode = 0;
+ kal_uint8 mccmnc[MAX_LEN_MCCMNC];
+ kal_uint8 iin[MAX_LEN_IIN];
+ kal_uint8 gid1[MAX_LEN_GID1];
+ kal_uint8 spn[MAX_LEN_SPN];
+ kal_uint16 offset = 0;
+ kal_uint16 remain = 0;
+ kal_uint16 idx = 0;
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process paramstr_len=%d", paramstr_len);
+ kal_mem_set(mccmnc, 0x00, MAX_LEN_MCCMNC);
+ kal_mem_set(iin, 0x00, MAX_LEN_IIN);
+ kal_mem_set(gid1, 0x00, MAX_LEN_GID1);
+ kal_mem_set(spn, 0x00, MAX_LEN_SPN);
+ RMMI_PTR->action_cmd = RMMI_CMD_SIMOFF_UPDATE_PARAM;
+ if(rmmi_util_atoi((kal_char)paramstr[offset], &mode) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process wrong mode");
+ return KAL_FALSE;
+ }
+ offset++;
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process mode=%d, offset=%d, switch_on=%d", mode, offset, RMMI_PTR->switch_on);
+ if((mode != 1) || (mode == RMMI_PTR->switch_on)){ return KAL_FALSE; }
+ for(idx=0; idx<MAX_LEN_MCCMNC; idx++){
+ if(rmmi_util_atoh((kal_char)paramstr[offset], &mccmnc[idx]) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process wrong mccmnc");
+ return KAL_FALSE;
+ }
+ if(mccmnc[idx] == 0x0F){ mccmnc[idx] = 0x00; }
+ offset++;
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process mccmnc[%d]=%x, offset=%d", idx, mccmnc[idx], offset);
+ }
+ for(idx=0; idx<MAX_LEN_IIN; idx++){
+ if(rmmi_util_atoi((kal_char)paramstr[offset], &iin[idx]) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process wrong iin");
+ }
+ offset++;
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process iin[%d]=%x, offset=%d", idx, iin[idx], offset);
+ }
+ for(idx=0; idx<MAX_LEN_GID1; idx++){
+ if(rmmi_util_atoi((kal_char)paramstr[offset], &gid1[idx]) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process wrong gid1");
+ }
+ offset++;
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process gid1[%d]=%x, offset=%d", idx, gid1[idx], offset);
+ }
+ remain = paramstr_len-offset;
+ for(idx=0; ((idx<remain) && (idx<MAX_LEN_SPN)); idx++){
+ if(idx == 0){
+ if(rmmi_util_atoi((kal_char)paramstr[offset], &spn[idx]) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process wrong spn");
+ return KAL_FALSE;
+ }
+ offset++;
+ }
+ else{
+ spn[idx] = paramstr[offset];
+ offset++;
+ }
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process spn[%d]=%x, offset=%d", idx, spn[idx], offset);
+ }
+ if(l4c_sim_vsim_update_req(source_string_ptr->src_id, RMMI_PTR->switch_on, 0, mode, mccmnc, iin, gid1, spn) == KAL_FALSE){
+ kal_prompt_trace(rmmi_current_mod_id, "rmmi_simoff_update_reset_process sending fail");
+ return KAL_FALSE;
+ }
+ return KAL_TRUE;
+}
+void rmmi_simoff_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool result = KAL_FALSE;
+ kal_uint16 srclen = 0;
+ kal_uint8* paramstr = NULL;
+ kal_uint16 paramstr_len = 0;
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+ RMMI_PTR->action_cmd = RMMI_CMD_SIMOFF;
+ rmmi_custom_dbg_trace("rmmi_simoff_hdlr()");
+ if ( source_string_ptr == NULL ) {
+ rmmi_custom_dbg_trace("rmmi_simoff_hdlr(), source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else{
+ switch (source_string_ptr->cmd_mode){
+ /* AT%SIMOFF */
+ case RMMI_ACTIVE_MODE:
+ /* AT%SIMOFF? */
+ case RMMI_READ_MODE:
+ /* AT%SIMOFF=? */
+ case RMMI_TEST_MODE:
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ case RMMI_SET_OR_EXECUTE_MODE:
+ srclen = rmmi_remove_space(source_string_ptr->string_ptr);
+ paramstr_len = srclen - LEN_SIMOFF_PREFIX;
+ kal_prompt_trace(rmmi_current_mod_id, " rmmi_simoff_hdlr srclen=%d, paramstr_len=%d", srclen, paramstr_len);
+ paramstr = (kal_uint8*)get_ctrl_buffer(paramstr_len);
+ kal_mem_cpy(paramstr, &source_string_ptr->string_ptr[LEN_SIMOFF_PREFIX-1], paramstr_len);
+ kal_prompt_trace(rmmi_current_mod_id, " strlen((char*)paramstr)=%d, paramstr_len=%d", strlen((char*)paramstr), paramstr_len);
+ if(paramstr_len == 1){
+ result = rmmi_simoff_normal_process(source_string_ptr, paramstr, paramstr_len);
+ if(result == KAL_TRUE){ return; }
+ }
+ else if(paramstr_len == 3){
+ result = rmmi_simoff_modem_reset(source_string_ptr, paramstr, paramstr_len);
+ if(result == KAL_TRUE){ return; }
+ }
+ else if(paramstr_len > 3){
+ result = rmmi_simoff_update_reset_process(source_string_ptr, paramstr, paramstr_len);
+ if(result == KAL_TRUE){ return; }
+ }
+ if(result == KAL_FALSE){
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+ break;
+ default:
+ /* unrecognized format of AT command line */
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ break;
+ }
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ RMMI_PTR->action_cmd = RMMI_MAX_CMD_NUM;
+}
+#endif
+#endif
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_bndi_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ void rmmi_bndi_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ rmmi_band_T band;
+ kal_uint8 gsm_band, supported_gsm_band;
+ kal_uint32 umts_band, supported_umts_fdd_band;
+
+ kal_uint32 lte_band[MAX_SUPPORTED_LTE_BAND], supported_lte_band[MAX_SUPPORTED_LTE_BAND];
+ kal_uint32 nr_band[MAX_SUPPORTED_NR_BAND], supported_nr_band[MAX_SUPPORTED_NR_BAND];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ }
+ else
+ {
+ kal_uint8 percent_char = RMMI_CUST_PERSENT;
+ kal_uint8 stx = RMMI_CUST_STX;
+ kal_uint8 etx = RMMI_CUST_ETX;
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ rmmi_band_init( &band );
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ {
+ RMMI_PTR->arg_list[0] = (void*)&stx;
+ RMMI_PTR->arg_list[1] = (void*)&percent_char;
+ RMMI_PTR->arg_list[2] = (void*)&etx;
+
+ rspstr_len = rmmi_fast_string_print( rspstr_ptr,
+ (kal_uint8*) "%cAT%cBNDI=[BAND : 3, 4, 6, 8]%c\r\n[3] : PCS\r\n[4] : DCS\r\n[6] : DUAL EXT\r\n[8] : DUAL US",
+ RMMI_PTR->arg_list, 3);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ case RMMI_ACTIVE_MODE:
+ case RMMI_READ_MODE:
+ {
+ if( l4c_nw_get_band_req( source_string_ptr->src_id,
+ &gsm_band,
+ &umts_band,
+ <e_band[0],
+ &nr_band[0],
+ &supported_gsm_band,
+ &supported_umts_fdd_band,
+ &supported_lte_band[0],
+ &supported_nr_band[0]) == KAL_TRUE )
+ {
+ RMMI_CUST_SET_RSP_TYPE(RMMI_CUST_RSP_WITH_OK);
+
+ switch( gsm_band )
+ {
+ case RMMI_CUST_BAND_PCS:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "PCS", RMMI_PTR->arg_list, 0);
+ }
+ break;
+ case RMMI_CUST_BAND_DCS:
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "DCS", RMMI_PTR->arg_list, 0);
+ }
+ break;
+ case (RMMI_CUST_BAND_EGSM |RMMI_CUST_BAND_DCS):
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "DUAL EXT", RMMI_PTR->arg_list, 0);
+ }
+ break;
+ case (RMMI_CUST_BAND_GSM850 |RMMI_CUST_BAND_PCS):
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "DUAL US", RMMI_PTR->arg_list, 0);
+ }
+ break;
+
+ default:
+ ; /* NOP */
+ }
+ }
+
+ }
+ break;
+
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ kal_uint8 opcode = (kal_uint8) rmmi_int_validator(source_string_ptr, (kal_uint8) RMMI_COMMA);
+
+ if (opcode == RMMI_VALIDATOR_ERROR)
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break; //invalid format
+ }
+ else
+ {
+ band.gsm_band= rmmi_cust_band_map( opcode );
+ kal_prompt_trace(MOD_L4C, "BNDI Opcode: %d, gsm band: %x", opcode, band.gsm_band);
+ if( band.gsm_band != RMMI_CUST_BNAD_NOT_SUPPORT )
+ {
+ if(l4c_nw_set_preferred_band_req( source_string_ptr->src_id,
+ band.gsm_band,
+ band.umts_band,
+ &band.lte_band[0],
+ &band.nr_band[0],
+ KAL_TRUE ) == KAL_TRUE )
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "BNDI OK", RMMI_PTR->arg_list, 0);
+ // the final "OK" will be print out after band selection succeed.
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+ else
+ {
+ /*rmmi_custom_dbg_trace("l4c_nw_set_preferred_band_req(), failed !!");*/
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ else
+ { /* band.gsm_band == RMMI_CUST_BNAD_NOT_SUPPORT */
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "BNDI ERROR", RMMI_PTR->arg_list, 0);
+ // the final "OK" will be print out after band selection succeed.
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ }
+ break;
+
+ default:
+ {
+ /* unrecognized format of AT command line */
+ /*rmmi_custom_dbg_trace("Unrecognized format of AT command line!");*/
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ }
+ return;
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_cust_band_map
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+static kal_uint8 rmmi_cust_band_map( kal_uint8 opcode )
+{
+ kal_uint8 ret;
+
+ switch( opcode )
+ {
+ case RMMI_CUST_BNDI_PARAM_PCS:
+ ret = RMMI_CUST_BAND_PCS;
+ break;
+ case RMMI_CUST_BNDI_PARAM_DCS:
+ ret = RMMI_CUST_BAND_DCS;
+ break;
+ case RMMI_CUST_BNDI_PARAM_DUAL_EXT:
+ ret = ( RMMI_CUST_BAND_EGSM |RMMI_CUST_BAND_DCS );
+ break;
+ case RMMI_CUST_BNDI_PARAM_DUAL_US:
+ ret = ( RMMI_CUST_BAND_GSM850 |RMMI_CUST_BAND_PCS );
+ break;
+ default:
+ ret = RMMI_CUST_BNAD_NOT_SUPPORT;
+ }
+
+ return ret;
+}
+
+/* For MOLY00165083 */
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_is_LTE_band_exist
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * kal_uint32 *
+ * RETURNS
+ * kal_bool
+ *****************************************************************************/
+static kal_bool rmmi_is_LTE_band_exist(kal_uint32 * lte_band)
+{
+ kal_uint8 i = 0;
+ kal_uint8 ret_val = KAL_FALSE; // invalid byte number
+
+ for(i = 0; i < MAX_SUPPORTED_LTE_BAND; i ++)
+ {
+ if(lte_band[i] != 0)
+ {
+ ret_val = KAL_TRUE;
+ break;
+ }
+ }
+ return ret_val;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_is_supported_band
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * kal_uint32 *, kal_uint32 *
+ * RETURNS
+ * kal_bool
+ *****************************************************************************/
+
+/* For MOLY00165083 */
+ static kal_bool rmmi_is_supported_band( kal_uint32 * supported_lte_band, const kal_uint32 * requested_lte_band )
+ {
+ kal_bool ret_val = KAL_FALSE;
+ if( ((supported_lte_band[0] & requested_lte_band[0]) == requested_lte_band[0])
+ && ((supported_lte_band[1] & requested_lte_band[1]) == requested_lte_band[1])
+ && ((supported_lte_band[2] & requested_lte_band[2]) == requested_lte_band[2])
+ && ((supported_lte_band[3] & requested_lte_band[3]) == requested_lte_band[3])
+ && ((supported_lte_band[4] & requested_lte_band[4]) == requested_lte_band[4])
+ && ((supported_lte_band[5] & requested_lte_band[5]) == requested_lte_band[5])
+ && ((supported_lte_band[6] & requested_lte_band[6]) == requested_lte_band[6])
+ && ((supported_lte_band[7] & requested_lte_band[7]) == requested_lte_band[7]) )
+ {
+ ret_val = KAL_TRUE;
+ }
+ return ret_val;
+ }
+
+/* For MOLY00165083 */
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_construct_band_value_and_string
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+static kal_uint16 rmmi_construct_band_value_and_string( kal_uint8 *rspstr_ptr,
+ kal_uint8 custom_band_value,
+ rmmi_band_T * band_ptr ,
+ kal_uint32 supported_gsm_band,
+ kal_uint32 supported_umts_fdd_band,
+ kal_uint32 * supported_lte_band,
+ kal_uint32 * supported_nr_band )
+{
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool result = KAL_FALSE;
+ kal_uint8 i = 0;
+
+ for(i=0; i<MAX_CAMPREQ_BAND; )
+ {
+ kal_prompt_trace(MOD_L4C, "table: %d, requested: %d", custom_band_table[i].custom_band, custom_band_value);
+
+ if( custom_band_table[i].custom_band == custom_band_value )
+ {
+ if( custom_band_value < CUST_BAND_WCDMA_I )
+ {
+ if( custom_band_value == CUST_BAND_GSM_ONLY )
+ {
+ if( supported_gsm_band != 0 )
+ {
+ band_ptr->band_present_bitmap |= GSM_BAND_PRESENT_BITMAP;
+ band_ptr->gsm_band = supported_gsm_band;
+ result = KAL_TRUE;
+ }
+ }
+ else if( (supported_gsm_band & (kal_uint8) custom_band_table[i].band[0])
+ == (kal_uint8) custom_band_table[i].band[0] )
+ {
+ band_ptr->band_present_bitmap |= GSM_BAND_PRESENT_BITMAP;
+ band_ptr->gsm_band |= (kal_uint8) custom_band_table[i].band[0];
+ result = KAL_TRUE;
+ }
+ }
+ else if( custom_band_value < CUST_BAND_LTE_ONLY )
+ {
+ if( custom_band_value == CUST_BAND_1X_ONLY )
+ {
+ ;// NOP
+ }
+ else if( custom_band_value == CUST_BAND_HDR_ONLY )
+ {
+ ;// NOP
+ }
+ else if( custom_band_value == CUST_BAND_TDSCDMA_ONLY )
+ {
+ ;// NOP
+ }
+ else if( custom_band_value == CUST_BAND_WCDMA_ONLY )
+ {
+ if( supported_umts_fdd_band != 0 )
+ {
+ band_ptr->band_present_bitmap |= UMTS_BAND_PRESENT_BITMAP;
+ band_ptr->umts_band = supported_umts_fdd_band;
+ result = KAL_TRUE;
+ }
+ }
+ else if( custom_band_value == CUST_BAND_Automatic )
+ {
+ if( supported_gsm_band != 0 )
+ {
+ band_ptr->band_present_bitmap |= GSM_BAND_PRESENT_BITMAP;
+ band_ptr->gsm_band = supported_gsm_band;
+ result = KAL_TRUE;
+ }
+ if( supported_umts_fdd_band != 0 )
+ {
+ band_ptr->band_present_bitmap |= UMTS_BAND_PRESENT_BITMAP;
+ band_ptr->umts_band = supported_umts_fdd_band;
+ result = KAL_TRUE;
+ }
+ if (rmmi_is_LTE_band_exist(&supported_lte_band[0]))
+ {
+ band_ptr->band_present_bitmap |= LTE_BAND_PRESENT_BITMAP;
+ kal_mem_cpy(&(band_ptr->lte_band[0]), &supported_lte_band[0], sizeof(kal_uint32)*MAX_SUPPORTED_LTE_BAND);
+ result = KAL_TRUE;
+ }
+ }
+ else if ( custom_band_value == CUST_BAND_GSM_WCDMA )
+ {
+ if( supported_gsm_band != 0 )
+ {
+ band_ptr->band_present_bitmap |= GSM_BAND_PRESENT_BITMAP;
+ band_ptr->gsm_band = supported_gsm_band;
+ result = KAL_TRUE;
+ }
+ if( supported_umts_fdd_band != 0 )
+ {
+ band_ptr->band_present_bitmap |= UMTS_BAND_PRESENT_BITMAP;
+ band_ptr->umts_band = supported_umts_fdd_band;
+ result = KAL_TRUE;
+ }
+ }
+ else if( (supported_umts_fdd_band & custom_band_table[i].band[0])
+ == custom_band_table[i].band[0] )
+ {
+ band_ptr->band_present_bitmap |= UMTS_BAND_PRESENT_BITMAP;
+ band_ptr->umts_band |= custom_band_table[i].band[0];
+ result = KAL_TRUE;
+ }
+ }
+ else
+ {
+ if( custom_band_value == CUST_BAND_LTE_ONLY )
+ {
+ if(rmmi_is_LTE_band_exist(&supported_lte_band[0]) )
+ {
+ band_ptr->band_present_bitmap |= LTE_BAND_PRESENT_BITMAP;
+ kal_mem_cpy(&(band_ptr->lte_band[0]), &supported_lte_band[0], sizeof(kal_uint32)*MAX_SUPPORTED_LTE_BAND);
+ result = KAL_TRUE;
+ }
+ }
+ else // specific LTE band request
+ {
+ if (rmmi_is_supported_band(&supported_lte_band[0], &(custom_band_table[i].band[0])))
+ {
+ band_ptr->band_present_bitmap |= LTE_BAND_PRESENT_BITMAP;
+ kal_mem_cpy(&(band_ptr->lte_band[0]), &(custom_band_table[i].band[0]), sizeof(kal_uint32)*MAX_SUPPORTED_LTE_BAND);
+ result = KAL_TRUE;
+ }
+ }
+ }
+ }
+
+ if (result == KAL_TRUE)
+ {
+ kal_prompt_trace(MOD_L4C, "Requested band: Band bitmap: [%x] LTE: [%x][%x], UMTS: [%x], GSM [%x]",
+ band_ptr->band_present_bitmap, band_ptr->lte_band[0], band_ptr->lte_band[1], band_ptr->umts_band, band_ptr->gsm_band);
+
+ if(rspstr_ptr != NULL)
+ {
+ rspstr_len = kal_sprintf( (char*)rspstr_ptr, "%c%s%c\n", 0x02, custom_band_table[i].band_str,0x03 );
+ }
+ break;
+ }
+ i++;
+ }
+
+ if(rspstr_ptr != NULL)
+ {
+ if ( result == KAL_TRUE )
+ {
+ rspstr_len += kal_sprintf( (char*)rspstr_ptr+rspstr_len, "%cOK%c", 0x02, 0x03);
+ }
+ else
+ {
+ rspstr_len += kal_sprintf( (char*)rspstr_ptr+rspstr_len, "%cNOT SUPPORT%c", 0x02, 0x03);
+ }
+ }
+
+ return rspstr_len;
+}
+
+rat_enum l4c_get_factory_rat_mode()
+{
+ return cust_fac_ptr_global->factory_change_rat;
+}
+
+void set_factory_rat_mode( kal_uint8 rat_band_bitmap )
+{
+ cust_fac_ptr_global->factory_change_rat = RAT_NONE;
+ if( (rat_band_bitmap & GSM_BAND_PRESENT_BITMAP) == GSM_BAND_PRESENT_BITMAP ) cust_fac_ptr_global->factory_change_rat |= RAT_GSM;
+ if( (rat_band_bitmap & UMTS_BAND_PRESENT_BITMAP) == UMTS_BAND_PRESENT_BITMAP ) cust_fac_ptr_global->factory_change_rat |= RAT_UMTS;
+ if( (rat_band_bitmap & LTE_BAND_PRESENT_BITMAP) == LTE_BAND_PRESENT_BITMAP ) cust_fac_ptr_global->factory_change_rat |= RAT_LTE;
+
+ return;
+}
+
+//AT_CAMPREQ MOLY00303967
+#ifdef __TC01__
+/*****************************************************************************
+* FUNCTION
+* rmmi_band_init
+* DESCRIPTION
+*
+* PARAMETERS
+*
+* RETURNS
+*
+*****************************************************************************/
+static void rmmi_band_init( rmmi_band_T * band )
+{
+ band->band_present_bitmap = 0;
+ band->gsm_band = 0;
+ band->umts_band = 0;
+ kal_mem_set(&band->lte_band[0], 0, sizeof(kal_uint32)*MAX_SUPPORTED_LTE_BAND);
+ kal_mem_set(&band->nr_band[0], 0, sizeof(kal_uint32)*MAX_SUPPORTED_NR_BAND); /* at%ltecall */
+ return;
+
+}
+#if 0 //block for warning
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+
+#ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+/*****************************************************************************
+* FUNCTION
+* rmmi_initial_campreq_with_set_rft_mode
+* DESCRIPTION
+*
+* PARAMETERS
+* void
+* RETURNS
+* boolean
+*****************************************************************************/
+kal_bool rmmi_initial_campreq_with_set_rft_mode( )
+{
+ kal_bool ret_val = KAL_FALSE;
+
+ if( L4C_COMM_PTR->cust_rft_mode == CUST_RFT_MODE_ENTERING )
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ ret_val = KAL_FALSE;
+ }
+ else
+ {
+ ret_val = l4c_nw_efun_state_req(RMMI_PTR->cust_cmd_src_id, 1, RFOFF_CAUSE_UNSPECIFIED);
+ if (ret_val == KAL_TRUE)
+ {
+ L4C_COMM_PTR->cust_rft_mode = CUST_RFT_MODE_ENTERING;
+ }
+ }
+
+ return ret_val;
+}
+#endif
+#ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+/*****************************************************************************
+* FUNCTION
+* rmmi_cust_init_campreq_rrsp
+* DESCRIPTION
+*
+* PARAMETERS
+* void
+* RETURNS
+* void
+*****************************************************************************/
+void rmmi_cust_init_campreq_rrsp( )
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ custom_factory_band_context_struct* rac_factory_ptr_g = cust_fac_ptr_global;
+ rmmi_band_T band;
+ kal_uint8 gsm_band, supported_gsm_band;
+ kal_uint32 umts_band, supported_umts_fdd_band;
+ kal_uint32 lte_band[MAX_SUPPORTED_LTE_BAND], supported_lte_band[MAX_SUPPORTED_LTE_BAND];
+ kal_uint32 nr_band[MAX_SUPPORTED_NR_BAND], supported_nr_band[MAX_SUPPORTED_NR_BAND];
+
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ RMMI_PTR->current_src = RMMI_PTR->cust_cmd_src_id;
+
+ L4C_COMM_PTR->cust_rft_mode = CUST_RFT_MODE_ON;
+ kal_prompt_trace(MOD_L4C, "rmmi_cust_init_campreq_rrsp()");
+ rmmi_band_init(&band);
+ if( l4c_nw_get_band_req( RMMI_PTR->cust_cmd_src_id,
+ &gsm_band,
+ &umts_band,
+ lte_band,
+ nr_band,
+ &supported_gsm_band,
+ &supported_umts_fdd_band,
+ supported_lte_band,
+ supported_nr_band) == KAL_TRUE )
+ {
+ rspstr_len = rmmi_construct_band_value_and_string ( rspstr_ptr,
+ L4C_COMM_PTR->init_campreq_mode,
+ &band,
+ supported_gsm_band,
+ supported_umts_fdd_band,
+ &supported_lte_band[0],
+ &supported_nr_band[0] );
+ }
+ else
+ {
+ rmmi_custom_dbg_trace("campreq - get supported band - failure!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+
+ if( band.band_present_bitmap )
+ {
+ set_factory_rat_mode(band.band_present_bitmap);
+ if(l4c_nw_set_preferred_band_req( RMMI_PTR->cust_cmd_src_id,
+ band.gsm_band,
+ band.umts_band,
+ band.lte_band,
+ band.nr_band,
+ KAL_TRUE ) == KAL_TRUE )
+ {
+ rac_factory_ptr_g->factory_dynamic_band = L4C_COMM_PTR->init_campreq_mode;
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+
+ if( rac_factory_ptr_g->initial_lte_call )
+ {
+ return;
+ }
+
+ rmmi_cust_final_rsp_generator(RMMI_PTR->current_src, (kal_uint8*) rspstr_ptr, rspstr_len );
+
+ return;
+
+ }
+#endif
+
+/*****************************************************************************
+* FUNCTION
+* rmmi_campreq_hdlr
+* DESCRIPTION
+*
+* PARAMETERS
+* source_string_ptr [IN] At cmd string
+* RETURNS
+* void
+*****************************************************************************/
+
+void rmmi_campreq_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ custom_factory_band_context_struct* rac_factory_ptr_g = cust_fac_ptr_global;
+ rmmi_band_T band;
+ kal_uint8 gsm_band, supported_gsm_band;
+ kal_uint32 umts_band, supported_umts_fdd_band;
+ kal_uint32 lte_band[MAX_SUPPORTED_LTE_BAND], supported_lte_band[MAX_SUPPORTED_LTE_BAND];
+ kal_uint32 nr_band[MAX_SUPPORTED_NR_BAND], supported_nr_band[MAX_SUPPORTED_NR_BAND];
+ kal_uint8 custom_band_value;
+
+ rmmi_band_init( &band );
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ case RMMI_READ_MODE:
+ case RMMI_ACTIVE_MODE:
+ // RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ //break;
+ case RMMI_SET_OR_EXECUTE_MODE: /* at%campreq */
+ {
+ kal_uint8 error_cause;
+
+ /* Get the mode */
+ custom_band_value = rmmi_int_validator_u8_check(&error_cause, source_string_ptr,RMMI_PTR->s_reg.s3 );
+ kal_prompt_trace(MOD_L4C, "campreq param: %d", custom_band_value);
+ if (custom_band_value == RMMI_VALIDATOR_ERROR)
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+#ifdef __AS_SPECIFIC_CHANNEL_SRCH__
+ gas_custom_set_specific_channel_srch( KAL_TRUE );
+ uas_custom_set_specific_channel_srch( KAL_TRUE );
+ eas_custom_set_specific_channel_srch( KAL_TRUE );
+
+ RMMI_PTR->cust_cmd_src_id = source_string_ptr->src_id;
+ /* Start MUSE - ALPS01198329 */
+ /* The device will make SIM2 flight mode in the MUSE factory test state. */
+ if( L4C_COMM_PTR->cust_rft_mode == CUST_RFT_MODE_OFF )
+ {
+ L4C_COMM_PTR->init_campreq_mode = custom_band_value;
+ if (L4C_ROOT_PTR->efun_state == SIM1_RADIO_ON)
+ {
+ L4C_COMM_PTR->cust_rft_mode = CUST_RFT_MODE_ON;
+ }
+ else
+ {
+ if ( rmmi_initial_campreq_with_set_rft_mode( ) == KAL_TRUE)
+ {
+ return;
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ return;
+ }
+ }
+ }
+ else if (L4C_COMM_PTR->cust_rft_mode == CUST_RFT_MODE_ENTERING )
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ return;
+ }
+#endif /* __AS_SPECIFIC_CHANNEL_SRCH__ */
+
+ rmmi_band_init(&band);
+
+ if( l4c_nw_get_band_req( source_string_ptr->src_id,
+ &gsm_band,
+ &umts_band,
+ lte_band,
+ nr_band,
+ &supported_gsm_band,
+ &supported_umts_fdd_band,
+ supported_lte_band,
+ supported_nr_band) == KAL_TRUE )
+ {
+ kal_prompt_trace(MOD_L4C, "Supported Band GSM[%x], UMTS[%x], LTE[%x][%x]",
+ supported_gsm_band, supported_umts_fdd_band, supported_lte_band[0], supported_lte_band[1]);
+
+ rspstr_len = rmmi_construct_band_value_and_string ( rspstr_ptr,
+ custom_band_value,
+ &band,
+ supported_gsm_band,
+ supported_umts_fdd_band,
+ &supported_lte_band[0],
+ &supported_nr_band[0] );
+ }
+ else
+ {
+ rmmi_custom_dbg_trace("campreq - get supported band - failure!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+
+ if( band.band_present_bitmap )
+ {
+ rac_factory_ptr_g->factory_dynamic_band = custom_band_value;
+ set_factory_rat_mode(band.band_present_bitmap);
+
+ if(l4c_nw_set_preferred_band_req( source_string_ptr->src_id,
+ band.gsm_band,
+ band.umts_band,
+ band.lte_band,
+ band.nr_band,
+ KAL_TRUE ) == KAL_TRUE )
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ }
+
+ }
+ }
+ break;
+
+ default:
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ /* unrecognized format of AT command line */
+ }
+ break;
+ } /* end of the switch */
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ return;
+
+}
+
+//Gen93_porting //AT_CAMP
+/*****************************************************************************
+* FUNCTION
+* rmmi_camp_hdlr
+* DESCRIPTION
+*
+* PARAMETERS
+* source_string_ptr [IN] At cmd string
+* RETURNS
+* void
+*****************************************************************************/
+void rmmi_camp_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint8 status;
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_TEST_MODE:
+ case RMMI_ACTIVE_MODE:
+ case RMMI_READ_MODE:
+ case RMMI_SET_OR_EXECUTE_MODE:
+ {
+ //l4crac_get_attach_status(&fake, &fake, &status);
+ status=l4crac_get_gsm_status();
+ if ((status == L4C_RAC_LIMITED_SERVICE) || (status == L4C_RAC_OK))
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "CAMP OK", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+ }
+ default:
+ {
+ /* unrecognized format of AT command line */
+ break;
+ }
+ } /* end of the switch */
+ }
+
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ return;
+
+}
+#endif /* (__TC01__) */
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_lbcall_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_lbcall_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint8 mode = 0;
+ kal_uint8 error_cause;
+
+
+ kal_mem_set(rmmi_rsp_buf, 0, sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: /* AT%LBCALL */
+ case RMMI_TEST_MODE: /* AT%LBCALL=? */
+ case RMMI_READ_MODE: /* AT%LBCALL? */
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NOT IMPLEMENT", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%LBCALL=XXX... */
+ {
+ mode = rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 1);
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ONLY );
+ break;
+ }
+ l4c_c2k_set_1x_loop_back_call_req(source_string_ptr->src_id, mode);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ break;
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ /* ---------------------------- End of Implementation----------------------*/
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+ }
+ return;
+}
+
+ /* AT%ECALL */
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_ecall_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ void rmmi_ecall_hdlr(rmmi_string_struct *source_string_ptr)
+ {
+ kal_uint8 * rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_uint8 ecc_mode = 0;
+ kal_uint8 error_cause = 0;
+ kal_uint8 sim_id;
+
+ /*rmmi_custom_dbg_trace("rmmi_ecall_hdlr()");*/
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ }
+ else
+ {
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ /* ---------------------------- Implement here ---------------------------*/
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: //AT%ECALL
+ case RMMI_TEST_MODE: //AT%ECALL=?
+ case RMMI_READ_MODE: //AT%ECALL?
+ {
+ if( rmmi_is_ecc_ongoing() == KAL_TRUE && RMMI_GET_ECALL_ACTION_STATE() == RMMI_ECALL_SETUP )
+ {
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "1", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "0", RMMI_PTR->arg_list, 0);
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+
+ case RMMI_SET_OR_EXECUTE_MODE: //AT%ECALL=<val>
+ {
+ ecc_mode = rmmi_int_validator_u8_check(&error_cause,source_string_ptr, (kal_uint8) RMMI_COMMA);
+
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ /* Response "ECALL ERROR" */
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "ECALL ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+
+ switch ( ecc_mode )
+ {
+ /* Behave just like ATH ,except the response data to PC*/
+ case RMMI_CUST_ECC_HUP:
+ {
+ if( rmmi_is_ecc_ongoing() == KAL_TRUE && RMMI_GET_ECALL_ACTION_STATE() == RMMI_ECALL_SETUP )
+ {
+ /* we use this flag to distinguish the request is from at%ecall. In order to output the response data for at%ecall */
+ RMMI_SET_ECALL_ACTION( RMMI_ECALL_CLEAR );
+ sim_id = rmmi_get_simid_call_exist();
+ rmmi_cust_invoke_ecc_call_clearing( source_string_ptr->src_id, sim_id );
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "[0]ECALL OFF", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ else
+ {
+ /* Response "ECALL ERROR" "ERROR" */
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "ECALL ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ break;
+ }
+
+ /* Behave just like ATD112; except the response data to PC*/
+ case RMMI_CUST_ECC_INVOKE:
+ {
+ /* Assume in service */
+ RMMI_ECALL_SET_NO_SRV_STATE( KAL_FALSE );
+
+ if( l4crac_get_gsm_status() == L4C_RAC_NO_CELL)
+ {
+ /* MAUI_02610201: this flag is used to prevent dialing ecc for a long time if MS is in no service */
+ RMMI_ECALL_SET_NO_SRV_STATE( KAL_TRUE );
+ }
+
+ sim_id = rmmi_get_simid_call_exist();
+
+ if ( sim_id != RMMI_INVALID_SIM_ID )
+ {
+ /* Response "ECALL ERROR" "ERROR" */
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "ECALL ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ else
+ {
+ if( rmmi_is_rac_activated( ) == KAL_TRUE )
+ {
+ /* we use this flag to distinguish the request is from at%ecall. In order to output the response data for at%ecall */
+ RMMI_SET_ECALL_ACTION( RMMI_ECALL_SETUP );
+ sim_id = RMMI_L4CID_MAP2_SIMID(l4c_current_mod_id);
+ rmmi_cust_invoke_ecc_call_setup( source_string_ptr->src_id, sim_id);
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "[1]ECALL ON", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "NETWORK NOT AVAILABLE", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ }
+
+ default:
+ {
+ /* Response "ECALL ERROR" */
+ rspstr_len = rmmi_fast_string_print_custom( rspstr_ptr, (kal_uint8*) "ECALL ERROR", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ {
+ /* unrecognized format of AT command line */
+ rmmi_custom_dbg_trace("Unrecognized format of AT command line!");
+
+ RMMI_CUST_SET_CMEE( RMMI_ERR_UNSPECIFIED );
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len);
+ /* ---------------------------- End of Implementation----------------------*/
+ }
+
+ return;
+ }
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_is_ecc_ongoing
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ static kal_bool rmmi_is_ecc_ongoing( )
+ {
+ kal_bool ret = KAL_FALSE;
+ kal_uint8 call_id = 0;
+ l4c_call_entry_struct call_info;
+ kal_bool ecc_exist = KAL_FALSE;
+ kal_uint8 sim_id = RMMI_INVALID_SIM_ID;
+ kal_uint8 restore_sim_if = 0;
+
+ sim_id = rmmi_get_simid_call_exist();
+
+ if ( sim_id != RMMI_L4CID_MAP2_SIMID(l4c_current_mod_id) )
+ {
+ /* call context is in SIM1 now ,switch to get SIM2 call information */
+ csmcc_context_selection( sim_id );
+ restore_sim_if = RMMI_L4CID_MAP2_SIMID(l4c_current_mod_id);
+ }
+
+ if((l4ccsm_cc_get_in_call (&call_id) == KAL_TRUE) &&
+ (l4ccsm_cc_get_call_info(call_id,&call_info,0) == KAL_TRUE) )
+ {
+ ecc_exist = ecc_custom_verify_emergency_number(
+ call_info.number.addr_bcd,
+ call_info.number.addr_length,
+ ECC_ENCODING_BCD,
+ RMMI_L4CID_MAP2_SIMID( l4c_current_mod_id ),
+ NULL, NULL, NULL);
+ }
+
+ if( restore_sim_if != RMMI_INVALID_SIM_ID )
+ {
+ /* after checking call info in the other side , we switch the call context back */
+ csmcc_context_selection( restore_sim_if );
+ }
+
+ /* check if there is ECC callsetup request ongoing */
+ for( sim_id = 0; sim_id < L4_MAX_SIM_NUM; sim_id ++ )
+ {
+ if((l4c_search_all_src(RMMI_SIMID_MAP2_L4CID(sim_id), ATD_ECC)== KAL_TRUE) || (ecc_exist == KAL_TRUE) )
+ {
+ ret = KAL_TRUE;
+ }
+ }
+
+ return ret;
+ }
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_get_simid_call_exist
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+ static kal_uint8 rmmi_get_simid_call_exist( )
+ {
+ kal_uint8 sim_id;
+
+ for( sim_id = 0; sim_id < L4_MAX_SIM_NUM; sim_id ++ )
+ {
+ if ( RMMI_IS_CALL_EXIST( sim_id ) == KAL_TRUE )
+ {
+ return sim_id;
+ }
+ }
+
+ return RMMI_INVALID_SIM_ID;
+ }
+
+ /*****************************************************************************
+ * FUNCTION
+ * rmmi_cust_invoke_ecc_call_clearing
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+static void rmmi_cust_invoke_ecc_call_clearing ( l4c_source_id_enum src_id, kal_uint8 sim_id )
+{
+
+ kal_sleep_task(KAL_TICKS_100_MSEC * 5);
+
+ l4c_cc_exe_chld_req(src_id, CSMCC_REL_ALL, l4c_cntxt_g->mo_call_id );
+
+ return;
+}
+
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_cust_invoke_ecc_call_setup
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+static void rmmi_cust_invoke_ecc_call_setup ( l4c_source_id_enum src_id, kal_uint8 sim_id )
+{
+ l4c_number_struct call_num;
+
+ call_num.type = 0xA1;
+ call_num.length = kal_sprintf ( (char*)&call_num.number[0], "112" );
+
+ l4c_cc_exe_call_setup_req(src_id, call_num, 0, CSMCC_VOICE_CALL, CLIR_AUTO, KAL_FALSE, ALS_DIAL_BY_SETTING, INFO_ECC_CALL);
+ l4c_cc_exe_call_setup_req(src_id, call_num, 0, CSMCC_VOICE_CALL, CLIR_AUTO, KAL_FALSE, ALS_DIAL_BY_SETTING, INFO_ECC_CALL);
+
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_is_rac_activated
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ *
+ * RETURNS
+ *
+ *****************************************************************************/
+static kal_bool rmmi_is_rac_activated()
+{
+ kal_uint8 sim_id;
+
+ for( sim_id = 0; sim_id < L4_MAX_SIM_NUM; sim_id ++ )
+ {
+ if ( RMMI_IS_RAC_ACTIVATED( sim_id ) == KAL_TRUE )
+ {
+ return KAL_TRUE;
+ }
+ }
+ return KAL_FALSE;
+}
+
+/* AT%FLIGHT */
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_flight_hdlr
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * source_string_ptr [IN] At cmd string
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_flight_hdlr(rmmi_string_struct *source_string_ptr)
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+ kal_bool ret_val = KAL_FALSE;
+
+#ifdef __GEMINI__
+#define RF_ON 3
+#define RF_OFF 0
+#else
+#define RF_ON 1
+#define RF_OFF 4
+#endif
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ if ( source_string_ptr == NULL )
+ {
+ rmmi_custom_dbg_trace("source_string_ptr is NULL!!!");
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ }
+ else
+ {
+ switch (source_string_ptr->cmd_mode)
+ {
+ case RMMI_ACTIVE_MODE: /* AT%FLIGHT */
+ case RMMI_READ_MODE: /* AT%FLIGHT? */
+ case RMMI_TEST_MODE: /* AT%FLIGHT=? */
+ {
+ #if defined(__GEMINI__)
+ if (L4C_ROOT_PTR->efun_state != SIM_RADIO_OFF)
+ #else
+ if (L4C_PTR->cfun_state == 1 )
+ #endif
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "0", RMMI_PTR->arg_list, 0);
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "1", RMMI_PTR->arg_list, 0);
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ case RMMI_SET_OR_EXECUTE_MODE: /* AT%FLIGHT=X */
+ {
+ kal_uint8 error_cause;
+ kal_uint8 flight_state;
+ kal_uint8 fun_state;
+
+ /* parse <flight> */
+ flight_state = (kal_uint8)rmmi_int_validator_range_check(&error_cause, source_string_ptr, RMMI_PTR->s_reg.s3, 0xFF);
+ if (error_cause != RMMI_PARSE_OK)
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+
+ if(flight_state == 1)
+ {
+ fun_state = RF_OFF;
+ #if defined(__GEMINI__)
+ if (L4C_ROOT_PTR->efun_state == SIM_RADIO_OFF)
+ #else
+ if (L4C_PTR->cfun_state == 4 )
+ #endif
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "[1] FLIGHT Mode ON", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ }
+ else if (flight_state == 0)
+ {
+ fun_state = RF_ON;
+ #ifdef __GEMINI__
+ if (L4C_ROOT_PTR->efun_state == (SIM1_RADIO_ON |SIM2_RADIO_ON))
+ #else
+ if (L4C_PTR->cfun_state == 1 )
+ #endif
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "[0] FLIGHT Mode OFF", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ break;
+ }
+ }
+ else
+ {
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+
+ #if defined(__GEMINI__)
+ ret_val = l4c_nw_efun_state_req(source_string_ptr->src_id, fun_state,RFOFF_CAUSE_UNSPECIFIED);
+ #else
+ ret_val = l4c_nw_cfun_state_req(source_string_ptr->src_id, fun_state);
+ #endif
+ if (ret_val == KAL_TRUE)
+ {
+ L4C_COMM_PTR->cust_flight_mode = KAL_TRUE;
+ RMMI_PTR->cust_cmd_src_id = source_string_ptr->src_id;
+ return;
+ }
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+
+ default:
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_ERROR );
+ break;
+ }
+ }
+ rmmi_cust_final_rsp_generator(source_string_ptr->src_id, (kal_uint8*) rspstr_ptr, rspstr_len );
+
+ return;
+}
+
+/*****************************************************************************
+ * FUNCTION
+ * rmmi_custom_bndi_read_rrsp
+ * DESCRIPTION
+ *
+ * PARAMETERS
+ * result [IN]
+ * length [IN]
+ * data [?]
+ * RETURNS
+ * void
+ *****************************************************************************/
+void rmmi_custom_flight_rrsp(kal_uint8 src_id)
+{
+ kal_uint8 *rspstr_ptr = NULL; /* response string and initialization */
+ kal_uint16 rspstr_len = 0; /* string length variable */
+
+ kal_mem_set(rmmi_rsp_buf,0,sizeof(rmmi_rsp_buf));
+ rspstr_ptr = &rmmi_rsp_buf[0];
+
+ L4C_COMM_PTR->cust_flight_mode = KAL_FALSE;
+ RMMI_PTR->current_src = RMMI_PTR->cust_cmd_src_id;
+
+#ifdef __GEMINI__
+ if (L4C_ROOT_PTR->efun_state == SIM_RADIO_OFF) //at_flight_patch
+#else
+ if (L4C_PTR->cfun_state==4)
+#endif
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "[1] FLIGHT Mode ON", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ else
+ {
+ rspstr_len = rmmi_fast_string_print_custom(rspstr_ptr, (kal_uint8*) "[0] FLIGHT Mode OFF", RMMI_PTR->arg_list, 0);
+ RMMI_CUST_SET_RSP_TYPE( RMMI_CUST_RSP_WITH_OK );
+ }
+ rmmi_cust_final_rsp_generator(RMMI_PTR->current_src, (kal_uint8*) rspstr_ptr, rspstr_len );
+}
+
+/*** END of rrsp functions *****/
+
+
+/****************************************/
+/* End of Custom AT command */
+/****************************************/
+RMMI_CUSTOM_CMD_FUNCTION const rmmi_custom_validator_ft[RMMI_MAX_CUSTOM_CMD_NUM] =
+{
+ #define CUSTOM_CMD(AT_NAME, HASH1, HASH2, TEST_STRING, ENUM, FUNC) FUNC,
+ #include "at_custom_cmd_tc01.h"
+ #undef CUSTOM_CMD
+};
+
+#endif /* __RMMI_EXTEND_CUSTOM_CMD__ */
+#endif /* __TC01__ */