blob: 65ea97fb7b0113f230bf55e4197201a21ed8419c [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
ll4c5c6b72022-03-31 15:27:23 +0800766/**
767 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
768 *
769 * @param buf Type:[IN]
770 */
771static void parse_imei(char buf[])
772{
773 if(NULL == buf)
774 {
775 return;
776 }
777 const char s[2] = ",";
778 char *token;
779 token = strtok(buf, s);
780 return;
781}
782
783int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700784{
785 if(g_lynq_sim_init_flag == 0)
786 {
787 return -1;
788 }
llfcd43492022-03-10 09:01:50 +0000789 int ret = -1;
790 if(buf == NULL)
791 return ret;
792 int send_num = 0;
793 int recv_num = 0;
794 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800795 lynq_client_t client_t1;
796 memset(&client_t1, 0, sizeof(client_t1) );
797 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
798 client_t1.paramLen = 0;
799 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000800 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800801 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000802 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800803 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000804 if(send_num < 0)
805 {
ll88f00782022-10-04 10:16:28 +0800806 RLOGD("function %s sendto error:", __FUNCTION__);
807 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800808 return send_num;
llfcd43492022-03-10 09:01:50 +0000809 }
ll4c5c6b72022-03-31 15:27:23 +0800810 //get data msg
llfcd43492022-03-10 09:01:50 +0000811 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 +0000812 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000813 if(recv_num < 0 || recv_num == 0)
814 {
815 RLOGD("recvfrom step2 fail:");
816 return recv_num;
817 }
818 Parcel p;
819 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
820 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800821 int num = 0;
llfcd43492022-03-10 09:01:50 +0000822 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800823 {
llfcd43492022-03-10 09:01:50 +0000824 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800825 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000826 p.readInt32(&request);
827 p.readInt32(&slot_id);
828 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800829 if(!error1){
830 p.readInt32(&num);
831 char * test = lynqStrdupReadString(p);
832 parse_imei(test);
833 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800834 free(test);
llfcd43492022-03-10 09:01:50 +0000835 }
836 }
837 return error1;
838}
839
rjw5d2a50e2022-02-28 15:01:49 +0800840static int judge(int slot){
841 switch(slot){
842 case 0:
843 return -1;
844 case 1:
845 return -1;
846 }
847 return 0;
848}
849
rjw5d2a50e2022-02-28 15:01:49 +0800850int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700851 if(g_lynq_sim_init_flag == 0)
852 {
853 return -1;
854 }
rjw5d2a50e2022-02-28 15:01:49 +0800855 int ret = -1;
856 if(!judge(slot))
857 return ret;
858 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800859 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
860 client_t.paramLen = 1;
861 client_t.uToken = Global_uToken;
862 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000863 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800864 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
865 if(send_num < 0)
866 {
ll88f00782022-10-04 10:16:28 +0800867 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800868 return send_num;
869 }
llab0f3e12022-07-20 11:59:51 +0000870 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800871 return 0;
872}
jb.qi96449342022-09-19 22:14:41 -0700873/**@breif change screen state
874*param num type: [IN] screen_state,0:close,1:open
875*param ret type: [OUT] result,0:success,other:fail
876*return int
877*/
ll887a0172022-03-09 03:13:31 +0000878int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700879 if(g_lynq_sim_init_flag == 0)
880 {
881 return -1;
882 }
jb.qi96449342022-09-19 22:14:41 -0700883
ll887a0172022-03-09 03:13:31 +0000884 int ret = -1;
885 if(!judge(num))
886 return ret;
887 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700888 int recv_num = 0;
889 int error[2];
890 char res_data[MAX_LEN] = {0};
891
892 //change the first screen
893 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000894 client_t.paramLen = 1;
895 client_t.uToken = Global_uToken;
896 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700897
llab0f3e12022-07-20 11:59:51 +0000898 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000899 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
900 if(send_num < 0)
901 {
jb.qi96449342022-09-19 22:14:41 -0700902 RLOGD("sendto error:\n");
ll88f00782022-10-04 10:16:28 +0800903 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000904 return send_num;
905 }
jb.qi96449342022-09-19 22:14:41 -0700906 for(int i=0;i<2;i++)
907 {
908 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
909 if(recv_num < 0 || recv_num == 0)
910 {
911 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
912 RLOGD("screen recvform error\n");
jb.qi6b23ed42022-09-22 00:30:55 -0700913 return errno;
jb.qi96449342022-09-19 22:14:41 -0700914 }
915 if(i == 1)
916 {
917 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
918 RLOGD("recvfrom success\n");
919 }
920 Parcel p;
921 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
922 p.setDataPosition(0);
923 if(p.dataAvail() > 0)
924 {
925 p.readInt32(&resp_type);
926 p.readInt32(&solicited_token);
927 p.readInt32(&request);
928 p.readInt32(&slot_id);
929 p.readInt32(&error1);
930 error[i] = error1;//change screen state result
931 }
932 }
933
934 if((error[0] != 0) || (error[1] != 0))
935 {
936 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
937 if(error[0] != 0)
938 {
939 return error[0];
940 }
941 else
942 {
943 return error[1];
944 }
945 }
946 else
947 {
948 return 0;
949 }
950
ll887a0172022-03-09 03:13:31 +0000951}
llba425bd2022-03-17 02:23:00 +0000952
953/**
954 * @brief Check whether the input is valid for lynq_req_sim_io api
955 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
956 * type: [IN] list[1]:EF id(fileid)
957 * type: [IN] list[2]:offset(p1)
958 * type: [IN] list[3]:offset(p2)
959 * type: [IN] list[4]:response len,sometimes needn't care(p3)
960 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
961 type: [IN] Path is in hex asciii format eg "7f205f70"
962 type: [IN] Path must always be provided.
963 * @param data type: [IN] May be NULL
964 * @param pin2 type: [IN] May be NULL
965 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
966 * @param sw type: [OUT]
967 * @param simResponse type: [OUT] response
968 * @return int
969 */
970static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
971{
llba425bd2022-03-17 02:23:00 +0000972 if(list == NULL)
973 {
974 return -1;
975 }
976 if(path == NULL)
977 {
978 return -1;
979 }
980 if(sw == NULL){
981 return -1;
982 }
983 if(simResponse == NULL){
984 return -1;
985 }
986 if(data == NULL)
987 {
988 memcpy(data_buf, "null", 4);
989 }
990 else
991 {
992 bzero(data_buf,32);
993 memcpy(data_buf, data, strlen(data));
994 }
995 if(pin2 == NULL)
996 {
997 memcpy(pin2_buf, "null", 4);
998 }
999 else
1000 {
1001 bzero(pin2_buf,32);
1002 memcpy(pin2_buf, data, strlen(data));
1003 }
1004 if(aidPtr == NULL)
1005 {
1006 memcpy(aidPtr_buf, "null", 4);
1007 }
1008 else
1009 {
1010 bzero(aidPtr_buf,32);
1011 memcpy(aidPtr_buf, data, strlen(data));
1012 }
1013 return 0;
1014}
1015
1016int 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 -07001017{
1018 if(g_lynq_sim_init_flag == 0)
1019 {
1020 return -1;
1021 }
llba425bd2022-03-17 02:23:00 +00001022 int ret = -1;
1023 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1024 {
1025 return ret;
1026 }
1027 int send_num = 0;
1028 int recv_num = 0;
1029 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001030 client_t.request = RIL_REQUEST_SIM_IO;
1031 client_t.paramLen = 9;
1032 client_t.uToken = Global_uToken;
1033 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 +00001034 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001035 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1036 if(send_num < 0)
1037 {
ll88f00782022-10-04 10:16:28 +08001038 RLOGD("function %s sendto error:", __FUNCTION__);
1039 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001040 return send_num;
1041 }
1042 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 +00001043 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001044 if(recv_num < 0 || recv_num == 0)
1045 {
1046 RLOGD("recvfrom step2 fail:");
1047 return recv_num;
1048 }
1049 Parcel p;
1050 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1051 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001052 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001053 {
llba425bd2022-03-17 02:23:00 +00001054 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001055 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001056 p.readInt32(&request);
1057 p.readInt32(&slot_id);
1058 p.readInt32(&error1);
1059 if(!error1)
1060 {
1061 p.readInt32(&sw[0]);
1062 p.readInt32(&sw[1]);
1063 char * test = lynqStrdupReadString(p);
1064 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001065 free(test);
llba425bd2022-03-17 02:23:00 +00001066 }
1067
1068 }
1069 return error1;
1070}
llb15599d2022-04-01 07:50:08 +00001071
ll88f00782022-10-04 10:16:28 +08001072static void wait_reset_mipc_response(int *response)
1073{
1074 int outfd = open("/data/tp",O_RDONLY);
1075 if(outfd == -1){
1076 RLOGD("open error");
1077 return;
1078 }
1079 char rst[1024];
1080 int s;
1081 s = read(outfd,rst,sizeof(rst));
1082 sscanf(rst,"%d",response);
1083 usleep(1);
1084 close(outfd);
1085 return;
1086}
1087
1088int lynq_reset_modem(void)
1089{
1090 if(g_lynq_sim_init_flag == 0)
1091 {
1092 return -1;
1093 }
1094 int ret = -1;
1095 int send_num = 0;
1096 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
1097 client_t.paramLen = 1;
1098 client_t.uToken = Global_uToken;
1099 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
1100 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1101 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1102 if(send_num < 0)
1103 {
1104 RLOGD("function %s sendto error:", __FUNCTION__);
1105 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1106 return ret;
1107 }
1108 wait_reset_mipc_response(&ret);
1109 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1110 RLOGD("function %d ret %d",__FUNCTION__, ret);
1111 return ret;
1112}
1113
llb15599d2022-04-01 07:50:08 +00001114/**
1115 * @brief handle shutdown buf
1116 * @param options type: [IN]My Param doc
1117 * @param time type: [IN]My Param doc
1118 * @param message type: [IN]My Param doc
1119 */
1120static void handle_shutdown_buf(char options[], char time[], char message[])
1121{
1122 if(NULL == options)
1123 {
1124 bzero(options_buf, 32);
1125 memcpy(options_buf," ", 1);
1126 }
1127 else
1128 {
1129 memcpy(options_buf,options, strlen(options));
1130 }
1131 if(NULL == time)
1132 {
1133 bzero(time_buf, 32);
1134 memcpy(time_buf," ", 1);
1135 }
1136 else
1137 {
1138 memcpy(time_buf, time, strlen(time));
1139 }
1140 if(NULL == message)
1141 {
1142 bzero(message_buf, 32);
1143 memcpy(message_buf," ", 1);
1144 }
1145 else
1146 {
1147 memcpy(message_buf, message, strlen(message));
1148 }
1149}
1150
1151int lynq_shutdown(char options[], char time[], char message[])
1152{
1153 char cmd[128] = {0};
1154 handle_shutdown_buf(options, time, message);
1155 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1156 system(cmd);
1157 return 0;
1158}
1159
1160int lynq_get_version(char buf[])
1161{
1162 FILE * fp;
1163 char buffer[128];
1164 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1165 fp = popen(buffer, "r");
1166 fgets(buffer, sizeof(buffer), fp);
1167 memcpy(buf, buffer, strlen(buffer));
1168 buf[strlen(buffer)] = '\0';
1169 pclose(fp);
1170 return 0;
1171}
lle1d5d7c2022-01-18 12:34:30 +00001172#if FLAG_TESS
1173int lynq_query_operator(char buf[]){
1174 int32_t token = -1;
1175 if(buf == NULL)
1176 return token;
1177 char msg_imsi[20] = {0};
1178 memset(msg_imsi,0,sizeof(msg_imsi));
1179 token = lynq_get_imsi(msg_imsi);
1180 if(strlen(msg_imsi) != 0){
1181 FindOperator *ope_command = NULL;
1182 ope_command = find_ope_command(msg_imsi, findOperator);
1183 if(ope_command){
1184 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1185 buf[strlen(ope_command->buf)] = '\0';
1186 }
1187 else{
1188 /*more*/
1189 char mccmnc[5] = {0};
1190 memcpy(buf, msg_imsi, 5);
1191 buf[5] = '\0';
1192 /*more*/
1193 }
1194 return token;
1195 }
1196 else{
1197 //msg->base.e = err;
1198 const char *test = "please insert sim card";
1199 memcpy(buf, test, strlen(test));
1200 return token;
1201 }
1202}
1203FindOperator findOperator[] = {
1204#include "operator.h"
1205};
1206
1207static FindOperator*find_ope_command (char *name,FindOperator *Class){
1208 if(name == NULL || Class == NULL){
1209 return ((FindOperator *)NULL);
1210 }
1211 register int i;
1212 for (i = 0; Class[i].MCCMCN; i++)
1213 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1214 return (&Class[i]);
1215 return ((FindOperator *)NULL);
1216}
1217
1218#endif