Add DS support.

Change-Id: Ib8bc4e171dd5ca526f8e151ff3d467097582a8cb
diff --git a/mbtk/libmbtk_lib/ril/inc/mbtk_ril.h b/mbtk/libmbtk_lib/ril/inc/mbtk_ril.h
index 3ad1dd4..11cf8ec 100755
--- a/mbtk/libmbtk_lib/ril/inc/mbtk_ril.h
+++ b/mbtk/libmbtk_lib/ril/inc/mbtk_ril.h
@@ -20,8 +20,8 @@
 
 // Tag(4) + Packet_Length(2)
 #define RIL_SOCK_PACK_EXTRA_LEN 6
-// RIL_SOCK_PACK_EXTRA_LEN + at_port(1) + Index(2) + Type(2) + Id(2) + Error(2) + data_len(2)
-#define RIL_SOCK_PACK_LEN_MIN (RIL_SOCK_PACK_EXTRA_LEN + 11)
+// RIL_SOCK_PACK_EXTRA_LEN + at_port(1) + sim_id(1) + Index(2) + Type(2) + Id(2) + Error(2) + data_len(2)
+#define RIL_SOCK_PACK_LEN_MIN (RIL_SOCK_PACK_EXTRA_LEN + 12)
 
 #define RIL_MSG_INDEX_AUTO      (-1)         // automatically , refor to :  ril_index
 #define RIL_MSG_INDEX_INVALID   (0)       // Invalid msg index.
@@ -78,6 +78,8 @@
     RIL_MSG_ID_SIM_PINPUK_TIMES,
     // <string> PLMN
     RIL_MSG_ID_SIM_PLMN,
+    // <uint8>
+    RIL_MSG_ID_SIM_SWITCH,
 
     RIL_MSG_ID_SIM_END,
 
@@ -240,6 +242,7 @@
     uint16 msg_len;
 
     uint8 at_port;  // ATPortType_enum
+    uint8 sim_id;   // mbtk_sim_type_enum
     uint16 msg_index;   // Message index(Start from 1)
             // 0 : For unknown msg id
     uint16 msg_type;    // Refor to : ril_msg_type_enum
@@ -407,7 +410,7 @@
 
 void ril_msg_pack_free(ril_msg_pack_info_t* pack);
 
-ril_msg_pack_info_t* ril_msg_pack_creat(ATPortType_enum port, int msg_type, int msg_id, int msg_index, const void *data, int data_len);
+ril_msg_pack_info_t* ril_msg_pack_creat(mbtk_sim_type_enum sim_id, ATPortType_enum port, int msg_type, int msg_id, int msg_index, const void *data, int data_len);
 
 int ril_pack_send(int fd, ril_msg_pack_info_t *pack);
 
diff --git a/mbtk/libmbtk_lib/ril/v2/mbtk_ril_api.c b/mbtk/libmbtk_lib/ril/v2/mbtk_ril_api.c
index f881408..6e648ef 100755
--- a/mbtk/libmbtk_lib/ril/v2/mbtk_ril_api.c
+++ b/mbtk/libmbtk_lib/ril/v2/mbtk_ril_api.c
@@ -1,7 +1,7 @@
 /*
 *    mbtk_ril_api.c
 *
-*    MBTK ril API for v2.
+*    MBTK ril API for v2(Only for DS).
 *
 */
 /******************************************************************************
@@ -14,6 +14,7 @@
 2024/12/31     LiuBin      Auto open default port.
                            Add port index for open/close,close port only index is 0.
 2025/03/26     LiuBin      Add timeout for API(Default timeout is 10s).
+2025/04/22     LiuBin      Add DS(Dual Sim) support.
 ******************************************************************************/
 
 #include <stdio.h>
@@ -475,7 +476,7 @@
 * Return recv data length.
 * -1 : fail.
 */
-static mbtk_ril_err_enum ril_req_process(ATPortType_enum port,
+static mbtk_ril_err_enum ril_req_process(mbtk_sim_type_enum sim_id, ATPortType_enum port,
                              ril_msg_id_enum  id,
                              const void         *req,
                              int                req_len,
@@ -483,7 +484,7 @@
                              bool is_async,
                              int timeout)
 {
-    ril_msg_pack_info_t* pack = ril_msg_pack_creat(port, RIL_MSG_TYPE_REQ, id, RIL_MSG_INDEX_AUTO, req, req_len);
+    ril_msg_pack_info_t* pack = ril_msg_pack_creat(sim_id, port, RIL_MSG_TYPE_REQ, id, RIL_MSG_INDEX_AUTO, req, req_len);
     if(pack == NULL)
     {
         return MBTK_RIL_ERR_MEMORY;
@@ -795,7 +796,7 @@
 /*
 * Get platform version.
 */
-mbtk_ril_err_enum mbtk_version_get(mbtk_ril_handle* handle, void *version)
+mbtk_ril_err_enum mbtk_ds_version_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, void *version)
 {
     if(!ril_cli.ril_ready)
     {
@@ -813,13 +814,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_VERSION, NULL, 0, version, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DEV_VERSION, NULL, 0, version, FALSE, 0);
 }
 
 /*
 * Get platform version.
 */
-mbtk_ril_err_enum mbtk_model_get(mbtk_ril_handle* handle, void *model)
+mbtk_ril_err_enum mbtk_version_get(mbtk_ril_handle* handle, void *version)
+{
+    return mbtk_ds_version_get(handle, MBTK_SIM_AUTO, version);
+}
+
+/*
+* Get platform version.
+*/
+mbtk_ril_err_enum mbtk_ds_model_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, void *model)
 {
     if(!ril_cli.ril_ready)
     {
@@ -837,7 +846,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_MODEL, NULL, 0, model, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DEV_MODEL, NULL, 0, model, FALSE, 0);
+}
+
+/*
+* Get platform version.
+*/
+mbtk_ril_err_enum mbtk_model_get(mbtk_ril_handle* handle, void *model)
+{
+    return mbtk_ds_model_get(handle, MBTK_SIM_AUTO, model);
 }
 
 /*
@@ -861,7 +878,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_IMEI, NULL, 0, imei, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_IMEI, NULL, 0, imei, FALSE, 0);
 }
 
 
@@ -886,7 +903,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_SN, NULL, 0, sn, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_SN, NULL, 0, sn, FALSE, 0);
 }
 
 
@@ -911,7 +928,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_MEID, NULL, 0, meid, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_MEID, NULL, 0, meid, FALSE, 0);
 }
 
 
@@ -937,7 +954,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_VOLTE, NULL, 0, volte_state, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_VOLTE, NULL, 0, volte_state, FALSE, 0);
 }
 
 /*
@@ -967,13 +984,13 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_VOLTE, &volte_state, 1, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_VOLTE, &volte_state, 1, NULL, FALSE, 0);
 }
 
 /*
 * Return radio state.
 */
-mbtk_ril_err_enum mbtk_radio_state_get(mbtk_ril_handle* handle, mbtk_radio_state_enum *radio_state)
+mbtk_ril_err_enum mbtk_ds_radio_state_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_radio_state_enum *radio_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -993,11 +1010,20 @@
     }
 
     uint8 result;
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_DEV_MODEM, NULL, 0, &result, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DEV_MODEM, NULL, 0, &result, FALSE, 0);
     *radio_state = (mbtk_radio_state_enum)result;
     return err;
 }
 
+
+/*
+* Return radio state.
+*/
+mbtk_ril_err_enum mbtk_radio_state_get(mbtk_ril_handle* handle, mbtk_radio_state_enum *radio_state)
+{
+    return mbtk_ds_radio_state_get(handle, MBTK_SIM_AUTO, radio_state);
+}
+
 /*
 * Set radio state.
 *
@@ -1005,7 +1031,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_radio_state_set(mbtk_ril_handle* handle, mbtk_radio_state_enum radio_state, bool reset_modem)
+mbtk_ril_err_enum mbtk_ds_radio_state_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_radio_state_enum radio_state, bool reset_modem)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1027,10 +1053,23 @@
     buff[0] = (uint8)radio_state;
     buff[1] = reset_modem ? 1 : 0;
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_MODEM, buff, 2, NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DEV_MODEM, buff, 2, NULL, FALSE, 0);
 }
 
 /*
+* Set radio state.
+*
+* Refor to : mbtk_radio_state_enum
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_radio_state_set(mbtk_ril_handle* handle, mbtk_radio_state_enum radio_state, bool reset_modem)
+{
+    return mbtk_ds_radio_state_set(handle, MBTK_SIM_AUTO, radio_state, reset_modem);
+}
+
+
+/*
 * Get system temperature.
 *
 * type[IN]:
@@ -1060,7 +1099,7 @@
 
     int16 result;
     uint8 temp_temp = (uint8)type;
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_DEV_TEMP, &temp_temp, 1, &result, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_TEMP, &temp_temp, 1, &result, FALSE, 0);
     *temp = (int16)result;
     return err;
 }
@@ -1070,7 +1109,7 @@
 * Get time type.
 * "23/05/24,06:09:32+32" -> "23/05/24 06:09:32 +32 00"
 */
