Squashed 'LYNQ_PUBLIC/' content from commit 79d8f932f
git-subtree-dir: LYNQ_PUBLIC
git-subtree-split: 79d8f932fb4ebc4b5aec6c5ace97634912394272
Change-Id: If2527ba937f56fe989487bf71e996f7cfd9fbe61
diff --git a/common_src/lib/liblynq-sim/LICENSE b/common_src/lib/liblynq-sim/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/common_src/lib/liblynq-sim/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/common_src/lib/liblynq-sim/include/lynq_sim.h b/common_src/lib/liblynq-sim/include/lynq_sim.h
new file mode 100755
index 0000000..c2d7793
--- /dev/null
+++ b/common_src/lib/liblynq-sim/include/lynq_sim.h
@@ -0,0 +1,94 @@
+/*=============================================================================
+# FileName: lynq_sim.h
+# Desc: about SIMAPI
+# Author: lei
+# Version: V1.0
+# LastChange: 2022-03-31
+# History:
+# If you need to use any API under lynq_sim, you must first call the lynq_sim_init() function to initialize these functions.
+=============================================================================*/
+#ifndef __LYNQ_SIM__
+#define __LYNQ_SIM__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int lynq_get_sim_status(int *card_status);
+int lynq_get_imsi(char buf[]);
+int lynq_sim_init(int utoken);
+int lynq_sim_deinit(void);
+int lynq_enable_pin(char pin[]);
+int lynq_disable_pin(char pin[]);
+int lynq_get_iccid(char buf[]);
+int lynq_query_pin_lock(char *pin,int buf[]);
+int lynq_verify_pin(char *pin);
+int lynq_change_pin(char *old_pin, char *new_pin);
+int lynq_unlock_pin(char *puk, char *pin);
+int lynq_query_phone_number(char buf[]);
+int lynq_switch_card(int slot);
+int lynq_screen(int num);
+int lynq_get_imei(char buf[]);
+int lynq_get_imei_and_sv(char imei[],char sv[]);
+
+/**
+ * @brief Request SIM I/O operation.
+ * This is similar to the TS 27.007 "restricted SIM" operation
+ * where it assumes all of the EF selection will be done by the callee.
+ * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ * type: [IN] list[1]:EF id(fileid)
+ * type: [IN] list[2]:offset(p1)
+ * type: [IN] list[3]:offset(p2)
+ * type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
+ type: [IN] Path is in hex asciii format eg "7f205f70"
+ type: [IN] Path must always be provided.
+ * @param data type: [IN] May be NULL
+ * @param pin2 type: [IN] May be NULL
+ * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param sw type: [OUT]
+ * @param simResponse type: [OUT] response
+ * @return int
+ */
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse);
+
+/**
+ * @brief
+ * @param options type: [IN] [options] define whether you want to halt, power-off, or reboot the machine.May be NULL
+ * @param time type: [IN] [time] specifies when you want the shutdown to perform.May be NULL
+ * @param message type: [IN] [message] adds a message that announces the shutdown.May be NULL
+ * @return int
+ */
+int lynq_shutdown(char options[], char time[], char message[]);
+
+/**
+ * @brief get currnet version of mobiletek
+ * @param buf type: [out] My Param doc
+ * @return int
+ */
+int lynq_get_version(char buf[]);
+
+/**
+ * @brief sim power on/off
+ *
+ */
+int lynq_sim_power(int mode);
+
+/**
+ * @brief reset modem
+ *
+ */
+int lynq_reset_modem(void);
+
+/**
+ * @brief factory test to both radio on/off
+ *
+ */
+int lynq_factory_radio_state(int num);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/common_src/lib/liblynq-sim/makefile b/common_src/lib/liblynq-sim/makefile
new file mode 100755
index 0000000..f34e6b0
--- /dev/null
+++ b/common_src/lib/liblynq-sim/makefile
@@ -0,0 +1,93 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
+ -g -Os \
+ -flto \
+ -fPIC \
+ -fpermissive \
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+ LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+ LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+ -DANDROID_MULTI_SIM \
+ -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+ LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+ -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+ -DMD_90_SUPPORT
+endif
+
+$(warning ################# RITA ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH)/include \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -lbinder \
+ -lutils \
+ -lcutils \
+ -llog \
+ -llynq-log \
+
+SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)
+
+EXECUTABLE = liblynq-sim.so
+
+OBJECTS=$(SOURCES:.c=.o)
+
+
+.PHONY: build clean install pack_rootfs
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build: $(EXECUTABLE)
+ $(warning ########## build $(EXECUTABLE) ##########)
+
+install:
+ mkdir -p $(ROOT)$(base_libdir)/
+ install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+
+pack_rootfs:
+ mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+ cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+ $(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+ mkdir -p $(PACK_TO)$(base_libdir)/
+ cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+ $(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/common_src/lib/liblynq-sim/src/lynq_sim.cpp b/common_src/lib/liblynq-sim/src/lynq_sim.cpp
new file mode 100755
index 0000000..f14fda2
--- /dev/null
+++ b/common_src/lib/liblynq-sim/src/lynq_sim.cpp
@@ -0,0 +1,1397 @@
+/*=============================================================================
+# FileName: lynq_sim.cpp
+# Desc: about SIM API
+# Author: mobiletek
+# Version: V1.0
+# LastChange: 2021-12-29
+# History:
+=============================================================================*/
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include "lynq_sim.h"
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h> /*add for get recvfrom errorid on 20220921*/
+#include <sys/stat.h>
+#include <fcntl.h>
+#define MAX_BUF 20
+#define MAX_NUM 80
+#define RIL_REQUEST_GET_SIM_STATUS 1
+#define RIL_REQUEST_GET_IMSI 11
+#define RIL_REQUEST_QUERY_ICCID 2026
+#define RIL_REQUEST_SET_FACILITY_LOCK 43
+#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
+#define RIL_REQUEST_ENTER_SIM_PIN 2
+#define RIL_REQUEST_ENTER_SIM_PUK 3
+#define RIL_REQUEST_CHANGE_SIM_PIN 6
+#define RIL_REQUEST_OEM_HOOK_RAW 59
+#define RIL_REQUEST_SCREEN_STATE 61
+#define RIL_REQUEST_SIM_IO 28
+#define RIL_REQUEST_DEVICE_IDENTITY 98
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
+#define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
+#define LYNQ_REQUEST_CHANGE_RADIO 8015
+#define MAX_LEN 1024*8
+#define MAX_NUM 10
+#define LOG_TAG "LYNQ_SIM"
+#define FLAG_TESS 0
+using ::android::Parcel;
+#define DEST_PORT 8088
+#define DSET_IP_ADDRESS "127.0.0.1"
+
+typedef struct{
+ int uToken;
+ int request;
+ int paramLen;
+ char param[MAX_LEN];
+}lynq_client_t;
+
+lynq_client_t client_t;
+/* socket文件描述符 */
+int len_addr_serv;
+struct sockaddr_in addr_serv;
+static int sock_fd = 0;
+int Global_uToken = 0;
+int solicited_token = -1;
+int resp_type = -1;
+int request = -1;
+int slot_id = -1;
+int error1 = -1;
+static pthread_mutex_t g_lynq_sim_sendto_mutex;
+/**
+ * @brief mark call initialization state
+ * 0: deinit state
+ * 1: init state
+ */
+int g_lynq_sim_init_flag = 0;
+
+/**
+ * @brief lynq_req_sim_io need to send request
+ */
+char data_buf[32] = {0};
+char pin2_buf[32] = {0};
+char aidPtr_buf[32] = {0};
+
+/**/
+char options_buf[32] = {0};
+char time_buf[32] = {0};
+char message_buf[32] = {0};
+
+int lynq_sim_init(int utoken){
+
+ RLOGE("%s start, parameter is %d", __func__,utoken);
+
+ if(g_lynq_sim_init_flag == 1)
+ {
+ RLOGD("lynq_sim_init failed");
+ return -1;
+ }
+ g_lynq_sim_init_flag = 1;
+ if(utoken < 0){
+ return -1;
+ }
+ Global_uToken = utoken;
+ sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (-1 == sock_fd)
+ {
+ return sock_fd;
+ }
+
+ struct sockaddr_in liblynq_data_socket;
+ bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
+ //set this lib socket config
+ liblynq_data_socket.sin_family = AF_INET;
+ liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
+ int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
+ if (-1 == ret)
+ {
+ RLOGE("liblynq_data_socket bind fail,errno:%d",errno);
+ return -1;
+ }
+
+ struct timeval timeOut;
+ timeOut.tv_sec = 60;
+ timeOut.tv_usec = 0;
+ if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
+ {
+ RLOGD("time out setting failed\n");
+ return -1;
+ }
+ /* 设置address */
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family = AF_INET;
+ addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
+ addr_serv.sin_port = htons(DEST_PORT);
+ len_addr_serv = sizeof(addr_serv);
+ /*test*/
+
+ RLOGE("%s end suc", __func__);
+ return 0;
+}
+
+int lynq_sim_deinit(void){
+
+ RLOGE("%s start", __func__);
+
+ if(g_lynq_sim_init_flag == 0)
+ {
+ RLOGD("lynq_sim_deinit failed");
+ return -1;
+ }
+ g_lynq_sim_init_flag = 0;
+ close(sock_fd);
+
+ RLOGE("%s end suc", __func__);
+ return 0;
+}
+
+static char * lynqStrdupReadString(Parcel &p) {
+ size_t stringlen;
+ const char16_t *s16;
+
+ s16 = p.readString16Inplace(&stringlen);
+ return strndup16to8(s16, stringlen);
+}
+
+/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
+int lynq_get_sim_status(int *card_status)
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(card_status == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ lynq_client_t client_t1;
+ memset(&client_t1, 0, sizeof(client_t1) );
+ client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
+ client_t1.paramLen = 0;
+ client_t1.uToken = Global_uToken;
+ char res_data[MAX_LEN] = {0};
+ int len1 = sizeof(client_t1.param);
+ memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return recv_num;
+ }
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ Parcel p;;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ p.readInt32(card_status);
+ }
+ return error1;
+}
+
+int lynq_get_imsi(char buf[])
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(buf == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ lynq_client_t client_t1;
+ memset(&client_t1, 0, sizeof(client_t1) );
+ client_t1.request = RIL_REQUEST_GET_IMSI;
+ client_t1.paramLen = 0;
+ client_t1.uToken = Global_uToken;
+ char res_data[MAX_LEN] = {0};
+ memset(client_t1.param, 0, sizeof(client_t1.param));
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ if(!error1){
+ char * test = lynqStrdupReadString(p);
+ memcpy(buf, test, strlen(test));
+ free(test);
+ }
+ }
+ return error1;
+}
+
+
+/*add by lei*/
+
+int lynq_get_iccid(char buf[]){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(buf == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ client_t.request = RIL_REQUEST_QUERY_ICCID;
+ client_t.paramLen = 0;
+ client_t.uToken = Global_uToken;
+ char res_data[MAX_LEN] = {0};
+ memset(client_t.param, 0, sizeof(client_t.param));
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ if(!error1){
+ char * test = lynqStrdupReadString(p);
+ memcpy(buf, test, strlen(test));
+ free(test);
+ }
+ }
+ return error1;
+}
+
+int lynq_enable_pin(char *pin){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(pin == NULL)
+ return ret;
+ if(!strlen(pin))
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
+ client_t.paramLen = 4;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ }
+ return error1;
+}
+
+int lynq_sim_power(int mode)
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ char res_data[MAX_LEN] = {0};
+ client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ char buf[64] = {0};
+ sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
+ sprintf(client_t.param, "%s\n", buf);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return ret;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = -1;
+ if(p.dataAvail() > 0)
+ {
+ char test[128] = {0};
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ p.readInt32(&num);
+ if(num == -1){
+ }else{
+ p.read(test, num);
+ return error1;
+ }
+ }
+ return error1;
+}
+
+int lynq_disable_pin(char *pin){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(pin == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
+ client_t.paramLen = 4;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ }
+ return error1;
+}
+
+int lynq_query_pin_lock(char *pin,int buf[]){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(pin == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
+ client_t.paramLen = 3;
+ client_t.uToken = Global_uToken;
+ char res_data[MAX_LEN] = {0};
+ sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = -1;
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ p.readInt32(&num);
+ if(num > 0){
+ int *test = (int *)calloc(1, sizeof(int)*num);
+ for(int i =0; i <num; i++){
+ p.readInt32(&test[i]);
+ buf[i] = test[i];
+ }
+ free(test);
+ }
+ }
+ return error1;
+}
+
+int lynq_verify_pin(char *pin){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(pin == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ int len = 0;
+ client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s\n", pin);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ }
+ return error1;
+}
+
+int lynq_change_pin(char *old_pin, char *new_pin){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(old_pin == NULL || new_pin == NULL)
+ return ret;
+ if(!strlen(new_pin))
+ return ret;
+ if(!strlen(old_pin))
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ int len = 0;
+ client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
+ client_t.paramLen = 2;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ }
+ return error1;
+}
+
+int lynq_unlock_pin(char *puk, char *pin){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(puk == NULL || pin == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ int len = 0;
+ client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
+ client_t.paramLen = 2;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s %s\n", puk, pin);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ }
+ return error1;
+}
+
+static void delete_char(char str[],char target){
+ if(str == NULL){
+ return;
+ }
+ int i,j;
+ for(i=j=0;str[i]!='\0';i++){
+ if(str[i]!=target){
+ str[j++]=str[i];
+ }
+ }
+ str[j]='\0';
+}
+
+static int parse_param(char *cmd, char **argv, char buf[]){
+ if(cmd == NULL || argv == NULL || buf == NULL){
+ return -1;
+ }
+ if(strstr(cmd,"ERROR")){
+ return 3;
+ }
+ else{
+ int argc = 0;
+ char *token;
+ token = strtok(cmd, ",");
+ if(token == NULL)
+ {
+ return 9001;
+ }
+ if(strstr(token, "CNUM"))
+ {
+ char *string;
+ while (token != NULL)
+ {
+ if(argc == 5)
+ {
+ if(NULL == argv[1])
+ {
+ return 9002;
+ }
+ int lengh = strlen(argv[1]);
+ memcpy(buf, argv[1], lengh);
+ delete_char(buf, '"');
+ RLOGD("too many phone number return\n");
+ return 0;
+ }
+ string = token;
+ argv[argc++] = string;
+ token = strtok(NULL, ",");
+ }
+ if(NULL == argv[1])
+ {
+ return 9001;
+ }
+ int lengh = strlen(argv[1]);
+ memcpy(buf, argv[1], lengh);
+ delete_char(buf, '"');
+ return 0;
+ }
+ return 9001;
+ }
+}
+
+int lynq_query_phone_number(char buf[]){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(buf == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ char res_data[MAX_LEN] = {0};
+ client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s\n", "AT+CNUM");
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return ret;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = -1;
+ if(p.dataAvail() > 0)
+ {
+ char test[128] = {0};
+ char *argv[5] = {0};
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ p.readInt32(&num);
+ if(num == -1){
+ }else{
+ p.read(test, num);
+ num = parse_param(test, argv, buf);
+ return num;
+ }
+ }
+ return error1;
+}
+
+int lynq_get_imei(char buf[])
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(buf == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ lynq_client_t client_t1;
+ memset(&client_t1, 0, sizeof(client_t1) );
+ client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
+ client_t1.paramLen = 0;
+ client_t1.uToken = Global_uToken;
+ char res_data[MAX_LEN] = {0};
+ memset(client_t1.param, 0, sizeof(client_t1.param));
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = 0;
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ if(!error1){
+ p.readInt32(&num);
+ char * test = lynqStrdupReadString(p);
+ memcpy(buf, test, strlen(test));
+ free(test);
+ }
+ }
+ return error1;
+}
+
+int lynq_get_imei_and_sv(char imei[],char sv[])
+{
+ RLOGD("%s called",__func__);
+ if(g_lynq_sim_init_flag == 0)
+ {
+ RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag);
+ return -2;
+ }
+ int ret = -1;
+ if(imei == NULL || sv== NULL)
+ {
+ RLOGD("%s imei is NULL or sv is NULL",__func__);
+ return ret;
+ }
+
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ lynq_client_t client_t1;
+ memset(&client_t1, 0, sizeof(client_t1) );
+ client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
+ client_t1.paramLen = 0;
+ client_t1.uToken = Global_uToken;
+ char res_data[MAX_LEN] = {0};
+ memset(client_t1.param, 0, sizeof(client_t1.param));
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("%s sendto error: %d",__func__,send_num);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num);
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = 0;
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ if(!error1){
+ p.readInt32(&num);
+ if(num<2)
+ {
+ RLOGD("%s num %d error, should greater than 1",__func__,num);
+ return -1;
+ }
+ char *resp[2]={NULL,NULL};
+ int i;
+ for(i=0;i<2;i++)
+ {
+ resp[i]= lynqStrdupReadString(p);
+ if(resp[i]==NULL)
+ {
+ break;
+ }
+ }
+
+ if(i==2){
+ memcpy(imei, resp[0], strlen(resp[0])+1);
+ memcpy(sv, resp[1], strlen(resp[1])+1);
+ }
+ else
+ {
+ RLOGD("%s resp[%d] is null",__func__,i);
+ }
+
+ for(i=0;i<2;i++)
+ {
+ if(resp[i]!=NULL)
+ {
+ free(resp[i]);
+ }
+ }
+ return i==2? 0:-1;
+ }
+ }
+ RLOGD("%s called failed %d",__func__,error1);
+ return error1;
+}
+
+static int judge(int slot){
+ switch(slot){
+ case 0:
+ return -1;
+ case 1:
+ return -1;
+ }
+ return 0;
+}
+
+int lynq_switch_card(int slot){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(!judge(slot))
+ return ret;
+ int send_num = 0;
+ client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d\n", slot);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ return send_num;
+ }
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return 0;
+}
+/**@breif change screen state
+*param num type: [IN] screen_state,0:close,1:open
+*param ret type: [OUT] result,0:success,other:fail
+*return int
+*/
+int lynq_screen(int num){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+
+ int ret = -1;
+ if(!judge(num))
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int error[2];
+ char res_data[MAX_LEN] = {0};
+
+ //change the first screen
+ client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d\n", num);
+
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("sendto error:\n");
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ for(int i=0;i<2;i++)
+ {
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
+ RLOGD("screen recvform error\n");
+ return errno;
+ }
+ if(i == 1)
+ {
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ RLOGD("recvfrom success\n");
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ error[i] = error1;//change screen state result
+ }
+ }
+
+ if((error[0] != 0) || (error[1] != 0))
+ {
+ RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
+ if(error[0] != 0)
+ {
+ return error[0];
+ }
+ else
+ {
+ return error[1];
+ }
+ }
+ else
+ {
+ return 0;
+ }
+
+}
+
+/**@breif change screen state
+*param num type: [IN] screen_state,0:close,1:open
+*param ret type: [OUT] result,0:success,other:fail
+*return int
+*/
+int lynq_factory_radio_state(int num){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+
+ int ret = -1;
+ if(!judge(num))
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int error[2];
+ char res_data[MAX_LEN] = {0};
+ //change the first screen
+ client_t.request = LYNQ_REQUEST_CHANGE_RADIO; //8015
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d\n", num);
+
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("sendto error:\n");
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ for(int i=0;i<2;i++)
+ {
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
+ RLOGD("screen recvform error\n");
+ return errno;
+ }
+ if(i == 1)
+ {
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ RLOGD("recvfrom success\n");
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ error[i] = error1;//change screen state result
+ }
+ }
+
+ if((error[0] != 0) || (error[1] != 0))
+ {
+ RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
+ if(error[0] != 0)
+ {
+ return error[0];
+ }
+ else
+ {
+ return error[1];
+ }
+ }
+ else
+ {
+ return 0;
+ }
+
+}
+
+/**
+ * @brief Check whether the input is valid for lynq_req_sim_io api
+ * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ * type: [IN] list[1]:EF id(fileid)
+ * type: [IN] list[2]:offset(p1)
+ * type: [IN] list[3]:offset(p2)
+ * type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
+ type: [IN] Path is in hex asciii format eg "7f205f70"
+ type: [IN] Path must always be provided.
+ * @param data type: [IN] May be NULL
+ * @param pin2 type: [IN] May be NULL
+ * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param sw type: [OUT]
+ * @param simResponse type: [OUT] response
+ * @return int
+ */
+static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
+{
+ if(list == NULL)
+ {
+ return -1;
+ }
+ if(path == NULL)
+ {
+ return -1;
+ }
+ if(sw == NULL){
+ return -1;
+ }
+ if(simResponse == NULL){
+ return -1;
+ }
+ if(data == NULL)
+ {
+ memcpy(data_buf, "null", 4);
+ }
+ else
+ {
+ bzero(data_buf,32);
+ memcpy(data_buf, data, strlen(data));
+ }
+ if(pin2 == NULL)
+ {
+ memcpy(pin2_buf, "null", 4);
+ }
+ else
+ {
+ bzero(pin2_buf,32);
+ memcpy(pin2_buf, data, strlen(data));
+ }
+ if(aidPtr == NULL)
+ {
+ memcpy(aidPtr_buf, "null", 4);
+ }
+ else
+ {
+ bzero(aidPtr_buf,32);
+ memcpy(aidPtr_buf, data, strlen(data));
+ }
+ return 0;
+}
+
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
+ {
+ return ret;
+ }
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ client_t.request = RIL_REQUEST_SIM_IO;
+ client_t.paramLen = 9;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ if(p.dataAvail() > 0)
+ {
+ p.readInt32(&resp_type);
+ p.readInt32(&solicited_token);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ if(!error1)
+ {
+ p.readInt32(&sw[0]);
+ p.readInt32(&sw[1]);
+ char * test = lynqStrdupReadString(p);
+ memcpy(simResponse, test, strlen(test));
+ free(test);
+ }
+
+ }
+ return error1;
+}
+
+static void wait_reset_mipc_response(int *response)
+{
+ usleep(500*1000);
+ int outfd = open("/data/tp",O_RDONLY);
+ if(outfd == -1){
+ RLOGD("open error");
+ return;
+ }
+ char rst[1024];
+ int s;
+ s = read(outfd,rst,sizeof(rst));
+ sscanf(rst,"%d",response);
+ usleep(1);
+ close(outfd);
+ return;
+}
+
+int lynq_reset_modem(void)
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+ int ret = -1;
+ int send_num = 0;
+ client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s\n", "AT+LRSTMD");
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return ret;
+ }
+ wait_reset_mipc_response(&ret);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ RLOGD("function %d ret %d",__FUNCTION__, ret);
+ return ret;
+}
+
+/**
+ * @brief handle shutdown buf
+ * @param options type: [IN]My Param doc
+ * @param time type: [IN]My Param doc
+ * @param message type: [IN]My Param doc
+ */
+static void handle_shutdown_buf(char options[], char time[], char message[])
+{
+ if(NULL == options)
+ {
+ bzero(options_buf, 32);
+ memcpy(options_buf," ", 1);
+ }
+ else
+ {
+ memcpy(options_buf,options, strlen(options));
+ }
+ if(NULL == time)
+ {
+ bzero(time_buf, 32);
+ memcpy(time_buf," ", 1);
+ }
+ else
+ {
+ memcpy(time_buf, time, strlen(time));
+ }
+ if(NULL == message)
+ {
+ bzero(message_buf, 32);
+ memcpy(message_buf," ", 1);
+ }
+ else
+ {
+ memcpy(message_buf, message, strlen(message));
+ }
+}
+
+int lynq_shutdown(char options[], char time[], char message[])
+{
+ char cmd[128] = {0};
+ handle_shutdown_buf(options, time, message);
+ sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
+ system(cmd);
+ return 0;
+}
+
+int lynq_get_version(char buf[])
+{
+ FILE * fp;
+ char buffer[128];
+ sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
+ fp = popen(buffer, "r");
+ fgets(buffer, sizeof(buffer), fp);
+ memcpy(buf, buffer, strlen(buffer));
+ buf[strlen(buffer)] = '\0';
+ pclose(fp);
+ return 0;
+}
+#if FLAG_TESS
+int lynq_query_operator(char buf[]){
+ int32_t token = -1;
+ if(buf == NULL)
+ return token;
+ char msg_imsi[20] = {0};
+ memset(msg_imsi,0,sizeof(msg_imsi));
+ token = lynq_get_imsi(msg_imsi);
+ if(strlen(msg_imsi) != 0){
+ FindOperator *ope_command = NULL;
+ ope_command = find_ope_command(msg_imsi, findOperator);
+ if(ope_command){
+ memcpy(buf, ope_command->buf, strlen(ope_command->buf));
+ buf[strlen(ope_command->buf)] = '\0';
+ }
+ else{
+ /*more*/
+ char mccmnc[5] = {0};
+ memcpy(buf, msg_imsi, 5);
+ buf[5] = '\0';
+ /*more*/
+ }
+ return token;
+ }
+ else{
+ //msg->base.e = err;
+ const char *test = "please insert sim card";
+ memcpy(buf, test, strlen(test));
+ return token;
+ }
+}
+FindOperator findOperator[] = {
+#include "operator.h"
+};
+
+static FindOperator*find_ope_command (char *name,FindOperator *Class){
+ if(name == NULL || Class == NULL){
+ return ((FindOperator *)NULL);
+ }
+ register int i;
+ for (i = 0; Class[i].MCCMCN; i++)
+ if (strncmp (name, Class[i].MCCMCN, 5) == 0)
+ return (&Class[i]);
+ return ((FindOperator *)NULL);
+}
+
+#endif