blob: c780859b8d35da2134f291082a6577db49a8d98b [file] [log] [blame]
lle1d5d7c2022-01-18 12:34:30 +00001/*=============================================================================
2# FileName: lynq_sim.cpp
3# Desc: about SIM API
4# Author: mobiletek
5# Version: V1.0
6# LastChange: 2021-12-29
7# History:
8=============================================================================*/
9#include <stdio.h>
10#include <sys/types.h>
11#include <sys/socket.h>
12#include <arpa/inet.h>
13#include <string.h>
14#include <unistd.h>
15#include <binder/Parcel.h>
16#include <log/log.h>
17#include <cutils/jstring.h>
18#include <pthread.h>
you.chen24d54af2024-01-02 12:26:57 +080019#include <vendor-ril/telephony/ril.h>
20#include <sys/socket.h>
21#include <netinet/in.h>
lle1d5d7c2022-01-18 12:34:30 +000022#include <arpa/inet.h>
jb.qi6b23ed42022-09-22 00:30:55 -070023#include <errno.h> /*add for get recvfrom errorid on 20220921*/
ll88f00782022-10-04 10:16:28 +080024#include <sys/stat.h>
25#include <fcntl.h>
you.chen24d54af2024-01-02 12:26:57 +080026#include "lynq_sim.h"
lle1d5d7c2022-01-18 12:34:30 +000027#define MAX_BUF 20
28#define MAX_NUM 80
rjw5d2a50e2022-02-28 15:01:49 +080029#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
jb.qi96449342022-09-19 22:14:41 -070030#define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
ll71a113b2022-10-21 18:07:25 +080031#define LYNQ_REQUEST_CHANGE_RADIO 8015
lle1d5d7c2022-01-18 12:34:30 +000032#define MAX_LEN 1024*8
33#define MAX_NUM 10
34#define LOG_TAG "LYNQ_SIM"
35#define FLAG_TESS 0
36using ::android::Parcel;
37#define DEST_PORT 8088
38#define DSET_IP_ADDRESS "127.0.0.1"
39
40typedef struct{
41 int uToken;
42 int request;
43 int paramLen;
44 char param[MAX_LEN];
45}lynq_client_t;
46
lle1d5d7c2022-01-18 12:34:30 +000047/* socket文件描述符 */
48int len_addr_serv;
49struct sockaddr_in addr_serv;
50static int sock_fd = 0;
you.chen24d54af2024-01-02 12:26:57 +080051int Global_uToken = 0;
llab0f3e12022-07-20 11:59:51 +000052static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000053/**
54 * @brief mark call initialization state
55 * 0: deinit state
56 * 1: init state
57 */
58int g_lynq_sim_init_flag = 0;
59
60/**
61 * @brief lynq_req_sim_io need to send request
62 */
63char data_buf[32] = {0};
64char pin2_buf[32] = {0};
65char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000066
you.chen24d54af2024-01-02 12:26:57 +080067/**
68 * @brief lynq_shutdown need
69 */
llb15599d2022-04-01 07:50:08 +000070char options_buf[32] = {0};
71char time_buf[32] = {0};
72char message_buf[32] = {0};
73
you.chen24d54af2024-01-02 12:26:57 +080074typedef struct{
75 int resp_type;
76 int token;
77 int request;
78 int slot_id;
79 int error;
80}lynq_resp_t;
81
82#define RESULT_OK (0)
83#define RESULT_ERROR (-1)
84
85typedef enum{
86 /*base abnormal*/
87 LYNQ_E_PARAMETER_ANONALY=7000,
88 LYNQ_E_SEND_REQUEST_FAIL=7001,
89 LYNQ_E_GET_HEAD_ERROR=7002,
90 LYNQ_E_INNER_ERROR=7100,
91 LYNQ_E_MALLOC_ERROR=7101,
92 /**/
93 LYNQ_E_CARDSTATE_ERROR=8000,
94 /* The voice service state is out of service*/
95 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
96 /* The voice service state is EMERGENCY_ONLY*/
97 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
98 /* The radio power is power off*/
99 LYNQ_E_STATE_POWER_OFF=8003,
100 LYNQ_E_TIME_OUT=8004,
101 /*create or open sms DB fail */
102 LYNQ_E_SMS_DB_FAIL=8005,
103 /*Failed to execute sql statement*/
104 LYNQ_E_SMS_SQL_FAIL = 8006,
105 LYNQ_E_SMS_NOT_FIND = 8007,
106 /* The logic conflict*/
107 LYNQ_E_CONFLICT=9000,
108 /*Null anomaly*/
109 LYNQ_E_NULL_ANONALY=9001,
110 /*Invalid id anomaly*/
111 LYNQ_E_INVALID_ID_ANONALY=9002,
112#ifdef ECALL_SUPPORT
113 LYNQ_E_ECALL_BEING_RUNNING =9003,
114 LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
115 LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
116#endif
117}LYNQ_E;
118
119/**@brief print solicied response msg's head information
120* @param head [IN]: head information
121* @return none
122*/
123void PrintHeader(lynq_resp_t& head)
124{
125 RLOGD("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);
126}
127
128int GetHeader(Parcel* &p, lynq_resp_t& head, int request_id)
129{
130 RLOGD("get header");
131 if(p->dataAvail() > 0)
132 {
133 p->readInt32(&(head.resp_type));
134 p->readInt32(&(head.token));
135 p->readInt32(&(head.request));
136 RLOGD("%s %d", __FUNCTION__, head.request);
137 p->readInt32(&(head.slot_id));
138 p->readInt32(&(head.error));
139 PrintHeader(head);
140 return head.error;
141 }
142 else
143 {
144 return RESULT_ERROR;
145 }
146}
147
148int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, const char* format,...)
149{
150 lynq_client_t client;
151 int ret;
152 int send_num;
153 int recv_num;
154 char res_data[MAX_LEN] = {0};
155 client.uToken = Global_uToken;
156 if(request_id == RIL_REQUEST_SCREEN_STATE)
157 {
158 client.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE;
159 }
160 else if(request_id == RIL_REQUEST_RADIO_POWER)
161 {
162 client.request = LYNQ_REQUEST_CHANGE_RADIO;
163 }
164 else
165 {
166 client.request = request_id;
167 }
168 client.paramLen = argc;
169 bzero(client.param,MAX_LEN);
170 if(argc!=0)
171 {
172 va_list args;
173 va_start(args, format);
174 vsnprintf(client.param, MAX_LEN, format, args);
175 va_end(args);
176 }
177 RLOGD("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
178 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
179 send_num = sendto(sock_fd,&client,sizeof(client),0,(struct sockaddr *)&addr_serv,len_addr_serv);
180 if(send_num <= 0)
181 {
182 RLOGD("send request fail, send num is %d", send_num);
183 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
184 return LYNQ_E_SEND_REQUEST_FAIL;
185 }
186 lynq_resp_t head;
187 head.request = -1;
188 for(int i = 0; i < cnt;)
189 {
190 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
191 if(recv_num <= 0)
192 {
193 RLOGD("recv request fail, recv num is %d", recv_num);
194 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
195 return recv_num;
196 }
197 p->setData((uint8_t *)res_data,sizeof(char)*recv_num);
198 p->setDataPosition(0);
199 ret=GetHeader(p,head,request_id);
200 if(ret!=0)
201 {
202 RLOGD("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
203 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
204 return ret;
205 }
206 if(request_id == head.request)
207 {
208 i++;
209 }
210 }
211 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
212 return ret;
213}
214
lle1d5d7c2022-01-18 12:34:30 +0000215int lynq_sim_init(int utoken){
q.huangf6a9ddc2023-12-08 20:23:56 +0800216
217 RLOGE("%s start, parameter is %d", __func__,utoken);
218
llba425bd2022-03-17 02:23:00 +0000219 if(g_lynq_sim_init_flag == 1)
220 {
221 RLOGD("lynq_sim_init failed");
222 return -1;
223 }
224 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +0000225 if(utoken < 0){
226 return -1;
227 }
lle1d5d7c2022-01-18 12:34:30 +0000228 Global_uToken = utoken;
229 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +0800230 if (-1 == sock_fd)
231 {
232 return sock_fd;
233 }
lh8d290112023-10-22 20:53:06 -0700234
235 struct sockaddr_in liblynq_data_socket;
236 bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
237 //set this lib socket config
238 liblynq_data_socket.sin_family = AF_INET;
239 liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
240 int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
241 if (-1 == ret)
242 {
243 RLOGE("liblynq_data_socket bind fail,errno:%d",errno);
244 return -1;
245 }
246
ll33334af2022-06-30 16:54:51 +0800247 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000248 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800249 timeOut.tv_usec = 0;
250 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
251 {
252 RLOGD("time out setting failed\n");
253 return -1;
254 }
lle1d5d7c2022-01-18 12:34:30 +0000255 /* 设置address */
256 memset(&addr_serv, 0, sizeof(addr_serv));
257 addr_serv.sin_family = AF_INET;
258 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
259 addr_serv.sin_port = htons(DEST_PORT);
260 len_addr_serv = sizeof(addr_serv);
261 /*test*/
q.huangf6a9ddc2023-12-08 20:23:56 +0800262
263 RLOGE("%s end suc", __func__);
lle1d5d7c2022-01-18 12:34:30 +0000264 return 0;
265}
266
267int lynq_sim_deinit(void){
q.huangf6a9ddc2023-12-08 20:23:56 +0800268
269 RLOGE("%s start", __func__);
270
llba425bd2022-03-17 02:23:00 +0000271 if(g_lynq_sim_init_flag == 0)
272 {
273 RLOGD("lynq_sim_deinit failed");
274 return -1;
275 }
276 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000277 close(sock_fd);
q.huangf6a9ddc2023-12-08 20:23:56 +0800278
279 RLOGE("%s end suc", __func__);
lle1d5d7c2022-01-18 12:34:30 +0000280 return 0;
281}
282
283static char * lynqStrdupReadString(Parcel &p) {
284 size_t stringlen;
285 const char16_t *s16;
286
287 s16 = p.readString16Inplace(&stringlen);
288 return strndup16to8(s16, stringlen);
289}
290
llba425bd2022-03-17 02:23:00 +0000291/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
lle1d5d7c2022-01-18 12:34:30 +0000292int lynq_get_sim_status(int *card_status)
293{
ll27dbe752022-08-10 00:33:52 -0700294 if(g_lynq_sim_init_flag == 0)
295 {
296 return -1;
297 }
you.chen24d54af2024-01-02 12:26:57 +0800298 Parcel p;
299 int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,1,"");
300 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000301 {
you.chen24d54af2024-01-02 12:26:57 +0800302 RLOGD("function %s execute error", __FUNCTION__);
303 return res;
lle1d5d7c2022-01-18 12:34:30 +0000304 }
you.chen24d54af2024-01-02 12:26:57 +0800305 p.readInt32(card_status);
306 return res;
lle1d5d7c2022-01-18 12:34:30 +0000307}
llba425bd2022-03-17 02:23:00 +0000308
lle1d5d7c2022-01-18 12:34:30 +0000309int lynq_get_imsi(char buf[])
you.chen24d54af2024-01-02 12:26:57 +0800310{
ll27dbe752022-08-10 00:33:52 -0700311 if(g_lynq_sim_init_flag == 0)
312 {
313 return -1;
314 }
lle1d5d7c2022-01-18 12:34:30 +0000315 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800316 int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,1,"");
317 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000318 {
you.chen24d54af2024-01-02 12:26:57 +0800319 RLOGD("function %s execute error", __FUNCTION__);
320 return res;
lle1d5d7c2022-01-18 12:34:30 +0000321 }
you.chen24d54af2024-01-02 12:26:57 +0800322 char * test = lynqStrdupReadString(p);
323 memcpy(buf, test, strlen(test));
324 free(test);
325 return res;
lle1d5d7c2022-01-18 12:34:30 +0000326}
327
328
329/*add by lei*/
330
331int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700332 if(g_lynq_sim_init_flag == 0)
333 {
334 return -1;
335 }
lle1d5d7c2022-01-18 12:34:30 +0000336 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800337 int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,1,"");
338 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000339 {
you.chen24d54af2024-01-02 12:26:57 +0800340 RLOGD("function %s execute error", __FUNCTION__);
341 return res;
lle1d5d7c2022-01-18 12:34:30 +0000342 }
you.chen24d54af2024-01-02 12:26:57 +0800343 char * test = lynqStrdupReadString(p);
344 memcpy(buf, test, strlen(test));
345 free(test);
346 return res;
lle1d5d7c2022-01-18 12:34:30 +0000347}
348
349int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700350 if(g_lynq_sim_init_flag == 0)
351 {
352 return -1;
353 }
lle1d5d7c2022-01-18 12:34:30 +0000354 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800355 int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "1");
356 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000357 {
you.chen24d54af2024-01-02 12:26:57 +0800358 RLOGD("function %s execute error", __FUNCTION__);
359 return res;
lle1d5d7c2022-01-18 12:34:30 +0000360 }
you.chen24d54af2024-01-02 12:26:57 +0800361 return res;
lle1d5d7c2022-01-18 12:34:30 +0000362}
363
lle6cc3932022-08-18 06:06:39 -0700364int lynq_sim_power(int mode)
365{
366 if(g_lynq_sim_init_flag == 0)
367 {
368 return -1;
369 }
lle6cc3932022-08-18 06:06:39 -0700370 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800371 int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s%d", "AT+ESIMPOWER=", mode);
372 if(res != 0)
373 {
374 RLOGD("function %s execute error", __FUNCTION__);
375 return res;
lle6cc3932022-08-18 06:06:39 -0700376 }
you.chen24d54af2024-01-02 12:26:57 +0800377 return res;
lle6cc3932022-08-18 06:06:39 -0700378}
379
lle1d5d7c2022-01-18 12:34:30 +0000380int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700381 if(g_lynq_sim_init_flag == 0)
382 {
383 return -1;
384 }
lle1d5d7c2022-01-18 12:34:30 +0000385 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800386 int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "0");
387 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000388 {
you.chen24d54af2024-01-02 12:26:57 +0800389 RLOGD("function %s execute error", __FUNCTION__);
390 return res;
lle1d5d7c2022-01-18 12:34:30 +0000391 }
you.chen24d54af2024-01-02 12:26:57 +0800392 return res;
lle1d5d7c2022-01-18 12:34:30 +0000393}
394
395int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700396 if(g_lynq_sim_init_flag == 0)
397 {
398 return -1;
399 }
lle1d5d7c2022-01-18 12:34:30 +0000400 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800401 int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,1,"%s %s %s\n", "SC", pin, "11");
402 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000403 {
you.chen24d54af2024-01-02 12:26:57 +0800404 RLOGD("function %s execute error", __FUNCTION__);
405 return res;
lle1d5d7c2022-01-18 12:34:30 +0000406 }
you.chen24d54af2024-01-02 12:26:57 +0800407 int num = -1;
408 p.readInt32(&num);
409 if(num > 0)
410 {
411 int *test = (int *)calloc(num, sizeof(int));
412 for(int i =0; i <num; i++){
413 p.readInt32(&test[i]);
414 buf[i] = test[i];
415 }
416 free(test);
417 }
418 return res;
lle1d5d7c2022-01-18 12:34:30 +0000419}
420
421int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700422 if(g_lynq_sim_init_flag == 0)
423 {
424 return -1;
425 }
lle1d5d7c2022-01-18 12:34:30 +0000426 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800427 int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,1,"%s\n", pin);
428 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000429 {
you.chen24d54af2024-01-02 12:26:57 +0800430 RLOGD("function %s execute error", __FUNCTION__);
431 return res;
lle1d5d7c2022-01-18 12:34:30 +0000432 }
you.chen24d54af2024-01-02 12:26:57 +0800433 return res;
lle1d5d7c2022-01-18 12:34:30 +0000434}
435
436int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700437 if(g_lynq_sim_init_flag == 0)
438 {
439 return -1;
440 }
you.chen24d54af2024-01-02 12:26:57 +0800441 int res = -1;
lle1d5d7c2022-01-18 12:34:30 +0000442 if(old_pin == NULL || new_pin == NULL)
you.chen24d54af2024-01-02 12:26:57 +0800443 return res;
rjw5d2a50e2022-02-28 15:01:49 +0800444 if(!strlen(new_pin))
you.chen24d54af2024-01-02 12:26:57 +0800445 return res;
ll3fe03462022-03-01 09:18:53 +0000446 if(!strlen(old_pin))
you.chen24d54af2024-01-02 12:26:57 +0800447 return res;
lle1d5d7c2022-01-18 12:34:30 +0000448 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800449 res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,1,"%s %s\n", old_pin, new_pin);
450 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000451 {
you.chen24d54af2024-01-02 12:26:57 +0800452 RLOGD("function %s execute error", __FUNCTION__);
453 return res;
lle1d5d7c2022-01-18 12:34:30 +0000454 }
you.chen24d54af2024-01-02 12:26:57 +0800455 return res;
lle1d5d7c2022-01-18 12:34:30 +0000456}
457
458int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700459 if(g_lynq_sim_init_flag == 0)
460 {
461 return -1;
462 }
lle1d5d7c2022-01-18 12:34:30 +0000463 if(puk == NULL || pin == NULL)
you.chen24d54af2024-01-02 12:26:57 +0800464 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000465 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800466 int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,1,"%s %s\n", puk, pin);
467 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000468 {
you.chen24d54af2024-01-02 12:26:57 +0800469 RLOGD("function %s execute error", __FUNCTION__);
470 return res;
lle1d5d7c2022-01-18 12:34:30 +0000471 }
you.chen24d54af2024-01-02 12:26:57 +0800472 return res;
lle1d5d7c2022-01-18 12:34:30 +0000473}
474
475static void delete_char(char str[],char target){
476 if(str == NULL){
477 return;
478 }
479 int i,j;
480 for(i=j=0;str[i]!='\0';i++){
481 if(str[i]!=target){
482 str[j++]=str[i];
483 }
484 }
485 str[j]='\0';
486}
487
488static int parse_param(char *cmd, char **argv, char buf[]){
489 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800490 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000491 }
492 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000493 return 3;
494 }
495 else{
496 int argc = 0;
497 char *token;
498 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800499 if(token == NULL)
500 {
501 return 9001;
502 }
llbe2bdbd2022-06-14 02:40:33 +0000503 if(strstr(token, "CNUM"))
504 {
lle1d5d7c2022-01-18 12:34:30 +0000505 char *string;
506 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000507 {
508 if(argc == 5)
509 {
510 if(NULL == argv[1])
511 {
512 return 9002;
513 }
514 int lengh = strlen(argv[1]);
515 memcpy(buf, argv[1], lengh);
516 delete_char(buf, '"');
517 RLOGD("too many phone number return\n");
518 return 0;
519 }
lle1d5d7c2022-01-18 12:34:30 +0000520 string = token;
521 argv[argc++] = string;
522 token = strtok(NULL, ",");
523 }
llbe2bdbd2022-06-14 02:40:33 +0000524 if(NULL == argv[1])
525 {
526 return 9001;
527 }
lle1d5d7c2022-01-18 12:34:30 +0000528 int lengh = strlen(argv[1]);
529 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000530 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800531 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000532 }
llbe2bdbd2022-06-14 02:40:33 +0000533 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000534 }
lle1d5d7c2022-01-18 12:34:30 +0000535}
536
537int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700538 if(g_lynq_sim_init_flag == 0)
539 {
540 return -1;
541 }
lle1d5d7c2022-01-18 12:34:30 +0000542 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800543 int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s\n", "AT+CNUM");
544 if(res != 0)
545 {
546 RLOGD("function %s execute error", __FUNCTION__);
547 return res;
lle1d5d7c2022-01-18 12:34:30 +0000548 }
you.chen24d54af2024-01-02 12:26:57 +0800549 int num = -1;
550 p.readInt32(&num);
551 char test[128] = {0};
552 char *argv[5] = {0};
553 if(num != -1)
554 {
555 p.read(test, num);
556 num = parse_param(test, argv, buf);
557 return num;
558 }
559 return res;
lle1d5d7c2022-01-18 12:34:30 +0000560}
rjw5d2a50e2022-02-28 15:01:49 +0800561
q.huangbe2d6932022-10-19 16:39:29 +0800562int lynq_get_imei(char buf[])
563{
564 if(g_lynq_sim_init_flag == 0)
565 {
566 return -1;
567 }
q.huangbe2d6932022-10-19 16:39:29 +0800568 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800569 int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
570 if(res != 0)
q.huangbe2d6932022-10-19 16:39:29 +0800571 {
you.chen24d54af2024-01-02 12:26:57 +0800572 RLOGD("function %s execute error", __FUNCTION__);
573 return res;
q.huangbe2d6932022-10-19 16:39:29 +0800574 }
you.chen24d54af2024-01-02 12:26:57 +0800575 int num = 0;
576 p.readInt32(&num);
577 char * test = lynqStrdupReadString(p);
578 memcpy(buf, test, strlen(test));
579 free(test);
580 return res;
q.huangbe2d6932022-10-19 16:39:29 +0800581}
582
q.huang2a282792022-10-12 11:39:36 +0800583int lynq_get_imei_and_sv(char imei[],char sv[])
q.huangd3b254d2022-10-19 16:39:29 +0800584{
585 if(g_lynq_sim_init_flag == 0)
586 {
you.chen24d54af2024-01-02 12:26:57 +0800587 return -1;
q.huangd3b254d2022-10-19 16:39:29 +0800588 }
589 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800590 int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
591 if(res != 0)
q.huangd3b254d2022-10-19 16:39:29 +0800592 {
you.chen24d54af2024-01-02 12:26:57 +0800593 RLOGD("function %s execute error", __FUNCTION__);
594 return res;
595 }
596 int num = 0;
597 p.readInt32(&num);
598 if(num<2)
599 {
600 RLOGD("%s num %d error, should greater than 1",__func__,num);
601 return -1;
602 }
603 char *resp[2]={NULL,NULL};
604 int i;
605 for(i=0;i<2;i++)
606 {
607 resp[i]= lynqStrdupReadString(p);
608 if(resp[i]==NULL)
609 {
610 break;
q.huangd3b254d2022-10-19 16:39:29 +0800611 }
you.chen24d54af2024-01-02 12:26:57 +0800612 }
613 if(i==2){
614 memcpy(imei, resp[0], strlen(resp[0])+1);
615 memcpy(sv, resp[1], strlen(resp[1])+1);
616 }
617 else
618 {
619 RLOGD("%s resp[%d] is null",__func__,i);
620 }
621 for(i=0;i<2;i++)
622 {
623 if(resp[i]!=NULL)
624 {
625 free(resp[i]);
626 }
627 }
628 return i==2? 0:-1;
629
q.huangd3b254d2022-10-19 16:39:29 +0800630}
631
rjw5d2a50e2022-02-28 15:01:49 +0800632static int judge(int slot){
633 switch(slot){
634 case 0:
635 return -1;
636 case 1:
637 return -1;
638 }
639 return 0;
640}
641
rjw5d2a50e2022-02-28 15:01:49 +0800642int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700643 if(g_lynq_sim_init_flag == 0)
644 {
645 return -1;
646 }
rjw5d2a50e2022-02-28 15:01:49 +0800647 if(!judge(slot))
you.chen24d54af2024-01-02 12:26:57 +0800648 return -1;
rjw5d2a50e2022-02-28 15:01:49 +0800649 int send_num = 0;
you.chen24d54af2024-01-02 12:26:57 +0800650 lynq_client_t client_t;
rjw5d2a50e2022-02-28 15:01:49 +0800651 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
652 client_t.paramLen = 1;
653 client_t.uToken = Global_uToken;
654 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000655 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800656 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); //because ril of id = -1
rjw5d2a50e2022-02-28 15:01:49 +0800657 if(send_num < 0)
658 {
ll88f00782022-10-04 10:16:28 +0800659 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800660 return send_num;
661 }
llab0f3e12022-07-20 11:59:51 +0000662 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800663 return 0;
664}
jb.qi96449342022-09-19 22:14:41 -0700665/**@breif change screen state
666*param num type: [IN] screen_state,0:close,1:open
667*param ret type: [OUT] result,0:success,other:fail
668*return int
669*/
ll887a0172022-03-09 03:13:31 +0000670int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700671 if(g_lynq_sim_init_flag == 0)
672 {
673 return -1;
674 }
ll887a0172022-03-09 03:13:31 +0000675 if(!judge(num))
you.chen24d54af2024-01-02 12:26:57 +0800676 return -1;
677 Parcel p;
678 int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,2,"%d\n",num);
679 if(res != 0)
ll887a0172022-03-09 03:13:31 +0000680 {
you.chen24d54af2024-01-02 12:26:57 +0800681 RLOGD("function %s execute error", __FUNCTION__);
682 return res;
ll887a0172022-03-09 03:13:31 +0000683 }
you.chen24d54af2024-01-02 12:26:57 +0800684 return res;
ll887a0172022-03-09 03:13:31 +0000685}
llba425bd2022-03-17 02:23:00 +0000686
ll71a113b2022-10-21 18:07:25 +0800687/**@breif change screen state
688*param num type: [IN] screen_state,0:close,1:open
689*param ret type: [OUT] result,0:success,other:fail
690*return int
691*/
692int lynq_factory_radio_state(int num){
693 if(g_lynq_sim_init_flag == 0)
694 {
695 return -1;
696 }
ll71a113b2022-10-21 18:07:25 +0800697 if(!judge(num))
you.chen24d54af2024-01-02 12:26:57 +0800698 return -1;
699 Parcel p;
700 int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,2,"%d\n",num);
701 if(res != 0)
ll71a113b2022-10-21 18:07:25 +0800702 {
you.chen24d54af2024-01-02 12:26:57 +0800703 RLOGD("function %s execute error", __FUNCTION__);
704 return res;
ll71a113b2022-10-21 18:07:25 +0800705 }
you.chen24d54af2024-01-02 12:26:57 +0800706 return res;
ll71a113b2022-10-21 18:07:25 +0800707}
708
llba425bd2022-03-17 02:23:00 +0000709/**
710 * @brief Check whether the input is valid for lynq_req_sim_io api
711 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
712 * type: [IN] list[1]:EF id(fileid)
713 * type: [IN] list[2]:offset(p1)
714 * type: [IN] list[3]:offset(p2)
715 * type: [IN] list[4]:response len,sometimes needn't care(p3)
716 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
717 type: [IN] Path is in hex asciii format eg "7f205f70"
718 type: [IN] Path must always be provided.
719 * @param data type: [IN] May be NULL
720 * @param pin2 type: [IN] May be NULL
721 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
722 * @param sw type: [OUT]
723 * @param simResponse type: [OUT] response
724 * @return int
725 */
726static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
727{
llba425bd2022-03-17 02:23:00 +0000728 if(list == NULL)
729 {
730 return -1;
731 }
732 if(path == NULL)
733 {
734 return -1;
735 }
736 if(sw == NULL){
737 return -1;
738 }
739 if(simResponse == NULL){
740 return -1;
741 }
742 if(data == NULL)
743 {
744 memcpy(data_buf, "null", 4);
745 }
746 else
747 {
748 bzero(data_buf,32);
749 memcpy(data_buf, data, strlen(data));
750 }
751 if(pin2 == NULL)
752 {
753 memcpy(pin2_buf, "null", 4);
754 }
755 else
756 {
757 bzero(pin2_buf,32);
758 memcpy(pin2_buf, data, strlen(data));
759 }
760 if(aidPtr == NULL)
761 {
762 memcpy(aidPtr_buf, "null", 4);
763 }
764 else
765 {
766 bzero(aidPtr_buf,32);
767 memcpy(aidPtr_buf, data, strlen(data));
768 }
769 return 0;
770}
771
772int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
ll27dbe752022-08-10 00:33:52 -0700773{
774 if(g_lynq_sim_init_flag == 0)
775 {
776 return -1;
777 }
llba425bd2022-03-17 02:23:00 +0000778 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
779 {
you.chen24d54af2024-01-02 12:26:57 +0800780 return -1;
llba425bd2022-03-17 02:23:00 +0000781 }
782 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800783 int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,1,"%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);
784 if(res != 0)
llb15599d2022-04-01 07:50:08 +0000785 {
you.chen24d54af2024-01-02 12:26:57 +0800786 RLOGD("function %s execute error", __FUNCTION__);
787 return res;
llba425bd2022-03-17 02:23:00 +0000788 }
you.chen24d54af2024-01-02 12:26:57 +0800789 p.readInt32(&sw[0]);
790 p.readInt32(&sw[1]);
791 char * test = lynqStrdupReadString(p);
792 memcpy(simResponse, test, strlen(test));
793 free(test);
794 return res;
llba425bd2022-03-17 02:23:00 +0000795}
llb15599d2022-04-01 07:50:08 +0000796
ll88f00782022-10-04 10:16:28 +0800797static void wait_reset_mipc_response(int *response)
798{
ll74a73b72022-10-17 10:30:58 +0800799 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +0800800 int outfd = open("/data/tp",O_RDONLY);
801 if(outfd == -1){
802 RLOGD("open error");
803 return;
804 }
805 char rst[1024];
806 int s;
807 s = read(outfd,rst,sizeof(rst));
808 sscanf(rst,"%d",response);
809 usleep(1);
810 close(outfd);
811 return;
812}
813
814int lynq_reset_modem(void)
815{
816 if(g_lynq_sim_init_flag == 0)
817 {
818 return -1;
819 }
820 int ret = -1;
821 int send_num = 0;
you.chen24d54af2024-01-02 12:26:57 +0800822 lynq_client_t client_t;
ll88f00782022-10-04 10:16:28 +0800823 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
824 client_t.paramLen = 1;
825 client_t.uToken = Global_uToken;
826 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
827 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800828 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);//because response not by ril callback
ll88f00782022-10-04 10:16:28 +0800829 if(send_num < 0)
830 {
831 RLOGD("function %s sendto error:", __FUNCTION__);
832 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
833 return ret;
834 }
835 wait_reset_mipc_response(&ret);
836 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800837 RLOGD("function %s ret %d",__FUNCTION__, ret);
ll88f00782022-10-04 10:16:28 +0800838 return ret;
839}
840
llb15599d2022-04-01 07:50:08 +0000841/**
842 * @brief handle shutdown buf
843 * @param options type: [IN]My Param doc
844 * @param time type: [IN]My Param doc
845 * @param message type: [IN]My Param doc
846 */
847static void handle_shutdown_buf(char options[], char time[], char message[])
848{
849 if(NULL == options)
850 {
851 bzero(options_buf, 32);
852 memcpy(options_buf," ", 1);
853 }
854 else
855 {
856 memcpy(options_buf,options, strlen(options));
857 }
858 if(NULL == time)
859 {
860 bzero(time_buf, 32);
861 memcpy(time_buf," ", 1);
862 }
863 else
864 {
865 memcpy(time_buf, time, strlen(time));
866 }
867 if(NULL == message)
868 {
869 bzero(message_buf, 32);
870 memcpy(message_buf," ", 1);
871 }
872 else
873 {
874 memcpy(message_buf, message, strlen(message));
875 }
876}
877
878int lynq_shutdown(char options[], char time[], char message[])
879{
880 char cmd[128] = {0};
881 handle_shutdown_buf(options, time, message);
882 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
883 system(cmd);
884 return 0;
885}
886
887int lynq_get_version(char buf[])
888{
you.chen24d54af2024-01-02 12:26:57 +0800889 FILE *fp;
llb15599d2022-04-01 07:50:08 +0000890 char buffer[128];
891 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
892 fp = popen(buffer, "r");
you.chen24d54af2024-01-02 12:26:57 +0800893 if(NULL == fp)
894 {
895 RLOGE("popen failed !");
896 return -1;
897 }
898 if(NULL != fgets(buffer, sizeof(buffer), fp))
899 {
900 if('\n' == buffer[strlen(buffer) - 1])
901 {
902 buffer[strlen(buffer) - 1] = '\0';
903 }
904 }
905 else
906 {
907 RLOGE("fgets failed !");
908 pclose(fp);
909 return -1;
910 }
llb15599d2022-04-01 07:50:08 +0000911 memcpy(buf, buffer, strlen(buffer));
912 buf[strlen(buffer)] = '\0';
913 pclose(fp);
914 return 0;
915}
lle1d5d7c2022-01-18 12:34:30 +0000916