-mbtk_ril_err_enum mbtk_cell_time_get(mbtk_ril_handle* handle, char* time_str)
+mbtk_ril_err_enum mbtk_ds_cell_time_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char* time_str)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1089,7 +1128,7 @@
     }
 
     char buff[RIL_SOCK_MSG_LEN_MAX] = {0};
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_DEV_CELL_TIME, NULL, 0, &buff, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DEV_CELL_TIME, NULL, 0, &buff, FALSE, 0);
     if(MBTK_RIL_ERR_SUCCESS == err)
     {
         memcpy(time_str,buff,strlen(buff));
@@ -1141,9 +1180,18 @@
 }
 
 /*
+* Get time type.
+* "23/05/24,06:09:32+32" -> "23/05/24 06:09:32 +32 00"
+*/
+mbtk_ril_err_enum mbtk_cell_time_get(mbtk_ril_handle* handle, char* time_str)
+{
+    return mbtk_ds_cell_time_get(handle, MBTK_SIM_AUTO, time_str);
+}
+
+/*
 * Get sim state.
 */
-mbtk_ril_err_enum mbtk_sim_state_get(mbtk_ril_handle* handle, mbtk_sim_state_enum *sim_state)
+mbtk_ril_err_enum mbtk_ds_sim_state_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_sim_state_enum *sim_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1163,15 +1211,24 @@
     }
 
     uint8 result;
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_SIM_STATE, NULL, 0, &result, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_STATE, NULL, 0, &result, FALSE, 0);
     *sim_state = (mbtk_sim_state_enum)result;
     return err;
 }
 
 /*
+* Get sim state.
+*/
+mbtk_ril_err_enum mbtk_sim_state_get(mbtk_ril_handle* handle, mbtk_sim_state_enum *sim_state)
+{
+    return mbtk_ds_sim_state_get(handle, MBTK_SIM_AUTO, sim_state);
+}
+
+
+/*
 * Get sim card type.
 */
-mbtk_ril_err_enum mbtk_sim_type_get(mbtk_ril_handle* handle, mbtk_sim_card_type_enum *sim_card_type)
+mbtk_ril_err_enum mbtk_ds_sim_type_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_sim_card_type_enum *sim_card_type)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1191,15 +1248,23 @@
     }
 
     uint8 result;
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_SIM_TYPE, NULL, 0, &result, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_TYPE, NULL, 0, &result, FALSE, 0);
     *sim_card_type = (mbtk_sim_card_type_enum)result;
     return err;
 }
 
 /*
+* Get sim card type.
+*/
+mbtk_ril_err_enum mbtk_sim_type_get(mbtk_ril_handle* handle, mbtk_sim_card_type_enum *sim_card_type)
+{
+    return mbtk_ds_sim_type_get(handle, MBTK_SIM_AUTO, sim_card_type);
+}
+
+/*
 * Get platform IMSI.
 */
-mbtk_ril_err_enum mbtk_imsi_get(mbtk_ril_handle* handle, void *imsi)
+mbtk_ril_err_enum mbtk_ds_imsi_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, void *imsi)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1217,13 +1282,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SIM_IMSI, NULL, 0, imsi, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_IMSI, NULL, 0, imsi, FALSE, 0);
+}
+
+/*
+* Get platform IMSI.
+*/
+mbtk_ril_err_enum mbtk_imsi_get(mbtk_ril_handle* handle, void *imsi)
+{
+    return mbtk_ds_imsi_get(handle, MBTK_SIM_AUTO, imsi);
 }
 
 /*
 * Get platform ICCID.
 */
-mbtk_ril_err_enum mbtk_iccid_get(mbtk_ril_handle* handle, void *iccid)
+mbtk_ril_err_enum mbtk_ds_iccid_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, void *iccid)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1241,13 +1314,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SIM_ICCID, NULL, 0, iccid, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_ICCID, NULL, 0, iccid, FALSE, 0);
+}
+
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_iccid_get(mbtk_ril_handle* handle, void *iccid)
+{
+    return mbtk_ds_iccid_get(handle, MBTK_SIM_AUTO, iccid);
 }
 
 /*
 * Get current phone number.
 */
-mbtk_ril_err_enum mbtk_phone_number_get(mbtk_ril_handle* handle, void *phone_number)
+mbtk_ril_err_enum mbtk_ds_phone_number_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, void *phone_number)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1265,13 +1346,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SIM_PN, NULL, 0, phone_number, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_PN, NULL, 0, phone_number, FALSE, 0);
+}
+
+/*
+* Get current phone number.
+*/
+mbtk_ril_err_enum mbtk_phone_number_get(mbtk_ril_handle* handle, void *phone_number)
+{
+    return mbtk_ds_phone_number_get(handle, MBTK_SIM_AUTO, phone_number);
 }
 
 /*
 * Get platform ICCID.
 */
-mbtk_ril_err_enum mbtk_sim_lock_get(mbtk_ril_handle* handle, int *lock_state)
+mbtk_ril_err_enum mbtk_ds_sim_lock_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int *lock_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1291,16 +1380,23 @@
     }
 
     uint8 result;
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_SIM_LOCK, NULL, 0, &result, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_LOCK, NULL, 0, &result, FALSE, 0);
     *lock_state = result;
     return err;
 }
 
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_sim_lock_get(mbtk_ril_handle* handle, int *lock_state)
+{
+    return mbtk_ds_sim_lock_get(handle, MBTK_SIM_AUTO, lock_state);
+}
 
 /*
 * Get platform ICCID.
 */
-mbtk_ril_err_enum mbtk_sim_lock_set(mbtk_ril_handle* handle, mbtk_sim_lock_info_t *lock_info)
+mbtk_ril_err_enum mbtk_ds_sim_lock_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_sim_lock_info_t *lock_info)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1318,13 +1414,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SIM_LOCK, lock_info, sizeof(mbtk_sim_lock_info_t), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_LOCK, lock_info, sizeof(mbtk_sim_lock_info_t), NULL, FALSE, 0);
+}
+
+/*
+* Get platform ICCID.
+*/
+mbtk_ril_err_enum mbtk_sim_lock_set(mbtk_ril_handle* handle, mbtk_sim_lock_info_t *lock_info)
+{
+    return mbtk_ds_sim_lock_set(handle, MBTK_SIM_AUTO, lock_info);
 }
 
 /*
 * Get PIN’s number of remaining retry
 */
-mbtk_ril_err_enum mbtk_sim_lock_retry_times_get(mbtk_ril_handle* handle, mbtk_pin_puk_last_times_t *retry_times)
+mbtk_ril_err_enum mbtk_ds_sim_lock_retry_times_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_pin_puk_last_times_t *retry_times)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1343,13 +1447,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SIM_PINPUK_TIMES, NULL, 0, retry_times, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_PINPUK_TIMES, NULL, 0, retry_times, FALSE, 0);
+}
+
+/*
+* Get PIN’s number of remaining retry
+*/
+mbtk_ril_err_enum mbtk_sim_lock_retry_times_get(mbtk_ril_handle* handle, mbtk_pin_puk_last_times_t *retry_times)
+{
+    return mbtk_ds_sim_lock_retry_times_get(handle, MBTK_SIM_AUTO, retry_times);
 }
 
 /*
 * Get plmn list
 */
-mbtk_ril_err_enum mbtk_plmn_list_get(mbtk_ril_handle* handle, mbtk_plmn_info *plmn_list)
+mbtk_ril_err_enum mbtk_ds_plmn_list_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_plmn_info *plmn_list)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1368,13 +1480,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SIM_PLMN, NULL, 0, plmn_list, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SIM_PLMN, NULL, 0, plmn_list, FALSE, 0);
+}
+
+/*
+* Get plmn list
+*/
+mbtk_ril_err_enum mbtk_plmn_list_get(mbtk_ril_handle* handle, mbtk_plmn_info *plmn_list)
+{
+    return mbtk_ds_plmn_list_get(handle, MBTK_SIM_AUTO, plmn_list);
 }
 
 /*
 * Get available network.
 */
