blob: 1fa55786b22162adf074deb2c3d1c7dfcbf443c8 [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 }
105 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000106 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800107 timeOut.tv_usec = 0;
108 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
109 {
110 RLOGD("time out setting failed\n");
111 return -1;
112 }
lle1d5d7c2022-01-18 12:34:30 +0000113 /* 设置address */
114 memset(&addr_serv, 0, sizeof(addr_serv));
115 addr_serv.sin_family = AF_INET;
116 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
117 addr_serv.sin_port = htons(DEST_PORT);
118 len_addr_serv = sizeof(addr_serv);
119 /*test*/
120 return 0;
121}
122
123int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000124 if(g_lynq_sim_init_flag == 0)
125 {
126 RLOGD("lynq_sim_deinit failed");
127 return -1;
128 }
129 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000130 close(sock_fd);
131 return 0;
132}
133
134static char * lynqStrdupReadString(Parcel &p) {
135 size_t stringlen;
136 const char16_t *s16;
137
138 s16 = p.readString16Inplace(&stringlen);
139 return strndup16to8(s16, stringlen);
140}
141
llba425bd2022-03-17 02:23:00 +0000142/*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 +0000143int lynq_get_sim_status(int *card_status)
144{
ll27dbe752022-08-10 00:33:52 -0700145 if(g_lynq_sim_init_flag == 0)
146 {
147 return -1;
148 }
lle1d5d7c2022-01-18 12:34:30 +0000149 int ret = -1;
150 if(card_status == NULL)
151 return ret;
152 int send_num = 0;
153 int recv_num = 0;
154 int len = 0;
155 lynq_client_t client_t1;
156 memset(&client_t1, 0, sizeof(client_t1) );
157 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
158 client_t1.paramLen = 0;
159 client_t1.uToken = Global_uToken;
160 char res_data[MAX_LEN] = {0};
161 int len1 = sizeof(client_t1.param);
162 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000163 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000164 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
165 if(send_num < 0)
166 {
ll88f00782022-10-04 10:16:28 +0800167 RLOGD("function %s sendto error:", __FUNCTION__);
168 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000169 return send_num;
170 }
171 //get data msg
172 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
173 if(recv_num < 0 || recv_num == 0)
174 {
175 RLOGD("recvfrom step2 fail:");
ll88f00782022-10-04 10:16:28 +0800176 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000177 return recv_num;
178 }
llab0f3e12022-07-20 11:59:51 +0000179 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000180 Parcel p;;
181 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
182 p.setDataPosition(0);
183 if(p.dataAvail() > 0)
184 {
185 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800186 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000187 p.readInt32(&request);
188 p.readInt32(&slot_id);
189 p.readInt32(&error1);
190 p.readInt32(card_status);
191 }
192 return error1;
193}
llba425bd2022-03-17 02:23:00 +0000194
lle1d5d7c2022-01-18 12:34:30 +0000195int lynq_get_imsi(char buf[])
196{
ll27dbe752022-08-10 00:33:52 -0700197 if(g_lynq_sim_init_flag == 0)
198 {
199 return -1;
200 }
lle1d5d7c2022-01-18 12:34:30 +0000201 int ret = -1;
202 if(buf == NULL)
203 return ret;
204 int send_num = 0;
205 int recv_num = 0;
206 int len = 0;
207 lynq_client_t client_t1;
208 memset(&client_t1, 0, sizeof(client_t1) );
209 client_t1.request = RIL_REQUEST_GET_IMSI;
210 client_t1.paramLen = 0;
211 client_t1.uToken = Global_uToken;
212 char res_data[MAX_LEN] = {0};
213 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000214 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000215 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
216 if(send_num < 0)
217 {
ll88f00782022-10-04 10:16:28 +0800218 RLOGD("function %s sendto error:", __FUNCTION__);
219 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000220 return send_num;
221 }
222 //get data msg
223 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 +0000224 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000225 if(recv_num < 0 || recv_num == 0)
226 {
227 RLOGD("recvfrom step2 fail:");
228 return recv_num;
229 }
230 Parcel p;
231 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
232 p.setDataPosition(0);
233 if(p.dataAvail() > 0)
234 {
235 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800236 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000237 p.readInt32(&request);
238 p.readInt32(&slot_id);
239 p.readInt32(&error1);
240 if(!error1){
241 char * test = lynqStrdupReadString(p);
242 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800243 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000244 }
245 }
246 return error1;
247}
248
249
250/*add by lei*/
251
252int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700253 if(g_lynq_sim_init_flag == 0)
254 {
255 return -1;
256 }
lle1d5d7c2022-01-18 12:34:30 +0000257 int ret = -1;
258 if(buf == NULL)
259 return ret;
260 int send_num = 0;
261 int recv_num = 0;
262 int len = 0;
263 client_t.request = RIL_REQUEST_QUERY_ICCID;
264 client_t.paramLen = 0;
265 client_t.uToken = Global_uToken;
266 char res_data[MAX_LEN] = {0};
267 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000268 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000269 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
270 if(send_num < 0)
271 {
ll88f00782022-10-04 10:16:28 +0800272 RLOGD("function %s sendto error:", __FUNCTION__);
273 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000274 return send_num;
275 }
276 //get data msg
277 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 +0000278 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000279 if(recv_num < 0 || recv_num == 0)
280 {
281 RLOGD("recvfrom step2 fail:");
282 return recv_num;
283 }
284 Parcel p;
285 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
286 p.setDataPosition(0);
287 if(p.dataAvail() > 0)
288 {
289 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800290 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000291 p.readInt32(&request);
292 p.readInt32(&slot_id);
293 p.readInt32(&error1);
294 if(!error1){
295 char * test = lynqStrdupReadString(p);
296 memcpy(buf, test, strlen(test));
lle4860662022-09-15 19:07:10 +0800297 free(test);
lle1d5d7c2022-01-18 12:34:30 +0000298 }
299 }
300 return error1;
301}
302
303int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700304 if(g_lynq_sim_init_flag == 0)
305 {
306 return -1;
307 }
lle1d5d7c2022-01-18 12:34:30 +0000308 int ret = -1;
309 if(pin == NULL)
310 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800311 if(!strlen(pin))
312 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000313 int send_num = 0;
314 int recv_num = 0;
315 char res_data[MAX_LEN] = {0};
316 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
317 client_t.paramLen = 4;
318 client_t.uToken = Global_uToken;
319 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000320 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000321 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
322 if(send_num < 0)
323 {
ll88f00782022-10-04 10:16:28 +0800324 RLOGD("function %s sendto error:", __FUNCTION__);
325 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000326 return send_num;
327 }
328
329 //get data msg
330 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 +0000331 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000332 if(recv_num < 0 || recv_num == 0)
333 {
334 RLOGD("recvfrom step2 fail:");
335 return recv_num;
336 }
337 Parcel p;
338 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
339 p.setDataPosition(0);
340 if(p.dataAvail() > 0)
341 {
342 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800343 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000344 p.readInt32(&request);
345 p.readInt32(&slot_id);
346 p.readInt32(&error1);
347 }
348 return error1;
349}
350
lle6cc3932022-08-18 06:06:39 -0700351int lynq_sim_power(int mode)
352{
353 if(g_lynq_sim_init_flag == 0)
354 {
355 return -1;
356 }
357 int ret = -1;
358 int send_num = 0;
359 int recv_num = 0;
360 int len = 0;
361 char res_data[MAX_LEN] = {0};
362 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
363 client_t.paramLen = 1;
364 client_t.uToken = Global_uToken;
365 char buf[64] = {0};
366 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
367 sprintf(client_t.param, "%s\n", buf);
368 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
369 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
370 if(send_num < 0)
371 {
ll88f00782022-10-04 10:16:28 +0800372 RLOGD("function %s sendto error:", __FUNCTION__);
373 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle6cc3932022-08-18 06:06:39 -0700374 return ret;
375 }
376 //get data msg
377 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
378 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
379 if(recv_num < 0 || recv_num == 0)
380 {
381 RLOGD("recvfrom step2 fail:");
382 return recv_num;
383 }
384 Parcel p;
385 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
386 p.setDataPosition(0);
387 int num = -1;
388 if(p.dataAvail() > 0)
389 {
390 char test[128] = {0};
391 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800392 p.readInt32(&solicited_token);
lle6cc3932022-08-18 06:06:39 -0700393 p.readInt32(&request);
394 p.readInt32(&slot_id);
395 p.readInt32(&error1);
396 p.readInt32(&num);
397 if(num == -1){
398 }else{
399 p.read(test, num);
400 return error1;
401 }
402 }
403 return error1;
404}
405
lle1d5d7c2022-01-18 12:34:30 +0000406int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700407 if(g_lynq_sim_init_flag == 0)
408 {
409 return -1;
410 }
lle1d5d7c2022-01-18 12:34:30 +0000411 int ret = -1;
412 if(pin == NULL)
413 return ret;
414 int send_num = 0;
415 int recv_num = 0;
416 char res_data[MAX_LEN] = {0};
417 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
418 client_t.paramLen = 4;
419 client_t.uToken = Global_uToken;
420 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000421 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000422 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
423 if(send_num < 0)
424 {
ll88f00782022-10-04 10:16:28 +0800425 RLOGD("function %s sendto error:", __FUNCTION__);
426 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000427 return send_num;
428 }
429 //get data msg
430 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 +0000431 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000432 if(recv_num < 0 || recv_num == 0)
433 {
434 RLOGD("recvfrom step2 fail:");
435 return recv_num;
436 }
437 Parcel p;
438 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
439 p.setDataPosition(0);
440 if(p.dataAvail() > 0)
441 {
442 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800443 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000444 p.readInt32(&request);
445 p.readInt32(&slot_id);
446 p.readInt32(&error1);
447 }
448 return error1;
449}
450
451int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700452 if(g_lynq_sim_init_flag == 0)
453 {
454 return -1;
455 }
lle1d5d7c2022-01-18 12:34:30 +0000456 int ret = -1;
457 if(pin == NULL)
458 return ret;
459 int send_num = 0;
460 int recv_num = 0;
461 int len = 0;
462 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
463 client_t.paramLen = 3;
464 client_t.uToken = Global_uToken;
465 char res_data[MAX_LEN] = {0};
466 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000467 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000468 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
469 if(send_num < 0)
470 {
ll88f00782022-10-04 10:16:28 +0800471 RLOGD("function %s sendto error:", __FUNCTION__);
472 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000473 return send_num;
474 }
475 //get data msg
476 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 +0000477 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000478 if(recv_num < 0 || recv_num == 0)
479 {
480 RLOGD("recvfrom step2 fail:");
481 return recv_num;
482 }
483 Parcel p;
484 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
485 p.setDataPosition(0);
486 int num = -1;
487 if(p.dataAvail() > 0)
488 {
489 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800490 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000491 p.readInt32(&request);
492 p.readInt32(&slot_id);
493 p.readInt32(&error1);
494 p.readInt32(&num);
495 if(num > 0){
496 int *test = (int *)calloc(1, sizeof(int)*num);
497 for(int i =0; i <num; i++){
498 p.readInt32(&test[i]);
499 buf[i] = test[i];
500 }
501 free(test);
502 }
503 }
504 return error1;
505}
506
507int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700508 if(g_lynq_sim_init_flag == 0)
509 {
510 return -1;
511 }
lle1d5d7c2022-01-18 12:34:30 +0000512 int ret = -1;
513 if(pin == NULL)
514 return ret;
515 int send_num = 0;
516 int recv_num = 0;
517 char res_data[MAX_LEN] = {0};
518 int len = 0;
519 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
520 client_t.paramLen = 1;
521 client_t.uToken = Global_uToken;
522 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000523 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000524 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
525 if(send_num < 0)
526 {
ll88f00782022-10-04 10:16:28 +0800527 RLOGD("function %s sendto error:", __FUNCTION__);
528 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000529 return send_num;
530 }
531 //get data msg
532 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 +0000533 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000534 if(recv_num < 0 || recv_num == 0)
535 {
536 RLOGD("recvfrom step2 fail:");
537 return recv_num;
538 }
539 Parcel p;
540 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
541 p.setDataPosition(0);
542 if(p.dataAvail() > 0)
543 {
544 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800545 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000546 p.readInt32(&request);
547 p.readInt32(&slot_id);
548 p.readInt32(&error1);
549 }
550 return error1;
551}
552
553int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700554 if(g_lynq_sim_init_flag == 0)
555 {
556 return -1;
557 }
lle1d5d7c2022-01-18 12:34:30 +0000558 int ret = -1;
559 if(old_pin == NULL || new_pin == NULL)
560 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800561 if(!strlen(new_pin))
562 return ret;
ll3fe03462022-03-01 09:18:53 +0000563 if(!strlen(old_pin))
564 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000565 int send_num = 0;
566 int recv_num = 0;
567 char res_data[MAX_LEN] = {0};
568 int len = 0;
569 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
570 client_t.paramLen = 2;
571 client_t.uToken = Global_uToken;
572 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000573 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000574 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
575 if(send_num < 0)
576 {
ll88f00782022-10-04 10:16:28 +0800577 RLOGD("function %s sendto error:", __FUNCTION__);
578 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000579 return send_num;
580 }
581 //get data msg
582 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 +0000583 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000584 if(recv_num < 0 || recv_num == 0)
585 {
586 RLOGD("recvfrom step2 fail:");
587 return recv_num;
588 }
589 Parcel p;
590 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
591 p.setDataPosition(0);
592 if(p.dataAvail() > 0)
593 {
594 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800595 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000596 p.readInt32(&request);
597 p.readInt32(&slot_id);
598 p.readInt32(&error1);
599 }
600 return error1;
601}
602
603int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700604 if(g_lynq_sim_init_flag == 0)
605 {
606 return -1;
607 }
lle1d5d7c2022-01-18 12:34:30 +0000608 int ret = -1;
609 if(puk == NULL || pin == NULL)
610 return ret;
611 int send_num = 0;
612 int recv_num = 0;
613 char res_data[MAX_LEN] = {0};
614 int len = 0;
615 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
616 client_t.paramLen = 2;
617 client_t.uToken = Global_uToken;
618 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000619 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000620 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
621 if(send_num < 0)
622 {
ll88f00782022-10-04 10:16:28 +0800623 RLOGD("function %s sendto error:", __FUNCTION__);
624 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000625 return send_num;
626 }
627 //get data msg
628 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 +0000629 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000630 if(recv_num < 0 || recv_num == 0)
631 {
632 RLOGD("recvfrom step2 fail:");
633 return recv_num;
634 }
635 Parcel p;
636 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
637 p.setDataPosition(0);
638 if(p.dataAvail() > 0)
639 {
640 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800641 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000642 p.readInt32(&request);
643 p.readInt32(&slot_id);
644 p.readInt32(&error1);
645 }
646 return error1;
647}
648
649static void delete_char(char str[],char target){
650 if(str == NULL){
651 return;
652 }
653 int i,j;
654 for(i=j=0;str[i]!='\0';i++){
655 if(str[i]!=target){
656 str[j++]=str[i];
657 }
658 }
659 str[j]='\0';
660}
661
662static int parse_param(char *cmd, char **argv, char buf[]){
663 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800664 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000665 }
666 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000667 return 3;
668 }
669 else{
670 int argc = 0;
671 char *token;
672 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800673 if(token == NULL)
674 {
675 return 9001;
676 }
llbe2bdbd2022-06-14 02:40:33 +0000677 if(strstr(token, "CNUM"))
678 {
lle1d5d7c2022-01-18 12:34:30 +0000679 char *string;
680 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000681 {
682 if(argc == 5)
683 {
684 if(NULL == argv[1])
685 {
686 return 9002;
687 }
688 int lengh = strlen(argv[1]);
689 memcpy(buf, argv[1], lengh);
690 delete_char(buf, '"');
691 RLOGD("too many phone number return\n");
692 return 0;
693 }
lle1d5d7c2022-01-18 12:34:30 +0000694 string = token;
695 argv[argc++] = string;
696 token = strtok(NULL, ",");
697 }
llbe2bdbd2022-06-14 02:40:33 +0000698 if(NULL == argv[1])
699 {
700 return 9001;
701 }
lle1d5d7c2022-01-18 12:34:30 +0000702 int lengh = strlen(argv[1]);
703 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000704 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800705 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000706 }
llbe2bdbd2022-06-14 02:40:33 +0000707 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000708 }
lle1d5d7c2022-01-18 12:34:30 +0000709}
710
711int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700712 if(g_lynq_sim_init_flag == 0)
713 {
714 return -1;
715 }
lle1d5d7c2022-01-18 12:34:30 +0000716 int ret = -1;
717 if(buf == NULL)
718 return ret;
719 int send_num = 0;
720 int recv_num = 0;
721 int len = 0;
722 char res_data[MAX_LEN] = {0};
723 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
724 client_t.paramLen = 1;
725 client_t.uToken = Global_uToken;
726 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000727 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000728 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
729 if(send_num < 0)
730 {
ll88f00782022-10-04 10:16:28 +0800731 RLOGD("function %s sendto error:", __FUNCTION__);
732 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000733 return ret;
734 }
735 //get data msg
736 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 +0000737 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000738 if(recv_num < 0 || recv_num == 0)
739 {
740 RLOGD("recvfrom step2 fail:");
741 return recv_num;
742 }
743 Parcel p;
744 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
745 p.setDataPosition(0);
746 int num = -1;
747 if(p.dataAvail() > 0)
748 {
llb1fc9212022-04-12 03:02:01 +0000749 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000750 char *argv[5] = {0};
751 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800752 p.readInt32(&solicited_token);
lle1d5d7c2022-01-18 12:34:30 +0000753 p.readInt32(&request);
754 p.readInt32(&slot_id);
755 p.readInt32(&error1);
756 p.readInt32(&num);
757 if(num == -1){
758 }else{
759 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800760 num = parse_param(test, argv, buf);
761 return num;
lle1d5d7c2022-01-18 12:34:30 +0000762 }
763 }
764 return error1;
765}
rjw5d2a50e2022-02-28 15:01:49 +0800766
q.huangd3b254d2022-10-19 16:39:29 +0800767int lynq_get_imei(char buf[])
768{
769 if(g_lynq_sim_init_flag == 0)
770 {
771 return -1;
772 }
773 int ret = -1;
774 if(buf == NULL)
775 return ret;
776 int send_num = 0;
777 int recv_num = 0;
778 int len = 0;
779 lynq_client_t client_t1;
780 memset(&client_t1, 0, sizeof(client_t1) );
781 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
782 client_t1.paramLen = 0;
783 client_t1.uToken = Global_uToken;
784 char res_data[MAX_LEN] = {0};
785 memset(client_t1.param, 0, sizeof(client_t1.param));
786 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
787 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
788 if(send_num < 0)
789 {
790 RLOGD("function %s sendto error:", __FUNCTION__);
791 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
792 return send_num;
793 }
794 //get data msg
795 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
796 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
797 if(recv_num < 0 || recv_num == 0)
798 {
799 RLOGD("recvfrom step2 fail:");
800 return recv_num;
801 }
802 Parcel p;
803 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
804 p.setDataPosition(0);
805 int num = 0;
806 if(p.dataAvail() > 0)
807 {
808 p.readInt32(&resp_type);
809 p.readInt32(&solicited_token);
810 p.readInt32(&request);
811 p.readInt32(&slot_id);
812 p.readInt32(&error1);
813 if(!error1){
814 p.readInt32(&num);
815 char * test = lynqStrdupReadString(p);
816 memcpy(buf, test, strlen(test));
817 free(test);
818 }
819 }
820 return error1;
821}
822
q.huang1f2a2252022-10-12 11:39:36 +0800823int lynq_get_imei_and_sv(char imei[],char sv[])
ll4c5c6b72022-03-31 15:27:23 +0800824{
q.huang1f2a2252022-10-12 11:39:36 +0800825 RLOGD("%s called",__func__);
ll27dbe752022-08-10 00:33:52 -0700826 if(g_lynq_sim_init_flag == 0)
827 {
q.huang1f2a2252022-10-12 11:39:36 +0800828 RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag);
829 return -2;
ll27dbe752022-08-10 00:33:52 -0700830 }
llfcd43492022-03-10 09:01:50 +0000831 int ret = -1;
q.huang1f2a2252022-10-12 11:39:36 +0800832 if(imei == NULL || sv== NULL)
833 {
834 RLOGD("%s imei is NULL or sv is NULL",__func__);
llfcd43492022-03-10 09:01:50 +0000835 return ret;
q.huang1f2a2252022-10-12 11:39:36 +0800836 }
837
llfcd43492022-03-10 09:01:50 +0000838 int send_num = 0;
839 int recv_num = 0;
840 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800841 lynq_client_t client_t1;
842 memset(&client_t1, 0, sizeof(client_t1) );
843 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
844 client_t1.paramLen = 0;
845 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000846 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800847 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000848 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800849 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000850 if(send_num < 0)
851 {
q.huang1f2a2252022-10-12 11:39:36 +0800852 RLOGD("%s sendto error: %d",__func__,send_num);
ll88f00782022-10-04 10:16:28 +0800853 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800854 return send_num;
llfcd43492022-03-10 09:01:50 +0000855 }
ll4c5c6b72022-03-31 15:27:23 +0800856 //get data msg
llfcd43492022-03-10 09:01:50 +0000857 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 +0000858 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000859 if(recv_num < 0 || recv_num == 0)
860 {
q.huang1f2a2252022-10-12 11:39:36 +0800861 RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num);
llfcd43492022-03-10 09:01:50 +0000862 return recv_num;
863 }
864 Parcel p;
865 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
866 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800867 int num = 0;
llfcd43492022-03-10 09:01:50 +0000868 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800869 {
llfcd43492022-03-10 09:01:50 +0000870 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800871 p.readInt32(&solicited_token);
llfcd43492022-03-10 09:01:50 +0000872 p.readInt32(&request);
873 p.readInt32(&slot_id);
874 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800875 if(!error1){
876 p.readInt32(&num);
q.huang1f2a2252022-10-12 11:39:36 +0800877 if(num<2)
878 {
879 RLOGD("%s num %d error, should greater than 1",__func__,num);
880 return -1;
881 }
882 char *resp[2]={NULL,NULL};
883 int i;
884 for(i=0;i<2;i++)
885 {
886 resp[i]= lynqStrdupReadString(p);
887 if(resp[i]==NULL)
888 {
889 break;
890 }
891 }
892
893 if(i==2){
894 memcpy(imei, resp[0], strlen(resp[0])+1);
895 memcpy(sv, resp[1], strlen(resp[1])+1);
896 }
897 else
898 {
899 RLOGD("%s resp[%d] is null",__func__,i);
900 }
901
902 for(i=0;i<2;i++)
903 {
904 if(resp[i]!=NULL)
905 {
906 free(resp[i]);
907 }
908 }
909 return i==2? 0:-1;
llfcd43492022-03-10 09:01:50 +0000910 }
q.huang1f2a2252022-10-12 11:39:36 +0800911 }
912 RLOGD("%s called failed %d",__func__,error1);
llfcd43492022-03-10 09:01:50 +0000913 return error1;
914}
915
rjw5d2a50e2022-02-28 15:01:49 +0800916static int judge(int slot){
917 switch(slot){
918 case 0:
919 return -1;
920 case 1:
921 return -1;
922 }
923 return 0;
924}
925
rjw5d2a50e2022-02-28 15:01:49 +0800926int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700927 if(g_lynq_sim_init_flag == 0)
928 {
929 return -1;
930 }
rjw5d2a50e2022-02-28 15:01:49 +0800931 int ret = -1;
932 if(!judge(slot))
933 return ret;
934 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800935 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
936 client_t.paramLen = 1;
937 client_t.uToken = Global_uToken;
938 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000939 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800940 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
941 if(send_num < 0)
942 {
ll88f00782022-10-04 10:16:28 +0800943 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800944 return send_num;
945 }
llab0f3e12022-07-20 11:59:51 +0000946 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800947 return 0;
948}
jb.qi96449342022-09-19 22:14:41 -0700949/**@breif change screen state
950*param num type: [IN] screen_state,0:close,1:open
951*param ret type: [OUT] result,0:success,other:fail
952*return int
953*/
ll887a0172022-03-09 03:13:31 +0000954int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700955 if(g_lynq_sim_init_flag == 0)
956 {
957 return -1;
958 }
jb.qi96449342022-09-19 22:14:41 -0700959
ll887a0172022-03-09 03:13:31 +0000960 int ret = -1;
961 if(!judge(num))
962 return ret;
963 int send_num = 0;
jb.qi96449342022-09-19 22:14:41 -0700964 int recv_num = 0;
965 int error[2];
966 char res_data[MAX_LEN] = {0};
967
968 //change the first screen
969 client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014
ll887a0172022-03-09 03:13:31 +0000970 client_t.paramLen = 1;
971 client_t.uToken = Global_uToken;
972 sprintf(client_t.param, "%d\n", num);
jb.qi96449342022-09-19 22:14:41 -0700973
llab0f3e12022-07-20 11:59:51 +0000974 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000975 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
976 if(send_num < 0)
977 {
jb.qi96449342022-09-19 22:14:41 -0700978 RLOGD("sendto error:\n");
ll88f00782022-10-04 10:16:28 +0800979 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000980 return send_num;
981 }
jb.qi96449342022-09-19 22:14:41 -0700982 for(int i=0;i<2;i++)
983 {
984 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
985 if(recv_num < 0 || recv_num == 0)
986 {
987 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
988 RLOGD("screen recvform error\n");
jb.qi6b23ed42022-09-22 00:30:55 -0700989 return errno;
jb.qi96449342022-09-19 22:14:41 -0700990 }
991 if(i == 1)
992 {
993 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
994 RLOGD("recvfrom success\n");
995 }
996 Parcel p;
997 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
998 p.setDataPosition(0);
999 if(p.dataAvail() > 0)
1000 {
1001 p.readInt32(&resp_type);
1002 p.readInt32(&solicited_token);
1003 p.readInt32(&request);
1004 p.readInt32(&slot_id);
1005 p.readInt32(&error1);
1006 error[i] = error1;//change screen state result
1007 }
1008 }
1009
1010 if((error[0] != 0) || (error[1] != 0))
1011 {
1012 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
1013 if(error[0] != 0)
1014 {
1015 return error[0];
1016 }
1017 else
1018 {
1019 return error[1];
1020 }
1021 }
1022 else
1023 {
1024 return 0;
1025 }
1026
ll887a0172022-03-09 03:13:31 +00001027}
llba425bd2022-03-17 02:23:00 +00001028
ll71a113b2022-10-21 18:07:25 +08001029/**@breif change screen state
1030*param num type: [IN] screen_state,0:close,1:open
1031*param ret type: [OUT] result,0:success,other:fail
1032*return int
1033*/
1034int lynq_factory_radio_state(int num){
1035 if(g_lynq_sim_init_flag == 0)
1036 {
1037 return -1;
1038 }
1039
1040 int ret = -1;
1041 if(!judge(num))
1042 return ret;
1043 int send_num = 0;
1044 int recv_num = 0;
1045 int error[2];
1046 char res_data[MAX_LEN] = {0};
1047 //change the first screen
1048 client_t.request = LYNQ_REQUEST_CHANGE_RADIO; //8015
1049 client_t.paramLen = 1;
1050 client_t.uToken = Global_uToken;
1051 sprintf(client_t.param, "%d\n", num);
1052
1053 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1054 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1055 if(send_num < 0)
1056 {
1057 RLOGD("sendto error:\n");
1058 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1059 return send_num;
1060 }
1061 for(int i=0;i<2;i++)
1062 {
1063 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
1064 if(recv_num < 0 || recv_num == 0)
1065 {
1066 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail
1067 RLOGD("screen recvform error\n");
1068 return errno;
1069 }
1070 if(i == 1)
1071 {
1072 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1073 RLOGD("recvfrom success\n");
1074 }
1075 Parcel p;
1076 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
1077 p.setDataPosition(0);
1078 if(p.dataAvail() > 0)
1079 {
1080 p.readInt32(&resp_type);
1081 p.readInt32(&solicited_token);
1082 p.readInt32(&request);
1083 p.readInt32(&slot_id);
1084 p.readInt32(&error1);
1085 error[i] = error1;//change screen state result
1086 }
1087 }
1088
1089 if((error[0] != 0) || (error[1] != 0))
1090 {
1091 RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]);
1092 if(error[0] != 0)
1093 {
1094 return error[0];
1095 }
1096 else
1097 {
1098 return error[1];
1099 }
1100 }
1101 else
1102 {
1103 return 0;
1104 }
1105
1106}
1107
llba425bd2022-03-17 02:23:00 +00001108/**
1109 * @brief Check whether the input is valid for lynq_req_sim_io api
1110 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
1111 * type: [IN] list[1]:EF id(fileid)
1112 * type: [IN] list[2]:offset(p1)
1113 * type: [IN] list[3]:offset(p2)
1114 * type: [IN] list[4]:response len,sometimes needn't care(p3)
1115 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
1116 type: [IN] Path is in hex asciii format eg "7f205f70"
1117 type: [IN] Path must always be provided.
1118 * @param data type: [IN] May be NULL
1119 * @param pin2 type: [IN] May be NULL
1120 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
1121 * @param sw type: [OUT]
1122 * @param simResponse type: [OUT] response
1123 * @return int
1124 */
1125static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
1126{
llba425bd2022-03-17 02:23:00 +00001127 if(list == NULL)
1128 {
1129 return -1;
1130 }
1131 if(path == NULL)
1132 {
1133 return -1;
1134 }
1135 if(sw == NULL){
1136 return -1;
1137 }
1138 if(simResponse == NULL){
1139 return -1;
1140 }
1141 if(data == NULL)
1142 {
1143 memcpy(data_buf, "null", 4);
1144 }
1145 else
1146 {
1147 bzero(data_buf,32);
1148 memcpy(data_buf, data, strlen(data));
1149 }
1150 if(pin2 == NULL)
1151 {
1152 memcpy(pin2_buf, "null", 4);
1153 }
1154 else
1155 {
1156 bzero(pin2_buf,32);
1157 memcpy(pin2_buf, data, strlen(data));
1158 }
1159 if(aidPtr == NULL)
1160 {
1161 memcpy(aidPtr_buf, "null", 4);
1162 }
1163 else
1164 {
1165 bzero(aidPtr_buf,32);
1166 memcpy(aidPtr_buf, data, strlen(data));
1167 }
1168 return 0;
1169}
1170
1171int 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 -07001172{
1173 if(g_lynq_sim_init_flag == 0)
1174 {
1175 return -1;
1176 }
llba425bd2022-03-17 02:23:00 +00001177 int ret = -1;
1178 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
1179 {
1180 return ret;
1181 }
1182 int send_num = 0;
1183 int recv_num = 0;
1184 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +00001185 client_t.request = RIL_REQUEST_SIM_IO;
1186 client_t.paramLen = 9;
1187 client_t.uToken = Global_uToken;
1188 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 +00001189 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001190 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1191 if(send_num < 0)
1192 {
ll88f00782022-10-04 10:16:28 +08001193 RLOGD("function %s sendto error:", __FUNCTION__);
1194 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001195 return send_num;
1196 }
1197 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 +00001198 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +00001199 if(recv_num < 0 || recv_num == 0)
1200 {
1201 RLOGD("recvfrom step2 fail:");
1202 return recv_num;
1203 }
1204 Parcel p;
1205 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
1206 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +00001207 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +00001208 {
llba425bd2022-03-17 02:23:00 +00001209 p.readInt32(&resp_type);
q.huang7de1d662022-09-13 14:19:24 +08001210 p.readInt32(&solicited_token);
llba425bd2022-03-17 02:23:00 +00001211 p.readInt32(&request);
1212 p.readInt32(&slot_id);
1213 p.readInt32(&error1);
1214 if(!error1)
1215 {
1216 p.readInt32(&sw[0]);
1217 p.readInt32(&sw[1]);
1218 char * test = lynqStrdupReadString(p);
1219 memcpy(simResponse, test, strlen(test));
lle4860662022-09-15 19:07:10 +08001220 free(test);
llba425bd2022-03-17 02:23:00 +00001221 }
1222
1223 }
1224 return error1;
1225}
llb15599d2022-04-01 07:50:08 +00001226
ll88f00782022-10-04 10:16:28 +08001227static void wait_reset_mipc_response(int *response)
1228{
ll74a73b72022-10-17 10:30:58 +08001229 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +08001230 int outfd = open("/data/tp",O_RDONLY);
1231 if(outfd == -1){
1232 RLOGD("open error");
1233 return;
1234 }
1235 char rst[1024];
1236 int s;
1237 s = read(outfd,rst,sizeof(rst));
1238 sscanf(rst,"%d",response);
1239 usleep(1);
1240 close(outfd);
1241 return;
1242}
1243
1244int lynq_reset_modem(void)
1245{
1246 if(g_lynq_sim_init_flag == 0)
1247 {
1248 return -1;
1249 }
1250 int ret = -1;
1251 int send_num = 0;
1252 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
1253 client_t.paramLen = 1;
1254 client_t.uToken = Global_uToken;
1255 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
1256 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
1257 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
1258 if(send_num < 0)
1259 {
1260 RLOGD("function %s sendto error:", __FUNCTION__);
1261 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1262 return ret;
1263 }
1264 wait_reset_mipc_response(&ret);
1265 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
1266 RLOGD("function %d ret %d",__FUNCTION__, ret);
1267 return ret;
1268}
1269
llb15599d2022-04-01 07:50:08 +00001270/**
1271 * @brief handle shutdown buf
1272 * @param options type: [IN]My Param doc
1273 * @param time type: [IN]My Param doc
1274 * @param message type: [IN]My Param doc
1275 */
1276static void handle_shutdown_buf(char options[], char time[], char message[])
1277{
1278 if(NULL == options)
1279 {
1280 bzero(options_buf, 32);
1281 memcpy(options_buf," ", 1);
1282 }
1283 else
1284 {
1285 memcpy(options_buf,options, strlen(options));
1286 }
1287 if(NULL == time)
1288 {
1289 bzero(time_buf, 32);
1290 memcpy(time_buf," ", 1);
1291 }
1292 else
1293 {
1294 memcpy(time_buf, time, strlen(time));
1295 }
1296 if(NULL == message)
1297 {
1298 bzero(message_buf, 32);
1299 memcpy(message_buf," ", 1);
1300 }
1301 else
1302 {
1303 memcpy(message_buf, message, strlen(message));
1304 }
1305}
1306
1307int lynq_shutdown(char options[], char time[], char message[])
1308{
1309 char cmd[128] = {0};
1310 handle_shutdown_buf(options, time, message);
1311 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1312 system(cmd);
1313 return 0;
1314}
1315
1316int lynq_get_version(char buf[])
1317{
1318 FILE * fp;
1319 char buffer[128];
1320 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1321 fp = popen(buffer, "r");
1322 fgets(buffer, sizeof(buffer), fp);
1323 memcpy(buf, buffer, strlen(buffer));
1324 buf[strlen(buffer)] = '\0';
1325 pclose(fp);
1326 return 0;
1327}
lle1d5d7c2022-01-18 12:34:30 +00001328#if FLAG_TESS
1329int lynq_query_operator(char buf[]){
1330 int32_t token = -1;
1331 if(buf == NULL)
1332 return token;
1333 char msg_imsi[20] = {0};
1334 memset(msg_imsi,0,sizeof(msg_imsi));
1335 token = lynq_get_imsi(msg_imsi);
1336 if(strlen(msg_imsi) != 0){
1337 FindOperator *ope_command = NULL;
1338 ope_command = find_ope_command(msg_imsi, findOperator);
1339 if(ope_command){
1340 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1341 buf[strlen(ope_command->buf)] = '\0';
1342 }
1343 else{
1344 /*more*/
1345 char mccmnc[5] = {0};
1346 memcpy(buf, msg_imsi, 5);
1347 buf[5] = '\0';
1348 /*more*/
1349 }
1350 return token;
1351 }
1352 else{
1353 //msg->base.e = err;
1354 const char *test = "please insert sim card";
1355 memcpy(buf, test, strlen(test));
1356 return token;
1357 }
1358}
1359FindOperator findOperator[] = {
1360#include "operator.h"
1361};
1362
1363static FindOperator*find_ope_command (char *name,FindOperator *Class){
1364 if(name == NULL || Class == NULL){
1365 return ((FindOperator *)NULL);
1366 }
1367 register int i;
1368 for (i = 0; Class[i].MCCMCN; i++)
1369 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1370 return (&Class[i]);
1371 return ((FindOperator *)NULL);
1372}
1373
1374#endif