blob: ff62e1f78ad3524d67aba4aa6cc48643ff545083 [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.huang1f2a2252022-10-12 11:39:36 +0800766int lynq_get_imei_and_sv(char imei[],char sv[])
ll4c5c6b72022-03-31 15:27:23 +0800767{
q.huang1f2a2252022-10-12 11:39:36 +0800768 RLOGD("%s called",__func__);
ll27dbe752022-08-10 00:33:52 -0700769 if(g_lynq_sim_init_flag == 0)
770 {
q.huang1f2a2252022-10-12 11:39:36 +0800771 RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag);
772 return -2;
ll27dbe752022-08-10 00:33:52 -0700773 }
llfcd43492022-03-10 09:01:50 +0000774 int ret = -1;
q.huang1f2a2252022-10-12 11:39:36 +0800775 if(imei == NULL || sv== NULL)
776 {
777 RLOGD("%s imei is NULL or sv is NULL",__func__);
llfcd43492022-03-10 09:01:50 +0000778 return ret;
q.huang1f2a2252022-10-12 11:39:36 +0800779 }
780
llfcd43492022-03-10 09:01:50 +0000781 int send_num = 0;
782 int recv_num = 0;
783 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800784 lynq_client_t client_t1;
785 memset(&client_t1, 0, sizeof(client_t1) );
786 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
787 client_t1.paramLen = 0;
788 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000789 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800790 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000791 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800792 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000793 if(send_num < 0)
794 {
q.huang1f2a2252022-10-12 11:39:36 +0800795 RLOGD("%s sendto error: %d",__func__,send_num);
ll88f00782022-10-04 10:16:28 +0800796 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800797 return send_num;
llfcd43492022-03-10 09:01:50 +0000798 }
ll4c5c6b72022-03-31 15:27:23 +0800799 //get data msg
llfcd43492022-03-10 09:01:50 +0000800 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 +0000801 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000802 if(recv_num < 0 || recv_num == 0)
803 {
q.huang1f2a2252022-10-12 11:39:36 +0800804 RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num);
llfcd43492022-03-10 09:01:50 +0000805 return recv_num;
806 }
807 Parcel p;
808 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
809 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800810 int num = 0;
llfcd43492022-03-10 09:01:50 +0000811 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800812 {
llfcd43492022-03-10 09:01:50 +0000813 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800814 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000815 p.readInt32(&request);
816 p.readInt32(&slot_id);
817 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800818 if(!error1){
819 p.readInt32(&num);
q.huang1f2a2252022-10-12 11:39:36 +0800820 if(num<2)
821 {
822 RLOGD("%s num %d error, should greater than 1",__func__,num);
823 return -1;
824 }
825 char *resp[2]={NULL,NULL};
826 int i;
827 for(i=0;i<2;i++)
828 {
829 resp[i]= lynqStrdupReadString(p);
830 if(resp[i]==NULL)
831 {
832 break;
833 }
834 }
835
836 if(i==2){
837 memcpy(imei, resp[0], strlen(resp[0])+1);
838 memcpy(sv, resp[1], strlen(resp[1])+1);
839 }
840 else
841 {
842 RLOGD("%s resp[%d] is null",__func__,i);
843 }
844
845 for(i=0;i<2;i++)
846 {
847 if(resp[i]!=NULL)
848 {
849 free(resp[i]);
850 }
851 }
852 return i==2? 0:-1;
llfcd43492022-03-10 09:01:50 +0000853 }
q.huang1f2a2252022-10-12 11:39:36 +0800854 }
855 RLOGD("%s called failed %d",__func__,error1);
llfcd43492022-03-10 09:01:50 +0000856 return error1;
857}
858
rjw5d2a50e2022-02-28 15:01:49 +0800859static int judge(int slot){
860 switch(slot){
861 case 0:
862 return -1;
863 case 1:
864 return -1;
865 }
866 return 0;
867}
868
rjw5d2a50e2022-02-28 15:01:49 +0800869int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700870 if(g_lynq_sim_init_flag == 0)
871 {
872 return -1;
873 }
rjw5d2a50e2022-02-28 15:01:49 +0800874 int ret = -1;
875 if(!judge(slot))
876 return ret;
877 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800878 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
879 client_t.paramLen = 1;
880 client_t.uToken = Global_uToken;
881 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000882 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800883 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
884 if(send_num < 0)
885 {
ll88f00782022-10-04 10:16:28 +0800886 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800887 return send_num;
888 }
llab0f3e12022-07-20 11:59:51 +0000889 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800890 return 0;
891}
jb.qi96449342022-09-19 22:14:41 -0700892/**@breif change screen state
893*param num type: [IN] screen_state,0:close,1:open
894*param ret type: [OUT] result,0:success,other:fail
895*return int
896*/
ll887a0172022-03-09 03:13:31 +0000897int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700898 if(g_lynq_sim_init_flag == 0)
899 {
900 return -1;
901 }
jb.qi96449342022-09-19 22:14:41 -0700902
ll887a0172022-03-09 03:13:31 +0000903 int ret = -1;
904 if(!judge(num))
905 return ret;
906 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700907 int recv_num = 0;
908 int error[2];
909 char res_data[MAX_LEN] = {0};
910
911 //change the first screen
912 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000913 client_t.paramLen = 1;
914 client_t.uToken = Global_uToken;
915 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700916
llab0f3e12022-07-20 11:59:51 +0000917 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000918 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
919 if(send_num < 0)
920 {
jb.qi96449342022-09-19 22:14:41 -0700921 RLOGD("sendto error:\n");
ll88f00782022-10-04 10:16:28 +0800922 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000923 return send_num;
924 }
jb.qi96449342022-09-19 22:14:41 -0700925 for(int i=0;i<2;i++)
926 {
927 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
928 if(recv_num < 0 || recv_num == 0)
929 {
930 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
931 RLOGD("screen recvform error\n");
jb.qi6b23ed42022-09-22 00:30:55 -0700932 return errno;
jb.qi96449342022-09-19 22:14:41 -0700933 }
934 if(i == 1)
935 {
936 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
937 RLOGD("recvfrom success\n");
938 }
939 Parcel p;
940 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
941 p.setDataPosition(0);
942 if(p.dataAvail() > 0)
943 {
944 p.readInt32(&resp_type);
945 p.readInt32(&solicited_token);
946 p.readInt32(&request);
947 p.readInt32(&slot_id);
948 p.readInt32(&error1);
949 error[i] = error1;//change screen state result
950 }
951 }
952
953 if((error[0] != 0) || (error[1] != 0))
954 {
955 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
956 if(error[0] != 0)
957 {
958 return error[0];
959 }
960 else
961 {
962 return error[1];
963 }
964 }
965 else
966 {
967 return 0;
968 }
969
ll887a0172022-03-09 03:13:31 +0000970}
llba425bd2022-03-17 02:23:00 +0000971
972/**
973 * @brief Check whether the input is valid for lynq_req_sim_io api
974 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
975 * type: [IN] list[1]:EF id(fileid)
976 * type: [IN] list[2]:offset(p1)
977 * type: [IN] list[3]:offset(p2)
978 * type: [IN] list[4]:response len,sometimes needn't care(p3)
979 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
980 type: [IN] Path is in hex asciii format eg "7f205f70"
981 type: [IN] Path must always be provided.
982 * @param data type: [IN] May be NULL
983 * @param pin2 type: [IN] May be NULL
984 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
985 * @param sw type: [OUT]
986 * @param simResponse type: [OUT] response
987 * @return int
988 */
989static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
990{
llba425bd2022-03-17 02:23:00 +0000991 if(list == NULL)
992 {
993 return -1;
994 }
995 if(path == NULL)
996 {
997 return -1;
998 }
999 if(sw == NULL){
1000 return -1;
1001 }
1002 if(simResponse == NULL){
1003 return -1;
1004 }
1005 if(data == NULL)
1006 {
1007 memcpy(data_buf, "null", 4);
1008 }
1009 else
1010 {
1011 bzero(data_buf,32);
1012 memcpy(data_buf, data, strlen(data));
1013 }
1014 if(pin2 == NULL)
1015 {
1016 memcpy(pin2_buf, "null", 4);
1017 }
1018 else
1019 {
1020 bzero(pin2_buf,32);
1021 memcpy(pin2_buf, data, strlen(data));
1022 }
1023 if(aidPtr == NULL)
1024 {
1025 memcpy(aidPtr_buf, "null", 4);
1026 }
1027 else
1028 {
1029 bzero(aidPtr_buf,32);
1030 memcpy(aidPtr_buf, data, strlen(data));
1031 }
1032 return 0;
1033}
1034
1035int 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 -07001036{
1037 if(g_lynq_sim_init_flag == 0)
1038 {
1039 return -1;
1040 }
llba425bd2022-03-17 02:23:00 +00001041 int ret = -1;
1042 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1043 {
1044 return ret;
1045 }
1046 int send_num = 0;
1047 int recv_num = 0;
1048 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001049 client_t.request = RIL_REQUEST_SIM_IO;
1050 client_t.paramLen = 9;
1051 client_t.uToken = Global_uToken;
1052 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 +00001053 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001054 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1055 if(send_num < 0)
1056 {
ll88f00782022-10-04 10:16:28 +08001057 RLOGD("function %s sendto error:", __FUNCTION__);
1058 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001059 return send_num;
1060 }
1061 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 +00001062 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001063 if(recv_num < 0 || recv_num == 0)
1064 {
1065 RLOGD("recvfrom step2 fail:");
1066 return recv_num;
1067 }
1068 Parcel p;
1069 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1070 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001071 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001072 {
llba425bd2022-03-17 02:23:00 +00001073 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001074 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001075 p.readInt32(&request);
1076 p.readInt32(&slot_id);
1077 p.readInt32(&error1);
1078 if(!error1)
1079 {
1080 p.readInt32(&sw[0]);
1081 p.readInt32(&sw[1]);
1082 char * test = lynqStrdupReadString(p);
1083 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001084 free(test);
llba425bd2022-03-17 02:23:00 +00001085 }
1086
1087 }
1088 return error1;
1089}
llb15599d2022-04-01 07:50:08 +00001090
ll88f00782022-10-04 10:16:28 +08001091static void wait_reset_mipc_response(int *response)
1092{
ll74a73b72022-10-17 10:30:58 +08001093 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +08001094 int outfd = open("/data/tp",O_RDONLY);
1095 if(outfd == -1){
1096 RLOGD("open error");
1097 return;
1098 }
1099 char rst[1024];
1100 int s;
1101 s = read(outfd,rst,sizeof(rst));
1102 sscanf(rst,"%d",response);
1103 usleep(1);
1104 close(outfd);
1105 return;
1106}
1107
1108int lynq_reset_modem(void)
1109{
1110 if(g_lynq_sim_init_flag == 0)
1111 {
1112 return -1;
1113 }
1114 int ret = -1;
1115 int send_num = 0;
1116 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
1117 client_t.paramLen = 1;
1118 client_t.uToken = Global_uToken;
1119 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
1120 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1121 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1122 if(send_num < 0)
1123 {
1124 RLOGD("function %s sendto error:", __FUNCTION__);
1125 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1126 return ret;
1127 }
1128 wait_reset_mipc_response(&ret);
1129 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1130 RLOGD("function %d ret %d",__FUNCTION__, ret);
1131 return ret;
1132}
1133
llb15599d2022-04-01 07:50:08 +00001134/**
1135 * @brief handle shutdown buf
1136 * @param options type: [IN]My Param doc
1137 * @param time type: [IN]My Param doc
1138 * @param message type: [IN]My Param doc
1139 */
1140static void handle_shutdown_buf(char options[], char time[], char message[])
1141{
1142 if(NULL == options)
1143 {
1144 bzero(options_buf, 32);
1145 memcpy(options_buf," ", 1);
1146 }
1147 else
1148 {
1149 memcpy(options_buf,options, strlen(options));
1150 }
1151 if(NULL == time)
1152 {
1153 bzero(time_buf, 32);
1154 memcpy(time_buf," ", 1);
1155 }
1156 else
1157 {
1158 memcpy(time_buf, time, strlen(time));
1159 }
1160 if(NULL == message)
1161 {
1162 bzero(message_buf, 32);
1163 memcpy(message_buf," ", 1);
1164 }
1165 else
1166 {
1167 memcpy(message_buf, message, strlen(message));
1168 }
1169}
1170
1171int lynq_shutdown(char options[], char time[], char message[])
1172{
1173 char cmd[128] = {0};
1174 handle_shutdown_buf(options, time, message);
1175 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1176 system(cmd);
1177 return 0;
1178}
1179
1180int lynq_get_version(char buf[])
1181{
1182 FILE * fp;
1183 char buffer[128];
1184 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1185 fp = popen(buffer, "r");
1186 fgets(buffer, sizeof(buffer), fp);
1187 memcpy(buf, buffer, strlen(buffer));
1188 buf[strlen(buffer)] = '\0';
1189 pclose(fp);
1190 return 0;
1191}
lle1d5d7c2022-01-18 12:34:30 +00001192#if FLAG_TESS
1193int lynq_query_operator(char buf[]){
1194 int32_t token = -1;
1195 if(buf == NULL)
1196 return token;
1197 char msg_imsi[20] = {0};
1198 memset(msg_imsi,0,sizeof(msg_imsi));
1199 token = lynq_get_imsi(msg_imsi);
1200 if(strlen(msg_imsi) != 0){
1201 FindOperator *ope_command = NULL;
1202 ope_command = find_ope_command(msg_imsi, findOperator);
1203 if(ope_command){
1204 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1205 buf[strlen(ope_command->buf)] = '\0';
1206 }
1207 else{
1208 /*more*/
1209 char mccmnc[5] = {0};
1210 memcpy(buf, msg_imsi, 5);
1211 buf[5] = '\0';
1212 /*more*/
1213 }
1214 return token;
1215 }
1216 else{
1217 //msg->base.e = err;
1218 const char *test = "please insert sim card";
1219 memcpy(buf, test, strlen(test));
1220 return token;
1221 }
1222}
1223FindOperator findOperator[] = {
1224#include "operator.h"
1225};
1226
1227static FindOperator*find_ope_command (char *name,FindOperator *Class){
1228 if(name == NULL || Class == NULL){
1229 return ((FindOperator *)NULL);
1230 }
1231 register int i;
1232 for (i = 0; Class[i].MCCMCN; i++)
1233 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1234 return (&Class[i]);
1235 return ((FindOperator *)NULL);
1236}
1237
1238#endif