-mbtk_ril_err_enum mbtk_available_net_get(mbtk_ril_handle* handle, mbtk_net_info_array_t *net_array)
+mbtk_ril_err_enum mbtk_ds_available_net_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_net_info_array_t *net_array)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1393,13 +1513,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_AVAILABLE, NULL, 0, net_array, FALSE, -1);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_AVAILABLE, NULL, 0, net_array, FALSE, -1);
+}
+
+/*
+* Get available network.
+*/
+mbtk_ril_err_enum mbtk_available_net_get(mbtk_ril_handle* handle, mbtk_net_info_array_t *net_array)
+{
+    return mbtk_ds_available_net_get(handle, MBTK_SIM_AUTO, net_array);
 }
 
 /*
 * Set network select mode. (+COPS=...)
 */
-mbtk_ril_err_enum mbtk_net_sel_mode_set(mbtk_ril_handle* handle, const mbtk_net_info_t *net)
+mbtk_ril_err_enum mbtk_ds_net_sel_mode_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, const mbtk_net_info_t *net)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1417,13 +1545,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_SEL_MODE, net, sizeof(mbtk_net_info_t), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_SEL_MODE, net, sizeof(mbtk_net_info_t), NULL, FALSE, 0);
+}
+
+/*
+* Set network select mode. (+COPS=...)
+*/
+mbtk_ril_err_enum mbtk_net_sel_mode_set(mbtk_ril_handle* handle, const mbtk_net_info_t *net)
+{
+    return mbtk_ds_net_sel_mode_set(handle, MBTK_SIM_AUTO, net);
 }
 
 /*
 * Get network select mode. (+COPS?)
 */
-mbtk_ril_err_enum mbtk_net_sel_mode_get(mbtk_ril_handle* handle, mbtk_net_info_t *net)
+mbtk_ril_err_enum mbtk_ds_net_sel_mode_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_net_info_t *net)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1442,7 +1578,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_SEL_MODE, NULL, 0, net, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_SEL_MODE, NULL, 0, net, FALSE, 0);
+}
+
+/*
+* Get network select mode. (+COPS?)
+*/
+mbtk_ril_err_enum mbtk_net_sel_mode_get(mbtk_ril_handle* handle, mbtk_net_info_t *net)
+{
+    return mbtk_ds_net_sel_mode_get(handle, MBTK_SIM_AUTO, net);
 }
 
 /*
@@ -1468,13 +1612,13 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_BAND, &type, sizeof(uint8), band, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_NET_BAND, &type, sizeof(uint8), band, FALSE, 0);
 }
 
 /*
 * Get platform current bands.
 */
-mbtk_ril_err_enum mbtk_current_band_get(mbtk_ril_handle* handle, mbtk_band_info_t *band)
+mbtk_ril_err_enum mbtk_ds_current_band_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_band_info_t *band)
 {
     uint8 type = 1; // Get current bands.
     if(!ril_cli.ril_ready)
@@ -1494,13 +1638,22 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_BAND, &type, sizeof(uint8), band, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_BAND, &type, sizeof(uint8), band, FALSE, 0);
+}
+
+
+/*
+* Get platform current bands.
+*/
+mbtk_ril_err_enum mbtk_current_band_get(mbtk_ril_handle* handle, mbtk_band_info_t *band)
+{
+    return mbtk_ds_current_band_get(handle, MBTK_SIM_AUTO, band);
 }
 
 /*
 * Set platform current bands.
 */
-mbtk_ril_err_enum mbtk_current_band_set(mbtk_ril_handle* handle, const mbtk_band_info_t *band)
+mbtk_ril_err_enum mbtk_ds_current_band_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, const mbtk_band_info_t *band)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1518,13 +1671,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_BAND, band, sizeof(mbtk_band_info_t), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_BAND, band, sizeof(mbtk_band_info_t), NULL, FALSE, 0);
+}
+
+/*
+* Set platform current bands.
+*/
+mbtk_ril_err_enum mbtk_current_band_set(mbtk_ril_handle* handle, const mbtk_band_info_t *band)
+{
+    return mbtk_ds_current_band_set(handle, MBTK_SIM_AUTO, band);
 }
 
 /*
 * Get current cell infomation.
 */
-mbtk_ril_err_enum mbtk_cell_get(mbtk_ril_handle* handle, mbtk_cell_info_array_t *cell_array)
+mbtk_ril_err_enum mbtk_ds_cell_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_cell_info_array_t *cell_array)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1543,7 +1704,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_CELL, NULL, 0, cell_array, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_CELL, NULL, 0, cell_array, FALSE, 0);
+}
+
+/*
+* Get current cell infomation.
+*/
+mbtk_ril_err_enum mbtk_cell_get(mbtk_ril_handle* handle, mbtk_cell_info_array_t *cell_array)
+{
+    return mbtk_ds_cell_get(handle, MBTK_SIM_AUTO, cell_array);
 }
 
 /*
@@ -1555,7 +1724,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_cell_set(mbtk_ril_handle* handle, char *info, char *response)
+mbtk_ril_err_enum mbtk_ds_cell_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char *info, char *response)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1573,13 +1742,27 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_CELL, info, strlen(info), response, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_CELL, info, strlen(info), response, FALSE, 0);
+}
+
+/*
+* Set cell info.
+*
+* at*CELL=<mode>,<act>,< band>,<freq>,<cellId>
+* at*cell=2,3,,40936,429   //
+* at*cell=0  //
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_cell_set(mbtk_ril_handle* handle, char *info, char *response)
+{
+    return mbtk_ds_cell_set(handle, MBTK_SIM_AUTO, info, response);
 }
 
 /*
 * Get current network signal.
 */
-mbtk_ril_err_enum mbtk_net_signal_get(mbtk_ril_handle* handle, mbtk_signal_info_t *signal)
+mbtk_ril_err_enum mbtk_ds_net_signal_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_signal_info_t *signal)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1598,13 +1781,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_SIGNAL, NULL, 0, signal, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_SIGNAL, NULL, 0, signal, FALSE, 0);
+}
+
+/*
+* Get current network signal.
+*/
+mbtk_ril_err_enum mbtk_net_signal_get(mbtk_ril_handle* handle, mbtk_signal_info_t *signal)
+{
+    return mbtk_ds_net_signal_get(handle, MBTK_SIM_AUTO, signal);
 }
 
 /*
 * Get current network register information.
 */
-mbtk_ril_err_enum mbtk_net_reg_get(mbtk_ril_handle* handle, mbtk_net_reg_info_t *reg)
+mbtk_ril_err_enum mbtk_ds_net_reg_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_net_reg_info_t *reg)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1623,13 +1814,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_REG, NULL, 0, reg, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_REG, NULL, 0, reg, FALSE, 0);
+}
+
+/*
+* Get current network register information.
+*/
+mbtk_ril_err_enum mbtk_net_reg_get(mbtk_ril_handle* handle, mbtk_net_reg_info_t *reg)
+{
+    return mbtk_ds_net_reg_get(handle, MBTK_SIM_AUTO, reg);
 }
 
 /*
 * oos get.
 */
-mbtk_ril_err_enum mbtk_oos_get(mbtk_ril_handle* handle, mbtk_ril_oos_info_t *oos_info)
+mbtk_ril_err_enum mbtk_ds_oos_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_ril_oos_info_t *oos_info)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1648,13 +1847,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_OOS, NULL, 0, oos_info, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_OOS, NULL, 0, oos_info, FALSE, 0);
+}
+
+/*
+* oos get.
+*/
+mbtk_ril_err_enum mbtk_oos_get(mbtk_ril_handle* handle, mbtk_ril_oos_info_t *oos_info)
+{
+    return mbtk_ds_oos_get(handle, MBTK_SIM_AUTO, oos_info);
 }
 
 /*
 * oos set .
 */
-mbtk_ril_err_enum mbtk_oos_set(mbtk_ril_handle* handle, const mbtk_ril_oos_info_t *oos_info)
+mbtk_ril_err_enum mbtk_ds_oos_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, const mbtk_ril_oos_info_t *oos_info)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1672,7 +1879,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_NET_OOS, oos_info, sizeof(mbtk_ril_oos_info_t), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_NET_OOS, oos_info, sizeof(mbtk_ril_oos_info_t), NULL, FALSE, 0);
+}
+
+/*
+* oos set .
+*/
+mbtk_ril_err_enum mbtk_oos_set(mbtk_ril_handle* handle, const mbtk_ril_oos_info_t *oos_info)
+{
+    return mbtk_ds_oos_set(handle, MBTK_SIM_AUTO, oos_info);
 }
 
 /*
@@ -1683,7 +1898,7 @@
 * 1~31 means suspend
 * Control the active reporting of some platform modems to reduce wakeup
 */
