[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,
+										 &lte_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__ */