blob: 0ce669ed1d2695f788aa250fdacd66ce1e992bac [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"
lle1d5d7c2022-01-18 12:34:30 +000027#define MAX_BUF 20
28#define MAX_NUM 80
rjw5d2a50e2022-02-28 15:01:49 +080029#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
jb.qi96449342022-09-19 22:14:41 -070030#define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/
ll71a113b2022-10-21 18:07:25 +080031#define LYNQ_REQUEST_CHANGE_RADIO 8015
lle1d5d7c2022-01-18 12:34:30 +000032#define MAX_LEN 1024*8
33#define MAX_NUM 10
34#define LOG_TAG "LYNQ_SIM"
35#define FLAG_TESS 0
36using ::android::Parcel;
37#define DEST_PORT 8088
38#define DSET_IP_ADDRESS "127.0.0.1"
39
40typedef struct{
41 int uToken;
42 int request;
43 int paramLen;
44 char param[MAX_LEN];
45}lynq_client_t;
46
lle1d5d7c2022-01-18 12:34:30 +000047/* socket文件描述符 */
48int len_addr_serv;
49struct sockaddr_in addr_serv;
50static int sock_fd = 0;
you.chen24d54af2024-01-02 12:26:57 +080051int Global_uToken = 0;
lxfc80d8312024-03-25 01:55:14 -070052static int default_cnt = 20;
llab0f3e12022-07-20 11:59:51 +000053static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000054/**
55 * @brief mark call initialization state
56 * 0: deinit state
57 * 1: init state
58 */
59int g_lynq_sim_init_flag = 0;
60
61/**
62 * @brief lynq_req_sim_io need to send request
63 */
64char data_buf[32] = {0};
65char pin2_buf[32] = {0};
66char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000067
you.chen24d54af2024-01-02 12:26:57 +080068/**
69 * @brief lynq_shutdown need
70 */
llb15599d2022-04-01 07:50:08 +000071char options_buf[32] = {0};
72char time_buf[32] = {0};
73char message_buf[32] = {0};
74
you.chen24d54af2024-01-02 12:26:57 +080075typedef struct{
76 int resp_type;
77 int token;
78 int request;
79 int slot_id;
80 int error;
81}lynq_resp_t;
82
83#define RESULT_OK (0)
84#define RESULT_ERROR (-1)
85
86typedef enum{
87 /*base abnormal*/
88 LYNQ_E_PARAMETER_ANONALY=7000,
89 LYNQ_E_SEND_REQUEST_FAIL=7001,
90 LYNQ_E_GET_HEAD_ERROR=7002,
91 LYNQ_E_INNER_ERROR=7100,
92 LYNQ_E_MALLOC_ERROR=7101,
93 /**/
94 LYNQ_E_CARDSTATE_ERROR=8000,
95 /* The voice service state is out of service*/
96 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
97 /* The voice service state is EMERGENCY_ONLY*/
98 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
99 /* The radio power is power off*/
100 LYNQ_E_STATE_POWER_OFF=8003,
101 LYNQ_E_TIME_OUT=8004,
102 /*create or open sms DB fail */
103 LYNQ_E_SMS_DB_FAIL=8005,
104 /*Failed to execute sql statement*/
105 LYNQ_E_SMS_SQL_FAIL = 8006,
106 LYNQ_E_SMS_NOT_FIND = 8007,
107 /* The logic conflict*/
108 LYNQ_E_CONFLICT=9000,
109 /*Null anomaly*/
110 LYNQ_E_NULL_ANONALY=9001,
111 /*Invalid id anomaly*/
112 LYNQ_E_INVALID_ID_ANONALY=9002,
113#ifdef ECALL_SUPPORT
114 LYNQ_E_ECALL_BEING_RUNNING =9003,
115 LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
116 LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
117#endif
118}LYNQ_E;
119
120/**@brief print solicied response msg's head information
121* @param head [IN]: head information
122* @return none
123*/
124void PrintHeader(lynq_resp_t& head)
125{
126 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);
127}
128
129int GetHeader(Parcel* &p, lynq_resp_t& head, int request_id)
130{
131 RLOGD("get header");
132 if(p->dataAvail() > 0)
133 {
134 p->readInt32(&(head.resp_type));
135 p->readInt32(&(head.token));
136 p->readInt32(&(head.request));
137 RLOGD("%s %d", __FUNCTION__, head.request);
138 p->readInt32(&(head.slot_id));
139 p->readInt32(&(head.error));
140 PrintHeader(head);
141 return head.error;
142 }
143 else
144 {
145 return RESULT_ERROR;
146 }
147}
lxfc80d8312024-03-25 01:55:14 -0700148int get_utoken()
149{
150 return (Global_uToken++)%10000;/*0-10000*/
151}
152int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, int sim_count, const char* format,...)
you.chen24d54af2024-01-02 12:26:57 +0800153{
154 lynq_client_t client;
155 int ret;
156 int send_num;
157 int recv_num;
158 char res_data[MAX_LEN] = {0};
lxfc80d8312024-03-25 01:55:14 -0700159 client.uToken = get_utoken();
you.chen24d54af2024-01-02 12:26:57 +0800160 if(request_id == RIL_REQUEST_SCREEN_STATE)
161 {
162 client.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE;
163 }
164 else if(request_id == RIL_REQUEST_RADIO_POWER)
165 {
166 client.request = LYNQ_REQUEST_CHANGE_RADIO;
167 }
168 else
169 {
170 client.request = request_id;
171 }
172 client.paramLen = argc;
173 bzero(client.param,MAX_LEN);
174 if(argc!=0)
175 {
176 va_list args;
177 va_start(args, format);
178 vsnprintf(client.param, MAX_LEN, format, args);
179 va_end(args);
180 }
181 RLOGD("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
182 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
183 send_num = sendto(sock_fd,&client,sizeof(client),0,(struct sockaddr *)&addr_serv,len_addr_serv);
184 if(send_num <= 0)
185 {
186 RLOGD("send request fail, send num is %d", send_num);
187 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
188 return LYNQ_E_SEND_REQUEST_FAIL;
189 }
190 lynq_resp_t head;
191 head.request = -1;
lxfc80d8312024-03-25 01:55:14 -0700192 for(int i = 0; i < cnt; i++)
you.chen24d54af2024-01-02 12:26:57 +0800193 {
lxfc80d8312024-03-25 01:55:14 -0700194 head.resp_type = -1;
195 head.token = -1;
196 head.request = -1;
197 head.slot_id = -1;
198 head.error = -1;
you.chen24d54af2024-01-02 12:26:57 +0800199 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
200 if(recv_num <= 0)
201 {
202 RLOGD("recv request fail, recv num is %d", recv_num);
203 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
204 return recv_num;
205 }
206 p->setData((uint8_t *)res_data,sizeof(char)*recv_num);
207 p->setDataPosition(0);
208 ret=GetHeader(p,head,request_id);
209 if(ret!=0)
210 {
211 RLOGD("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
lxfc80d8312024-03-25 01:55:14 -0700212
213 if (head.token != client.uToken)
214 {
215 RLOGD("head.token is %d != client.uToken is %d", head.token, client.uToken);
216 ret = RESULT_ERROR;
217 continue;
218 }
219
you.chen24d54af2024-01-02 12:26:57 +0800220 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
221 return ret;
222 }
lxfc80d8312024-03-25 01:55:14 -0700223 if (head.token != client.uToken)
224 {
225 RLOGD("head.token is %d != client.uToken is %d", head.token, client.uToken);
226 ret = RESULT_ERROR;
227 continue;
228 }
you.chen24d54af2024-01-02 12:26:57 +0800229 if(request_id == head.request)
230 {
lxfc80d8312024-03-25 01:55:14 -0700231 sim_count--;
232 if(sim_count <= 0)
233 break;
234 else
235 continue;
you.chen24d54af2024-01-02 12:26:57 +0800236 }
237 }
238 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
239 return ret;
240}
241
lle1d5d7c2022-01-18 12:34:30 +0000242int lynq_sim_init(int utoken){
q.huangf6a9ddc2023-12-08 20:23:56 +0800243
244 RLOGE("%s start, parameter is %d", __func__,utoken);
245
llba425bd2022-03-17 02:23:00 +0000246 if(g_lynq_sim_init_flag == 1)
247 {
248 RLOGD("lynq_sim_init failed");
249 return -1;
250 }
251 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +0000252 if(utoken < 0){
253 return -1;
254 }
lle1d5d7c2022-01-18 12:34:30 +0000255 Global_uToken = utoken;
256 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +0800257 if (-1 == sock_fd)
258 {
259 return sock_fd;
260 }
lh8d290112023-10-22 20:53:06 -0700261
262 struct sockaddr_in liblynq_data_socket;
263 bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
264 //set this lib socket config
265 liblynq_data_socket.sin_family = AF_INET;
266 liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
267 int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
268 if (-1 == ret)
269 {
270 RLOGE("liblynq_data_socket bind fail,errno:%d",errno);
271 return -1;
272 }
273
ll33334af2022-06-30 16:54:51 +0800274 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000275 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800276 timeOut.tv_usec = 0;
277 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
278 {
279 RLOGD("time out setting failed\n");
280 return -1;
281 }
lle1d5d7c2022-01-18 12:34:30 +0000282 /* 设置address */
283 memset(&addr_serv, 0, sizeof(addr_serv));
284 addr_serv.sin_family = AF_INET;
285 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
286 addr_serv.sin_port = htons(DEST_PORT);
287 len_addr_serv = sizeof(addr_serv);
288 /*test*/
q.huangf6a9ddc2023-12-08 20:23:56 +0800289
290 RLOGE("%s end suc", __func__);
lle1d5d7c2022-01-18 12:34:30 +0000291 return 0;
292}
293
294int lynq_sim_deinit(void){
q.huangf6a9ddc2023-12-08 20:23:56 +0800295
296 RLOGE("%s start", __func__);
297
llba425bd2022-03-17 02:23:00 +0000298 if(g_lynq_sim_init_flag == 0)
299 {
300 RLOGD("lynq_sim_deinit failed");
301 return -1;
302 }
303 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000304 close(sock_fd);
q.huangf6a9ddc2023-12-08 20:23:56 +0800305
306 RLOGE("%s end suc", __func__);
lle1d5d7c2022-01-18 12:34:30 +0000307 return 0;
308}
309
310static char * lynqStrdupReadString(Parcel &p) {
311 size_t stringlen;
312 const char16_t *s16;
313
314 s16 = p.readString16Inplace(&stringlen);
315 return strndup16to8(s16, stringlen);
316}
317
llba425bd2022-03-17 02:23:00 +0000318/*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 +0000319int lynq_get_sim_status(int *card_status)
320{
ll27dbe752022-08-10 00:33:52 -0700321 if(g_lynq_sim_init_flag == 0)
322 {
323 return -1;
324 }
you.chen24d54af2024-01-02 12:26:57 +0800325 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700326 int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,default_cnt,1,"");
you.chen24d54af2024-01-02 12:26:57 +0800327 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000328 {
you.chen24d54af2024-01-02 12:26:57 +0800329 RLOGD("function %s execute error", __FUNCTION__);
330 return res;
lle1d5d7c2022-01-18 12:34:30 +0000331 }
you.chen24d54af2024-01-02 12:26:57 +0800332 p.readInt32(card_status);
333 return res;
lle1d5d7c2022-01-18 12:34:30 +0000334}
llba425bd2022-03-17 02:23:00 +0000335
lle1d5d7c2022-01-18 12:34:30 +0000336int lynq_get_imsi(char buf[])
you.chen24d54af2024-01-02 12:26:57 +0800337{
ll27dbe752022-08-10 00:33:52 -0700338 if(g_lynq_sim_init_flag == 0)
339 {
340 return -1;
341 }
lle1d5d7c2022-01-18 12:34:30 +0000342 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700343 int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,default_cnt,1,"");
you.chen24d54af2024-01-02 12:26:57 +0800344 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000345 {
you.chen24d54af2024-01-02 12:26:57 +0800346 RLOGD("function %s execute error", __FUNCTION__);
347 return res;
lle1d5d7c2022-01-18 12:34:30 +0000348 }
you.chen24d54af2024-01-02 12:26:57 +0800349 char * test = lynqStrdupReadString(p);
350 memcpy(buf, test, strlen(test));
351 free(test);
352 return res;
lle1d5d7c2022-01-18 12:34:30 +0000353}
354
355
356/*add by lei*/
357
358int lynq_get_iccid(char buf[]){
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;
lxfc80d8312024-03-25 01:55:14 -0700364 int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,default_cnt,1,"");
you.chen24d54af2024-01-02 12:26:57 +0800365 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 char * test = lynqStrdupReadString(p);
371 memcpy(buf, test, strlen(test));
372 free(test);
373 return res;
lle1d5d7c2022-01-18 12:34:30 +0000374}
375
376int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700377 if(g_lynq_sim_init_flag == 0)
378 {
379 return -1;
380 }
lle1d5d7c2022-01-18 12:34:30 +0000381 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700382 int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,default_cnt,1,"%s %s %s %s\n", "SC", pin, "11", "1");
you.chen24d54af2024-01-02 12:26:57 +0800383 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000384 {
you.chen24d54af2024-01-02 12:26:57 +0800385 RLOGD("function %s execute error", __FUNCTION__);
386 return res;
lle1d5d7c2022-01-18 12:34:30 +0000387 }
you.chen24d54af2024-01-02 12:26:57 +0800388 return res;
lle1d5d7c2022-01-18 12:34:30 +0000389}
390
lle6cc3932022-08-18 06:06:39 -0700391int lynq_sim_power(int mode)
392{
393 if(g_lynq_sim_init_flag == 0)
394 {
395 return -1;
396 }
lle6cc3932022-08-18 06:06:39 -0700397 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700398 int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,default_cnt,1,"%s%d", "AT+ESIMPOWER=", mode);
you.chen24d54af2024-01-02 12:26:57 +0800399 if(res != 0)
400 {
401 RLOGD("function %s execute error", __FUNCTION__);
402 return res;
lle6cc3932022-08-18 06:06:39 -0700403 }
you.chen24d54af2024-01-02 12:26:57 +0800404 return res;
lle6cc3932022-08-18 06:06:39 -0700405}
406
lle1d5d7c2022-01-18 12:34:30 +0000407int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700408 if(g_lynq_sim_init_flag == 0)
409 {
410 return -1;
411 }
lle1d5d7c2022-01-18 12:34:30 +0000412 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700413 int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,default_cnt,1,"%s %s %s %s\n", "SC", pin, "11", "0");
you.chen24d54af2024-01-02 12:26:57 +0800414 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000415 {
you.chen24d54af2024-01-02 12:26:57 +0800416 RLOGD("function %s execute error", __FUNCTION__);
417 return res;
lle1d5d7c2022-01-18 12:34:30 +0000418 }
you.chen24d54af2024-01-02 12:26:57 +0800419 return res;
lle1d5d7c2022-01-18 12:34:30 +0000420}
421
422int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700423 if(g_lynq_sim_init_flag == 0)
424 {
425 return -1;
426 }
lle1d5d7c2022-01-18 12:34:30 +0000427 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700428 int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,default_cnt,1,"%s %s %s\n", "SC", pin, "11");
you.chen24d54af2024-01-02 12:26:57 +0800429 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000430 {
you.chen24d54af2024-01-02 12:26:57 +0800431 RLOGD("function %s execute error", __FUNCTION__);
432 return res;
lle1d5d7c2022-01-18 12:34:30 +0000433 }
you.chen24d54af2024-01-02 12:26:57 +0800434 int num = -1;
435 p.readInt32(&num);
436 if(num > 0)
437 {
438 int *test = (int *)calloc(num, sizeof(int));
439 for(int i =0; i <num; i++){
440 p.readInt32(&test[i]);
441 buf[i] = test[i];
442 }
443 free(test);
444 }
445 return res;
lle1d5d7c2022-01-18 12:34:30 +0000446}
447
448int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700449 if(g_lynq_sim_init_flag == 0)
450 {
451 return -1;
452 }
lle1d5d7c2022-01-18 12:34:30 +0000453 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700454 int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,default_cnt,1,"%s\n", pin);
you.chen24d54af2024-01-02 12:26:57 +0800455 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000456 {
you.chen24d54af2024-01-02 12:26:57 +0800457 RLOGD("function %s execute error", __FUNCTION__);
458 return res;
lle1d5d7c2022-01-18 12:34:30 +0000459 }
you.chen24d54af2024-01-02 12:26:57 +0800460 return res;
lle1d5d7c2022-01-18 12:34:30 +0000461}
462
463int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700464 if(g_lynq_sim_init_flag == 0)
465 {
466 return -1;
467 }
you.chen24d54af2024-01-02 12:26:57 +0800468 int res = -1;
lle1d5d7c2022-01-18 12:34:30 +0000469 if(old_pin == NULL || new_pin == NULL)
you.chen24d54af2024-01-02 12:26:57 +0800470 return res;
rjw5d2a50e2022-02-28 15:01:49 +0800471 if(!strlen(new_pin))
you.chen24d54af2024-01-02 12:26:57 +0800472 return res;
ll3fe03462022-03-01 09:18:53 +0000473 if(!strlen(old_pin))
you.chen24d54af2024-01-02 12:26:57 +0800474 return res;
lle1d5d7c2022-01-18 12:34:30 +0000475 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700476 res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,default_cnt,1,"%s %s\n", old_pin, new_pin);
you.chen24d54af2024-01-02 12:26:57 +0800477 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000478 {
you.chen24d54af2024-01-02 12:26:57 +0800479 RLOGD("function %s execute error", __FUNCTION__);
480 return res;
lle1d5d7c2022-01-18 12:34:30 +0000481 }
you.chen24d54af2024-01-02 12:26:57 +0800482 return res;
lle1d5d7c2022-01-18 12:34:30 +0000483}
484
485int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700486 if(g_lynq_sim_init_flag == 0)
487 {
488 return -1;
489 }
lle1d5d7c2022-01-18 12:34:30 +0000490 if(puk == NULL || pin == NULL)
you.chen24d54af2024-01-02 12:26:57 +0800491 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000492 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700493 int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,default_cnt,1,"%s %s\n", puk, pin);
you.chen24d54af2024-01-02 12:26:57 +0800494 if(res != 0)
lle1d5d7c2022-01-18 12:34:30 +0000495 {
you.chen24d54af2024-01-02 12:26:57 +0800496 RLOGD("function %s execute error", __FUNCTION__);
497 return res;
lle1d5d7c2022-01-18 12:34:30 +0000498 }
you.chen24d54af2024-01-02 12:26:57 +0800499 return res;
lle1d5d7c2022-01-18 12:34:30 +0000500}
501
502static void delete_char(char str[],char target){
503 if(str == NULL){
504 return;
505 }
506 int i,j;
507 for(i=j=0;str[i]!='\0';i++){
508 if(str[i]!=target){
509 str[j++]=str[i];
510 }
511 }
512 str[j]='\0';
513}
514
515static int parse_param(char *cmd, char **argv, char buf[]){
516 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800517 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000518 }
519 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000520 return 3;
521 }
522 else{
523 int argc = 0;
524 char *token;
525 token = strtok(cmd, ",");
lle4860662022-09-15 19:07:10 +0800526 if(token == NULL)
527 {
528 return 9001;
529 }
llbe2bdbd2022-06-14 02:40:33 +0000530 if(strstr(token, "CNUM"))
531 {
lle1d5d7c2022-01-18 12:34:30 +0000532 char *string;
533 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000534 {
535 if(argc == 5)
536 {
537 if(NULL == argv[1])
538 {
539 return 9002;
540 }
541 int lengh = strlen(argv[1]);
542 memcpy(buf, argv[1], lengh);
543 delete_char(buf, '"');
544 RLOGD("too many phone number return\n");
545 return 0;
546 }
lle1d5d7c2022-01-18 12:34:30 +0000547 string = token;
548 argv[argc++] = string;
549 token = strtok(NULL, ",");
550 }
llbe2bdbd2022-06-14 02:40:33 +0000551 if(NULL == argv[1])
552 {
553 return 9001;
554 }
lle1d5d7c2022-01-18 12:34:30 +0000555 int lengh = strlen(argv[1]);
556 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000557 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800558 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000559 }
llbe2bdbd2022-06-14 02:40:33 +0000560 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000561 }
lle1d5d7c2022-01-18 12:34:30 +0000562}
563
564int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700565 if(g_lynq_sim_init_flag == 0)
566 {
567 return -1;
568 }
lle1d5d7c2022-01-18 12:34:30 +0000569 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700570 int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,default_cnt,1,"%s\n", "AT+CNUM");
you.chen24d54af2024-01-02 12:26:57 +0800571 if(res != 0)
572 {
573 RLOGD("function %s execute error", __FUNCTION__);
574 return res;
lle1d5d7c2022-01-18 12:34:30 +0000575 }
you.chen24d54af2024-01-02 12:26:57 +0800576 int num = -1;
577 p.readInt32(&num);
578 char test[128] = {0};
579 char *argv[5] = {0};
580 if(num != -1)
581 {
582 p.read(test, num);
583 num = parse_param(test, argv, buf);
584 return num;
585 }
586 return res;
lle1d5d7c2022-01-18 12:34:30 +0000587}
rjw5d2a50e2022-02-28 15:01:49 +0800588
q.huangbe2d6932022-10-19 16:39:29 +0800589int lynq_get_imei(char buf[])
590{
591 if(g_lynq_sim_init_flag == 0)
592 {
593 return -1;
594 }
q.huangbe2d6932022-10-19 16:39:29 +0800595 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700596 int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,default_cnt,1,"");
you.chen24d54af2024-01-02 12:26:57 +0800597 if(res != 0)
q.huangbe2d6932022-10-19 16:39:29 +0800598 {
you.chen24d54af2024-01-02 12:26:57 +0800599 RLOGD("function %s execute error", __FUNCTION__);
600 return res;
q.huangbe2d6932022-10-19 16:39:29 +0800601 }
you.chen24d54af2024-01-02 12:26:57 +0800602 int num = 0;
603 p.readInt32(&num);
604 char * test = lynqStrdupReadString(p);
605 memcpy(buf, test, strlen(test));
606 free(test);
607 return res;
q.huangbe2d6932022-10-19 16:39:29 +0800608}
609
q.huang2a282792022-10-12 11:39:36 +0800610int lynq_get_imei_and_sv(char imei[],char sv[])
q.huangd3b254d2022-10-19 16:39:29 +0800611{
612 if(g_lynq_sim_init_flag == 0)
613 {
you.chen24d54af2024-01-02 12:26:57 +0800614 return -1;
q.huangd3b254d2022-10-19 16:39:29 +0800615 }
616 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700617 int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,default_cnt,1,"");
you.chen24d54af2024-01-02 12:26:57 +0800618 if(res != 0)
q.huangd3b254d2022-10-19 16:39:29 +0800619 {
you.chen24d54af2024-01-02 12:26:57 +0800620 RLOGD("function %s execute error", __FUNCTION__);
621 return res;
622 }
623 int num = 0;
624 p.readInt32(&num);
625 if(num<2)
626 {
627 RLOGD("%s num %d error, should greater than 1",__func__,num);
628 return -1;
629 }
630 char *resp[2]={NULL,NULL};
631 int i;
632 for(i=0;i<2;i++)
633 {
634 resp[i]= lynqStrdupReadString(p);
635 if(resp[i]==NULL)
636 {
637 break;
q.huangd3b254d2022-10-19 16:39:29 +0800638 }
you.chen24d54af2024-01-02 12:26:57 +0800639 }
640 if(i==2){
641 memcpy(imei, resp[0], strlen(resp[0])+1);
642 memcpy(sv, resp[1], strlen(resp[1])+1);
643 }
644 else
645 {
646 RLOGD("%s resp[%d] is null",__func__,i);
647 }
648 for(i=0;i<2;i++)
649 {
650 if(resp[i]!=NULL)
651 {
652 free(resp[i]);
653 }
654 }
655 return i==2? 0:-1;
656
q.huangd3b254d2022-10-19 16:39:29 +0800657}
658
rjw5d2a50e2022-02-28 15:01:49 +0800659static int judge(int slot){
660 switch(slot){
661 case 0:
662 return -1;
663 case 1:
664 return -1;
665 }
666 return 0;
667}
668
rjw5d2a50e2022-02-28 15:01:49 +0800669int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700670 if(g_lynq_sim_init_flag == 0)
671 {
672 return -1;
673 }
rjw5d2a50e2022-02-28 15:01:49 +0800674 if(!judge(slot))
you.chen24d54af2024-01-02 12:26:57 +0800675 return -1;
rjw5d2a50e2022-02-28 15:01:49 +0800676 int send_num = 0;
you.chen24d54af2024-01-02 12:26:57 +0800677 lynq_client_t client_t;
rjw5d2a50e2022-02-28 15:01:49 +0800678 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
679 client_t.paramLen = 1;
lxfc80d8312024-03-25 01:55:14 -0700680 client_t.uToken = get_utoken();
rjw5d2a50e2022-02-28 15:01:49 +0800681 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000682 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800683 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 +0800684 if(send_num < 0)
685 {
ll88f00782022-10-04 10:16:28 +0800686 RLOGD("function %s sendto error:", __FUNCTION__);
rjw5d2a50e2022-02-28 15:01:49 +0800687 return send_num;
688 }
llab0f3e12022-07-20 11:59:51 +0000689 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800690 return 0;
691}
jb.qi96449342022-09-19 22:14:41 -0700692/**@breif change screen state
693*param num type: [IN] screen_state,0:close,1:open
694*param ret type: [OUT] result,0:success,other:fail
695*return int
696*/
ll887a0172022-03-09 03:13:31 +0000697int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700698 if(g_lynq_sim_init_flag == 0)
699 {
700 return -1;
701 }
ll887a0172022-03-09 03:13:31 +0000702 if(!judge(num))
you.chen24d54af2024-01-02 12:26:57 +0800703 return -1;
704 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700705 int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,default_cnt,2,"%d\n",num);
you.chen24d54af2024-01-02 12:26:57 +0800706 if(res != 0)
ll887a0172022-03-09 03:13:31 +0000707 {
you.chen24d54af2024-01-02 12:26:57 +0800708 RLOGD("function %s execute error", __FUNCTION__);
709 return res;
ll887a0172022-03-09 03:13:31 +0000710 }
you.chen24d54af2024-01-02 12:26:57 +0800711 return res;
ll887a0172022-03-09 03:13:31 +0000712}
llba425bd2022-03-17 02:23:00 +0000713
ll71a113b2022-10-21 18:07:25 +0800714/**@breif change screen state
715*param num type: [IN] screen_state,0:close,1:open
716*param ret type: [OUT] result,0:success,other:fail
717*return int
718*/
719int lynq_factory_radio_state(int num){
720 if(g_lynq_sim_init_flag == 0)
721 {
722 return -1;
723 }
ll71a113b2022-10-21 18:07:25 +0800724 if(!judge(num))
you.chen24d54af2024-01-02 12:26:57 +0800725 return -1;
726 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700727 int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,default_cnt,2,"%d\n",num);
you.chen24d54af2024-01-02 12:26:57 +0800728 if(res != 0)
ll71a113b2022-10-21 18:07:25 +0800729 {
you.chen24d54af2024-01-02 12:26:57 +0800730 RLOGD("function %s execute error", __FUNCTION__);
731 return res;
ll71a113b2022-10-21 18:07:25 +0800732 }
you.chen24d54af2024-01-02 12:26:57 +0800733 return res;
ll71a113b2022-10-21 18:07:25 +0800734}
735
llba425bd2022-03-17 02:23:00 +0000736/**
737 * @brief Check whether the input is valid for lynq_req_sim_io api
738 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
739 * type: [IN] list[1]:EF id(fileid)
740 * type: [IN] list[2]:offset(p1)
741 * type: [IN] list[3]:offset(p2)
742 * type: [IN] list[4]:response len,sometimes needn't care(p3)
743 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
744 type: [IN] Path is in hex asciii format eg "7f205f70"
745 type: [IN] Path must always be provided.
746 * @param data type: [IN] May be NULL
747 * @param pin2 type: [IN] May be NULL
748 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
749 * @param sw type: [OUT]
750 * @param simResponse type: [OUT] response
751 * @return int
752 */
753static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
754{
llba425bd2022-03-17 02:23:00 +0000755 if(list == NULL)
756 {
757 return -1;
758 }
759 if(path == NULL)
760 {
761 return -1;
762 }
763 if(sw == NULL){
764 return -1;
765 }
766 if(simResponse == NULL){
767 return -1;
768 }
769 if(data == NULL)
770 {
771 memcpy(data_buf, "null", 4);
772 }
773 else
774 {
775 bzero(data_buf,32);
776 memcpy(data_buf, data, strlen(data));
777 }
778 if(pin2 == NULL)
779 {
780 memcpy(pin2_buf, "null", 4);
781 }
782 else
783 {
784 bzero(pin2_buf,32);
785 memcpy(pin2_buf, data, strlen(data));
786 }
787 if(aidPtr == NULL)
788 {
789 memcpy(aidPtr_buf, "null", 4);
790 }
791 else
792 {
793 bzero(aidPtr_buf,32);
794 memcpy(aidPtr_buf, data, strlen(data));
795 }
796 return 0;
797}
798
799int 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 -0700800{
801 if(g_lynq_sim_init_flag == 0)
802 {
803 return -1;
804 }
llba425bd2022-03-17 02:23:00 +0000805 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
806 {
you.chen24d54af2024-01-02 12:26:57 +0800807 return -1;
llba425bd2022-03-17 02:23:00 +0000808 }
809 Parcel p;
lxfc80d8312024-03-25 01:55:14 -0700810 int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,default_cnt,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);
you.chen24d54af2024-01-02 12:26:57 +0800811 if(res != 0)
llb15599d2022-04-01 07:50:08 +0000812 {
you.chen24d54af2024-01-02 12:26:57 +0800813 RLOGD("function %s execute error", __FUNCTION__);
814 return res;
llba425bd2022-03-17 02:23:00 +0000815 }
you.chen24d54af2024-01-02 12:26:57 +0800816 p.readInt32(&sw[0]);
817 p.readInt32(&sw[1]);
818 char * test = lynqStrdupReadString(p);
819 memcpy(simResponse, test, strlen(test));
820 free(test);
821 return res;
llba425bd2022-03-17 02:23:00 +0000822}
llb15599d2022-04-01 07:50:08 +0000823
ll88f00782022-10-04 10:16:28 +0800824static void wait_reset_mipc_response(int *response)
825{
ll74a73b72022-10-17 10:30:58 +0800826 usleep(500*1000);
ll88f00782022-10-04 10:16:28 +0800827 int outfd = open("/data/tp",O_RDONLY);
828 if(outfd == -1){
829 RLOGD("open error");
830 return;
831 }
832 char rst[1024];
833 int s;
834 s = read(outfd,rst,sizeof(rst));
835 sscanf(rst,"%d",response);
836 usleep(1);
837 close(outfd);
838 return;
839}
840
841int lynq_reset_modem(void)
842{
843 if(g_lynq_sim_init_flag == 0)
844 {
845 return -1;
846 }
847 int ret = -1;
848 int send_num = 0;
you.chen24d54af2024-01-02 12:26:57 +0800849 lynq_client_t client_t;
ll88f00782022-10-04 10:16:28 +0800850 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
851 client_t.paramLen = 1;
lxfc80d8312024-03-25 01:55:14 -0700852 client_t.uToken = get_utoken();
ll88f00782022-10-04 10:16:28 +0800853 sprintf(client_t.param, "%s\n", "AT+LRSTMD");
854 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800855 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 +0800856 if(send_num < 0)
857 {
858 RLOGD("function %s sendto error:", __FUNCTION__);
859 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
860 return ret;
861 }
862 wait_reset_mipc_response(&ret);
863 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
you.chen24d54af2024-01-02 12:26:57 +0800864 RLOGD("function %s ret %d",__FUNCTION__, ret);
ll88f00782022-10-04 10:16:28 +0800865 return ret;
866}
867
llb15599d2022-04-01 07:50:08 +0000868/**
869 * @brief handle shutdown buf
870 * @param options type: [IN]My Param doc
871 * @param time type: [IN]My Param doc
872 * @param message type: [IN]My Param doc
873 */
874static void handle_shutdown_buf(char options[], char time[], char message[])
875{
876 if(NULL == options)
877 {
878 bzero(options_buf, 32);
879 memcpy(options_buf," ", 1);
880 }
881 else
882 {
883 memcpy(options_buf,options, strlen(options));
884 }
885 if(NULL == time)
886 {
887 bzero(time_buf, 32);
888 memcpy(time_buf," ", 1);
889 }
890 else
891 {
892 memcpy(time_buf, time, strlen(time));
893 }
894 if(NULL == message)
895 {
896 bzero(message_buf, 32);
897 memcpy(message_buf," ", 1);
898 }
899 else
900 {
901 memcpy(message_buf, message, strlen(message));
902 }
903}
904
905int lynq_shutdown(char options[], char time[], char message[])
906{
907 char cmd[128] = {0};
908 handle_shutdown_buf(options, time, message);
909 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
910 system(cmd);
911 return 0;
912}
913
914int lynq_get_version(char buf[])
915{
you.chen24d54af2024-01-02 12:26:57 +0800916 FILE *fp;
llb15599d2022-04-01 07:50:08 +0000917 char buffer[128];
918 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
919 fp = popen(buffer, "r");
you.chen24d54af2024-01-02 12:26:57 +0800920 if(NULL == fp)
921 {
922 RLOGE("popen failed !");
923 return -1;
924 }
925 if(NULL != fgets(buffer, sizeof(buffer), fp))
926 {
927 if('\n' == buffer[strlen(buffer) - 1])
928 {
929 buffer[strlen(buffer) - 1] = '\0';
930 }
931 }
932 else
933 {
934 RLOGE("fgets failed !");
935 pclose(fp);
936 return -1;
937 }
llb15599d2022-04-01 07:50:08 +0000938 memcpy(buf, buffer, strlen(buffer));
939 buf[strlen(buffer)] = '\0';
940 pclose(fp);
941 return 0;
942}
lle1d5d7c2022-01-18 12:34:30 +0000943
lxfc80d8312024-03-25 01:55:14 -0700944