[Feature][ZXW-33]merge ZXW 0428 version
Change-Id: I11f167edfea428d9fab198ff00ff1364932d1b0b
diff --git a/ap/lib/libvsim/ght_vsim_api.c b/ap/lib/libvsim/ght_vsim_api.c
index 5d2647f..12a5afa 100755
--- a/ap/lib/libvsim/ght_vsim_api.c
+++ b/ap/lib/libvsim/ght_vsim_api.c
@@ -10,8 +10,10 @@
extern int32_t zte_mdm_event_regist(zte_mdm_event_ind_callback ind_cb);
extern int32_t zte_atVsimInit(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID);
+extern int32_t zte_atSoftSimInit(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID);
extern int32_t zte_atVsimClose(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID);
+extern int32_t zte_atSoftSimClose(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID);
extern int32_t zte_atVsimReset(void);
@@ -96,6 +98,12 @@
zte_mdm_event_regist(fibo_mdm_event_ind_cb);
zte_atVsimInit(vsim_apdu_process, nSimID);
}
+void fibo_SoftSim_init(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID)
+{
+ printf("[VSIM] fibo_SoftSim_init,%d", nSimID);
+ zte_mdm_event_regist(fibo_mdm_event_ind_cb);
+ zte_atSoftSimInit(softsim_apdu_process, nSimID);
+}
/**********************************************************
** Function Name: fibo_vsim_close
@@ -109,6 +117,11 @@
printf("[VSIM] fibo_vsim_close,%d", nSimID);
zte_atVsimClose(vsim_apdu_process, nSimID);
}
+void fibo_SoftSim_close(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID)
+{
+ printf("[VSIM] fibo_SoftSim_close,%d", nSimID);
+ zte_atSoftSimClose(softsim_apdu_process, nSimID);
+}
/**************************************************************
** Function Name: fibo_set_sim_workmode
diff --git a/ap/lib/libvsim/ght_vsim_api.h b/ap/lib/libvsim/ght_vsim_api.h
index 685794d..b381421 100755
--- a/ap/lib/libvsim/ght_vsim_api.h
+++ b/ap/lib/libvsim/ght_vsim_api.h
@@ -247,7 +247,7 @@
*********************************************************************/
typedef int (*VSIM_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);
-
+typedef int (*SoftSim_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);
/*********************************************************************
** Ãû³Æ£º FIBO_MODEM_EVENT
@@ -282,6 +282,7 @@
**************************************************************************/
extern void fibo_vsim_init(VSIM_COMMAND vsim_apdu_process, uint8_t nSimID);
+extern void fibo_SoftSim_init(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID);
/**********************************************************
** Function Name: fibo_vsim_close
@@ -293,6 +294,7 @@
***********************************************************/
extern void fibo_vsim_close(VSIM_COMMAND vsim_apdu_process, uint8_t nSimID);
+extern void fibo_SoftSim_close(SoftSim_COMMAND softsim_apdu_process, uint8_t nSimID);
/**************************************************************
** Function Name: fibo_set_dualsim
diff --git a/ap/lib/libvsim/libvsim.c b/ap/lib/libvsim/libvsim.c
index 22067cd..e0f275b 100755
--- a/ap/lib/libvsim/libvsim.c
+++ b/ap/lib/libvsim/libvsim.c
@@ -37,7 +37,9 @@
int g_read_thread_state = -1;
int g_msg_thread_state = -1;
VSIM_COMMAND g_vsim_apdu_process_cb;
+SoftSim_COMMAND g_softsim_apdu_process_cb;
zte_mdm_event_ind_callback g_vsim_event_ind_cb;
+unsigned char g_vsim_slot[2];
int32_t zte_mdm_event_ind_cb(E_MODEM_EVENT_ID event_id, void *ind_data, uint32_t ind_data_len)
{
@@ -125,7 +127,7 @@
static void read_thread_entry(void *arg)
{
prctl(PR_SET_NAME, "vsim_read", 0, 0, 0);
- while(g_vsim_apdu_process_cb)
+ while(g_vsim_event_ind_cb)
{
VSIM_MSG_BUF msg_in = {0};
VSIM_MSG_BUF msg_out = {0};
@@ -150,8 +152,14 @@
vsim_set(MSG_CMD_VSIM_SET_STANDBY,0);
}
msg_in.usDataLen = sizeof(msg_in.aucDataBuf);
- ret = g_vsim_apdu_process_cb(&msg_out.aucDataBuf[2], msg_out.usDataLen, msg_in.aucDataBuf,
- &msg_in.usDataLen, msg_out.aucDataBuf[0]);
+ if(g_vsim_apdu_process_cb && msg_out.aucDataBuf[0] < 2 && g_vsim_slot[msg_out.aucDataBuf[0]] == 1){
+ ret = g_vsim_apdu_process_cb(&msg_out.aucDataBuf[2], msg_out.usDataLen, msg_in.aucDataBuf,
+ &msg_in.usDataLen, msg_out.aucDataBuf[0]);
+ }
+ if(g_softsim_apdu_process_cb && msg_out.aucDataBuf[0] < 2 && g_vsim_slot[msg_out.aucDataBuf[0]] == 2){
+ ret = g_softsim_apdu_process_cb(&msg_out.aucDataBuf[2], msg_out.usDataLen, msg_in.aucDataBuf,
+ &msg_in.usDataLen, msg_out.aucDataBuf[0]);
+ }
vsim_debug_printf("##vsim## g_vsim_apdu_process_cb ret=0x%x len=%d\n", ret, msg_in.usDataLen);
//ÇÐÐéÄ⿨
if(is_auth){
@@ -214,7 +222,11 @@
char imei[]="862769025435956";
fibo_set_IMEI_by_simid(imei,sizeof(imei),1);
fibo_mdm_event_regist(zte_mdm_event_ind_cb);
- fibo_vsim_init(zte_vsim_ind_cb,1);
+ vsim_set(MSG_CMD_VSIM_SET_STANDBY,1);
+ vsim_card_switch_req(1);
+ vsim_set(MSG_CMD_VSIM_SET_SWITCH,1);
+ get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+ g_vsim_slot[1] = 1;
}
if(stMsg.aucDataBuf[0] == 2){
fibo_vsim_close(zte_vsim_ind_cb,1);
@@ -246,9 +258,13 @@
int32_t zte_atVsimInit(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID)
{
+ char stat[4] = {0};
+
+ sc_cfg_get("vsim_stat",stat,sizeof(stat));
vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
- if(vsim_apdu_process_fn == NULL || nSimID != 1){
- printf("##vsim## init param err fn=0x%x sim=%d\n", vsim_apdu_process_fn, nSimID);
+ if(vsim_apdu_process_fn == NULL || nSimID != 1 || g_vsim_apdu_process_cb || atoi(stat)){
+ printf("##vsim## init param err fn=0x%x old=0x%x sim=%d stat=%d\n",
+ vsim_apdu_process_fn, g_vsim_apdu_process_cb, nSimID, atoi(stat));
return -1;
}
g_vsim_apdu_process_cb = vsim_apdu_process_fn;
@@ -260,23 +276,113 @@
printf("##vsim## init fail read=%d msg=%d\n", g_read_thread_state, g_msg_thread_state);
return -1;
}
+ g_vsim_slot[1] = 1;
+ sc_cfg_set("vsim_stat","1");
vsim_set(MSG_CMD_VSIM_SET_STANDBY,1);//´ËÊ±ÔÆ¿¨Î´½¨ÍøÂçÁ´½Ó£¬ÏÈÇÐÊý¾ÝÔÙÇÐÍø
vsim_card_switch_req(1);
vsim_set(MSG_CMD_VSIM_SET_SWITCH,1);
+ get_modem_info("AT+ZCARDSWITCH=1,1\r\n", NULL, NULL);
get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
return 0;
}
-int32_t zte_atVsimClose(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID)
+int32_t zte_atSoftSimInit(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID)
+{
+ char stat[4] = {0};
+
+ sc_cfg_get("softsim_stat",stat,sizeof(stat));
+ vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
+ if(softssim_apdu_process_fn == NULL || (nSimID != 1 && nSimID != 0) || g_softsim_apdu_process_cb || atoi(stat)){
+ printf("##vsim## soft init param err fn=0x%x old=0x%x sim=%d\n",
+ softssim_apdu_process_fn, g_softsim_apdu_process_cb, nSimID, atoi(stat));
+ return -1;
+ }
+ g_vsim_slot[nSimID] = 2;
+ sc_cfg_set("softsim_stat","1");
+ g_softsim_apdu_process_cb = softssim_apdu_process_fn;
+ if(nSimID){
+ vsim_set(MSG_CMD_VSIM_SET_STANDBY,1);//´ËÊ±ÔÆ¿¨Î´½¨ÍøÂçÁ´½Ó£¬ÏÈÇÐÊý¾ÝÔÙÇÐÍø
+ vsim_card_switch_req(1);
+ vsim_set(MSG_CMD_VSIM_SET_SWITCH,1);
+ get_modem_info("AT+ZCARDSWITCH=2,1\r\n", NULL, NULL);
+ get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+ }else{
+ uint8_t sim = 0;
+ uint8_t ret = 0;
+ zte_GetGTDUALSIM(&sim);
+ if(sim != nSimID)
+ zte_SetGTDUALSIM(nSimID);
+ ret = vsim_get_cardstat_fromps();
+ if(ret >= 0 && nSimID != ret)
+ vsim_card_switch_req(nSimID);
+ get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
+ get_modem_info("AT+CFUN=5\r\n", NULL, NULL);
+ get_modem_info("AT+ZCARDSWITCH=2,0\r\n", NULL, NULL);
+ get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+ if(sim != nSimID)
+ zte_SetGTDUALSIM(sim);
+ if(ret >= 0 && nSimID != ret)
+ vsim_card_switch_req(ret);
+ }
+ return 0;
+}
+
+int32_t zte_atSoftSimClose(VSIM_COMMAND vsim_apdu_process_fn, uint8_t nSimID)
{
vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
+ if(nSimID != 1 && nSimID != 0){
+ printf("##vsim## soft close param err sim=%d\n", nSimID);
+ return -1;
+ }
+ if(nSimID){
+ zte_SetGTDATASIM(1);
+ get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
+ vsim_card_switch_req(0);
+ zte_SetGTDUALSIM(0);
+ vsim_set(MSG_CMD_VSIM_RESET_FLOW_STATISTIC,1);
+ }else{
+ uint8_t sim = 0;
+ uint8_t ret = 0;
+ zte_GetGTDUALSIM(&sim);
+ if(sim != nSimID)
+ zte_SetGTDUALSIM(nSimID);
+ ret = vsim_get_cardstat_fromps();
+ if(ret >= 0 && nSimID != ret)
+ vsim_card_switch_req(nSimID);
+ get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
+ get_modem_info("AT+CFUN=5\r\n", NULL, NULL);
+ get_modem_info("AT+ZCARDSWITCH=0,0\r\n", NULL, NULL);
+ get_modem_info("AT+CFUN=1\r\n", NULL, NULL);
+ if(sim != nSimID)
+ zte_SetGTDUALSIM(sim);
+ if(ret >= 0 && nSimID != ret)
+ vsim_card_switch_req(ret);
+ }
+ g_vsim_apdu_process_cb = NULL;
+ g_vsim_slot[nSimID] = 0;
+ sc_cfg_set("softsim_stat","0");
+ return 0;
+}
+
+int32_t zte_atVsimClose(SoftSim_COMMAND softssim_apdu_process_fn, uint8_t nSimID)
+{
+ vsim_debug_printf("##vsim## [%s] start\n", __FUNCTION__);
+ if(nSimID != 1 && nSimID != 0){
+ printf("##vsim## close param err sim=%d\n", nSimID);
+ return -1;
+ }
zte_SetGTDATASIM(1);
get_modem_info("AT+CFUN=0\r\n", NULL, NULL);
vsim_card_switch_req(0);
zte_SetGTDUALSIM(0);
+ vsim_set(MSG_CMD_VSIM_RESET_FLOW_STATISTIC,1);
+ g_vsim_apdu_process_cb = NULL;
+ g_vsim_slot[1] = 0;
+ sc_cfg_set("vsim_stat","0");
return 0;
}
+
int32_t zte_SetGTDATASIM(uint8_t nSimID)
{
int ret = 0;
diff --git a/ap/lib/libvsim/zte_vsim_api.h b/ap/lib/libvsim/zte_vsim_api.h
index 1552449..c3821dd 100755
--- a/ap/lib/libvsim/zte_vsim_api.h
+++ b/ap/lib/libvsim/zte_vsim_api.h
@@ -236,7 +236,7 @@
*********************************************************************/
typedef int (*VSIM_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);
-
+typedef int (*SoftSim_COMMAND)(uint8_t *apdu_req, uint16_t apdu_req_len,uint8_t *apdu_rsp, uint16_t *apdu_rsp_len, uint8_t slot);
/*********************************************************************
** Ãû³Æ£º zte_mdm_event_ind_callback
** ÃèÊö£º ÏûϢʼþ֪ͨº¯ÊýµÄ½á¹¹¶¨Òå