blob: cb1729d4edaa906e9402e42c913a74d659973da6 [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>
19#include "lynq_sim.h"
20#include <sys/socket.h>
21#include <netinet/in.h>
22#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>
lle1d5d7c2022-01-18 12:34:30 +000026#define MAX_BUF 20
27#define MAX_NUM 80
28#define RIL_REQUEST_GET_SIM_STATUS 1
29#define RIL_REQUEST_GET_IMSI 11
30#define RIL_REQUEST_QUERY_ICCID 2026
31#define RIL_REQUEST_SET_FACILITY_LOCK 43
32#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
33#define RIL_REQUEST_ENTER_SIM_PIN 2
34#define RIL_REQUEST_ENTER_SIM_PUK 3
35#define RIL_REQUEST_CHANGE_SIM_PIN 6
36#define RIL_REQUEST_OEM_HOOK_RAW 59
ll887a0172022-03-09 03:13:31 +000037#define RIL_REQUEST_SCREEN_STATE 61
llba425bd2022-03-17 02:23:00 +000038#define RIL_REQUEST_SIM_IO 28
ll4c5c6b72022-03-31 15:27:23 +080039#define RIL_REQUEST_DEVICE_IDENTITY 98
rjw5d2a50e2022-02-28 15:01:49 +080040#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
jb.qi96449342022-09-19 22:14:41 -070041#define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
lle1d5d7c2022-01-18 12:34:30 +000042#define MAX_LEN 1024*8
43#define MAX_NUM 10
44#define LOG_TAG "LYNQ_SIM"
45#define FLAG_TESS 0
46using ::android::Parcel;
47#define DEST_PORT 8088
48#define DSET_IP_ADDRESS "127.0.0.1"
49
50typedef struct{
51 int uToken;
52 int request;
53 int paramLen;
54 char param[MAX_LEN];
55}lynq_client_t;
56
57lynq_client_t client_t;
58/* socket文件描述符 */
59int len_addr_serv;
60struct sockaddr_in addr_serv;
61static int sock_fd = 0;
62int Global_uToken = 0;
q.huang7de1d662022-09-13 14:19:24 +080063int solicited_token = -1;
lle1d5d7c2022-01-18 12:34:30 +000064int resp_type = -1;
65int request = -1;
66int slot_id = -1;
67int error1 = -1;
llab0f3e12022-07-20 11:59:51 +000068static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000069/**
70 * @brief mark call initialization state
71 * 0: deinit state
72 * 1: init state
73 */
74int g_lynq_sim_init_flag = 0;
75
76/**
77 * @brief lynq_req_sim_io need to send request
78 */
79char data_buf[32] = {0};
80char pin2_buf[32] = {0};
81char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000082
llb15599d2022-04-01 07:50:08 +000083/**/
84char options_buf[32] = {0};
85char time_buf[32] = {0};
86char message_buf[32] = {0};
87
lle1d5d7c2022-01-18 12:34:30 +000088int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000089 if(g_lynq_sim_init_flag == 1)
90 {
91 RLOGD("lynq_sim_init failed");
92 return -1;
93 }
94 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000095 if(utoken < 0){
96 return -1;
97 }
lle1d5d7c2022-01-18 12:34:30 +000098 Global_uToken = utoken;
99 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +0800100 if (-1 == sock_fd)
101 {
102 return sock_fd;
103 }
104 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000105 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800106 timeOut.tv_usec = 0;
107 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
108 {
109 RLOGD("time out setting failed\n");
110 return -1;
111 }
lle1d5d7c2022-01-18 12:34:30 +0000112 /* 设置address */
113 memset(&addr_serv, 0, sizeof(addr_serv));
114 addr_serv.sin_family = AF_INET;
115 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
116 addr_serv.sin_port = htons(DEST_PORT);
117 len_addr_serv = sizeof(addr_serv);
118 /*test*/
119 return 0;
120}
121
122int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000123 if(g_lynq_sim_init_flag == 0)
124 {
125 RLOGD("lynq_sim_deinit failed");
126 return -1;
127 }
128 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000129 close(sock_fd);
130 return 0;
131}
132
133static char * lynqStrdupReadString(Parcel &p) {
134 size_t stringlen;
135 const char16_t *s16;
136
137 s16 = p.readString16Inplace(&stringlen);
138 return strndup16to8(s16, stringlen);
139}
140
llba425bd2022-03-17 02:23:00 +0000141/*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 +0000142int lynq_get_sim_status(int *card_status)
143{
ll27dbe752022-08-10 00:33:52 -0700144 if(g_lynq_sim_init_flag == 0)
145 {
146 return -1;
147 }
lle1d5d7c2022-01-18 12:34:30 +0000148 int ret = -1;
149 if(card_status == NULL)
150 return ret;
151 int send_num = 0;
152 int recv_num = 0;
153 int len = 0;
154 lynq_client_t client_t1;
155 memset(&client_t1, 0, sizeof(client_t1) );
156 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
157 client_t1.paramLen = 0;
158 client_t1.uToken = Global_uToken;
159 char res_data[MAX_LEN] = {0};
160 int len1 = sizeof(client_t1.param);
161 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000162 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000163 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
164 if(send_num < 0)
165 {
ll88f00782022-10-04 10:16:28 +0800166 RLOGD("function %s sendto error:", __FUNCTION__);
167 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000168 return send_num;
169 }
170 //get data msg
171 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
172 if(recv_num < 0 || recv_num == 0)
173 {
174 RLOGD("recvfrom step2 fail:");
ll88f00782022-10-04 10:16:28 +0800175 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000176 return recv_num;
177 }
llab0f3e12022-07-20 11:59:51 +0000178 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000179 Parcel p;;
180 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
181 p.setDataPosition(0);
182 if(p.dataAvail() > 0)
183 {
184 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800185 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000186 p.readInt32(&request);
187 p.readInt32(&slot_id);
188 p.readInt32(&error1);
189 p.readInt32(card_status);
190 }
191 return error1;
192}
llba425bd2022-03-17 02:23:00 +0000193
lle1d5d7c2022-01-18 12:34:30 +0000194int lynq_get_imsi(char buf[])
195{
ll27dbe752022-08-10 00:33:52 -0700196 if(g_lynq_sim_init_flag == 0)
197 {
198 return -1;
199 }
lle1d5d7c2022-01-18 12:34:30 +0000200 int ret = -1;
201 if(buf == NULL)
202 return ret;
203 int send_num = 0;
204 int recv_num = 0;
205 int len = 0;
206 lynq_client_t client_t1;
207 memset(&client_t1, 0, sizeof(client_t1) );
208 client_t1.request = RIL_REQUEST_GET_IMSI;
209 client_t1.paramLen = 0;
210 client_t1.uToken = Global_uToken;
211 char res_data[MAX_LEN] = {0};
212 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000213 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000214 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
215 if(send_num < 0)
216 {
ll88f00782022-10-04 10:16:28 +0800217 RLOGD("function %s sendto error:", __FUNCTION__);
218 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000219 return send_num;
220 }
221 //get data msg
222 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000223 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000224 if(recv_num < 0 || recv_num == 0)
225 {
226 RLOGD("recvfrom step2 fail:");
227 return recv_num;
228 }
229 Parcel p;
230 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
231 p.setDataPosition(0);
232 if(p.dataAvail() > 0)
233 {
234 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800235 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000236 p.readInt32(&request);
237 p.readInt32(&slot_id);
238 p.readInt32(&error1);
239 if(!error1){
240 char * test = lynqStrdupReadString(p);
241 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800242 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000243 }
244 }
245 return error1;
246}
247
248
249/*add by lei*/
250
251int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700252 if(g_lynq_sim_init_flag == 0)
253 {
254 return -1;
255 }
lle1d5d7c2022-01-18 12:34:30 +0000256 int ret = -1;
257 if(buf == NULL)
258 return ret;
259 int send_num = 0;
260 int recv_num = 0;
261 int len = 0;
262 client_t.request = RIL_REQUEST_QUERY_ICCID;
263 client_t.paramLen = 0;
264 client_t.uToken = Global_uToken;
265 char res_data[MAX_LEN] = {0};
266 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000267 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000268 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
269 if(send_num < 0)
270 {
ll88f00782022-10-04 10:16:28 +0800271 RLOGD("function %s sendto error:", __FUNCTION__);
272 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000273 return send_num;
274 }
275 //get data msg
276 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000277 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000278 if(recv_num < 0 || recv_num == 0)
279 {
280 RLOGD("recvfrom step2 fail:");
281 return recv_num;
282 }
283 Parcel p;
284 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
285 p.setDataPosition(0);
286 if(p.dataAvail() > 0)
287 {
288 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800289 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000290 p.readInt32(&request);
291 p.readInt32(&slot_id);
292 p.readInt32(&error1);
293 if(!error1){
294 char * test = lynqStrdupReadString(p);
295 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800296 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000297 }
298 }
299 return error1;
300}
301
302int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700303 if(g_lynq_sim_init_flag == 0)
304 {
305 return -1;
306 }
lle1d5d7c2022-01-18 12:34:30 +0000307 int ret = -1;
308 if(pin == NULL)
309 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800310 if(!strlen(pin))
311 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000312 int send_num = 0;
313 int recv_num = 0;
314 char res_data[MAX_LEN] = {0};
315 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
316 client_t.paramLen = 4;
317 client_t.uToken = Global_uToken;
318 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000319 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000320 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
321 if(send_num < 0)
322 {
ll88f00782022-10-04 10:16:28 +0800323 RLOGD("function %s sendto error:", __FUNCTION__);
324 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000325 return send_num;
326 }
327
328 //get data msg
329 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000330 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000331 if(recv_num < 0 || recv_num == 0)
332 {
333 RLOGD("recvfrom step2 fail:");
334 return recv_num;
335 }
336 Parcel p;
337 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
338 p.setDataPosition(0);
339 if(p.dataAvail() > 0)
340 {
341 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800342 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000343 p.readInt32(&request);
344 p.readInt32(&slot_id);
345 p.readInt32(&error1);
346 }
347 return error1;
348}
349
lle6cc3932022-08-18 06:06:39 -0700350int lynq_sim_power(int mode)
351{
352 if(g_lynq_sim_init_flag == 0)
353 {
354 return -1;
355 }
356 int ret = -1;
357 int send_num = 0;
358 int recv_num = 0;
359 int len = 0;
360 char res_data[MAX_LEN] = {0};
361 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
362 client_t.paramLen = 1;
363 client_t.uToken = Global_uToken;
364 char buf[64] = {0};
365 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
366 sprintf(client_t.param, "%s\n", buf);
367 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
368 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
369 if(send_num < 0)
370 {
ll88f00782022-10-04 10:16:28 +0800371 RLOGD("function %s sendto error:", __FUNCTION__);
372 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle6cc3932022-08-18 06:06:39 -0700373 return ret;
374 }
375 //get data msg
376 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
377 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
378 if(recv_num < 0 || recv_num == 0)
379 {
380 RLOGD("recvfrom step2 fail:");
381 return recv_num;
382 }
383 Parcel p;
384 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
385 p.setDataPosition(0);
386 int num = -1;
387 if(p.dataAvail() > 0)
388 {
389 char test[128] = {0};
390 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800391 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700392 p.readInt32(&request);
393 p.readInt32(&slot_id);
394 p.readInt32(&error1);
395 p.readInt32(&num);
396 if(num == -1){
397 }else{
398 p.read(test, num);
399 return error1;
400 }
401 }
402 return error1;
403}
404
lle1d5d7c2022-01-18 12:34:30 +0000405int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700406 if(g_lynq_sim_init_flag == 0)
407 {
408 return -1;
409 }
lle1d5d7c2022-01-18 12:34:30 +0000410 int ret = -1;
411 if(pin == NULL)
412 return ret;
413 int send_num = 0;
414 int recv_num = 0;
415 char res_data[MAX_LEN] = {0};
416 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
417 client_t.paramLen = 4;
418 client_t.uToken = Global_uToken;
419 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000420 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000421 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
422 if(send_num < 0)
423 {
ll88f00782022-10-04 10:16:28 +0800424 RLOGD("function %s sendto error:", __FUNCTION__);
425 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000426 return send_num;
427 }
428 //get data msg
429 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000430 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000431 if(recv_num < 0 || recv_num == 0)
432 {
433 RLOGD("recvfrom step2 fail:");
434 return recv_num;
435 }
436 Parcel p;
437 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
438 p.setDataPosition(0);
439 if(p.dataAvail() > 0)
440 {
441 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800442 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000443 p.readInt32(&request);
444 p.readInt32(&slot_id);
445 p.readInt32(&error1);
446 }
447 return error1;
448}
449
450int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700451 if(g_lynq_sim_init_flag == 0)
452 {
453 return -1;
454 }
lle1d5d7c2022-01-18 12:34:30 +0000455 int ret = -1;
456 if(pin == NULL)
457 return ret;
458 int send_num = 0;
459 int recv_num = 0;
460 int len = 0;
461 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
462 client_t.paramLen = 3;
463 client_t.uToken = Global_uToken;
464 char res_data[MAX_LEN] = {0};
465 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000466 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000467 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
468 if(send_num < 0)
469 {
ll88f00782022-10-04 10:16:28 +0800470 RLOGD("function %s sendto error:", __FUNCTION__);
471 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000472 return send_num;
473 }
474 //get data msg
475 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000476 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000477 if(recv_num < 0 || recv_num == 0)
478 {
479 RLOGD("recvfrom step2 fail:");
480 return recv_num;
481 }
482 Parcel p;
483 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
484 p.setDataPosition(0);
485 int num = -1;
486 if(p.dataAvail() > 0)
487 {
488 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800489 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000490 p.readInt32(&request);
491 p.readInt32(&slot_id);
492 p.readInt32(&error1);
493 p.readInt32(&num);
494 if(num > 0){
495 int *test = (int *)calloc(1, sizeof(int)*num);
496 for(int i =0; i <num; i++){
497 p.readInt32(&test[i]);
498 buf[i] = test[i];
499 }
500 free(test);
501 }
502 }
503 return error1;
504}
505
506int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700507 if(g_lynq_sim_init_flag == 0)
508 {
509 return -1;
510 }
lle1d5d7c2022-01-18 12:34:30 +0000511 int ret = -1;
512 if(pin == NULL)
513 return ret;
514 int send_num = 0;
515 int recv_num = 0;
516 char res_data[MAX_LEN] = {0};
517 int len = 0;
518 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
519 client_t.paramLen = 1;
520 client_t.uToken = Global_uToken;
521 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000522 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000523 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
524 if(send_num < 0)
525 {
ll88f00782022-10-04 10:16:28 +0800526 RLOGD("function %s sendto error:", __FUNCTION__);
527 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000528 return send_num;
529 }
530 //get data msg
531 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000532 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000533 if(recv_num < 0 || recv_num == 0)
534 {
535 RLOGD("recvfrom step2 fail:");
536 return recv_num;
537 }
538 Parcel p;
539 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
540 p.setDataPosition(0);
541 if(p.dataAvail() > 0)
542 {
543 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800544 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000545 p.readInt32(&request);
546 p.readInt32(&slot_id);
547 p.readInt32(&error1);
548 }
549 return error1;
550}
551
552int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700553 if(g_lynq_sim_init_flag == 0)
554 {
555 return -1;
556 }
lle1d5d7c2022-01-18 12:34:30 +0000557 int ret = -1;
558 if(old_pin == NULL || new_pin == NULL)
559 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800560 if(!strlen(new_pin))
561 return ret;
ll3fe03462022-03-01 09:18:53 +0000562 if(!strlen(old_pin))
563 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000564 int send_num = 0;
565 int recv_num = 0;
566 char res_data[MAX_LEN] = {0};
567 int len = 0;
568 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
569 client_t.paramLen = 2;
570 client_t.uToken = Global_uToken;
571 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000572 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000573 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
574 if(send_num < 0)
575 {
ll88f00782022-10-04 10:16:28 +0800576 RLOGD("function %s sendto error:", __FUNCTION__);
577 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000578 return send_num;
579 }
580 //get data msg
581 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000582 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000583 if(recv_num < 0 || recv_num == 0)
584 {
585 RLOGD("recvfrom step2 fail:");
586 return recv_num;
587 }
588 Parcel p;
589 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
590 p.setDataPosition(0);
591 if(p.dataAvail() > 0)
592 {
593 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800594 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000595 p.readInt32(&request);
596 p.readInt32(&slot_id);
597 p.readInt32(&error1);
598 }
599 return error1;
600}
601
602int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700603 if(g_lynq_sim_init_flag == 0)
604 {
605 return -1;
606 }
lle1d5d7c2022-01-18 12:34:30 +0000607 int ret = -1;
608 if(puk == NULL || pin == NULL)
609 return ret;
610 int send_num = 0;
611 int recv_num = 0;
612 char res_data[MAX_LEN] = {0};
613 int len = 0;
614 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
615 client_t.paramLen = 2;
616 client_t.uToken = Global_uToken;
617 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000618 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000619 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
620 if(send_num < 0)
621 {
ll88f00782022-10-04 10:16:28 +0800622 RLOGD("function %s sendto error:", __FUNCTION__);
623 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000624 return send_num;
625 }
626 //get data msg
627 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000628 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000629 if(recv_num < 0 || recv_num == 0)
630 {
631 RLOGD("recvfrom step2 fail:");
632 return recv_num;
633 }
634 Parcel p;
635 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
636 p.setDataPosition(0);
637 if(p.dataAvail() > 0)
638 {
639 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800640 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000641 p.readInt32(&request);
642 p.readInt32(&slot_id);
643 p.readInt32(&error1);
644 }
645 return error1;
646}
647
648static void delete_char(char str[],char target){
649 if(str == NULL){
650 return;
651 }
652 int i,j;
653 for(i=j=0;str[i]!='\0';i++){
654 if(str[i]!=target){
655 str[j++]=str[i];
656 }
657 }
658 str[j]='\0';
659}
660
661static int parse_param(char *cmd, char **argv, char buf[]){
662 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800663 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000664 }
665 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000666 return 3;
667 }
668 else{
669 int argc = 0;
670 char *token;
671 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800672 if(token == NULL)
673 {
674 return 9001;
675 }
llbe2bdbd2022-06-14 02:40:33 +0000676 if(strstr(token, "CNUM"))
677 {
lle1d5d7c2022-01-18 12:34:30 +0000678 char *string;
679 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000680 {
681 if(argc == 5)
682 {
683 if(NULL == argv[1])
684 {
685 return 9002;
686 }
687 int lengh = strlen(argv[1]);
688 memcpy(buf, argv[1], lengh);
689 delete_char(buf, '"');
690 RLOGD("too many phone number return\n");
691 return 0;
692 }
lle1d5d7c2022-01-18 12:34:30 +0000693 string = token;
694 argv[argc++] = string;
695 token = strtok(NULL, ",");
696 }
llbe2bdbd2022-06-14 02:40:33 +0000697 if(NULL == argv[1])
698 {
699 return 9001;
700 }
lle1d5d7c2022-01-18 12:34:30 +0000701 int lengh = strlen(argv[1]);
702 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000703 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800704 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000705 }
llbe2bdbd2022-06-14 02:40:33 +0000706 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000707 }
lle1d5d7c2022-01-18 12:34:30 +0000708}
709
710int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700711 if(g_lynq_sim_init_flag == 0)
712 {
713 return -1;
714 }
lle1d5d7c2022-01-18 12:34:30 +0000715 int ret = -1;
716 if(buf == NULL)
717 return ret;
718 int send_num = 0;
719 int recv_num = 0;
720 int len = 0;
721 char res_data[MAX_LEN] = {0};
722 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
723 client_t.paramLen = 1;
724 client_t.uToken = Global_uToken;
725 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000726 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000727 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
728 if(send_num < 0)
729 {
ll88f00782022-10-04 10:16:28 +0800730 RLOGD("function %s sendto error:", __FUNCTION__);
731 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000732 return ret;
733 }
734 //get data msg
735 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000736 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000737 if(recv_num < 0 || recv_num == 0)
738 {
739 RLOGD("recvfrom step2 fail:");
740 return recv_num;
741 }
742 Parcel p;
743 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
744 p.setDataPosition(0);
745 int num = -1;
746 if(p.dataAvail() > 0)
747 {
llb1fc9212022-04-12 03:02:01 +0000748 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000749 char *argv[5] = {0};
750 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800751 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000752 p.readInt32(&request);
753 p.readInt32(&slot_id);
754 p.readInt32(&error1);
755 p.readInt32(&num);
756 if(num == -1){
757 }else{
758 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800759 num = parse_param(test, argv, buf);
760 return num;
lle1d5d7c2022-01-18 12:34:30 +0000761 }
762 }
763 return error1;
764}
rjw5d2a50e2022-02-28 15:01:49 +0800765
q.huangd3b254d2022-10-19 16:39:29 +0800766int lynq_get_imei(char buf[])
767{
768 if(g_lynq_sim_init_flag == 0)
769 {
770 return -1;
771 }
772 int ret = -1;
773 if(buf == NULL)
774 return ret;
775 int send_num = 0;
776 int recv_num = 0;
777 int len = 0;
778 lynq_client_t client_t1;
779 memset(&client_t1, 0, sizeof(client_t1) );
780 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
781 client_t1.paramLen = 0;
782 client_t1.uToken = Global_uToken;
783 char res_data[MAX_LEN] = {0};
784 memset(client_t1.param, 0, sizeof(client_t1.param));
785 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
786 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
787 if(send_num < 0)
788 {
789 RLOGD("function %s sendto error:", __FUNCTION__);
790 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
791 return send_num;
792 }
793 //get data msg
794 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
795 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
796 if(recv_num < 0 || recv_num == 0)
797 {
798 RLOGD("recvfrom step2 fail:");
799 return recv_num;
800 }
801 Parcel p;
802 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
803 p.setDataPosition(0);
804 int num = 0;
805 if(p.dataAvail() > 0)
806 {
807 p.readInt32(&resp_type);
808 p.readInt32(&solicited_token);
809 p.readInt32(&request);
810 p.readInt32(&slot_id);
811 p.readInt32(&error1);
812 if(!error1){
813 p.readInt32(&num);
814 char * test = lynqStrdupReadString(p);
815 memcpy(buf, test, strlen(test));
816 free(test);
817 }
818 }
819 return error1;
820}
821
q.huang1f2a2252022-10-12 11:39:36 +0800822int lynq_get_imei_and_sv(char imei[],char sv[])
ll4c5c6b72022-03-31 15:27:23 +0800823{
q.huang1f2a2252022-10-12 11:39:36 +0800824 RLOGD("%s called",__func__);
ll27dbe752022-08-10 00:33:52 -0700825 if(g_lynq_sim_init_flag == 0)
826 {
q.huang1f2a2252022-10-12 11:39:36 +0800827 RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag);
828 return -2;
ll27dbe752022-08-10 00:33:52 -0700829 }
llfcd43492022-03-10 09:01:50 +0000830 int ret = -1;
q.huang1f2a2252022-10-12 11:39:36 +0800831 if(imei == NULL || sv== NULL)
832 {
833 RLOGD("%s imei is NULL or sv is NULL",__func__);
llfcd43492022-03-10 09:01:50 +0000834 return ret;
q.huang1f2a2252022-10-12 11:39:36 +0800835 }
836
llfcd43492022-03-10 09:01:50 +0000837 int send_num = 0;
838 int recv_num = 0;
839 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800840 lynq_client_t client_t1;
841 memset(&client_t1, 0, sizeof(client_t1) );
842 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
843 client_t1.paramLen = 0;
844 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000845 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800846 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000847 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800848 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000849 if(send_num < 0)
850 {
q.huang1f2a2252022-10-12 11:39:36 +0800851 RLOGD("%s sendto error: %d",__func__,send_num);
ll88f00782022-10-04 10:16:28 +0800852 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800853 return send_num;
llfcd43492022-03-10 09:01:50 +0000854 }
ll4c5c6b72022-03-31 15:27:23 +0800855 //get data msg
llfcd43492022-03-10 09:01:50 +0000856 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000857 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000858 if(recv_num < 0 || recv_num == 0)
859 {
q.huang1f2a2252022-10-12 11:39:36 +0800860 RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num);
llfcd43492022-03-10 09:01:50 +0000861 return recv_num;
862 }
863 Parcel p;
864 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
865 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800866 int num = 0;
llfcd43492022-03-10 09:01:50 +0000867 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800868 {
llfcd43492022-03-10 09:01:50 +0000869 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800870 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000871 p.readInt32(&request);
872 p.readInt32(&slot_id);
873 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800874 if(!error1){
875 p.readInt32(&num);
q.huang1f2a2252022-10-12 11:39:36 +0800876 if(num<2)
877 {
878 RLOGD("%s num %d error, should greater than 1",__func__,num);
879 return -1;
880 }
881 char *resp[2]={NULL,NULL};
882 int i;
883 for(i=0;i<2;i++)
884 {
885 resp[i]= lynqStrdupReadString(p);
886 if(resp[i]==NULL)
887 {
888 break;
889 }
890 }
891
892 if(i==2){
893 memcpy(imei, resp[0], strlen(resp[0])+1);
894 memcpy(sv, resp[1], strlen(resp[1])+1);
895 }
896 else
897 {
898 RLOGD("%s resp[%d] is null",__func__,i);
899 }
900
901 for(i=0;i<2;i++)
902 {
903 if(resp[i]!=NULL)
904 {
905 free(resp[i]);
906 }
907 }
908 return i==2? 0:-1;
llfcd43492022-03-10 09:01:50 +0000909 }
q.huang1f2a2252022-10-12 11:39:36 +0800910 }
911 RLOGD("%s called failed %d",__func__,error1);
llfcd43492022-03-10 09:01:50 +0000912 return error1;
913}
914
rjw5d2a50e2022-02-28 15:01:49 +0800915static int judge(int slot){
916 switch(slot){
917 case 0:
918 return -1;
919 case 1:
920 return -1;
921 }
922 return 0;
923}
924
rjw5d2a50e2022-02-28 15:01:49 +0800925int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700926 if(g_lynq_sim_init_flag == 0)
927 {
928 return -1;
929 }
rjw5d2a50e2022-02-28 15:01:49 +0800930 int ret = -1;
931 if(!judge(slot))
932 return ret;
933 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800934 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
935 client_t.paramLen = 1;
936 client_t.uToken = Global_uToken;
937 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000938 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800939 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
940 if(send_num < 0)
941 {
ll88f00782022-10-04 10:16:28 +0800942 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800943 return send_num;
944 }
llab0f3e12022-07-20 11:59:51 +0000945 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800946 return 0;
947}
jb.qi96449342022-09-19 22:14:41 -0700948/**@breif change screen state
949*param num type: [IN] screen_state,0:close,1:open
950*param ret type: [OUT] result,0:success,other:fail
951*return int
952*/
ll887a0172022-03-09 03:13:31 +0000953int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700954 if(g_lynq_sim_init_flag == 0)
955 {
956 return -1;
957 }
jb.qi96449342022-09-19 22:14:41 -0700958
ll887a0172022-03-09 03:13:31 +0000959 int ret = -1;
960 if(!judge(num))
961 return ret;
962 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700963 int recv_num = 0;
964 int error[2];
965 char res_data[MAX_LEN] = {0};
966
967 //change the first screen
968 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000969 client_t.paramLen = 1;
970 client_t.uToken = Global_uToken;
971 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700972
llab0f3e12022-07-20 11:59:51 +0000973 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000974 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
975 if(send_num < 0)
976 {
jb.qi96449342022-09-19 22:14:41 -0700977 RLOGD("sendto error:\n");
ll88f00782022-10-04 10:16:28 +0800978 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000979 return send_num;
980 }
jb.qi96449342022-09-19 22:14:41 -0700981 for(int i=0;i<2;i++)
982 {
983 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
984 if(recv_num < 0 || recv_num == 0)
985 {
986 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
987 RLOGD("screen recvform error\n");
jb.qi6b23ed42022-09-22 00:30:55 -0700988 return errno;
jb.qi96449342022-09-19 22:14:41 -0700989 }
990 if(i == 1)
991 {
992 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
993 RLOGD("recvfrom success\n");
994 }
995 Parcel p;
996 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
997 p.setDataPosition(0);
998 if(p.dataAvail() > 0)
999 {
1000 p.readInt32(&resp_type);
1001 p.readInt32(&solicited_token);
1002 p.readInt32(&request);
1003 p.readInt32(&slot_id);
1004 p.readInt32(&error1);
1005 error[i] = error1;//change screen state result
1006 }
1007 }
1008
1009 if((error[0] != 0) || (error[1] != 0))
1010 {
1011 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
1012 if(error[0] != 0)
1013 {
1014 return error[0];
1015 }
1016 else
1017 {
1018 return error[1];
1019 }
1020 }
1021 else
1022 {
1023 return 0;
1024 }
1025
ll887a0172022-03-09 03:13:31 +00001026}
llba425bd2022-03-17 02:23:00 +00001027
1028/**
1029 * @brief Check whether the input is valid for lynq_req_sim_io api
1030 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
1031 * type: [IN] list[1]:EF id(fileid)
1032 * type: [IN] list[2]:offset(p1)
1033 * type: [IN] list[3]:offset(p2)
1034 * type: [IN] list[4]:response len,sometimes needn't care(p3)
1035 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
1036 type: [IN] Path is in hex asciii format eg "7f205f70"
1037 type: [IN] Path must always be provided.
1038 * @param data type: [IN] May be NULL
1039 * @param pin2 type: [IN] May be NULL
1040 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
1041 * @param sw type: [OUT]
1042 * @param simResponse type: [OUT] response
1043 * @return int
1044 */
1045static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
1046{
llba425bd2022-03-17 02:23:00 +00001047 if(list == NULL)
1048 {
1049 return -1;
1050 }
1051 if(path == NULL)
1052 {
1053 return -1;
1054 }
1055 if(sw == NULL){
1056 return -1;
1057 }
1058 if(simResponse == NULL){
1059 return -1;
1060 }
1061 if(data == NULL)
1062 {
1063 memcpy(data_buf, "null", 4);
1064 }
1065 else
1066 {
1067 bzero(data_buf,32);
1068 memcpy(data_buf, data, strlen(data));
1069 }
1070 if(pin2 == NULL)
1071 {
1072 memcpy(pin2_buf, "null", 4);
1073 }
1074 else
1075 {
1076 bzero(pin2_buf,32);
1077 memcpy(pin2_buf, data, strlen(data));
1078 }
1079 if(aidPtr == NULL)
1080 {
1081 memcpy(aidPtr_buf, "null", 4);
1082 }
1083 else
1084 {
1085 bzero(aidPtr_buf,32);
1086 memcpy(aidPtr_buf, data, strlen(data));
1087 }
1088 return 0;
1089}
1090
1091int 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 -07001092{
1093 if(g_lynq_sim_init_flag == 0)
1094 {
1095 return -1;
1096 }
llba425bd2022-03-17 02:23:00 +00001097 int ret = -1;
1098 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1099 {
1100 return ret;
1101 }
1102 int send_num = 0;
1103 int recv_num = 0;
1104 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001105 client_t.request = RIL_REQUEST_SIM_IO;
1106 client_t.paramLen = 9;
1107 client_t.uToken = Global_uToken;
1108 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);
llab0f3e12022-07-20 11:59:51 +00001109 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001110 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1111 if(send_num < 0)
1112 {
ll88f00782022-10-04 10:16:28 +08001113 RLOGD("function %s sendto error:", __FUNCTION__);
1114 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001115 return send_num;
1116 }
1117 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +00001118 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001119 if(recv_num < 0 || recv_num == 0)
1120 {
1121 RLOGD("recvfrom step2 fail:");
1122 return recv_num;
1123 }
1124 Parcel p;
1125 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1126 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001127 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001128 {
llba425bd2022-03-17 02:23:00 +00001129 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001130 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001131 p.readInt32(&request);
1132 p.readInt32(&slot_id);
1133 p.readInt32(&error1);
1134 if(!error1)
1135 {
1136 p.readInt32(&sw[0]);
1137 p.readInt32(&sw[1]);
1138 char * test = lynqStrdupReadString(p);
1139 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001140 free(test);
llba425bd2022-03-17 02:23:00 +00001141 }
1142
1143 }
1144 return error1;
1145}
llb15599d2022-04-01 07:50:08 +00001146
ll88f00782022-10-04 10:16:28 +08001147static void wait_reset_mipc_response(int *response)
1148{
ll74a73b72022-10-17 10:30:58 +08001149 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +08001150 int outfd = open("/data/tp",O_RDONLY);
1151 if(outfd == -1){
1152 RLOGD("open error");
1153 return;
1154 }
1155 char rst[1024];
1156 int s;
1157 s = read(outfd,rst,sizeof(rst));
1158 sscanf(rst,"%d",response);
1159 usleep(1);
1160 close(outfd);
1161 return;
1162}
1163
1164int lynq_reset_modem(void)
1165{
1166 if(g_lynq_sim_init_flag == 0)
1167 {
1168 return -1;
1169 }
1170 int ret = -1;
1171 int send_num = 0;
1172 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
1173 client_t.paramLen = 1;
1174 client_t.uToken = Global_uToken;
1175 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
1176 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1177 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1178 if(send_num < 0)
1179 {
1180 RLOGD("function %s sendto error:", __FUNCTION__);
1181 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1182 return ret;
1183 }
1184 wait_reset_mipc_response(&ret);
1185 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1186 RLOGD("function %d ret %d",__FUNCTION__, ret);
1187 return ret;
1188}
1189
llb15599d2022-04-01 07:50:08 +00001190/**
1191 * @brief handle shutdown buf
1192 * @param options type: [IN]My Param doc
1193 * @param time type: [IN]My Param doc
1194 * @param message type: [IN]My Param doc
1195 */
1196static void handle_shutdown_buf(char options[], char time[], char message[])
1197{
1198 if(NULL == options)
1199 {
1200 bzero(options_buf, 32);
1201 memcpy(options_buf," ", 1);
1202 }
1203 else
1204 {
1205 memcpy(options_buf,options, strlen(options));
1206 }
1207 if(NULL == time)
1208 {
1209 bzero(time_buf, 32);
1210 memcpy(time_buf," ", 1);
1211 }
1212 else
1213 {
1214 memcpy(time_buf, time, strlen(time));
1215 }
1216 if(NULL == message)
1217 {
1218 bzero(message_buf, 32);
1219 memcpy(message_buf," ", 1);
1220 }
1221 else
1222 {
1223 memcpy(message_buf, message, strlen(message));
1224 }
1225}
1226
1227int lynq_shutdown(char options[], char time[], char message[])
1228{
1229 char cmd[128] = {0};
1230 handle_shutdown_buf(options, time, message);
1231 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1232 system(cmd);
1233 return 0;
1234}
1235
1236int lynq_get_version(char buf[])
1237{
1238 FILE * fp;
1239 char buffer[128];
1240 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1241 fp = popen(buffer, "r");
1242 fgets(buffer, sizeof(buffer), fp);
1243 memcpy(buf, buffer, strlen(buffer));
1244 buf[strlen(buffer)] = '\0';
1245 pclose(fp);
1246 return 0;
1247}
lle1d5d7c2022-01-18 12:34:30 +00001248#if FLAG_TESS
1249int lynq_query_operator(char buf[]){
1250 int32_t token = -1;
1251 if(buf == NULL)
1252 return token;
1253 char msg_imsi[20] = {0};
1254 memset(msg_imsi,0,sizeof(msg_imsi));
1255 token = lynq_get_imsi(msg_imsi);
1256 if(strlen(msg_imsi) != 0){
1257 FindOperator *ope_command = NULL;
1258 ope_command = find_ope_command(msg_imsi, findOperator);
1259 if(ope_command){
1260 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1261 buf[strlen(ope_command->buf)] = '\0';
1262 }
1263 else{
1264 /*more*/
1265 char mccmnc[5] = {0};
1266 memcpy(buf, msg_imsi, 5);
1267 buf[5] = '\0';
1268 /*more*/
1269 }
1270 return token;
1271 }
1272 else{
1273 //msg->base.e = err;
1274 const char *test = "please insert sim card";
1275 memcpy(buf, test, strlen(test));
1276 return token;
1277 }
1278}
1279FindOperator findOperator[] = {
1280#include "operator.h"
1281};
1282
1283static FindOperator*find_ope_command (char *name,FindOperator *Class){
1284 if(name == NULL || Class == NULL){
1285 return ((FindOperator *)NULL);
1286 }
1287 register int i;
1288 for (i = 0; Class[i].MCCMCN; i++)
1289 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1290 return (&Class[i]);
1291 return ((FindOperator *)NULL);
1292}
1293
1294#endif