-mbtk_ril_err_enum mbtk_wakeup_state_set(mbtk_ril_handle* handle, int wakeup_state)
+mbtk_ril_err_enum mbtk_ds_wakeup_state_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int wakeup_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1701,13 +1916,26 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_POWERIND, &wakeup_state, sizeof(uint8), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DEV_POWERIND, &wakeup_state, sizeof(uint8), NULL, FALSE, 0);
+}
+
+/*
+* Set wakeup state.
+*
+* wakeup_state:(0~31)
+* 0 : means resume all
+* 1~31 means suspend
+* Control the active reporting of some platform modems to reduce wakeup
+*/
+mbtk_ril_err_enum mbtk_wakeup_state_set(mbtk_ril_handle* handle, int wakeup_state)
+{
+    return mbtk_ds_wakeup_state_set(handle, MBTK_SIM_AUTO, wakeup_state);
 }
 
 /*
 * Get all APN informations.
 */
-mbtk_ril_err_enum mbtk_apn_get(mbtk_ril_handle* handle, mbtk_apn_info_array_t *apns)
+mbtk_ril_err_enum mbtk_ds_apn_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_apn_info_array_t *apns)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1726,14 +1954,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DATA_CALL_APN, NULL, 0, apns, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DATA_CALL_APN, NULL, 0, apns, FALSE, 0);
 }
 
+/*
+* Get all APN informations.
+*/
+mbtk_ril_err_enum mbtk_apn_get(mbtk_ril_handle* handle, mbtk_apn_info_array_t *apns)
+{
+    return mbtk_ds_apn_get(handle, MBTK_SIM_AUTO, apns);
+}
 
 /*
 * Set current APN informations.
 */
-mbtk_ril_err_enum mbtk_apn_set(mbtk_ril_handle* handle, mbtk_apn_info_t *apn)
+mbtk_ril_err_enum mbtk_ds_apn_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_apn_info_t *apn)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1763,15 +1998,23 @@
         }
     }
 
-    err = ril_req_process(port_info->port, RIL_MSG_ID_DATA_CALL_APN, apn, sizeof(mbtk_apn_info_t), &return_cid, FALSE, 0);
+    err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DATA_CALL_APN, apn, sizeof(mbtk_apn_info_t), &return_cid, FALSE, 0);
     apn->cid = return_cid;
     return err;
 }
 
 /*
+* Set current APN informations.
+*/
+mbtk_ril_err_enum mbtk_apn_set(mbtk_ril_handle* handle, mbtk_apn_info_t *apn)
+{
+    return mbtk_ds_apn_set(handle, MBTK_SIM_AUTO, apn);
+}
+
+/*
 * Start data call.
 */
-mbtk_ril_err_enum mbtk_data_call_start(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, mbtk_data_call_item_state_enum auto_boot_call,
+mbtk_ril_err_enum mbtk_ds_data_call_start(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_ril_cid_enum cid, mbtk_data_call_item_state_enum auto_boot_call,
             mbtk_data_call_item_state_enum def_route, mbtk_data_call_item_state_enum as_dns, int *retry_interval, int retry_interval_num,
             int timeout, mbtk_ip_info_t *rsp_info)
 {
@@ -1812,13 +2055,24 @@
         info.timeout = (uint16)10;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DATA_CALL_OPT, &info, sizeof(mbtk_data_call_info_t), rsp_info, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DATA_CALL_OPT, &info, sizeof(mbtk_data_call_info_t), rsp_info, FALSE, 0);
+}
+
+/*
+* Start data call.
+*/
+mbtk_ril_err_enum mbtk_data_call_start(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, mbtk_data_call_item_state_enum auto_boot_call,
+            mbtk_data_call_item_state_enum def_route, mbtk_data_call_item_state_enum as_dns, int *retry_interval, int retry_interval_num,
+            int timeout, mbtk_ip_info_t *rsp_info)
+{
+    return mbtk_ds_data_call_start(handle, MBTK_SIM_AUTO, cid, auto_boot_call,
+                def_route, as_dns, retry_interval, retry_interval_num, timeout, rsp_info);
 }
 
 /*
 * Stop data call.
 */
-mbtk_ril_err_enum mbtk_data_call_stop(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, int timeout)
+mbtk_ril_err_enum mbtk_ds_data_call_stop(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_ril_cid_enum cid, int timeout)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1846,13 +2100,21 @@
     if(timeout > 0) {
         info.timeout = (uint16)timeout;
     }
-    return ril_req_process(port_info->port, RIL_MSG_ID_DATA_CALL_OPT, &info, sizeof(mbtk_data_call_info_t), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DATA_CALL_OPT, &info, sizeof(mbtk_data_call_info_t), NULL, FALSE, 0);
+}
+
+/*
+* Stop data call.
+*/
+mbtk_ril_err_enum mbtk_data_call_stop(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, int timeout)
+{
+    return mbtk_ds_data_call_stop(handle, MBTK_SIM_AUTO, cid, timeout);
 }
 
 /*
 * Get data call state.
 */
-mbtk_ril_err_enum mbtk_data_call_state_get(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, mbtk_ip_info_t *ip)
+mbtk_ril_err_enum mbtk_ds_data_call_state_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_ril_cid_enum cid, mbtk_ip_info_t *ip)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1880,13 +2142,21 @@
     info.type = MBTK_DATA_CALL_STATE;
     info.cid = cid;
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_DATA_CALL_OPT, &info, sizeof(mbtk_data_call_info_t), ip, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_DATA_CALL_OPT, &info, sizeof(mbtk_data_call_info_t), ip, FALSE, 0);
+}
+
+/*
+* Get data call state.
+*/
+mbtk_ril_err_enum mbtk_data_call_state_get(mbtk_ril_handle* handle, mbtk_ril_cid_enum cid, mbtk_ip_info_t *ip)
+{
+    return mbtk_ds_data_call_state_get(handle, MBTK_SIM_AUTO, cid, ip);
 }
 
 /*
 * Return sms cmgf.
 */
-mbtk_ril_err_enum mbtk_sms_cmgf_get(mbtk_ril_handle* handle, int *sms_state)
+mbtk_ril_err_enum mbtk_ds_sms_cmgf_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int *sms_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1906,12 +2176,20 @@
     }
 
     uint8 state;
-    mbtk_ril_err_enum err = ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGF, NULL, 0, &state, FALSE, 0);
+    mbtk_ril_err_enum err = ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGF, NULL, 0, &state, FALSE, 0);
     *sms_state = state;
     return err;
 }
 
 /*
+* Return sms cmgf.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgf_get(mbtk_ril_handle* handle, int *sms_state)
+{
+    return mbtk_ds_sms_cmgf_get(handle, MBTK_SIM_AUTO, sms_state);
+}
+
+/*
 * Set sms cmgf.
 *
 * volte_state:
@@ -1920,7 +2198,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_cmgf_set(mbtk_ril_handle* handle, int mode)
+mbtk_ril_err_enum mbtk_ds_sms_cmgf_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int mode)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1938,7 +2216,21 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGF, &mode, sizeof(uint8), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGF, &mode, sizeof(uint8), NULL, FALSE, 0);
+}
+
+/*
+* Set sms cmgf.
+*
+* volte_state:
+* 0 : PDU mode.
+* 1 :  text mode.
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgf_set(mbtk_ril_handle* handle, int mode)
+{
+    return mbtk_ds_sms_cmgf_set(handle, MBTK_SIM_AUTO, mode);
 }
 
 /*
@@ -1954,7 +2246,7 @@
 
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_cmgs_set(mbtk_ril_handle* handle, char * cmgs, char *resp)
+mbtk_ril_err_enum mbtk_ds_sms_cmgs_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cmgs, char *resp)
 {
     if(!ril_cli.ril_ready)
     {
@@ -1972,7 +2264,25 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGS, cmgs, strlen(cmgs), resp, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGS, cmgs, strlen(cmgs), resp, FALSE, 0);
+}
+
+/*
+* Set sms cmgs.
+*
+if PDU mode (+CMGF=0):
++CMGS=<length><CR>
+PDU is given<ctrl-Z/ESC>
+
+if text mode (+CMGF=1):
++CMGS=<da>[,<toda>]<CR>
+text is entered<ctrl-Z/ESC>
+
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgs_set(mbtk_ril_handle* handle, char * cmgs, char *resp)
+{
+    return mbtk_ds_sms_cmgs_set(handle, MBTK_SIM_AUTO, cmgs, resp);
 }
 
 /*
@@ -1987,7 +2297,7 @@
 given<ctrl-Z/ESC>
 
 */
