Add DS support.
Change-Id: Ib8bc4e171dd5ca526f8e151ff3d467097582a8cb
diff --git a/mbtk/mbtk_rild_v2/src/ril_sim.c b/mbtk/mbtk_rild_v2/src/ril_sim.c
index fc9221e..a0fc554 100755
--- a/mbtk/mbtk_rild_v2/src/ril_sim.c
+++ b/mbtk/mbtk_rild_v2/src/ril_sim.c
@@ -17,10 +17,11 @@
#include "mbtk_utils.h"
#include "ril_info.h"
-void ril_rsp_pack_send(ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
+void ril_rsp_pack_send(mbtk_sim_type_enum sim_id, ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
+ATPortId_enum portType_2_portId(mbtk_sim_type_enum sim_id, ATPortType_enum port);
/** Returns SIM_NOT_READY on error */
-mbtk_sim_state_enum ril_sim_state_get(ATPortType_enum port)
+mbtk_sim_state_enum ril_sim_state_get(mbtk_sim_type_enum sim_id, ATPortType_enum port)
{
ATResponse *p_response = NULL;
int err;
@@ -28,7 +29,7 @@
char *cpinLine;
char *cpinResult;
- err = at_send_command_singleline(port, "AT+CPIN?", "+CPIN:", &p_response);
+ err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CPIN?", "+CPIN:", &p_response);
if (err < 0 || p_response->success == 0 || !p_response->p_intermediates)
{
@@ -144,7 +145,7 @@
at_response_free(p_response);
p_response = NULL;
cpinResult = NULL;
- ril_info.sim_state = ret;
+ ril_info.sim_state[sim_id] = ret;
return ret;
}
@@ -154,11 +155,11 @@
OK
*/
-static int req_sim_type_get(ATPortType_enum port, uint8 *type, int *cme_err)
+static int req_sim_type_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8 *type, int *cme_err)
{
ATResponse *response = NULL;
// char *tmp_ptr = NULL;
- int err = at_send_command_singleline(port, "AT*EUICC?", "*EUICC:", &response);
+ int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT*EUICC?", "*EUICC:", &response);
if (err < 0 || response->success == 0 || !response->p_intermediates){
*cme_err = at_get_cme_error(response);
@@ -191,11 +192,11 @@
OK
*/
-static int req_iccid_get(ATPortType_enum port, void *data, int *cme_err)
+static int req_iccid_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
{
ATResponse *response = NULL;
char *tmp_ptr = NULL;
- int err = at_send_command_singleline(port, "AT+ICCID", "+ICCID:", &response);
+ int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+ICCID", "+ICCID:", &response);
if (err < 0 || response->success == 0 || !response->p_intermediates){
*cme_err = at_get_cme_error(response);
@@ -228,11 +229,11 @@
OK
*/
-static int req_phone_number_get(ATPortType_enum port, void *data, int *cme_err)
+static int req_phone_number_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
{
ATResponse *response = NULL;
char *tmp_ptr = NULL;
- int err = at_send_command_singleline(port, "AT+CNUM?", "+CNUM:", &response);
+ int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CNUM?", "+CNUM:", &response);
if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
if(response) {
*cme_err = at_get_cme_error(response);
@@ -278,10 +279,10 @@
OK
*/
-static int req_imsi_get(ATPortType_enum port, void *data, int *cme_err)
+static int req_imsi_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
{
ATResponse *response = NULL;
- int err = at_send_command_numeric(port, "AT+CIMI", &response);
+ int err = at_send_command_numeric(portType_2_portId(sim_id, port), "AT+CIMI", &response);
if (err < 0 || response->success == 0 || !response->p_intermediates){
*cme_err = at_get_cme_error(response);
@@ -294,12 +295,12 @@
return err;
}
-static int req_sim_lock_state_get(ATPortType_enum port, int *state, int *cme_err)
+static int req_sim_lock_state_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, int *state, int *cme_err)
{
ATResponse *response = NULL;
// char cmd[64]={0};
- int err = at_send_command_singleline(port, "AT+CLCK=SC,2", "+CLCK:", &response);
+ int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CLCK=SC,2", "+CLCK:", &response);
if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
if(response) {
*cme_err = at_get_cme_error(response);
@@ -343,12 +344,12 @@
*
*/
-static int req_sim_lock_switch(ATPortType_enum port, bool enable, uint8* pin, int *cme_err)
+static int req_sim_lock_switch(mbtk_sim_type_enum sim_id, ATPortType_enum port, bool enable, uint8* pin, int *cme_err)
{
ATResponse *response = NULL;
char cmd[64]={0};
snprintf(cmd, sizeof(cmd), "AT+CLCK=SC,%d,%s", enable ? 1 : 0, pin);
- int err = at_send_command_singleline(port, cmd, "+CLCK:", &response);
+ int err = at_send_command_singleline(portType_2_portId(sim_id, port), cmd, "+CLCK:", &response);
if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
if(response) {
*cme_err = at_get_cme_error(response);
@@ -393,22 +394,22 @@
return err;
}
-static int req_sim_pin_change(ATPortType_enum port, uint8* old_pin, uint8 *new_pin, int *cme_err)
+static int req_sim_pin_change(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8* old_pin, uint8 *new_pin, int *cme_err)
{
ATResponse *response = NULL;
char cmd[128]={0};
int err = 0;
int state;
- if(req_sim_lock_state_get(port, &state, cme_err) || *cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_sim_lock_state_get(sim_id, port, &state, cme_err) || *cme_err != MBTK_RIL_ERR_CME_NON)
{
return -1;
}
if(state == 0) { // Sim lock not open.
- return req_sim_lock_switch(port, TRUE, new_pin, cme_err);
+ return req_sim_lock_switch(sim_id, port, TRUE, new_pin, cme_err);
} else {// Change password.
snprintf(cmd, sizeof(cmd), "AT+CPWD=SC,%s,%s", old_pin, new_pin);
- err = at_send_command(port, cmd, &response);
+ err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
if (err < 0 || response->success == 0){
if(cme_err) {
*cme_err = at_get_cme_error(response);
@@ -422,12 +423,12 @@
return err;
}
-static int req_sim_pin_verify(ATPortType_enum port, uint8* pin, int *cme_err)
+static int req_sim_pin_verify(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8* pin, int *cme_err)
{
ATResponse *response = NULL;
char cmd[64]={0};
sprintf(cmd, "AT+CPIN=%s", pin);
- int err = at_send_command(port, cmd, &response);
+ int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
if (err < 0 || response->success == 0){
if(cme_err) {
*cme_err = at_get_cme_error(response);
@@ -440,12 +441,12 @@
return err;
}
-static int req_sim_puk_verify(ATPortType_enum port, uint8* puk, uint8* pin, int *cme_err)
+static int req_sim_puk_verify(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8* puk, uint8* pin, int *cme_err)
{
ATResponse *response = NULL;
char cmd[64]={0};
sprintf(cmd, "AT+CPIN=%s,%s", puk, pin);
- int err = at_send_command(port, cmd, &response);
+ int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
if (err < 0 || response->success == 0){
if(cme_err) {
*cme_err = at_get_cme_error(response);
@@ -458,29 +459,29 @@
return err;
}
-static int req_sim_lock_set(ATPortType_enum port, mbtk_sim_lock_info_t *lock_info, int *cme_err)
+static int req_sim_lock_set(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_sim_lock_info_t *lock_info, int *cme_err)
{
switch(lock_info->type)
{
case MBTK_SIM_LOCK_TYPE_DISABLE:
{
- return req_sim_lock_switch(port, FALSE, lock_info->pin1, cme_err);
+ return req_sim_lock_switch(sim_id, port, FALSE, lock_info->pin1, cme_err);
}
case MBTK_SIM_LOCK_TYPE_ENABLE:
{
- return req_sim_lock_switch(port, TRUE, lock_info->pin1, cme_err);
+ return req_sim_lock_switch(sim_id, port, TRUE, lock_info->pin1, cme_err);
}
case MBTK_SIM_LOCK_TYPE_CHANGE:
{
- return req_sim_pin_change(port, lock_info->pin1, lock_info->pin2, cme_err);
+ return req_sim_pin_change(sim_id, port, lock_info->pin1, lock_info->pin2, cme_err);
}
case MBTK_SIM_LOCK_TYPE_VERIFY_PIN:
{
- return req_sim_pin_verify(port, lock_info->pin1, cme_err);
+ return req_sim_pin_verify(sim_id, port, lock_info->pin1, cme_err);
}
case MBTK_SIM_LOCK_TYPE_VERIFY_PUK:
{
- return req_sim_puk_verify(port, lock_info->puk, lock_info->pin1, cme_err);
+ return req_sim_puk_verify(sim_id, port, lock_info->puk, lock_info->pin1, cme_err);
}
default:
{
@@ -498,12 +499,12 @@
OK
*/
-static int req_pin_puk_last_times_get(ATPortType_enum port, mbtk_pin_puk_last_times_t *times, int *cme_err)
+static int req_pin_puk_last_times_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_pin_puk_last_times_t *times, int *cme_err)
{
ATResponse *response = NULL;
// char *tmp_ptr = NULL;
int tmp_int;
- int err = at_send_command_singleline(port, "AT+EPIN?", "+EPIN:", &response);
+ int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+EPIN?", "+EPIN:", &response);
if (err < 0 || response->success == 0 || !response->p_intermediates){
*cme_err = at_get_cme_error(response);
@@ -558,11 +559,11 @@
OK
*/
-static int req_plmn_get(ATPortType_enum port, mbtk_plmn_info *info, int *cme_err)
+static int req_plmn_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_plmn_info *info, int *cme_err)
{
ATResponse *response = NULL;
// char *tmp_ptr = NULL;
- int err = at_send_command_multiline(port, "AT+CPOL?", "+CPOL:", &response);
+ int err = at_send_command_multiline(portType_2_portId(sim_id, port), "AT+CPOL?", "+CPOL:", &response);
if (err < 0 || response->success == 0 || !response->p_intermediates){
*cme_err = at_get_cme_error(response);
@@ -614,6 +615,69 @@
return err;
}
+/*
+>AT+SWITCHSIM?
+<+SWITCHSIM: 0
+
+<OK
+*/
+int req_dual_sim_get(ATPortType_enum port, mbtk_sim_type_enum *sim_id, int *cme_err)
+{
+ ATResponse *response = NULL;
+// char *tmp_ptr = NULL;
+ int err = at_send_command_singleline(portType_2_portId(MBTK_SIM_1, port), "AT+SWITCHSIM?", "+SWITCHSIM:", &response);
+
+ if (err < 0 || response->success == 0 || !response->p_intermediates){
+ if(cme_err) {
+ *cme_err = at_get_cme_error(response);
+ }
+ goto exit;
+ }
+
+ char *line = response->p_intermediates->line;
+ err = at_tok_start(&line);
+ if (err < 0)
+ {
+ goto exit;
+ }
+ int tmp_int = -1;
+ err = at_tok_nextint(&line, &tmp_int);
+ if (err < 0)
+ {
+ goto exit;
+ }
+ if(tmp_int != -1)
+ *sim_id = tmp_int;
+ goto exit;
+exit:
+ at_response_free(response);
+ return err;
+}
+
+/*
+>AT+SWITCHSIM?
+<+SWITCHSIM: 0
+
+<OK
+*/
+static int req_dual_sim_set(ATPortType_enum port, mbtk_sim_type_enum sim_id, int *cme_err)
+{
+ int err = -1;
+ ATResponse *response = NULL;
+
+ char cmd[64] = {0};
+ snprintf(cmd, sizeof(cmd), "AT+SWITCHSIM=%d", sim_id);
+ err = at_send_command(portType_2_portId(MBTK_SIM_1, port), cmd, &response);
+ if (err < 0 || response->success == 0){
+ *cme_err = at_get_cme_error(response);
+ goto exit;
+ }
+
+exit:
+ at_response_free(response);
+ return err;
+}
+
//void net_list_free(void *data);
// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
// Otherwise, do not call pack_error_send().
@@ -627,7 +691,7 @@
{
if(pack->data_len == 0 || pack->data == NULL)
{
- mbtk_sim_state_enum state = ril_sim_state_get(cli_info->port);
+ mbtk_sim_state_enum state = ril_sim_state_get(cli_info->sim_id, cli_info->port);
if(state == MBTK_SIM_STATE_UNKNOWN)
{
err = MBTK_RIL_ERR_UNKNOWN;
@@ -635,7 +699,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
}
}
else // Set
@@ -650,7 +714,7 @@
if(pack->data_len == 0 || pack->data == NULL)
{
uint8 sim_card_type;
- if(req_sim_type_get(cli_info->port, &sim_card_type, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_sim_type_get(cli_info->sim_id, cli_info->port, &sim_card_type, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -661,7 +725,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &sim_card_type, sizeof(uint8));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &sim_card_type, sizeof(uint8));
}
}
else // Set
@@ -676,7 +740,7 @@
if(pack->data_len == 0 || pack->data == NULL)
{
char imsi[20] = {0};
- if(req_imsi_get(cli_info->port, imsi, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_imsi_get(cli_info->sim_id, cli_info->port, imsi, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -687,7 +751,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, imsi, strlen(imsi));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, imsi, strlen(imsi));
}
}
else // Set
@@ -702,7 +766,7 @@
if(pack->data_len == 0 || pack->data == NULL)
{
char pn[50] = {0};
- if(req_phone_number_get(cli_info->port, pn, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_phone_number_get(cli_info->sim_id, cli_info->port, pn, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -713,7 +777,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, pn, strlen(pn));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, pn, strlen(pn));
}
}
else // Set
@@ -728,7 +792,7 @@
if(pack->data_len == 0 || pack->data == NULL)
{
char iccid[50] = {0};
- if(req_iccid_get(cli_info->port, iccid, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_iccid_get(cli_info->sim_id, cli_info->port, iccid, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -739,7 +803,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, iccid, strlen(iccid));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, iccid, strlen(iccid));
}
}
else // Set
@@ -754,7 +818,7 @@
if(pack->data_len == 0 || pack->data == NULL)
{
int state;
- if(req_sim_lock_state_get(cli_info->port, &state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_sim_lock_state_get(cli_info->sim_id, cli_info->port, &state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -765,13 +829,13 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
}
}
else // Set
{
mbtk_sim_lock_info_t *lock_info = (mbtk_sim_lock_info_t*)pack->data;
- if(req_sim_lock_set(cli_info->port, lock_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_sim_lock_set(cli_info->sim_id, cli_info->port, lock_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -782,7 +846,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
}
}
break;
@@ -792,7 +856,7 @@
if(pack->data_len == 0 || pack->data == NULL)
{
mbtk_pin_puk_last_times_t last_times;
- if(req_pin_puk_last_times_get(cli_info->port, &last_times, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_pin_puk_last_times_get(cli_info->sim_id, cli_info->port, &last_times, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -803,7 +867,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &last_times, sizeof(mbtk_pin_puk_last_times_t));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &last_times, sizeof(mbtk_pin_puk_last_times_t));
}
}
else // Set
@@ -819,7 +883,7 @@
{
mbtk_plmn_info info;
memset(&info, 0, sizeof(mbtk_plmn_info));
- if(req_plmn_get(cli_info->port, &info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ if(req_plmn_get(cli_info->sim_id, cli_info->port, &info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
{
if(cme_err != MBTK_RIL_ERR_CME_NON) {
err = MBTK_RIL_ERR_CME + cme_err;
@@ -830,7 +894,7 @@
}
else
{
- ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &info, sizeof(mbtk_plmn_info));
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &info, sizeof(mbtk_plmn_info));
}
}
else // Set
@@ -840,6 +904,45 @@
}
break;
}
+ case RIL_MSG_ID_SIM_SWITCH:
+ {
+ if(pack->data_len == 0 || pack->data == NULL)
+ {
+ mbtk_sim_type_enum sim_id;
+ if(req_dual_sim_get(cli_info->port, &sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ {
+ if(cme_err != MBTK_RIL_ERR_CME_NON) {
+ err = MBTK_RIL_ERR_CME + cme_err;
+ } else {
+ err = MBTK_RIL_ERR_UNKNOWN;
+ }
+ LOG("Get SWITCHSIM fail.");
+ }
+ else
+ {
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &sim_id, sizeof(mbtk_sim_type_enum));
+ }
+ }
+ else // Set
+ {
+ mbtk_sim_type_enum *sim_id = (mbtk_sim_type_enum*)pack->data;
+ if(req_dual_sim_set(cli_info->port, *sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
+ {
+ if(cme_err != MBTK_RIL_ERR_CME_NON) {
+ err = MBTK_RIL_ERR_CME + cme_err;
+ } else {
+ err = MBTK_RIL_ERR_UNKNOWN;
+ }
+ LOG("Set SWITCHSIM fail.");
+ }
+ else
+ {
+ ril_info.cur_sim_id = *sim_id;
+ ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
+ }
+ }
+ break;
+ }
default:
{
err = MBTK_RIL_ERR_REQ_UNKNOWN;