blob: cbc845900656a6128f3749d3fde96f374016815b [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>
you.chen24d54af2024-01-02 12:26:57 +080019#include <vendor-ril/telephony/ril.h>
20#include <sys/socket.h>
21#include <netinet/in.h>
lle1d5d7c2022-01-18 12:34:30 +000022#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>
you.chen24d54af2024-01-02 12:26:57 +080026#include "lynq_sim.h"
lhee0d3b32024-04-25 03:54:48 -070027#include "liblog/lynq_deflog.h"
28#include "lynq_sim_urc.h"
29
30
lle1d5d7c2022-01-18 12:34:30 +000031#define MAX_BUF 20
32#define MAX_NUM 80
lhee0d3b32024-04-25 03:54:48 -070033
lle1d5d7c2022-01-18 12:34:30 +000034#define MAX_LEN 1024*8
lhee0d3b32024-04-25 03:54:48 -070035
36#define USER_LOG_TAG "LYNQ_SIM"
lle1d5d7c2022-01-18 12:34:30 +000037#define FLAG_TESS 0
38using ::android::Parcel;
39#define DEST_PORT 8088
40#define DSET_IP_ADDRESS "127.0.0.1"
41
42typedef struct{
43 int uToken;
44 int request;
45 int paramLen;
46 char param[MAX_LEN];
47}lynq_client_t;
48
lle1d5d7c2022-01-18 12:34:30 +000049/* socket文件描述符 */
50int len_addr_serv;
51struct sockaddr_in addr_serv;
52static int sock_fd = 0;
you.chen24d54af2024-01-02 12:26:57 +080053int Global_uToken = 0;
llab0f3e12022-07-20 11:59:51 +000054static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000055/**
56 * @brief mark call initialization state
57 * 0: deinit state
58 * 1: init state
59 */
60int g_lynq_sim_init_flag = 0;
61
62/**
63 * @brief lynq_req_sim_io need to send request
64 */
65char data_buf[32] = {0};
66char pin2_buf[32] = {0};
67char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000068
you.chen24d54af2024-01-02 12:26:57 +080069/**
70 * @brief lynq_shutdown need
71 */
llb15599d2022-04-01 07:50:08 +000072char options_buf[32] = {0};
73char time_buf[32] = {0};
74char message_buf[32] = {0};
75
you.chen24d54af2024-01-02 12:26:57 +080076typedef struct{
77 int resp_type;
78 int token;
79 int request;
80 int slot_id;
81 int error;
82}lynq_resp_t;
83
lhee0d3b32024-04-25 03:54:48 -070084static pthread_mutex_t s_sim_allow_data_mutex = PTHREAD_MUTEX_INITIALIZER;
85static pthread_cond_t s_sim_allow_data_cond = PTHREAD_COND_INITIALIZER;
86static int s_sim_allow_data_value = -1;
87#define SIM_ALLOW_DATA_TIMEOUT 60*1000
you.chen24d54af2024-01-02 12:26:57 +080088
lhee0d3b32024-04-25 03:54:48 -070089int waitAllowDataSignal(int mtime)
90{
91 int ret = 0;
92 int sec = 0;
93 int usec = 0;
94 struct timeval now;
95 struct timespec timeout;
96 gettimeofday(&now,NULL);
97 sec = mtime/1000;
98 usec = mtime%1000;
99 timeout.tv_sec = now.tv_sec+sec;
100 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
101 pthread_mutex_lock(&s_sim_allow_data_mutex);
102 ret = pthread_cond_timedwait(&s_sim_allow_data_cond,&s_sim_allow_data_mutex,&timeout);
103 pthread_mutex_unlock(&s_sim_allow_data_mutex);
104 return ret;
105}
106
107void sendAllowDataSignal(int value)
108{
109 pthread_mutex_lock(&s_sim_allow_data_mutex);
110 s_sim_allow_data_value = value;
111 pthread_cond_signal(&s_sim_allow_data_cond);
112 pthread_mutex_unlock(&s_sim_allow_data_mutex);
113 return;
114}
you.chen24d54af2024-01-02 12:26:57 +0800115
116/**@brief print solicied response msg's head information
117* @param head [IN]: head information
118* @return none
119*/
120void PrintHeader(lynq_resp_t& head)
121{
122 RLOGD("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);
123}
124
125int GetHeader(Parcel* &p, lynq_resp_t& head, int request_id)
126{
127 RLOGD("get header");
128 if(p->dataAvail() > 0)
129 {
130 p->readInt32(&(head.resp_type));
131 p->readInt32(&(head.token));
132 p->readInt32(&(head.request));
133 RLOGD("%s %d", __FUNCTION__, head.request);
134 p->readInt32(&(head.slot_id));
135 p->readInt32(&(head.error));
136 PrintHeader(head);
137 return head.error;
138 }
139 else
140 {
141 return RESULT_ERROR;
142 }
143}
144
145int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, const char* format,...)
146{
147 lynq_client_t client;
148 int ret;
149 int send_num;
150 int recv_num;
151 char res_data[MAX_LEN] = {0};
152 client.uToken = Global_uToken;
153 if(request_id == RIL_REQUEST_SCREEN_STATE)
154 {
155 client.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE;
156 }
157 else if(request_id == RIL_REQUEST_RADIO_POWER)
158 {
159 client.request = LYNQ_REQUEST_CHANGE_RADIO;
160 }
161 else
162 {
163 client.request = request_id;
164 }
165 client.paramLen = argc;
166 bzero(client.param,MAX_LEN);
167 if(argc!=0)
168 {
169 va_list args;
170 va_start(args, format);
171 vsnprintf(client.param, MAX_LEN, format, args);
172 va_end(args);
173 }
174 RLOGD("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
175 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
176 send_num = sendto(sock_fd,&client,sizeof(client),0,(struct sockaddr *)&addr_serv,len_addr_serv);
177 if(send_num <= 0)
178 {
179 RLOGD("send request fail, send num is %d", send_num);
180 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
181 return LYNQ_E_SEND_REQUEST_FAIL;
182 }
183 lynq_resp_t head;
184 head.request = -1;
185 for(int i = 0; i < cnt;)
186 {
187 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
188 if(recv_num <= 0)
189 {
190 RLOGD("recv request fail, recv num is %d", recv_num);
191 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
192 return recv_num;
193 }
194 p->setData((uint8_t *)res_data,sizeof(char)*recv_num);
195 p->setDataPosition(0);
196 ret=GetHeader(p,head,request_id);
197 if(ret!=0)
198 {
199 RLOGD("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
200 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
201 return ret;
202 }
203 if(request_id == head.request)
204 {
205 i++;
206 }
207 }
208 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
209 return ret;
210}
211
lle1d5d7c2022-01-18 12:34:30 +0000212int lynq_sim_init(int utoken){
lhee0d3b32024-04-25 03:54:48 -0700213 LYLOGSET(LOG_DEBUG);
214 LYLOGEINIT(USER_LOG_TAG);
q.huangf6a9ddc2023-12-08 20:23:56 +0800215 RLOGE("%s start, parameter is %d", __func__,utoken);
216
llba425bd2022-03-17 02:23:00 +0000217 if(g_lynq_sim_init_flag == 1)
218 {
219 RLOGD("lynq_sim_init failed");
220 return -1;
221 }
222 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +0000223 if(utoken < 0){
224 return -1;
225 }
lle1d5d7c2022-01-18 12:34:30 +0000226 Global_uToken = utoken;
227 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +0800228 if (-1 == sock_fd)
229 {
230 return sock_fd;
231 }
lh8d290112023-10-22 20:53:06 -0700232
233 struct sockaddr_in liblynq_data_socket;
234 bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
235 //set this lib socket config
236 liblynq_data_socket.sin_family = AF_INET;
237 liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
238 int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
239 if (-1 == ret)
240 {
241 RLOGE("liblynq_data_socket bind fail,errno:%d",errno);
242 return -1;
243 }
244
ll33334af2022-06-30 16:54:51 +0800245 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000246 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800247 timeOut.tv_usec = 0;
248 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
249 {
lhee0d3b32024-04-25 03:54:48 -0700250 RLOGD("time out setting failed\n");
ll33334af2022-06-30 16:54:51 +0800251 return -1;
252 }
q.huangf6a9ddc2023-12-08 20:23:56 +0800253
lhee0d3b32024-04-25 03:54:48 -0700254 memset(&addr_serv, 0, sizeof(addr_serv));
255 addr_serv.sin_family = AF_INET;
256 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
257 addr_serv.sin_port = htons(DEST_PORT);
258 len_addr_serv = sizeof(addr_serv);
259
260#ifdef MODE_DSDS
261 ret = lynq_start_all_urc_socket_thread();
262 if(ret != RESULT_OK)
263 {
264 LYERRLOG("init socket urc fail!!!");
265 return LYNQ_E_INNER_ERROR;
266 }
267#endif
q.huangf6a9ddc2023-12-08 20:23:56 +0800268 RLOGE("%s end suc", __func__);
lle1d5d7c2022-01-18 12:34:30 +0000269 return 0;
270}
271
272int lynq_sim_deinit(void){
q.huangf6a9ddc2023-12-08 20:23:56 +0800273
274 RLOGE("%s start", __func__);
275
llba425bd2022-03-17 02:23:00 +0000276 if(g_lynq_sim_init_flag == 0)
277 {
278 RLOGD("lynq_sim_deinit failed");
279 return -1;
280 }
lhee0d3b32024-04-25 03:54:48 -0700281
282#ifdef DMODE_DSDS
283 lynq_close_all_urc_socket_thread();
284#endif
llba425bd2022-03-17 02:23:00 +0000285 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000286 close(sock_fd);
q.huangf6a9ddc2023-12-08 20:23:56 +0800287
288 RLOGE("%s end suc", __func__);
lle1d5d7c2022-01-18 12:34:30 +0000289 return 0;
290}
291
292static char * lynqStrdupReadString(Parcel &p) {
293 size_t stringlen;
294 const char16_t *s16;
295
296 s16 = p.readString16Inplace(&stringlen);
297 return strndup16to8(s16, stringlen);
298}
299
llba425bd2022-03-17 02:23:00 +0000300/*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 +0000301int lynq_get_sim_status(int *card_status)
302{
ll27dbe752022-08-10 00:33:52 -0700303 if(g_lynq_sim_init_flag == 0)
304 {
305 return -1;
306 }
you.chen24d54af2024-01-02 12:26:57 +0800307 Parcel p;
308 int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,1,"");
309 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000310 {
you.chen24d54af2024-01-02 12:26:57 +0800311 RLOGD("function %s execute error", __FUNCTION__);
312 return res;
lle1d5d7c2022-01-18 12:34:30 +0000313 }
you.chen24d54af2024-01-02 12:26:57 +0800314 p.readInt32(card_status);
315 return res;
lle1d5d7c2022-01-18 12:34:30 +0000316}
llba425bd2022-03-17 02:23:00 +0000317
lle1d5d7c2022-01-18 12:34:30 +0000318int lynq_get_imsi(char buf[])
you.chen24d54af2024-01-02 12:26:57 +0800319{
ll27dbe752022-08-10 00:33:52 -0700320 if(g_lynq_sim_init_flag == 0)
321 {
322 return -1;
323 }
lle1d5d7c2022-01-18 12:34:30 +0000324 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800325 int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,1,"");
326 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000327 {
you.chen24d54af2024-01-02 12:26:57 +0800328 RLOGD("function %s execute error", __FUNCTION__);
329 return res;
lle1d5d7c2022-01-18 12:34:30 +0000330 }
you.chen24d54af2024-01-02 12:26:57 +0800331 char * test = lynqStrdupReadString(p);
332 memcpy(buf, test, strlen(test));
333 free(test);
334 return res;
lle1d5d7c2022-01-18 12:34:30 +0000335}
336
337
338/*add by lei*/
339
340int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700341 if(g_lynq_sim_init_flag == 0)
342 {
343 return -1;
344 }
lle1d5d7c2022-01-18 12:34:30 +0000345 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800346 int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,1,"");
347 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000348 {
you.chen24d54af2024-01-02 12:26:57 +0800349 RLOGD("function %s execute error", __FUNCTION__);
350 return res;
lle1d5d7c2022-01-18 12:34:30 +0000351 }
you.chen24d54af2024-01-02 12:26:57 +0800352 char * test = lynqStrdupReadString(p);
353 memcpy(buf, test, strlen(test));
354 free(test);
355 return res;
lle1d5d7c2022-01-18 12:34:30 +0000356}
357
358int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700359 if(g_lynq_sim_init_flag == 0)
360 {
361 return -1;
362 }
lle1d5d7c2022-01-18 12:34:30 +0000363 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800364 int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "1");
365 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000366 {
you.chen24d54af2024-01-02 12:26:57 +0800367 RLOGD("function %s execute error", __FUNCTION__);
368 return res;
lle1d5d7c2022-01-18 12:34:30 +0000369 }
you.chen24d54af2024-01-02 12:26:57 +0800370 return res;
lle1d5d7c2022-01-18 12:34:30 +0000371}
372
lle6cc3932022-08-18 06:06:39 -0700373int lynq_sim_power(int mode)
374{
375 if(g_lynq_sim_init_flag == 0)
376 {
377 return -1;
378 }
lle6cc3932022-08-18 06:06:39 -0700379 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800380 int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s%d", "AT+ESIMPOWER=", mode);
381 if(res != 0)
382 {
383 RLOGD("function %s execute error", __FUNCTION__);
384 return res;
lle6cc3932022-08-18 06:06:39 -0700385 }
you.chen24d54af2024-01-02 12:26:57 +0800386 return res;
lle6cc3932022-08-18 06:06:39 -0700387}
388
lle1d5d7c2022-01-18 12:34:30 +0000389int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700390 if(g_lynq_sim_init_flag == 0)
391 {
392 return -1;
393 }
lle1d5d7c2022-01-18 12:34:30 +0000394 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800395 int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "0");
396 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000397 {
you.chen24d54af2024-01-02 12:26:57 +0800398 RLOGD("function %s execute error", __FUNCTION__);
399 return res;
lle1d5d7c2022-01-18 12:34:30 +0000400 }
you.chen24d54af2024-01-02 12:26:57 +0800401 return res;
lle1d5d7c2022-01-18 12:34:30 +0000402}
403
404int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700405 if(g_lynq_sim_init_flag == 0)
406 {
407 return -1;
408 }
lle1d5d7c2022-01-18 12:34:30 +0000409 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800410 int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,1,"%s %s %s\n", "SC", pin, "11");
411 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000412 {
you.chen24d54af2024-01-02 12:26:57 +0800413 RLOGD("function %s execute error", __FUNCTION__);
414 return res;
lle1d5d7c2022-01-18 12:34:30 +0000415 }
you.chen24d54af2024-01-02 12:26:57 +0800416 int num = -1;
417 p.readInt32(&num);
418 if(num > 0)
419 {
420 int *test = (int *)calloc(num, sizeof(int));
421 for(int i =0; i <num; i++){
422 p.readInt32(&test[i]);
423 buf[i] = test[i];
424 }
425 free(test);
426 }
427 return res;
lle1d5d7c2022-01-18 12:34:30 +0000428}
429
430int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700431 if(g_lynq_sim_init_flag == 0)
432 {
433 return -1;
434 }
lle1d5d7c2022-01-18 12:34:30 +0000435 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800436 int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,1,"%s\n", pin);
437 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000438 {
you.chen24d54af2024-01-02 12:26:57 +0800439 RLOGD("function %s execute error", __FUNCTION__);
440 return res;
lle1d5d7c2022-01-18 12:34:30 +0000441 }
you.chen24d54af2024-01-02 12:26:57 +0800442 return res;
lle1d5d7c2022-01-18 12:34:30 +0000443}
444
445int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700446 if(g_lynq_sim_init_flag == 0)
447 {
448 return -1;
449 }
you.chen24d54af2024-01-02 12:26:57 +0800450 int res = -1;
lle1d5d7c2022-01-18 12:34:30 +0000451 if(old_pin == NULL || new_pin == NULL)
you.chen24d54af2024-01-02 12:26:57 +0800452 return res;
rjw5d2a50e2022-02-28 15:01:49 +0800453 if(!strlen(new_pin))
you.chen24d54af2024-01-02 12:26:57 +0800454 return res;
ll3fe03462022-03-01 09:18:53 +0000455 if(!strlen(old_pin))
you.chen24d54af2024-01-02 12:26:57 +0800456 return res;
lle1d5d7c2022-01-18 12:34:30 +0000457 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800458 res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,1,"%s %s\n", old_pin, new_pin);
459 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000460 {
you.chen24d54af2024-01-02 12:26:57 +0800461 RLOGD("function %s execute error", __FUNCTION__);
462 return res;
lle1d5d7c2022-01-18 12:34:30 +0000463 }
you.chen24d54af2024-01-02 12:26:57 +0800464 return res;
lle1d5d7c2022-01-18 12:34:30 +0000465}
466
467int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700468 if(g_lynq_sim_init_flag == 0)
469 {
470 return -1;
471 }
lle1d5d7c2022-01-18 12:34:30 +0000472 if(puk == NULL || pin == NULL)
you.chen24d54af2024-01-02 12:26:57 +0800473 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000474 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800475 int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,1,"%s %s\n", puk, pin);
476 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000477 {
you.chen24d54af2024-01-02 12:26:57 +0800478 RLOGD("function %s execute error", __FUNCTION__);
479 return res;
lle1d5d7c2022-01-18 12:34:30 +0000480 }
you.chen24d54af2024-01-02 12:26:57 +0800481 return res;
lle1d5d7c2022-01-18 12:34:30 +0000482}
483
484static void delete_char(char str[],char target){
485 if(str == NULL){
486 return;
487 }
488 int i,j;
489 for(i=j=0;str[i]!='\0';i++){
490 if(str[i]!=target){
491 str[j++]=str[i];
492 }
493 }
494 str[j]='\0';
495}
496
497static int parse_param(char *cmd, char **argv, char buf[]){
498 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800499 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000500 }
501 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000502 return 3;
503 }
504 else{
505 int argc = 0;
506 char *token;
507 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800508 if(token == NULL)
509 {
510 return 9001;
511 }
llbe2bdbd2022-06-14 02:40:33 +0000512 if(strstr(token, "CNUM"))
513 {
lle1d5d7c2022-01-18 12:34:30 +0000514 char *string;
515 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000516 {
517 if(argc == 5)
518 {
519 if(NULL == argv[1])
520 {
521 return 9002;
522 }
523 int lengh = strlen(argv[1]);
524 memcpy(buf, argv[1], lengh);
525 delete_char(buf, '"');
526 RLOGD("too many phone number return\n");
527 return 0;
528 }
lle1d5d7c2022-01-18 12:34:30 +0000529 string = token;
530 argv[argc++] = string;
531 token = strtok(NULL, ",");
532 }
llbe2bdbd2022-06-14 02:40:33 +0000533 if(NULL == argv[1])
534 {
535 return 9001;
536 }
lle1d5d7c2022-01-18 12:34:30 +0000537 int lengh = strlen(argv[1]);
538 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000539 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800540 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000541 }
llbe2bdbd2022-06-14 02:40:33 +0000542 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000543 }
lle1d5d7c2022-01-18 12:34:30 +0000544}
545
546int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700547 if(g_lynq_sim_init_flag == 0)
548 {
549 return -1;
550 }
lle1d5d7c2022-01-18 12:34:30 +0000551 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800552 int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s\n", "AT+CNUM");
553 if(res != 0)
554 {
555 RLOGD("function %s execute error", __FUNCTION__);
556 return res;
lle1d5d7c2022-01-18 12:34:30 +0000557 }
you.chen24d54af2024-01-02 12:26:57 +0800558 int num = -1;
559 p.readInt32(&num);
560 char test[128] = {0};
561 char *argv[5] = {0};
562 if(num != -1)
563 {
564 p.read(test, num);
565 num = parse_param(test, argv, buf);
566 return num;
567 }
568 return res;
lle1d5d7c2022-01-18 12:34:30 +0000569}
rjw5d2a50e2022-02-28 15:01:49 +0800570
q.huangbe2d6932022-10-19 16:39:29 +0800571int lynq_get_imei(char buf[])
572{
573 if(g_lynq_sim_init_flag == 0)
574 {
575 return -1;
576 }
q.huangbe2d6932022-10-19 16:39:29 +0800577 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800578 int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
579 if(res != 0)
q.huangbe2d6932022-10-19 16:39:29 +0800580 {
you.chen24d54af2024-01-02 12:26:57 +0800581 RLOGD("function %s execute error", __FUNCTION__);
582 return res;
q.huangbe2d6932022-10-19 16:39:29 +0800583 }
you.chen24d54af2024-01-02 12:26:57 +0800584 int num = 0;
585 p.readInt32(&num);
586 char * test = lynqStrdupReadString(p);
587 memcpy(buf, test, strlen(test));
588 free(test);
589 return res;
q.huangbe2d6932022-10-19 16:39:29 +0800590}
591
q.huang2a282792022-10-12 11:39:36 +0800592int lynq_get_imei_and_sv(char imei[],char sv[])
q.huangd3b254d2022-10-19 16:39:29 +0800593{
594 if(g_lynq_sim_init_flag == 0)
595 {
you.chen24d54af2024-01-02 12:26:57 +0800596 return -1;
q.huangd3b254d2022-10-19 16:39:29 +0800597 }
598 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800599 int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
600 if(res != 0)
q.huangd3b254d2022-10-19 16:39:29 +0800601 {
you.chen24d54af2024-01-02 12:26:57 +0800602 RLOGD("function %s execute error", __FUNCTION__);
603 return res;
604 }
605 int num = 0;
606 p.readInt32(&num);
607 if(num<2)
608 {
609 RLOGD("%s num %d error, should greater than 1",__func__,num);
610 return -1;
611 }
612 char *resp[2]={NULL,NULL};
613 int i;
614 for(i=0;i<2;i++)
615 {
616 resp[i]= lynqStrdupReadString(p);
617 if(resp[i]==NULL)
618 {
619 break;
q.huangd3b254d2022-10-19 16:39:29 +0800620 }
you.chen24d54af2024-01-02 12:26:57 +0800621 }
622 if(i==2){
623 memcpy(imei, resp[0], strlen(resp[0])+1);
624 memcpy(sv, resp[1], strlen(resp[1])+1);
625 }
626 else
627 {
628 RLOGD("%s resp[%d] is null",__func__,i);
629 }
630 for(i=0;i<2;i++)
631 {
632 if(resp[i]!=NULL)
633 {
634 free(resp[i]);
635 }
636 }
637 return i==2? 0:-1;
638
q.huangd3b254d2022-10-19 16:39:29 +0800639}
640
rjw5d2a50e2022-02-28 15:01:49 +0800641static int judge(int slot){
642 switch(slot){
643 case 0:
644 return -1;
645 case 1:
646 return -1;
647 }
648 return 0;
649}
650
lhee0d3b32024-04-25 03:54:48 -0700651#ifdef MODE_DSDS
652int lynq_set_default_sim(const int slot)
653{
654 if(g_lynq_sim_init_flag == 0)
655 {
656 RLOGE("can`t init SIM module");
657 return -1;
658 }
659 if(!judge(slot))
660 {
661 RLOGD("is not 0 or 1");
662 return -1;
663 }
664 int send_num = 0;
665 lynq_client_t client_t;
666 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
667 client_t.paramLen = 1;
668 client_t.uToken = Global_uToken;
669 sprintf(client_t.param, "%d\n", slot);
670 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
671 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
672 if(send_num < 0)
673 {
674 RLOGD("function %s sendto error:", __FUNCTION__);
675 return send_num;
676 }
677
678 if(waitAllowDataSignal(SIM_ALLOW_DATA_TIMEOUT) == ETIMEDOUT)
679 {
680 LYERRLOG("timeout:wait allow data fail!!!");
681 return LYNQ_E_TIME_OUT;
682 }
683 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
684 LYERRLOG("sim allow data value %d",s_sim_allow_data_value);
685 return s_sim_allow_data_value;
686}
687#endif
688
rjw5d2a50e2022-02-28 15:01:49 +0800689int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700690 if(g_lynq_sim_init_flag == 0)
691 {
692 return -1;
693 }
rjw5d2a50e2022-02-28 15:01:49 +0800694 if(!judge(slot))
you.chen24d54af2024-01-02 12:26:57 +0800695 return -1;
rjw5d2a50e2022-02-28 15:01:49 +0800696 int send_num = 0;
you.chen24d54af2024-01-02 12:26:57 +0800697 lynq_client_t client_t;
rjw5d2a50e2022-02-28 15:01:49 +0800698 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
699 client_t.paramLen = 1;
700 client_t.uToken = Global_uToken;
701 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000702 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800703 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); //because ril of id = -1
rjw5d2a50e2022-02-28 15:01:49 +0800704 if(send_num < 0)
705 {
ll88f00782022-10-04 10:16:28 +0800706 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800707 return send_num;
708 }
llab0f3e12022-07-20 11:59:51 +0000709 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800710 return 0;
711}
jb.qi96449342022-09-19 22:14:41 -0700712/**@breif change screen state
713*param num type: [IN] screen_state,0:close,1:open
714*param ret type: [OUT] result,0:success,other:fail
715*return int
716*/
ll887a0172022-03-09 03:13:31 +0000717int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700718 if(g_lynq_sim_init_flag == 0)
719 {
720 return -1;
721 }
ll887a0172022-03-09 03:13:31 +0000722 if(!judge(num))
you.chen24d54af2024-01-02 12:26:57 +0800723 return -1;
724 Parcel p;
725 int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,2,"%d\n",num);
726 if(res != 0)
ll887a0172022-03-09 03:13:31 +0000727 {
you.chen24d54af2024-01-02 12:26:57 +0800728 RLOGD("function %s execute error", __FUNCTION__);
729 return res;
ll887a0172022-03-09 03:13:31 +0000730 }
you.chen24d54af2024-01-02 12:26:57 +0800731 return res;
ll887a0172022-03-09 03:13:31 +0000732}
llba425bd2022-03-17 02:23:00 +0000733
ll71a113b2022-10-21 18:07:25 +0800734/**@breif change screen state
735*param num type: [IN] screen_state,0:close,1:open
736*param ret type: [OUT] result,0:success,other:fail
737*return int
738*/
739int lynq_factory_radio_state(int num){
740 if(g_lynq_sim_init_flag == 0)
741 {
742 return -1;
743 }
ll71a113b2022-10-21 18:07:25 +0800744 if(!judge(num))
you.chen24d54af2024-01-02 12:26:57 +0800745 return -1;
746 Parcel p;
747 int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,2,"%d\n",num);
748 if(res != 0)
ll71a113b2022-10-21 18:07:25 +0800749 {
you.chen24d54af2024-01-02 12:26:57 +0800750 RLOGD("function %s execute error", __FUNCTION__);
751 return res;
ll71a113b2022-10-21 18:07:25 +0800752 }
you.chen24d54af2024-01-02 12:26:57 +0800753 return res;
ll71a113b2022-10-21 18:07:25 +0800754}
755
llba425bd2022-03-17 02:23:00 +0000756/**
757 * @brief Check whether the input is valid for lynq_req_sim_io api
758 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
759 * type: [IN] list[1]:EF id(fileid)
760 * type: [IN] list[2]:offset(p1)
761 * type: [IN] list[3]:offset(p2)
762 * type: [IN] list[4]:response len,sometimes needn't care(p3)
763 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
764 type: [IN] Path is in hex asciii format eg "7f205f70"
765 type: [IN] Path must always be provided.
766 * @param data type: [IN] May be NULL
767 * @param pin2 type: [IN] May be NULL
768 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
769 * @param sw type: [OUT]
770 * @param simResponse type: [OUT] response
771 * @return int
772 */
773static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
774{
llba425bd2022-03-17 02:23:00 +0000775 if(list == NULL)
776 {
777 return -1;
778 }
779 if(path == NULL)
780 {
781 return -1;
782 }
783 if(sw == NULL){
784 return -1;
785 }
786 if(simResponse == NULL){
787 return -1;
788 }
789 if(data == NULL)
790 {
791 memcpy(data_buf, "null", 4);
792 }
793 else
794 {
795 bzero(data_buf,32);
796 memcpy(data_buf, data, strlen(data));
797 }
798 if(pin2 == NULL)
799 {
800 memcpy(pin2_buf, "null", 4);
801 }
802 else
803 {
804 bzero(pin2_buf,32);
805 memcpy(pin2_buf, data, strlen(data));
806 }
807 if(aidPtr == NULL)
808 {
809 memcpy(aidPtr_buf, "null", 4);
810 }
811 else
812 {
813 bzero(aidPtr_buf,32);
814 memcpy(aidPtr_buf, data, strlen(data));
815 }
816 return 0;
817}
818
819int 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 -0700820{
821 if(g_lynq_sim_init_flag == 0)
822 {
823 return -1;
824 }
llba425bd2022-03-17 02:23:00 +0000825 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
826 {
you.chen24d54af2024-01-02 12:26:57 +0800827 return -1;
llba425bd2022-03-17 02:23:00 +0000828 }
829 Parcel p;
you.chen24d54af2024-01-02 12:26:57 +0800830 int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,1,"%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);
831 if(res != 0)
llb15599d2022-04-01 07:50:08 +0000832 {
you.chen24d54af2024-01-02 12:26:57 +0800833 RLOGD("function %s execute error", __FUNCTION__);
834 return res;
llba425bd2022-03-17 02:23:00 +0000835 }
you.chen24d54af2024-01-02 12:26:57 +0800836 p.readInt32(&sw[0]);
837 p.readInt32(&sw[1]);
838 char * test = lynqStrdupReadString(p);
839 memcpy(simResponse, test, strlen(test));
840 free(test);
841 return res;
llba425bd2022-03-17 02:23:00 +0000842}
llb15599d2022-04-01 07:50:08 +0000843
ll88f00782022-10-04 10:16:28 +0800844static void wait_reset_mipc_response(int *response)
845{
ll74a73b72022-10-17 10:30:58 +0800846 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +0800847 int outfd = open("/data/tp",O_RDONLY);
848 if(outfd == -1){
849 RLOGD("open error");
850 return;
851 }
852 char rst[1024];
853 int s;
854 s = read(outfd,rst,sizeof(rst));
855 sscanf(rst,"%d",response);
856 usleep(1);
857 close(outfd);
858 return;
859}
860
861int lynq_reset_modem(void)
862{
863 if(g_lynq_sim_init_flag == 0)
864 {
865 return -1;
866 }
867 int ret = -1;
868 int send_num = 0;
you.chen24d54af2024-01-02 12:26:57 +0800869 lynq_client_t client_t;
ll88f00782022-10-04 10:16:28 +0800870 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
871 client_t.paramLen = 1;
872 client_t.uToken = Global_uToken;
873 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
874 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800875 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);//because response not by ril callback
ll88f00782022-10-04 10:16:28 +0800876 if(send_num < 0)
877 {
878 RLOGD("function %s sendto error:", __FUNCTION__);
879 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
880 return ret;
881 }
882 wait_reset_mipc_response(&ret);
883 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800884 RLOGD("function %s ret %d",__FUNCTION__, ret);
ll88f00782022-10-04 10:16:28 +0800885 return ret;
886}
887
llb15599d2022-04-01 07:50:08 +0000888/**
889 * @brief handle shutdown buf
890 * @param options type: [IN]My Param doc
891 * @param time type: [IN]My Param doc
892 * @param message type: [IN]My Param doc
893 */
894static void handle_shutdown_buf(char options[], char time[], char message[])
895{
896 if(NULL == options)
897 {
898 bzero(options_buf, 32);
899 memcpy(options_buf," ", 1);
900 }
901 else
902 {
903 memcpy(options_buf,options, strlen(options));
904 }
905 if(NULL == time)
906 {
907 bzero(time_buf, 32);
908 memcpy(time_buf," ", 1);
909 }
910 else
911 {
912 memcpy(time_buf, time, strlen(time));
913 }
914 if(NULL == message)
915 {
916 bzero(message_buf, 32);
917 memcpy(message_buf," ", 1);
918 }
919 else
920 {
921 memcpy(message_buf, message, strlen(message));
922 }
923}
924
925int lynq_shutdown(char options[], char time[], char message[])
926{
927 char cmd[128] = {0};
928 handle_shutdown_buf(options, time, message);
929 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
930 system(cmd);
931 return 0;
932}
933
934int lynq_get_version(char buf[])
935{
you.chen24d54af2024-01-02 12:26:57 +0800936 FILE *fp;
llb15599d2022-04-01 07:50:08 +0000937 char buffer[128];
938 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
939 fp = popen(buffer, "r");
you.chen24d54af2024-01-02 12:26:57 +0800940 if(NULL == fp)
941 {
942 RLOGE("popen failed !");
943 return -1;
944 }
945 if(NULL != fgets(buffer, sizeof(buffer), fp))
946 {
947 if('\n' == buffer[strlen(buffer) - 1])
948 {
949 buffer[strlen(buffer) - 1] = '\0';
950 }
951 }
952 else
953 {
954 RLOGE("fgets failed !");
955 pclose(fp);
956 return -1;
957 }
llb15599d2022-04-01 07:50:08 +0000958 memcpy(buf, buffer, strlen(buffer));
959 buf[strlen(buffer)] = '\0';
960 pclose(fp);
961 return 0;
962}
lle1d5d7c2022-01-18 12:34:30 +0000963
lhee0d3b32024-04-25 03:54:48 -0700964void urc_msg_process(Parcel *p)
965{
966 int resp_type;
967 int urcid;
968 int slot_id;
969 int error_code;
970
971 int size=p->dataSize();
972 p->readInt32(&resp_type);
973 p->readInt32(&urcid);
974 p->readInt32(&slot_id);
975 LYINFLOG("%s urc id = %d, slot_id = %d, size is %d",__func__, urcid,slot_id,size);
976 switch (urcid)
977 {
978 case LYNQ_URC_ALLOW_DATA://new sms received
979 {
980 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
981 p->readInt32(&error_code);
982 sendAllowDataSignal(error_code);
983 break;
984 }
985 default:
986 break;
987 }
988}
989