-mbtk_ril_err_enum mbtk_sms_cmgw_set(mbtk_ril_handle* handle, char * cmgw, char *resp)
+mbtk_ril_err_enum mbtk_ds_sms_cmgw_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cmgw, char *resp)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2005,7 +2315,53 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGW, cmgw, strlen(cmgw), resp, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGW, cmgw, strlen(cmgw), resp, FALSE, 0);
+}
+
+/*
+* Set sms cmgw.
+*
+if text mode (+CMGF=1):
++CMGW=<oa/da>[,<tooa/toda>[,<stat>]]
+<CR>
+text is entered<ctrl-Z/ESC>
+if PDU mode (+CMGF=0):
++CMGW=<length>[,<stat>]<CR>PDU is
+given<ctrl-Z/ESC>
+
+*/
+mbtk_ril_err_enum mbtk_sms_cmgw_set(mbtk_ril_handle* handle, char * cmgw, char *resp)
+{
+    return mbtk_ds_sms_cmgw_set(handle, MBTK_SIM_AUTO, cmgw, resp);
+}
+
+
+/*
+* Set sms cmgd.
+*
+* +CMGD=<index>[,<delflag>]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_ds_sms_cmgd_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cmdg)
+{
+    if(!ril_cli.ril_ready)
+    {
+        return MBTK_RIL_ERR_NOT_INIT;
+    }
+
+    if(cmdg == NULL || handle == NULL)
+    {
+        LOGE("ARG error.");
+        return MBTK_RIL_ERR_PARAMETER;
+    }
+
+    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
+    if(!at_port_check(port_info->port)) {
+        return MBTK_RIL_ERR_PORT;
+    }
+
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGD, cmdg, strlen(cmdg), NULL, FALSE, 0);
 }
 
 /*
@@ -2017,23 +2373,7 @@
 */
 mbtk_ril_err_enum mbtk_sms_cmgd_set(mbtk_ril_handle* handle, char * cmdg)
 {
-    if(!ril_cli.ril_ready)
-    {
-        return MBTK_RIL_ERR_NOT_INIT;
-    }
-
-    if(cmdg == NULL || handle == NULL)
-    {
-        LOGE("ARG error.");
-        return MBTK_RIL_ERR_PARAMETER;
-    }
-
-    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
-    if(!at_port_check(port_info->port)) {
-        return MBTK_RIL_ERR_PORT;
-    }
-
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGD, cmdg, strlen(cmdg), NULL, FALSE, 0);
+    return mbtk_ds_sms_cmgd_set(handle, MBTK_SIM_AUTO, cmdg);
 }
 
 /*
@@ -2043,7 +2383,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_cmgd_get(mbtk_ril_handle* handle, char * cmdg)
+mbtk_ril_err_enum mbtk_ds_sms_cmgd_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cmdg)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2061,9 +2401,20 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGD, NULL, 0, cmdg, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGD, NULL, 0, cmdg, FALSE, 0);
 }
 
+/*
+* Get sms cmgd.
+*
+* +CMGD: (XXX,XXX)(0-4)
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgd_get(mbtk_ril_handle* handle, char * cmdg)
+{
+    return mbtk_ds_sms_cmgd_get(handle, MBTK_SIM_AUTO, cmdg);
+}
 
 /*
 * Set sms cmgl.
@@ -2072,7 +2423,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_cmgl_set(mbtk_ril_handle* handle, char * cmgl, char *resp)
+mbtk_ril_err_enum mbtk_ds_sms_cmgl_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cmgl, char *resp)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2090,13 +2441,26 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGL, cmgl, strlen(cmgl), resp, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGL, cmgl, strlen(cmgl), resp, FALSE, 0);
 }
 
 /*
+* Set sms cmgl.
+*
+* AT+CMGL[=<stat>]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cmgl_set(mbtk_ril_handle* handle, char * cmgl, char *resp)
+{
+    return mbtk_ds_sms_cmgl_set(handle, MBTK_SIM_AUTO, cmgl, resp);
+}
+
+
+/*
 * Return sms csca.
 */
-mbtk_ril_err_enum mbtk_sms_csca_get(mbtk_ril_handle* handle, char *buf)
+mbtk_ril_err_enum mbtk_ds_sms_csca_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char *buf)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2114,7 +2478,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CSCA, NULL, 0, buf, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CSCA, NULL, 0, buf, FALSE, 0);
+}
+
+/*
+* Return sms csca.
+*/
+mbtk_ril_err_enum mbtk_sms_csca_get(mbtk_ril_handle* handle, char *buf)
+{
+    return mbtk_ds_sms_csca_get(handle, MBTK_SIM_AUTO, buf);
 }
 
 /*
@@ -2124,7 +2496,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_csca_set(mbtk_ril_handle* handle, char * csca)
+mbtk_ril_err_enum mbtk_ds_sms_csca_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * csca)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2142,17 +2514,30 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CSCA, csca, strlen(csca), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CSCA, csca, strlen(csca), NULL, FALSE, 0);
 }
 
 /*
+* Set sms csca.
+*
+* AT+CSCA=<number> [,<type>]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_csca_set(mbtk_ril_handle* handle, char * csca)
+{
+    return mbtk_ds_sms_csca_set(handle, MBTK_SIM_AUTO, csca);
+}
+
+
+/*
 * Set sms csmp.
 *
 * AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_csmp_set(mbtk_ril_handle* handle, char * csmp)
+mbtk_ril_err_enum mbtk_ds_sms_csmp_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * csmp)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2170,7 +2555,19 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CSMP, csmp, strlen(csmp), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CSMP, csmp, strlen(csmp), NULL, FALSE, 0);
+}
+
+/*
+* Set sms csmp.
+*
+* AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_csmp_set(mbtk_ril_handle* handle, char * csmp)
+{
+    return mbtk_ds_sms_csmp_set(handle, MBTK_SIM_AUTO, csmp);
 }
 
 /*
@@ -2180,7 +2577,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_cscb_set(mbtk_ril_handle* handle, char * cscb)
+mbtk_ril_err_enum mbtk_ds_sms_cscb_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cscb)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2198,7 +2595,19 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CSCB, cscb, strlen(cscb), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CSCB, cscb, strlen(cscb), NULL, FALSE, 0);
+}
+
+/*
+* Set sms cscb.
+*
+* AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cscb_set(mbtk_ril_handle* handle, char * cscb)
+{
+    return mbtk_ds_sms_cscb_set(handle, MBTK_SIM_AUTO, cscb);
 }
 
 /*
@@ -2210,7 +2619,7 @@
 if sending fails:
 +CMS ERROR: <err>
 */
-mbtk_ril_err_enum mbtk_sms_cnmi_set(mbtk_ril_handle* handle)
+mbtk_ril_err_enum mbtk_ds_sms_cnmi_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2228,10 +2637,25 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CNMI, NULL, 0, NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CNMI, NULL, 0, NULL, FALSE, 0);
 }
 
 /*
+* Set sms cnmi.
+*
+at+cnmi=1,2
+
+OK
+if sending fails:
++CMS ERROR: <err>
+*/
+mbtk_ril_err_enum mbtk_sms_cnmi_set(mbtk_ril_handle* handle)
+{
+    return mbtk_ds_sms_cnmi_set(handle, MBTK_SIM_AUTO);
+}
+
+
+/*
 * Set sms cmss.
 *
 +CMSS=<index>[,<da>[,<toda>]]
@@ -2242,7 +2666,7 @@
 if sending fails:
 +CMS ERROR: <err>
 */
-mbtk_ril_err_enum mbtk_sms_cmss_set(mbtk_ril_handle* handle, char * cmss, char *resp)
+mbtk_ril_err_enum mbtk_ds_sms_cmss_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * cmss, char *resp)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2260,13 +2684,29 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMSS, cmss, strlen(cmss), resp, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMSS, cmss, strlen(cmss), resp, FALSE, 0);
+}
+
+/*
+* Set sms cmss.
+*
++CMSS=<index>[,<da>[,<toda>]]
+
+if sending successful:
++CMSS: <mr>
+OK
+if sending fails:
++CMS ERROR: <err>
+*/
+mbtk_ril_err_enum mbtk_sms_cmss_set(mbtk_ril_handle* handle, char * cmss, char *resp)
+{
+    return mbtk_ds_sms_cmss_set(handle, MBTK_SIM_AUTO, cmss, resp);
 }
 
 /*
 * Return sms cmgf.
 */
-mbtk_ril_err_enum mbtk_sms_cpms_get(mbtk_ril_handle* handle, char * mem)
+mbtk_ril_err_enum mbtk_ds_sms_cpms_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * mem)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2284,9 +2724,16 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CPMS, NULL, 0, mem, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CPMS, NULL, 0, mem, FALSE, 0);
 }
 
