blob: 009953738368c6e749896427ca61933a93827dd5 [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*/
ll71a113b2022-10-21 18:07:25 +080042#define LYNQ_REQUEST_CHANGE_RADIO 8015
lle1d5d7c2022-01-18 12:34:30 +000043#define MAX_LEN 1024*8
44#define MAX_NUM 10
45#define LOG_TAG "LYNQ_SIM"
46#define FLAG_TESS 0
47using ::android::Parcel;
48#define DEST_PORT 8088
49#define DSET_IP_ADDRESS "127.0.0.1"
50
51typedef struct{
52 int uToken;
53 int request;
54 int paramLen;
55 char param[MAX_LEN];
56}lynq_client_t;
57
58lynq_client_t client_t;
59/* socket文件描述符 */
60int len_addr_serv;
61struct sockaddr_in addr_serv;
62static int sock_fd = 0;
63int Global_uToken = 0;
q.huang7de1d662022-09-13 14:19:24 +080064int solicited_token = -1;
lle1d5d7c2022-01-18 12:34:30 +000065int resp_type = -1;
66int request = -1;
67int slot_id = -1;
68int error1 = -1;
llab0f3e12022-07-20 11:59:51 +000069static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000070/**
71 * @brief mark call initialization state
72 * 0: deinit state
73 * 1: init state
74 */
75int g_lynq_sim_init_flag = 0;
76
77/**
78 * @brief lynq_req_sim_io need to send request
79 */
80char data_buf[32] = {0};
81char pin2_buf[32] = {0};
82char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000083
llb15599d2022-04-01 07:50:08 +000084/**/
85char options_buf[32] = {0};
86char time_buf[32] = {0};
87char message_buf[32] = {0};
88
lle1d5d7c2022-01-18 12:34:30 +000089int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000090 if(g_lynq_sim_init_flag == 1)
91 {
92 RLOGD("lynq_sim_init failed");
93 return -1;
94 }
95 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000096 if(utoken < 0){
97 return -1;
98 }
lle1d5d7c2022-01-18 12:34:30 +000099 Global_uToken = utoken;
100 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +0800101 if (-1 == sock_fd)
102 {
103 return sock_fd;
104 }
lh8d290112023-10-22 20:53:06 -0700105
106 struct sockaddr_in liblynq_data_socket;
107 bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
108 //set this lib socket config
109 liblynq_data_socket.sin_family = AF_INET;
110 liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
111 int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
112 if (-1 == ret)
113 {
114 RLOGE("liblynq_data_socket bind fail,errno:%d",errno);
115 return -1;
116 }
117
ll33334af2022-06-30 16:54:51 +0800118 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000119 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800120 timeOut.tv_usec = 0;
121 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
122 {
123 RLOGD("time out setting failed\n");
124 return -1;
125 }
lle1d5d7c2022-01-18 12:34:30 +0000126 /* 设置address */
127 memset(&addr_serv, 0, sizeof(addr_serv));
128 addr_serv.sin_family = AF_INET;
129 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
130 addr_serv.sin_port = htons(DEST_PORT);
131 len_addr_serv = sizeof(addr_serv);
132 /*test*/
133 return 0;
134}
135
136int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000137 if(g_lynq_sim_init_flag == 0)
138 {
139 RLOGD("lynq_sim_deinit failed");
140 return -1;
141 }
142 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000143 close(sock_fd);
144 return 0;
145}
146
147static char * lynqStrdupReadString(Parcel &p) {
148 size_t stringlen;
149 const char16_t *s16;
150
151 s16 = p.readString16Inplace(&stringlen);
152 return strndup16to8(s16, stringlen);
153}
154
llba425bd2022-03-17 02:23:00 +0000155/*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 +0000156int lynq_get_sim_status(int *card_status)
157{
ll27dbe752022-08-10 00:33:52 -0700158 if(g_lynq_sim_init_flag == 0)
159 {
160 return -1;
161 }
lle1d5d7c2022-01-18 12:34:30 +0000162 int ret = -1;
163 if(card_status == NULL)
164 return ret;
165 int send_num = 0;
166 int recv_num = 0;
167 int len = 0;
168 lynq_client_t client_t1;
169 memset(&client_t1, 0, sizeof(client_t1) );
170 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
171 client_t1.paramLen = 0;
172 client_t1.uToken = Global_uToken;
173 char res_data[MAX_LEN] = {0};
174 int len1 = sizeof(client_t1.param);
175 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000176 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000177 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
178 if(send_num < 0)
179 {
ll88f00782022-10-04 10:16:28 +0800180 RLOGD("function %s sendto error:", __FUNCTION__);
181 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000182 return send_num;
183 }
184 //get data msg
185 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
186 if(recv_num < 0 || recv_num == 0)
187 {
188 RLOGD("recvfrom step2 fail:");
ll88f00782022-10-04 10:16:28 +0800189 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000190 return recv_num;
191 }
llab0f3e12022-07-20 11:59:51 +0000192 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000193 Parcel p;;
194 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
195 p.setDataPosition(0);
196 if(p.dataAvail() > 0)
197 {
198 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800199 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000200 p.readInt32(&request);
201 p.readInt32(&slot_id);
202 p.readInt32(&error1);
203 p.readInt32(card_status);
204 }
205 return error1;
206}
llba425bd2022-03-17 02:23:00 +0000207
lle1d5d7c2022-01-18 12:34:30 +0000208int lynq_get_imsi(char buf[])
209{
ll27dbe752022-08-10 00:33:52 -0700210 if(g_lynq_sim_init_flag == 0)
211 {
212 return -1;
213 }
lle1d5d7c2022-01-18 12:34:30 +0000214 int ret = -1;
215 if(buf == NULL)
216 return ret;
217 int send_num = 0;
218 int recv_num = 0;
219 int len = 0;
220 lynq_client_t client_t1;
221 memset(&client_t1, 0, sizeof(client_t1) );
222 client_t1.request = RIL_REQUEST_GET_IMSI;
223 client_t1.paramLen = 0;
224 client_t1.uToken = Global_uToken;
225 char res_data[MAX_LEN] = {0};
226 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000227 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000228 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
229 if(send_num < 0)
230 {
ll88f00782022-10-04 10:16:28 +0800231 RLOGD("function %s sendto error:", __FUNCTION__);
232 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000233 return send_num;
234 }
235 //get data msg
236 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 +0000237 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000238 if(recv_num < 0 || recv_num == 0)
239 {
240 RLOGD("recvfrom step2 fail:");
241 return recv_num;
242 }
243 Parcel p;
244 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
245 p.setDataPosition(0);
246 if(p.dataAvail() > 0)
247 {
248 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800249 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000250 p.readInt32(&request);
251 p.readInt32(&slot_id);
252 p.readInt32(&error1);
253 if(!error1){
254 char * test = lynqStrdupReadString(p);
255 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800256 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000257 }
258 }
259 return error1;
260}
261
262
263/*add by lei*/
264
265int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700266 if(g_lynq_sim_init_flag == 0)
267 {
268 return -1;
269 }
lle1d5d7c2022-01-18 12:34:30 +0000270 int ret = -1;
271 if(buf == NULL)
272 return ret;
273 int send_num = 0;
274 int recv_num = 0;
275 int len = 0;
276 client_t.request = RIL_REQUEST_QUERY_ICCID;
277 client_t.paramLen = 0;
278 client_t.uToken = Global_uToken;
279 char res_data[MAX_LEN] = {0};
280 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000281 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000282 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
283 if(send_num < 0)
284 {
ll88f00782022-10-04 10:16:28 +0800285 RLOGD("function %s sendto error:", __FUNCTION__);
286 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000287 return send_num;
288 }
289 //get data msg
290 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 +0000291 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000292 if(recv_num < 0 || recv_num == 0)
293 {
294 RLOGD("recvfrom step2 fail:");
295 return recv_num;
296 }
297 Parcel p;
298 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
299 p.setDataPosition(0);
300 if(p.dataAvail() > 0)
301 {
302 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800303 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000304 p.readInt32(&request);
305 p.readInt32(&slot_id);
306 p.readInt32(&error1);
307 if(!error1){
308 char * test = lynqStrdupReadString(p);
309 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800310 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000311 }
312 }
313 return error1;
314}
315
316int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700317 if(g_lynq_sim_init_flag == 0)
318 {
319 return -1;
320 }
lle1d5d7c2022-01-18 12:34:30 +0000321 int ret = -1;
322 if(pin == NULL)
323 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800324 if(!strlen(pin))
325 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000326 int send_num = 0;
327 int recv_num = 0;
328 char res_data[MAX_LEN] = {0};
329 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
330 client_t.paramLen = 4;
331 client_t.uToken = Global_uToken;
332 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000333 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000334 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
335 if(send_num < 0)
336 {
ll88f00782022-10-04 10:16:28 +0800337 RLOGD("function %s sendto error:", __FUNCTION__);
338 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000339 return send_num;
340 }
341
342 //get data msg
343 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 +0000344 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000345 if(recv_num < 0 || recv_num == 0)
346 {
347 RLOGD("recvfrom step2 fail:");
348 return recv_num;
349 }
350 Parcel p;
351 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
352 p.setDataPosition(0);
353 if(p.dataAvail() > 0)
354 {
355 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800356 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000357 p.readInt32(&request);
358 p.readInt32(&slot_id);
359 p.readInt32(&error1);
360 }
361 return error1;
362}
363
lle6cc3932022-08-18 06:06:39 -0700364int lynq_sim_power(int mode)
365{
366 if(g_lynq_sim_init_flag == 0)
367 {
368 return -1;
369 }
370 int ret = -1;
371 int send_num = 0;
372 int recv_num = 0;
373 int len = 0;
374 char res_data[MAX_LEN] = {0};
375 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
376 client_t.paramLen = 1;
377 client_t.uToken = Global_uToken;
378 char buf[64] = {0};
379 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
380 sprintf(client_t.param, "%s\n", buf);
381 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
382 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
383 if(send_num < 0)
384 {
ll88f00782022-10-04 10:16:28 +0800385 RLOGD("function %s sendto error:", __FUNCTION__);
386 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle6cc3932022-08-18 06:06:39 -0700387 return ret;
388 }
389 //get data msg
390 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
391 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
392 if(recv_num < 0 || recv_num == 0)
393 {
394 RLOGD("recvfrom step2 fail:");
395 return recv_num;
396 }
397 Parcel p;
398 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
399 p.setDataPosition(0);
400 int num = -1;
401 if(p.dataAvail() > 0)
402 {
403 char test[128] = {0};
404 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800405 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700406 p.readInt32(&request);
407 p.readInt32(&slot_id);
408 p.readInt32(&error1);
409 p.readInt32(&num);
410 if(num == -1){
411 }else{
412 p.read(test, num);
413 return error1;
414 }
415 }
416 return error1;
417}
418
lle1d5d7c2022-01-18 12:34:30 +0000419int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700420 if(g_lynq_sim_init_flag == 0)
421 {
422 return -1;
423 }
lle1d5d7c2022-01-18 12:34:30 +0000424 int ret = -1;
425 if(pin == NULL)
426 return ret;
427 int send_num = 0;
428 int recv_num = 0;
429 char res_data[MAX_LEN] = {0};
430 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
431 client_t.paramLen = 4;
432 client_t.uToken = Global_uToken;
433 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000434 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000435 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
436 if(send_num < 0)
437 {
ll88f00782022-10-04 10:16:28 +0800438 RLOGD("function %s sendto error:", __FUNCTION__);
439 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000440 return send_num;
441 }
442 //get data msg
443 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 +0000444 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000445 if(recv_num < 0 || recv_num == 0)
446 {
447 RLOGD("recvfrom step2 fail:");
448 return recv_num;
449 }
450 Parcel p;
451 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
452 p.setDataPosition(0);
453 if(p.dataAvail() > 0)
454 {
455 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800456 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000457 p.readInt32(&request);
458 p.readInt32(&slot_id);
459 p.readInt32(&error1);
460 }
461 return error1;
462}
463
464int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700465 if(g_lynq_sim_init_flag == 0)
466 {
467 return -1;
468 }
lle1d5d7c2022-01-18 12:34:30 +0000469 int ret = -1;
470 if(pin == NULL)
471 return ret;
472 int send_num = 0;
473 int recv_num = 0;
474 int len = 0;
475 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
476 client_t.paramLen = 3;
477 client_t.uToken = Global_uToken;
478 char res_data[MAX_LEN] = {0};
479 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000480 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000481 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
482 if(send_num < 0)
483 {
ll88f00782022-10-04 10:16:28 +0800484 RLOGD("function %s sendto error:", __FUNCTION__);
485 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000486 return send_num;
487 }
488 //get data msg
489 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 +0000490 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000491 if(recv_num < 0 || recv_num == 0)
492 {
493 RLOGD("recvfrom step2 fail:");
494 return recv_num;
495 }
496 Parcel p;
497 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
498 p.setDataPosition(0);
499 int num = -1;
500 if(p.dataAvail() > 0)
501 {
502 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800503 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000504 p.readInt32(&request);
505 p.readInt32(&slot_id);
506 p.readInt32(&error1);
507 p.readInt32(&num);
508 if(num > 0){
509 int *test = (int *)calloc(1, sizeof(int)*num);
510 for(int i =0; i <num; i++){
511 p.readInt32(&test[i]);
512 buf[i] = test[i];
513 }
514 free(test);
515 }
516 }
517 return error1;
518}
519
520int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700521 if(g_lynq_sim_init_flag == 0)
522 {
523 return -1;
524 }
lle1d5d7c2022-01-18 12:34:30 +0000525 int ret = -1;
526 if(pin == NULL)
527 return ret;
528 int send_num = 0;
529 int recv_num = 0;
530 char res_data[MAX_LEN] = {0};
531 int len = 0;
532 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
533 client_t.paramLen = 1;
534 client_t.uToken = Global_uToken;
535 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000536 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000537 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
538 if(send_num < 0)
539 {
ll88f00782022-10-04 10:16:28 +0800540 RLOGD("function %s sendto error:", __FUNCTION__);
541 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000542 return send_num;
543 }
544 //get data msg
545 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 +0000546 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000547 if(recv_num < 0 || recv_num == 0)
548 {
549 RLOGD("recvfrom step2 fail:");
550 return recv_num;
551 }
552 Parcel p;
553 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
554 p.setDataPosition(0);
555 if(p.dataAvail() > 0)
556 {
557 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800558 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000559 p.readInt32(&request);
560 p.readInt32(&slot_id);
561 p.readInt32(&error1);
562 }
563 return error1;
564}
565
566int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700567 if(g_lynq_sim_init_flag == 0)
568 {
569 return -1;
570 }
lle1d5d7c2022-01-18 12:34:30 +0000571 int ret = -1;
572 if(old_pin == NULL || new_pin == NULL)
573 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800574 if(!strlen(new_pin))
575 return ret;
ll3fe03462022-03-01 09:18:53 +0000576 if(!strlen(old_pin))
577 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000578 int send_num = 0;
579 int recv_num = 0;
580 char res_data[MAX_LEN] = {0};
581 int len = 0;
582 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
583 client_t.paramLen = 2;
584 client_t.uToken = Global_uToken;
585 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000586 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000587 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
588 if(send_num < 0)
589 {
ll88f00782022-10-04 10:16:28 +0800590 RLOGD("function %s sendto error:", __FUNCTION__);
591 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000592 return send_num;
593 }
594 //get data msg
595 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 +0000596 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000597 if(recv_num < 0 || recv_num == 0)
598 {
599 RLOGD("recvfrom step2 fail:");
600 return recv_num;
601 }
602 Parcel p;
603 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
604 p.setDataPosition(0);
605 if(p.dataAvail() > 0)
606 {
607 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800608 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000609 p.readInt32(&request);
610 p.readInt32(&slot_id);
611 p.readInt32(&error1);
612 }
613 return error1;
614}
615
616int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700617 if(g_lynq_sim_init_flag == 0)
618 {
619 return -1;
620 }
lle1d5d7c2022-01-18 12:34:30 +0000621 int ret = -1;
622 if(puk == NULL || pin == NULL)
623 return ret;
624 int send_num = 0;
625 int recv_num = 0;
626 char res_data[MAX_LEN] = {0};
627 int len = 0;
628 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
629 client_t.paramLen = 2;
630 client_t.uToken = Global_uToken;
631 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000632 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000633 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
634 if(send_num < 0)
635 {
ll88f00782022-10-04 10:16:28 +0800636 RLOGD("function %s sendto error:", __FUNCTION__);
637 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000638 return send_num;
639 }
640 //get data msg
641 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 +0000642 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000643 if(recv_num < 0 || recv_num == 0)
644 {
645 RLOGD("recvfrom step2 fail:");
646 return recv_num;
647 }
648 Parcel p;
649 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
650 p.setDataPosition(0);
651 if(p.dataAvail() > 0)
652 {
653 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800654 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000655 p.readInt32(&request);
656 p.readInt32(&slot_id);
657 p.readInt32(&error1);
658 }
659 return error1;
660}
661
662static void delete_char(char str[],char target){
663 if(str == NULL){
664 return;
665 }
666 int i,j;
667 for(i=j=0;str[i]!='\0';i++){
668 if(str[i]!=target){
669 str[j++]=str[i];
670 }
671 }
672 str[j]='\0';
673}
674
675static int parse_param(char *cmd, char **argv, char buf[]){
676 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800677 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000678 }
679 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000680 return 3;
681 }
682 else{
683 int argc = 0;
684 char *token;
685 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800686 if(token == NULL)
687 {
688 return 9001;
689 }
llbe2bdbd2022-06-14 02:40:33 +0000690 if(strstr(token, "CNUM"))
691 {
lle1d5d7c2022-01-18 12:34:30 +0000692 char *string;
693 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000694 {
695 if(argc == 5)
696 {
697 if(NULL == argv[1])
698 {
699 return 9002;
700 }
701 int lengh = strlen(argv[1]);
702 memcpy(buf, argv[1], lengh);
703 delete_char(buf, '"');
704 RLOGD("too many phone number return\n");
705 return 0;
706 }
lle1d5d7c2022-01-18 12:34:30 +0000707 string = token;
708 argv[argc++] = string;
709 token = strtok(NULL, ",");
710 }
llbe2bdbd2022-06-14 02:40:33 +0000711 if(NULL == argv[1])
712 {
713 return 9001;
714 }
lle1d5d7c2022-01-18 12:34:30 +0000715 int lengh = strlen(argv[1]);
716 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000717 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800718 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000719 }
llbe2bdbd2022-06-14 02:40:33 +0000720 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000721 }
lle1d5d7c2022-01-18 12:34:30 +0000722}
723
724int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700725 if(g_lynq_sim_init_flag == 0)
726 {
727 return -1;
728 }
lle1d5d7c2022-01-18 12:34:30 +0000729 int ret = -1;
730 if(buf == NULL)
731 return ret;
732 int send_num = 0;
733 int recv_num = 0;
734 int len = 0;
735 char res_data[MAX_LEN] = {0};
736 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
737 client_t.paramLen = 1;
738 client_t.uToken = Global_uToken;
739 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000740 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000741 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
742 if(send_num < 0)
743 {
ll88f00782022-10-04 10:16:28 +0800744 RLOGD("function %s sendto error:", __FUNCTION__);
745 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000746 return ret;
747 }
748 //get data msg
749 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 +0000750 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000751 if(recv_num < 0 || recv_num == 0)
752 {
753 RLOGD("recvfrom step2 fail:");
754 return recv_num;
755 }
756 Parcel p;
757 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
758 p.setDataPosition(0);
759 int num = -1;
760 if(p.dataAvail() > 0)
761 {
llb1fc9212022-04-12 03:02:01 +0000762 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000763 char *argv[5] = {0};
764 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800765 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000766 p.readInt32(&request);
767 p.readInt32(&slot_id);
768 p.readInt32(&error1);
769 p.readInt32(&num);
770 if(num == -1){
771 }else{
772 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800773 num = parse_param(test, argv, buf);
774 return num;
lle1d5d7c2022-01-18 12:34:30 +0000775 }
776 }
777 return error1;
778}
rjw5d2a50e2022-02-28 15:01:49 +0800779
q.huangbe2d6932022-10-19 16:39:29 +0800780int lynq_get_imei(char buf[])
781{
782 if(g_lynq_sim_init_flag == 0)
783 {
784 return -1;
785 }
786 int ret = -1;
787 if(buf == NULL)
788 return ret;
789 int send_num = 0;
790 int recv_num = 0;
791 int len = 0;
792 lynq_client_t client_t1;
793 memset(&client_t1, 0, sizeof(client_t1) );
794 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
795 client_t1.paramLen = 0;
796 client_t1.uToken = Global_uToken;
797 char res_data[MAX_LEN] = {0};
798 memset(client_t1.param, 0, sizeof(client_t1.param));
799 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
800 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
801 if(send_num < 0)
802 {
803 RLOGD("function %s sendto error:", __FUNCTION__);
804 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
805 return send_num;
806 }
807 //get data msg
808 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
809 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
810 if(recv_num < 0 || recv_num == 0)
811 {
812 RLOGD("recvfrom step2 fail:");
813 return recv_num;
814 }
815 Parcel p;
816 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
817 p.setDataPosition(0);
818 int num = 0;
819 if(p.dataAvail() > 0)
820 {
821 p.readInt32(&resp_type);
822 p.readInt32(&solicited_token);
823 p.readInt32(&request);
824 p.readInt32(&slot_id);
825 p.readInt32(&error1);
826 if(!error1){
827 p.readInt32(&num);
828 char * test = lynqStrdupReadString(p);
829 memcpy(buf, test, strlen(test));
830 free(test);
831 }
832 }
833 return error1;
834}
835
q.huang2a282792022-10-12 11:39:36 +0800836int lynq_get_imei_and_sv(char imei[],char sv[])
q.huangd3b254d2022-10-19 16:39:29 +0800837{
q.huang2a282792022-10-12 11:39:36 +0800838 RLOGD("%s called",__func__);
q.huangd3b254d2022-10-19 16:39:29 +0800839 if(g_lynq_sim_init_flag == 0)
840 {
q.huang2a282792022-10-12 11:39:36 +0800841 RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag);
842 return -2;
q.huangd3b254d2022-10-19 16:39:29 +0800843 }
844 int ret = -1;
q.huang2a282792022-10-12 11:39:36 +0800845 if(imei == NULL || sv== NULL)
846 {
847 RLOGD("%s imei is NULL or sv is NULL",__func__);
q.huangd3b254d2022-10-19 16:39:29 +0800848 return ret;
q.huang2a282792022-10-12 11:39:36 +0800849 }
850
q.huangd3b254d2022-10-19 16:39:29 +0800851 int send_num = 0;
852 int recv_num = 0;
853 int len = 0;
854 lynq_client_t client_t1;
855 memset(&client_t1, 0, sizeof(client_t1) );
856 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
857 client_t1.paramLen = 0;
858 client_t1.uToken = Global_uToken;
859 char res_data[MAX_LEN] = {0};
860 memset(client_t1.param, 0, sizeof(client_t1.param));
861 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
862 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
863 if(send_num < 0)
864 {
q.huang2a282792022-10-12 11:39:36 +0800865 RLOGD("%s sendto error: %d",__func__,send_num);
q.huangd3b254d2022-10-19 16:39:29 +0800866 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
867 return send_num;
868 }
869 //get data msg
870 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
871 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
872 if(recv_num < 0 || recv_num == 0)
873 {
q.huang2a282792022-10-12 11:39:36 +0800874 RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num);
q.huangd3b254d2022-10-19 16:39:29 +0800875 return recv_num;
876 }
877 Parcel p;
878 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
879 p.setDataPosition(0);
880 int num = 0;
881 if(p.dataAvail() > 0)
882 {
883 p.readInt32(&resp_type);
884 p.readInt32(&solicited_token);
885 p.readInt32(&request);
886 p.readInt32(&slot_id);
887 p.readInt32(&error1);
888 if(!error1){
889 p.readInt32(&num);
q.huang2a282792022-10-12 11:39:36 +0800890 if(num<2)
891 {
892 RLOGD("%s num %d error, should greater than 1",__func__,num);
893 return -1;
894 }
895 char *resp[2]={NULL,NULL};
896 int i;
897 for(i=0;i<2;i++)
898 {
899 resp[i]= lynqStrdupReadString(p);
900 if(resp[i]==NULL)
901 {
902 break;
903 }
904 }
905
906 if(i==2){
907 memcpy(imei, resp[0], strlen(resp[0])+1);
908 memcpy(sv, resp[1], strlen(resp[1])+1);
909 }
910 else
911 {
912 RLOGD("%s resp[%d] is null",__func__,i);
913 }
914
915 for(i=0;i<2;i++)
916 {
917 if(resp[i]!=NULL)
918 {
919 free(resp[i]);
920 }
921 }
922 return i==2? 0:-1;
q.huangd3b254d2022-10-19 16:39:29 +0800923 }
q.huang2a282792022-10-12 11:39:36 +0800924 }
925 RLOGD("%s called failed %d",__func__,error1);
q.huangd3b254d2022-10-19 16:39:29 +0800926 return error1;
927}
928
rjw5d2a50e2022-02-28 15:01:49 +0800929static int judge(int slot){
930 switch(slot){
931 case 0:
932 return -1;
933 case 1:
934 return -1;
935 }
936 return 0;
937}
938
rjw5d2a50e2022-02-28 15:01:49 +0800939int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700940 if(g_lynq_sim_init_flag == 0)
941 {
942 return -1;
943 }
rjw5d2a50e2022-02-28 15:01:49 +0800944 int ret = -1;
945 if(!judge(slot))
946 return ret;
947 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800948 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
949 client_t.paramLen = 1;
950 client_t.uToken = Global_uToken;
951 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000952 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800953 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
954 if(send_num < 0)
955 {
ll88f00782022-10-04 10:16:28 +0800956 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800957 return send_num;
958 }
llab0f3e12022-07-20 11:59:51 +0000959 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800960 return 0;
961}
jb.qi96449342022-09-19 22:14:41 -0700962/**@breif change screen state
963*param num type: [IN] screen_state,0:close,1:open
964*param ret type: [OUT] result,0:success,other:fail
965*return int
966*/
ll887a0172022-03-09 03:13:31 +0000967int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700968 if(g_lynq_sim_init_flag == 0)
969 {
970 return -1;
971 }
jb.qi96449342022-09-19 22:14:41 -0700972
ll887a0172022-03-09 03:13:31 +0000973 int ret = -1;
974 if(!judge(num))
975 return ret;
976 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700977 int recv_num = 0;
978 int error[2];
979 char res_data[MAX_LEN] = {0};
980
981 //change the first screen
982 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000983 client_t.paramLen = 1;
984 client_t.uToken = Global_uToken;
985 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700986
llab0f3e12022-07-20 11:59:51 +0000987 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000988 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
989 if(send_num < 0)
990 {
jb.qi96449342022-09-19 22:14:41 -0700991 RLOGD("sendto error:\n");
ll88f00782022-10-04 10:16:28 +0800992 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000993 return send_num;
994 }
jb.qi96449342022-09-19 22:14:41 -0700995 for(int i=0;i<2;i++)
996 {
997 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
998 if(recv_num < 0 || recv_num == 0)
999 {
1000 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
1001 RLOGD("screen recvform error\n");
jb.qi6b23ed42022-09-22 00:30:55 -07001002 return errno;
jb.qi96449342022-09-19 22:14:41 -07001003 }
1004 if(i == 1)
1005 {
1006 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1007 RLOGD("recvfrom success\n");
1008 }
1009 Parcel p;
1010 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
1011 p.setDataPosition(0);
1012 if(p.dataAvail() > 0)
1013 {
1014 p.readInt32(&resp_type);
1015 p.readInt32(&solicited_token);
1016 p.readInt32(&request);
1017 p.readInt32(&slot_id);
1018 p.readInt32(&error1);
1019 error[i] = error1;//change screen state result
1020 }
1021 }
1022
1023 if((error[0] != 0) || (error[1] != 0))
1024 {
1025 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
1026 if(error[0] != 0)
1027 {
1028 return error[0];
1029 }
1030 else
1031 {
1032 return error[1];
1033 }
1034 }
1035 else
1036 {
1037 return 0;
1038 }
1039
ll887a0172022-03-09 03:13:31 +00001040}
llba425bd2022-03-17 02:23:00 +00001041
ll71a113b2022-10-21 18:07:25 +08001042/**@breif change screen state
1043*param num type: [IN] screen_state,0:close,1:open
1044*param ret type: [OUT] result,0:success,other:fail
1045*return int
1046*/
1047int lynq_factory_radio_state(int num){
1048 if(g_lynq_sim_init_flag == 0)
1049 {
1050 return -1;
1051 }
1052
1053 int ret = -1;
1054 if(!judge(num))
1055 return ret;
1056 int send_num = 0;
1057 int recv_num = 0;
1058 int error[2];
1059 char res_data[MAX_LEN] = {0};
1060 //change the first screen
1061 client_t.request = LYNQ_REQUEST_CHANGE_RADIO; //8015
1062 client_t.paramLen = 1;
1063 client_t.uToken = Global_uToken;
1064 sprintf(client_t.param, "%d\n", num);
1065
1066 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1067 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1068 if(send_num < 0)
1069 {
1070 RLOGD("sendto error:\n");
1071 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1072 return send_num;
1073 }
1074 for(int i=0;i<2;i++)
1075 {
1076 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
1077 if(recv_num < 0 || recv_num == 0)
1078 {
1079 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
1080 RLOGD("screen recvform error\n");
1081 return errno;
1082 }
1083 if(i == 1)
1084 {
1085 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1086 RLOGD("recvfrom success\n");
1087 }
1088 Parcel p;
1089 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
1090 p.setDataPosition(0);
1091 if(p.dataAvail() > 0)
1092 {
1093 p.readInt32(&resp_type);
1094 p.readInt32(&solicited_token);
1095 p.readInt32(&request);
1096 p.readInt32(&slot_id);
1097 p.readInt32(&error1);
1098 error[i] = error1;//change screen state result
1099 }
1100 }
1101
1102 if((error[0] != 0) || (error[1] != 0))
1103 {
1104 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
1105 if(error[0] != 0)
1106 {
1107 return error[0];
1108 }
1109 else
1110 {
1111 return error[1];
1112 }
1113 }
1114 else
1115 {
1116 return 0;
1117 }
1118
1119}
1120
llba425bd2022-03-17 02:23:00 +00001121/**
1122 * @brief Check whether the input is valid for lynq_req_sim_io api
1123 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
1124 * type: [IN] list[1]:EF id(fileid)
1125 * type: [IN] list[2]:offset(p1)
1126 * type: [IN] list[3]:offset(p2)
1127 * type: [IN] list[4]:response len,sometimes needn't care(p3)
1128 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
1129 type: [IN] Path is in hex asciii format eg "7f205f70"
1130 type: [IN] Path must always be provided.
1131 * @param data type: [IN] May be NULL
1132 * @param pin2 type: [IN] May be NULL
1133 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
1134 * @param sw type: [OUT]
1135 * @param simResponse type: [OUT] response
1136 * @return int
1137 */
1138static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
1139{
llba425bd2022-03-17 02:23:00 +00001140 if(list == NULL)
1141 {
1142 return -1;
1143 }
1144 if(path == NULL)
1145 {
1146 return -1;
1147 }
1148 if(sw == NULL){
1149 return -1;
1150 }
1151 if(simResponse == NULL){
1152 return -1;
1153 }
1154 if(data == NULL)
1155 {
1156 memcpy(data_buf, "null", 4);
1157 }
1158 else
1159 {
1160 bzero(data_buf,32);
1161 memcpy(data_buf, data, strlen(data));
1162 }
1163 if(pin2 == NULL)
1164 {
1165 memcpy(pin2_buf, "null", 4);
1166 }
1167 else
1168 {
1169 bzero(pin2_buf,32);
1170 memcpy(pin2_buf, data, strlen(data));
1171 }
1172 if(aidPtr == NULL)
1173 {
1174 memcpy(aidPtr_buf, "null", 4);
1175 }
1176 else
1177 {
1178 bzero(aidPtr_buf,32);
1179 memcpy(aidPtr_buf, data, strlen(data));
1180 }
1181 return 0;
1182}
1183
1184int 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 -07001185{
1186 if(g_lynq_sim_init_flag == 0)
1187 {
1188 return -1;
1189 }
llba425bd2022-03-17 02:23:00 +00001190 int ret = -1;
1191 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1192 {
1193 return ret;
1194 }
1195 int send_num = 0;
1196 int recv_num = 0;
1197 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001198 client_t.request = RIL_REQUEST_SIM_IO;
1199 client_t.paramLen = 9;
1200 client_t.uToken = Global_uToken;
1201 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 +00001202 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001203 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1204 if(send_num < 0)
1205 {
ll88f00782022-10-04 10:16:28 +08001206 RLOGD("function %s sendto error:", __FUNCTION__);
1207 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001208 return send_num;
1209 }
1210 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 +00001211 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001212 if(recv_num < 0 || recv_num == 0)
1213 {
1214 RLOGD("recvfrom step2 fail:");
1215 return recv_num;
1216 }
1217 Parcel p;
1218 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1219 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001220 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001221 {
llba425bd2022-03-17 02:23:00 +00001222 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001223 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001224 p.readInt32(&request);
1225 p.readInt32(&slot_id);
1226 p.readInt32(&error1);
1227 if(!error1)
1228 {
1229 p.readInt32(&sw[0]);
1230 p.readInt32(&sw[1]);
1231 char * test = lynqStrdupReadString(p);
1232 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001233 free(test);
llba425bd2022-03-17 02:23:00 +00001234 }
1235
1236 }
1237 return error1;
1238}
llb15599d2022-04-01 07:50:08 +00001239
ll88f00782022-10-04 10:16:28 +08001240static void wait_reset_mipc_response(int *response)
1241{
ll74a73b72022-10-17 10:30:58 +08001242 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +08001243 int outfd = open("/data/tp",O_RDONLY);
1244 if(outfd == -1){
1245 RLOGD("open error");
1246 return;
1247 }
1248 char rst[1024];
1249 int s;
1250 s = read(outfd,rst,sizeof(rst));
1251 sscanf(rst,"%d",response);
1252 usleep(1);
1253 close(outfd);
1254 return;
1255}
1256
1257int lynq_reset_modem(void)
1258{
1259 if(g_lynq_sim_init_flag == 0)
1260 {
1261 return -1;
1262 }
1263 int ret = -1;
1264 int send_num = 0;
1265 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
1266 client_t.paramLen = 1;
1267 client_t.uToken = Global_uToken;
1268 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
1269 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1270 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1271 if(send_num < 0)
1272 {
1273 RLOGD("function %s sendto error:", __FUNCTION__);
1274 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1275 return ret;
1276 }
1277 wait_reset_mipc_response(&ret);
1278 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1279 RLOGD("function %d ret %d",__FUNCTION__, ret);
1280 return ret;
1281}
1282
llb15599d2022-04-01 07:50:08 +00001283/**
1284 * @brief handle shutdown buf
1285 * @param options type: [IN]My Param doc
1286 * @param time type: [IN]My Param doc
1287 * @param message type: [IN]My Param doc
1288 */
1289static void handle_shutdown_buf(char options[], char time[], char message[])
1290{
1291 if(NULL == options)
1292 {
1293 bzero(options_buf, 32);
1294 memcpy(options_buf," ", 1);
1295 }
1296 else
1297 {
1298 memcpy(options_buf,options, strlen(options));
1299 }
1300 if(NULL == time)
1301 {
1302 bzero(time_buf, 32);
1303 memcpy(time_buf," ", 1);
1304 }
1305 else
1306 {
1307 memcpy(time_buf, time, strlen(time));
1308 }
1309 if(NULL == message)
1310 {
1311 bzero(message_buf, 32);
1312 memcpy(message_buf," ", 1);
1313 }
1314 else
1315 {
1316 memcpy(message_buf, message, strlen(message));
1317 }
1318}
1319
1320int lynq_shutdown(char options[], char time[], char message[])
1321{
1322 char cmd[128] = {0};
1323 handle_shutdown_buf(options, time, message);
1324 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1325 system(cmd);
1326 return 0;
1327}
1328
1329int lynq_get_version(char buf[])
1330{
1331 FILE * fp;
1332 char buffer[128];
1333 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1334 fp = popen(buffer, "r");
1335 fgets(buffer, sizeof(buffer), fp);
1336 memcpy(buf, buffer, strlen(buffer));
1337 buf[strlen(buffer)] = '\0';
1338 pclose(fp);
1339 return 0;
1340}
lle1d5d7c2022-01-18 12:34:30 +00001341#if FLAG_TESS
1342int lynq_query_operator(char buf[]){
1343 int32_t token = -1;
1344 if(buf == NULL)
1345 return token;
1346 char msg_imsi[20] = {0};
1347 memset(msg_imsi,0,sizeof(msg_imsi));
1348 token = lynq_get_imsi(msg_imsi);
1349 if(strlen(msg_imsi) != 0){
1350 FindOperator *ope_command = NULL;
1351 ope_command = find_ope_command(msg_imsi, findOperator);
1352 if(ope_command){
1353 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1354 buf[strlen(ope_command->buf)] = '\0';
1355 }
1356 else{
1357 /*more*/
1358 char mccmnc[5] = {0};
1359 memcpy(buf, msg_imsi, 5);
1360 buf[5] = '\0';
1361 /*more*/
1362 }
1363 return token;
1364 }
1365 else{
1366 //msg->base.e = err;
1367 const char *test = "please insert sim card";
1368 memcpy(buf, test, strlen(test));
1369 return token;
1370 }
1371}
1372FindOperator findOperator[] = {
1373#include "operator.h"
1374};
1375
1376static FindOperator*find_ope_command (char *name,FindOperator *Class){
1377 if(name == NULL || Class == NULL){
1378 return ((FindOperator *)NULL);
1379 }
1380 register int i;
1381 for (i = 0; Class[i].MCCMCN; i++)
1382 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1383 return (&Class[i]);
1384 return ((FindOperator *)NULL);
1385}
1386
1387#endif