+/*
+* Return sms cmgf.
+*/
+mbtk_ril_err_enum mbtk_sms_cpms_get(mbtk_ril_handle* handle, char *mem)
+{
+    return mbtk_ds_sms_cpms_get(handle, MBTK_SIM_AUTO, mem);
+}
 
 /*
 * Set sms cpms.
@@ -2295,7 +2742,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_sms_cpms_set(mbtk_ril_handle* handle, char * mem, char* resp)
+mbtk_ril_err_enum mbtk_ds_sms_cpms_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char * mem, char* resp)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2313,7 +2760,63 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CPMS, mem, strlen(mem), resp, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CPMS, mem, strlen(mem), resp, FALSE, 0);
+}
+
+/*
+* Set sms cpms.
+*
+* AT+CPMS=<mem1>[,<mem2>[,<mem3>]]
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_sms_cpms_set(mbtk_ril_handle* handle, char * mem, char* resp)
+{
+    return mbtk_ds_sms_cpms_set(handle, MBTK_SIM_AUTO, mem, resp);
+}
+
+
+/*
+* Set sms cm.
+*
+* +CMGR=<index>
+
+if PDU mode (+CMGF=0) ��command successful:
++CMGR: <stat>,[<alpha>],<length><CR><LF><pdu>
+OK
+if text mode (+CMGF=1), command successful and SMS-DELIVER:
++CMGR:<stat>,<oa>,[<alpha>],<scts>[,<tooa>,<fo>,<pid>,<dcs
+>, <sca>,<tosca>,<length>]<CR><LF><data>
+OK
+if text mode (+CMGF=1), command successful and SMS-SUBMIT:
++CMGR:
+<stat>,<da>,[<alpha>][,<toda>,<fo>,<pid>,<dcs>,[<vp>],
+<sca>,<tosca>,<length>]<CR><LF><data>
+OK
+otherwise:
++CMS ERROR: <err>
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_ds_sms_cmgr_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int index, char *resp)
+{
+    if(!ril_cli.ril_ready)
+    {
+        return MBTK_RIL_ERR_NOT_INIT;
+    }
+
+    if(resp == NULL || handle == NULL)
+    {
+        LOGE("ARG error.");
+        return MBTK_RIL_ERR_PARAMETER;
+    }
+
+    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
+    if(!at_port_check(port_info->port)) {
+        return MBTK_RIL_ERR_PORT;
+    }
+
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_SMS_CMGR, &index, sizeof(uint8), resp, FALSE, 0);
 }
 
 /*
@@ -2340,23 +2843,7 @@
 */
 mbtk_ril_err_enum mbtk_sms_cmgr_set(mbtk_ril_handle* handle, int index, char *resp)
 {
-    if(!ril_cli.ril_ready)
-    {
-        return MBTK_RIL_ERR_NOT_INIT;
-    }
-
-    if(resp == NULL || handle == NULL)
-    {
-        LOGE("ARG error.");
-        return MBTK_RIL_ERR_PARAMETER;
-    }
-
-    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
-    if(!at_port_check(port_info->port)) {
-        return MBTK_RIL_ERR_PORT;
-    }
-
-    return ril_req_process(port_info->port, RIL_MSG_ID_SMS_CMGR, &index, sizeof(uint8), resp, FALSE, 0);
+    return mbtk_ds_sms_cmgr_set(handle, MBTK_SIM_AUTO, index, resp);
 }
 
 
@@ -2550,7 +3037,7 @@
 * call_start
 *
 */
-mbtk_ril_err_enum mbtk_call_start(mbtk_ril_handle* handle, char* phone_number)
+mbtk_ril_err_enum mbtk_ds_call_start(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, char* phone_number)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2568,7 +3055,43 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_START, phone_number, strlen(phone_number), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_START, phone_number, strlen(phone_number), NULL, FALSE, 0);
+}
+
+/*
+* call_start
+*
+*/
+mbtk_ril_err_enum mbtk_call_start(mbtk_ril_handle* handle, char* phone_number)
+{
+
+
+    return mbtk_ds_call_start(handle, MBTK_SIM_AUTO, phone_number);
+}
+
+/*
+* Answer the phone call.
+*
+*/
+mbtk_ril_err_enum mbtk_ds_call_answer(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id)
+{
+    if(!ril_cli.ril_ready)
+    {
+        return MBTK_RIL_ERR_NOT_INIT;
+    }
+
+    if(handle == NULL)
+    {
+        LOGE("ARG error.");
+        return MBTK_RIL_ERR_PARAMETER;
+    }
+
+    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
+    if(!at_port_check(port_info->port)) {
+        return MBTK_RIL_ERR_PORT;
+    }
+
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_ANSWER, NULL, 0, NULL, FALSE, 0);
 }
 
 /*
@@ -2577,6 +3100,16 @@
 */
 mbtk_ril_err_enum mbtk_call_answer(mbtk_ril_handle* handle)
 {
+    return mbtk_ds_call_answer(handle, MBTK_SIM_AUTO);
+}
+
+
+/*
+* Hang up all call.
+*
+*/
+mbtk_ril_err_enum mbtk_ds_call_hang(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -2593,7 +3126,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_ANSWER, NULL, 0, NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_HANGUP, NULL, 0, NULL, FALSE, 0);
 }
 
 /*
@@ -2602,6 +3135,15 @@
 */
 mbtk_ril_err_enum mbtk_call_hang(mbtk_ril_handle* handle)
 {
+    return mbtk_ds_call_hang(handle, MBTK_SIM_AUTO);
+}
+
+/*
+* Hang up a call.
+*
+*/
+mbtk_ril_err_enum mbtk_ds_a_call_hang(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int phone_id)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -2618,7 +3160,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_HANGUP, NULL, 0, NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_HANGUP_A, &phone_id, sizeof(uint8), NULL, FALSE, 0);
 }
 
 /*
@@ -2627,6 +3169,15 @@
 */
 mbtk_ril_err_enum mbtk_a_call_hang(mbtk_ril_handle* handle, int phone_id)
 {
+    return mbtk_ds_a_call_hang(handle, MBTK_SIM_AUTO, phone_id);
+}
+
+/*
+* Hang up waiting or background call.
+*
+*/
+mbtk_ril_err_enum mbtk_ds_waiting_or_background_call_hang(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -2643,7 +3194,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_HANGUP_A, &phone_id, sizeof(uint8), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_HANGUP_B, NULL, 0, NULL, FALSE, 0);
 }
 
 /*
@@ -2652,30 +3203,14 @@
 */
 mbtk_ril_err_enum mbtk_waiting_or_background_call_hang(mbtk_ril_handle* handle)
 {
-    if(!ril_cli.ril_ready)
-    {
-        return MBTK_RIL_ERR_NOT_INIT;
-    }
-
-    if(handle == NULL)
-    {
-        LOGE("ARG error.");
-        return MBTK_RIL_ERR_PARAMETER;
-    }
-
-    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
-    if(!at_port_check(port_info->port)) {
-        return MBTK_RIL_ERR_PORT;
-    }
-
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_HANGUP_B, NULL, 0, NULL, FALSE, 0);
+    return mbtk_ds_waiting_or_background_call_hang(handle, MBTK_SIM_AUTO);
 }
 
 /*
 * Hang up foreground resume background call.
 *
 */
-mbtk_ril_err_enum mbtk_foreground_resume_background_call_hang(mbtk_ril_handle* handle)
+mbtk_ril_err_enum mbtk_ds_foreground_resume_background_call_hang(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2693,13 +3228,22 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_HANGUP_C, NULL, 0, NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_HANGUP_C, NULL, 0, NULL, FALSE, 0);
+}
+
+/*
+* Hang up foreground resume background call.
+*
+*/
+mbtk_ril_err_enum mbtk_foreground_resume_background_call_hang(mbtk_ril_handle* handle)
+{
+    return mbtk_ds_foreground_resume_background_call_hang(handle, MBTK_SIM_AUTO);
 }
 
 /*
 * Get current call phone number.
 */
-mbtk_ril_err_enum mbtk_call_reg_get(mbtk_ril_handle* handle, mbtk_call_info_t *reg)
+mbtk_ril_err_enum mbtk_ds_call_reg_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_call_info_t *reg)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2718,13 +3262,22 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_WAITIN, NULL, 0, reg, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_WAITIN, NULL, 0, reg, FALSE, 0);
 }
 
 /*
+* Get current call phone number.
+*/
+mbtk_ril_err_enum mbtk_call_reg_get(mbtk_ril_handle* handle, mbtk_call_info_t *reg)
+{
+    return mbtk_ds_call_reg_get(handle, MBTK_SIM_AUTO, reg);
+}
+
+
+/*
 * Return mute state.
 */
-mbtk_ril_err_enum mbtk_mute_state_get(mbtk_ril_handle* handle, int *mute_state)
+mbtk_ril_err_enum mbtk_ds_mute_state_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int *mute_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2743,7 +3296,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_MUTE, NULL, 0, mute_state, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_MUTE, NULL, 0, mute_state, FALSE, 0);
+}
+
+/*
+* Return mute state.
+*/
+mbtk_ril_err_enum mbtk_mute_state_get(mbtk_ril_handle* handle, int *mute_state)
+{
+    return mbtk_ds_mute_state_get(handle, MBTK_SIM_AUTO, mute_state);
 }
 
 /*
@@ -2755,7 +3316,7 @@
 *
 * Restarting takes effect after execution.
 */
-mbtk_ril_err_enum mbtk_mute_state_set(mbtk_ril_handle* handle, int mute_state)
+mbtk_ril_err_enum mbtk_ds_mute_state_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int mute_state)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2773,14 +3334,28 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_MUTE, &mute_state, sizeof(uint8), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_MUTE, &mute_state, sizeof(uint8), NULL, FALSE, 0);
+}
+
+/*
+* Set mute state.
+*
+* mute_state:
+* 0 : of mute.
+* 1 : on mute.
+*
+* Restarting takes effect after execution.
+*/
+mbtk_ril_err_enum mbtk_mute_state_set(mbtk_ril_handle* handle, int mute_state)
+{
+    return mbtk_ds_mute_state_set(handle, MBTK_SIM_AUTO, mute_state);
 }
 
 /*
 * Set DTMF character.
 *
 */
-mbtk_ril_err_enum mbtk_dtmf_send(mbtk_ril_handle* handle, mbtk_call_dtmf_info_t *dtmf_character)
+mbtk_ril_err_enum mbtk_ds_dtmf_send(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, mbtk_call_dtmf_info_t *dtmf_character)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2798,10 +3373,19 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_DTMF, dtmf_character, sizeof(mbtk_call_dtmf_info_t), NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_DTMF, dtmf_character, sizeof(mbtk_call_dtmf_info_t), NULL, FALSE, 0);
 }
 
-mbtk_ril_err_enum mbtk_centric_set(mbtk_ril_handle* handle, int centric)
+/*
+* Set DTMF character.
+*
+*/
+mbtk_ril_err_enum mbtk_dtmf_send(mbtk_ril_handle* handle, mbtk_call_dtmf_info_t *dtmf_character)
+{
+    return mbtk_ds_dtmf_send(handle, MBTK_SIM_AUTO, dtmf_character);
+}
+
+mbtk_ril_err_enum mbtk_ds_centric_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int centric)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2819,10 +3403,15 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_CENTRIC, &centric, 1, NULL, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_CENTRIC, &centric, 1, NULL, FALSE, 0);
 }
 
-mbtk_ril_err_enum mbtk_centric_get(mbtk_ril_handle* handle, int *centric)
+mbtk_ril_err_enum mbtk_centric_set(mbtk_ril_handle* handle, int centric)
+{
+    return mbtk_ds_centric_set(handle, MBTK_SIM_AUTO, centric);
+}
+
+mbtk_ril_err_enum mbtk_ds_centric_get(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id, int *centric)
 {
     if(!ril_cli.ril_ready)
     {
@@ -2841,10 +3430,13 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_CALL_CENTRIC, NULL, 0, centric, FALSE, 0);
+    return ril_req_process(sim_id, port_info->port, RIL_MSG_ID_CALL_CENTRIC, NULL, 0, centric, FALSE, 0);
 }
 
-
+mbtk_ril_err_enum mbtk_centric_get(mbtk_ril_handle* handle, int *centric)
+{
+    return mbtk_ds_centric_get(handle, MBTK_SIM_AUTO, centric);
+}
 
 /*
 * Set msd item.
@@ -2868,7 +3460,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MSDCFG, msd_cfg, sizeof(mbtk_ecall_msd_cfg_info_t), NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MSDCFG, msd_cfg, sizeof(mbtk_ecall_msd_cfg_info_t), NULL, FALSE, 0);
 }
 
 /*
@@ -2893,7 +3485,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MSDGEN, NULL, 0, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MSDGEN, NULL, 0, NULL, FALSE, 0);
 }
 
 /*
@@ -2924,7 +3516,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MSD, msd, strlen(msd), NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MSD, msd, strlen(msd), NULL, FALSE, 0);
 }
 
 /*
@@ -2949,7 +3541,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MSD, NULL, 0, msd, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MSD, NULL, 0, msd, FALSE, 0);
 }
 
 
@@ -2975,7 +3567,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_PUSH, NULL, 0, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_PUSH, NULL, 0, NULL, FALSE, 0);
 }
 
 /*
@@ -3000,7 +3592,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_ONLY, info, sizeof(mbtk_ecall_only_info_t), NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_ONLY, info, sizeof(mbtk_ecall_only_info_t), NULL, FALSE, 0);
 }
 
 /*
@@ -3026,7 +3618,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_ONLY, NULL, 0, info, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_ONLY, NULL, 0, info, FALSE, 0);
 }
 
 /*
@@ -3051,7 +3643,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_REG, &reg, 1, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_REG, &reg, 1, NULL, FALSE, 0);
 }
 
 /*
@@ -3076,7 +3668,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_DIAL, &type, 1, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_DIAL, &type, 1, NULL, FALSE, 0);
 }
 
 /*
@@ -3104,7 +3696,7 @@
 
     memset(type, 0, sizeof(mbtk_ecall_dial_type_enum));
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_DIAL, NULL, 0, type, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_DIAL, NULL, 0, type, FALSE, 0);
 }
 
 /*
@@ -3129,7 +3721,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MODE, &mode, 1, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MODE, &mode, 1, NULL, FALSE, 0);
 }
 
 /*
@@ -3157,7 +3749,7 @@
 
     memset(mode, 0, sizeof(mbtk_ecall_mode_type_enum));
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MODE, NULL, 0, mode, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MODE, NULL, 0, mode, FALSE, 0);
 }
 
 /*
@@ -3182,7 +3774,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_CFG, cfg, sizeof(mbtk_ecall_cfg_info_t), NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_CFG, cfg, sizeof(mbtk_ecall_cfg_info_t), NULL, FALSE, 0);
 }
 
 /*
@@ -3210,7 +3802,7 @@
 
     uint32 type = cfg->type;
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_CFG, &type, sizeof(uint32), cfg, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_CFG, &type, sizeof(uint32), cfg, FALSE, 0);
 }
 
 /*
@@ -3235,7 +3827,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_SMS_NUM, number, strlen(number), NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_SMS_NUM, number, strlen(number), NULL, FALSE, 0);
 }
 
 /*
@@ -3260,7 +3852,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_SMS_NUM, NULL, 0, number, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_SMS_NUM, NULL, 0, number, FALSE, 0);
 }
 
 /*
@@ -3285,7 +3877,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_MUTESPK, &mute, 1, NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_MUTESPK, &mute, 1, NULL, FALSE, 0);
 }
 
 /*
@@ -3310,7 +3902,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    return ril_req_process(port_info->port, RIL_MSG_ID_ECALL_DSP_GAIN, gain_info, sizeof(mbtk_ecall_gain_info_t), NULL, FALSE, 0);
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_ECALL_DSP_GAIN, gain_info, sizeof(mbtk_ecall_gain_info_t), NULL, FALSE, 0);
 }
 
 int mbtk_get_modem_version(mbtk_ril_handle* handle, void *modem_version)
@@ -3319,7 +3911,7 @@
     {
         return MBTK_RIL_ERR_NOT_INIT;
     }
-    
+
     if(handle == NULL || modem_version == NULL)
     {
         LOGE("ARG error.");
@@ -3329,11 +3921,63 @@
     if(!at_port_check(port_info->port)) {
         return MBTK_RIL_ERR_PORT;
     }
-    
-    return ril_req_process(port_info->port, RIL_MSG_ID_DEV_MD_VERSION_REQ, NULL, 0, modem_version,FALSE, 0);
-        
+
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_DEV_MD_VERSION_REQ, NULL, 0, modem_version,FALSE, 0);
+
 }
 
+/*
+* Set dual sim switch.
+*
+*/
+mbtk_ril_err_enum mbtk_sim_switch_set(mbtk_ril_handle* handle, mbtk_sim_type_enum sim_id)
+{
+    if(!ril_cli.ril_ready)
+    {
+        return MBTK_RIL_ERR_NOT_INIT;
+    }
+
+    if(sim_id != MBTK_SIM_1 && sim_id != MBTK_SIM_2)
+    {
+        LOGE("ARG error.");
+        return MBTK_RIL_ERR_PARAMETER;
+    }
+
+    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
+    if(!at_port_check(port_info->port)) {
+        return MBTK_RIL_ERR_PORT;
+    }
+
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_SIM_SWITCH, &sim_id, sizeof(mbtk_sim_type_enum), NULL, FALSE, 0);
+}
+
+/*
+* Get dual sim switch.
+*
+*/
+mbtk_ril_err_enum mbtk_sim_switch_get(mbtk_ril_handle* handle, mbtk_sim_type_enum *sim_id)
+{
+    if(!ril_cli.ril_ready)
+    {
+        return MBTK_RIL_ERR_NOT_INIT;
+    }
+
+    if(sim_id == NULL || handle == NULL)
+    {
+        LOGE("ARG error.");
+        return MBTK_RIL_ERR_PARAMETER;
+    }
+
+    memset(sim_id, 0x00, sizeof(mbtk_sim_type_enum));
+    ril_at_port_info_t *port_info = (ril_at_port_info_t*)handle;
+    if(!at_port_check(port_info->port)) {
+        return MBTK_RIL_ERR_PORT;
+    }
+
+    return ril_req_process(MBTK_SIM_1, port_info->port, RIL_MSG_ID_SIM_SWITCH, NULL, 0, sim_id, FALSE, 0);
+}
+
+
 #if 0
 /*
 * Set wakeup state.
@@ -3395,7 +4039,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_SER_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(MBTK_SIM_1, ATPORTTYPE_0, RIL_MSG_ID_IND_SER_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
         ril_cli.cb[RIL_MSG_ID_IND_SER_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
@@ -3406,7 +4050,7 @@
 /*
 * Set net reg state change callback function.
 */
-mbtk_ril_err_enum mbtk_net_reg_state_change_cb_reg(mbtk_ril_callback_func cb)
+mbtk_ril_err_enum mbtk_ds_net_reg_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
 {
     if(!ril_cli.ril_ready)
     {
@@ -3417,7 +4061,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_NET_REG_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_NET_REG_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
         ril_cli.cb[RIL_MSG_ID_IND_NET_REG_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
@@ -3426,10 +4070,48 @@
 }
 
 /*
+* Set net reg state change callback function.
+*/
+mbtk_ril_err_enum mbtk_net_reg_state_change_cb_reg(mbtk_ril_callback_func cb)
+{
+    return mbtk_ds_net_reg_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
+/*
+* Set call state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ds_call_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
+{
+    if(!ril_cli.ril_ready)
+    {
+        return MBTK_RIL_ERR_NOT_INIT;
+    }
+
+    if(!at_port_check(ATPORTTYPE_0)) {
+        return MBTK_RIL_ERR_PORT;
+    }
+
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_CALL_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    if(MBTK_RIL_ERR_SUCCESS == ret)
+    {
+        ril_cli.cb[RIL_MSG_ID_IND_CALL_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
+    }
+    return ret;
+}
+
+/*
 * Set call state change callback function.
 */
 mbtk_ril_err_enum mbtk_call_state_change_cb_reg(mbtk_ril_callback_func cb)
 {
+    return mbtk_ds_call_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
+/*
+* Set sms state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ds_sms_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -3439,10 +4121,10 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_CALL_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_SMS_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
-        ril_cli.cb[RIL_MSG_ID_IND_CALL_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
+        ril_cli.cb[RIL_MSG_ID_IND_SMS_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
     }
     return ret;
 }
@@ -3452,6 +4134,14 @@
 */
 mbtk_ril_err_enum mbtk_sms_state_change_cb_reg(mbtk_ril_callback_func cb)
 {
+    return mbtk_ds_sms_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
+/*
+* Set radio state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ds_radio_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -3461,10 +4151,10 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_SMS_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_RADIO_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
-        ril_cli.cb[RIL_MSG_ID_IND_SMS_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
+        ril_cli.cb[RIL_MSG_ID_IND_RADIO_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
     }
     return ret;
 }
@@ -3474,6 +4164,14 @@
 */
 mbtk_ril_err_enum mbtk_radio_state_change_cb_reg(mbtk_ril_callback_func cb)
 {
+    return mbtk_ds_radio_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
+/*
+* Set sim state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ds_sim_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -3483,10 +4181,10 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_RADIO_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_SIM_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
-        ril_cli.cb[RIL_MSG_ID_IND_RADIO_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
+        ril_cli.cb[RIL_MSG_ID_IND_SIM_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
     }
     return ret;
 }
@@ -3496,6 +4194,14 @@
 */
 mbtk_ril_err_enum mbtk_sim_state_change_cb_reg(mbtk_ril_callback_func cb)
 {
+    return mbtk_ds_sim_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
+/*
+* Set pdp state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ds_pdp_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -3505,10 +4211,10 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_SIM_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_PDP_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
-        ril_cli.cb[RIL_MSG_ID_IND_SIM_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
+        ril_cli.cb[RIL_MSG_ID_IND_PDP_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
     }
     return ret;
 }
@@ -3518,6 +4224,14 @@
 */
 mbtk_ril_err_enum mbtk_pdp_state_change_cb_reg(mbtk_ril_callback_func cb)
 {
+    return mbtk_ds_pdp_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
+/*
+* Set signal state change callback function.
+*/
+mbtk_ril_err_enum mbtk_ds_signal_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
+{
     if(!ril_cli.ril_ready)
     {
         return MBTK_RIL_ERR_NOT_INIT;
@@ -3527,10 +4241,10 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_PDP_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_SIGNAL_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
-        ril_cli.cb[RIL_MSG_ID_IND_PDP_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
+        ril_cli.cb[RIL_MSG_ID_IND_SIGNAL_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
     }
     return ret;
 }
@@ -3540,24 +4254,10 @@
 */
 mbtk_ril_err_enum mbtk_signal_state_change_cb_reg(mbtk_ril_callback_func cb)
 {
-    if(!ril_cli.ril_ready)
-    {
-        return MBTK_RIL_ERR_NOT_INIT;
-    }
-
-    if(!at_port_check(ATPORTTYPE_0)) {
-        return MBTK_RIL_ERR_PORT;
-    }
-
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_SIGNAL_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
-    if(MBTK_RIL_ERR_SUCCESS == ret)
-    {
-        ril_cli.cb[RIL_MSG_ID_IND_SIGNAL_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
-    }
-    return ret;
+    return mbtk_ds_signal_state_change_cb_reg(MBTK_SIM_AUTO, cb);
 }
 
-mbtk_ril_err_enum mbtk_ecall_state_change_cb_reg(mbtk_ril_callback_func cb)
+mbtk_ril_err_enum mbtk_ds_ecall_state_change_cb_reg(mbtk_sim_type_enum sim_id, mbtk_ril_callback_func cb)
 {
     if(!ril_cli.ril_ready)
     {
@@ -3568,7 +4268,7 @@
         return MBTK_RIL_ERR_PORT;
     }
 
-    int ret = ril_req_process(ATPORTTYPE_0, RIL_MSG_ID_IND_ECALL_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
+    int ret = ril_req_process(sim_id, ATPORTTYPE_0, RIL_MSG_ID_IND_ECALL_STATE_CHANGE, NULL, 0, NULL, FALSE, -1);
     if(MBTK_RIL_ERR_SUCCESS == ret)
     {
         ril_cli.cb[RIL_MSG_ID_IND_ECALL_STATE_CHANGE - RIL_MSG_ID_IND_BEGIN - 1] = cb;
@@ -3576,4 +4276,9 @@
     return ret;
 }
 
+mbtk_ril_err_enum mbtk_ecall_state_change_cb_reg(mbtk_ril_callback_func cb)
+{
+    return mbtk_ds_ecall_state_change_cb_reg(MBTK_SIM_AUTO, cb);
+}
+
 
diff --git a/mbtk/libmbtk_lib/ril/v2/ril_utils.c b/mbtk/libmbtk_lib/ril/v2/ril_utils.c
index 33b25a8..fc9e723 100755
--- a/mbtk/libmbtk_lib/ril/v2/ril_utils.c
+++ b/mbtk/libmbtk_lib/ril/v2/ril_utils.c
@@ -470,7 +470,7 @@
     }
 }
 
-ril_msg_pack_info_t* ril_msg_pack_creat(ATPortType_enum port, int msg_type, int msg_id, int msg_index, const void *data, int data_len)
+ril_msg_pack_info_t* ril_msg_pack_creat(mbtk_sim_type_enum sim_id, ATPortType_enum port, int msg_type, int msg_id, int msg_index, const void *data, int data_len)
 {
     ril_msg_pack_info_t *pack = (ril_msg_pack_info_t *)malloc(sizeof(ril_msg_pack_info_t));
     if(!pack)
@@ -481,6 +481,7 @@
 
     pack->tag = RIL_SOCK_PACKET_TAG;
     pack->at_port = (uint8)port;
+    pack->sim_id = (uint8)sim_id;
     if(msg_index < 0) {
         pack->msg_index = ril_index++;
     } else {