blob: cd443040faba34523e9f7f1a7716df5b1fe08b31 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw_nw_interface.h"
2#include <unistd.h>
3#include <dlfcn.h>
4#include <time.h>
5
6#define MBTK_BUFF_TEMP_SIZE_32 32
7#define MBTK_ERR_OK 0
8#define MBTK_ERR_FAIL -1
9#define GSW_SIM_ICCID_LENGTH 20+1
10#define GSW_SIM_IMSI_LENGTH 20+1
11#define GSW_SIM_MSISDN_LENGTH 20+1
12#define GSW_SIM_IMEI_LENGTH 20+1
13
14//mbtk include
15typedef unsigned int uint32;
16typedef unsigned char uint8;
17typedef unsigned short uint16;
18typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
19typedef struct
20{
21 int client_fd;
22 pthread_t read_thread_id;
23 int exit_fd[2];
24 bool is_waitting;
25 pthread_cond_t cond;
26 pthread_mutex_t mutex;
27
28 pthread_mutex_t send_mutex;
29
30 // Temp response data.
31 uint16 info_err;
32 uint16 data_len;
33 void *data;
34
35 //mbtk wyq for server_ready_status add start
36 char server_ready_status;
37 //mbtk wyq for server_ready_status add end
38
39 mbtk_info_callback_func net_state_cb;
40 mbtk_info_callback_func call_state_cb;
41 mbtk_info_callback_func sms_state_cb;
42 mbtk_info_callback_func radio_state_cb;
43 mbtk_info_callback_func sim_state_cb;
44 mbtk_info_callback_func pdp_state_cb;
45 //add signal by xr
46 mbtk_info_callback_func signal_state_cb;
47} mbtk_info_handle_t;
48
49typedef enum {
50 MBTK_SIM_ABSENT = 0,
51 MBTK_SIM_NOT_READY = 1,
52 MBTK_SIM_READY = 2,
53 MBTK_SIM_PIN = 3,
54 MBTK_SIM_PUK = 4,
55 MBTK_SIM_NETWORK_PERSONALIZATION = 5
56} mbtk_sim_state_enum;
57
58typedef enum
59{
60 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
61 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
62 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
63 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
64 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
65 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
66}MBTK_DEV_MODEM_FUNCTION;
67
68typedef struct
69{
70 MBTK_DEV_MODEM_FUNCTION fun;
71 int rst;
72} mbtk_modem_info_t;
73
74//api
75
76static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
77#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL
78#define GSW_HAL_MEM_INVAILD GSW_HAL_ARG_INVALID
79#define lib_mbtk_path "/lib/libmbtk_lib.so"
80
81static int sim_init_flag = 0;
82mbtk_info_handle_t* sim_info_handle = NULL;
83static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
84int (*mbtk_sim_state_get)(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state);
85int (*mbtk_imsi_get)(mbtk_info_handle_t* handle, void *imsi);
86int (*mbtk_iccid_get)(mbtk_info_handle_t* handle, void *iccid);
87int (*mbtk_phone_number_get)(mbtk_info_handle_t* handle, void *phone_number);
88int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
89int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
90int (*mbtk_sim_power_set)(int power);
91static void (*mbtk_log)(int level, const char *format, ...);
92static void (*mbtk_log_init)(char *path, char *tag);
93
94#ifndef LOG_ERR_LEVEL
95#define LOG_ERR_LEVEL 3 /* error conditions */
96#endif
97#ifndef LOG_WARN_LEVEL
98#define LOG_WARN_LEVEL 4 /* warning conditions */
99#endif
100#ifndef LOG_INFO_LEVEL
101#define LOG_INFO_LEVEL 6 /* informational */
102#endif
103#ifndef LOG_DEBUG_LEVEL
104#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
105#endif
106#ifndef LOG_VERBOSE_LEVEL
107#define LOG_VERBOSE_LEVEL 8
108#endif
109
l.yang6a42e4d2025-05-28 01:04:20 -0700110#define GSW_SIM "[HAL][GSW_SIM]"
111
b.liu68a94c92025-05-24 12:53:41 +0800112#define LOGV(fmt, args ...) \
113 do{ \
114 char *file_ptr_1001 = __FILE__; \
115 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
116 char line_1001[10] = {0}; \
117 sprintf(line_1001, "%d", __LINE__); \
118 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
119 if(*ptr_1001 == '/') \
120 break; \
121 ptr_1001--; \
122 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700123 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_SIM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800124 } while(0)
125
126#define LOGI(fmt, args...) \
127 do{ \
128 char *file_ptr_1001 = __FILE__; \
129 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
130 char line_1001[10] = {0}; \
131 sprintf(line_1001, "%d", __LINE__); \
132 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
133 if(*ptr_1001 == '/') \
134 break; \
135 ptr_1001--; \
136 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700137 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_SIM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800138 } while(0)
139
140#define LOGD(fmt, args...) \
141 do{ \
142 char *file_ptr_1001 = __FILE__; \
143 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
144 char line_1001[10] = {0}; \
145 sprintf(line_1001, "%d", __LINE__); \
146 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
147 if(*ptr_1001 == '/') \
148 break; \
149 ptr_1001--; \
150 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700151 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_SIM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800152 } while(0)
153
154#define LOGW(fmt, args...) \
155 do{ \
156 char *file_ptr_1001 = __FILE__; \
157 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
158 char line_1001[10] = {0}; \
159 sprintf(line_1001, "%d", __LINE__); \
160 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
161 if(*ptr_1001 == '/') \
162 break; \
163 ptr_1001--; \
164 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700165 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_SIM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800166 } while(0)
167
168#define LOGE(fmt, args...) \
169 do{ \
170 char *file_ptr_1001 = __FILE__; \
171 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
172 char line_1001[10] = {0}; \
173 sprintf(line_1001, "%d", __LINE__); \
174 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
175 if(*ptr_1001 == '/') \
176 break; \
177 ptr_1001--; \
178 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700179 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_SIM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800180 } while(0)
181
182
183
184
185static void *dlHandle_mbtk;
186
187
188static int gsw_sim_api_import()
189{
190 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
191 if (dlHandle_mbtk == NULL)
192 {
193 return GSW_HAL_FAIL;
194 }
195
196 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
197 if (mbtk_log_init == NULL)
198 {
199 return GSW_HAL_FAIL;
200 }
201
202 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
203 if (mbtk_log == NULL)
204 {
205 return GSW_HAL_FAIL;
206 }
207
208 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
209 if (mbtk_info_handle_get == NULL)
210 {
211 LOGE("mbtk_info_handle_get dlsym fail\n");
212 return GSW_HAL_FAIL;
213 }
214
215 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
216 if (mbtk_info_handle_free == NULL)
217 {
218 LOGE("mbtk_info_handle_free dlsym fail\n");
219 return GSW_HAL_FAIL;
220 }
221
222 mbtk_imsi_get = (int (*)(mbtk_info_handle_t* handle, void *imsi))dlsym(dlHandle_mbtk, "mbtk_imsi_get");
223 if (mbtk_imsi_get == NULL)
224 {
225 LOGE("mbtk_imsi_get dlsym fail\n");
226 return GSW_HAL_FAIL;
227 }
228
229 mbtk_iccid_get = (int (*)(mbtk_info_handle_t* handle, void *iccid))dlsym(dlHandle_mbtk, "mbtk_iccid_get");
230 if (mbtk_iccid_get == NULL)
231 {
232 LOGE("mbtk_iccid_get dlsym fail\n");
233 return GSW_HAL_FAIL;
234 }
235
236 mbtk_phone_number_get = (int (*)(mbtk_info_handle_t* handle, void *phone_number))dlsym(dlHandle_mbtk, "mbtk_phone_number_get");
237 if (mbtk_phone_number_get == NULL)
238 {
239 LOGE("mbtk_phone_number_get dlsym fail\n");
240 return GSW_HAL_FAIL;
241 }
242
243 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
244 if (mbtk_imei_get == NULL)
245 {
246 LOGE("mbtk_imei_get dlsym fail\n");
247 return GSW_HAL_FAIL;
248 }
249
250 mbtk_sim_state_get = (int (*)(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state))dlsym(dlHandle_mbtk, "mbtk_sim_state_get");
251 if (mbtk_sim_state_get == NULL)
252 {
253 LOGE("mbtk_sim_state_get dlsym fail\n");
254 return GSW_HAL_FAIL;
255 }
256
257 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
258 if (mbtk_set_modem_fun == NULL)
259 {
260 LOGE("mbtk_set_modem_fun dlsym fail\n");
261 return GSW_HAL_FAIL;
262 }
263
264 mbtk_sim_power_set = (int (*)(int power))dlsym(dlHandle_mbtk, "mbtk_sim_power_set");
265 if (mbtk_sim_power_set == NULL)
266 {
267 LOGE("mbtk_sim_power_set dlsym fail\n");
268 return GSW_HAL_FAIL;
269 }
270
271 LOGD("gsw_sim_api_import end\n");
272 return GSW_HAL_SUCCESS;
273}
274
275/**
276 * @brief sim sdk init
277 * @param [in] token usr id define by who use
278 * @retval 0: success
279 * @retval other: fail
280 */
281int gsw_sim_sdk_init(int32_t token)
282{
283 int ret = GSW_HAL_FAIL;
284
285 if(sim_init_flag == 1 && sim_info_handle != NULL)
286 {
287 return GSW_HAL_SUCCESS;
288 }
289
290 ret = gsw_sim_api_import();
291 if(ret != GSW_HAL_SUCCESS)
292 {
293 if(mbtk_log != NULL)
294 {
295 LOGE("gsw_sim_import fail\n");
296 }
297 return GSW_HAL_FAIL;
298 }
299
300 mbtk_log_init("syslog", "MBTK_RIL");
301
302 sim_info_handle = mbtk_info_handle_get();
303 if(sim_info_handle == NULL)
304 {
305 LOGE("mbtk_info_handle_get fail\n");
306 return GSW_HAL_FAIL;
307 }
308
309 sim_init_flag = 1;
310 return GSW_HAL_SUCCESS;
311}
312
313
314/**
315 * @brief sim sdk deinit
316 * @param
317 * @retval 0: success
318 * @retval other: fail
319 */
320int gsw_sim_sdk_deinit(void)
321{
322 int ret = -1;
323
324 if(sim_init_flag == 0 && sim_info_handle == NULL)
325 {
326 LOGE("sim sdk has been deinit\n");
327 return GSW_HAL_FAIL;
328 }
329
330 ret = mbtk_info_handle_free(&sim_info_handle);
331 if(ret != GSW_HAL_SUCCESS)
332 {
333 LOGE("mbtk_info_handle_free fail\n");
334 return GSW_HAL_FAIL;
335 }
336
337 sim_init_flag = 0;
338 sim_info_handle = NULL;
339 dlclose(dlHandle_mbtk);
340
341 return GSW_HAL_SUCCESS;
342
343}
344
345
346/**
347 * @brief get sim state
348 * @param [out] sim_state sim status as sim_status_e_type
349 * @retval 0: success
350 * @retval other: fail
351 */
352int gsw_get_sim_status(int *sim_state)
353{
354 LOGD("gsw_get_sim_status enter\n");
355 int ret = -1;
356
357 if(sim_init_flag == 0 && sim_info_handle == NULL)
358 {
359 LOGE("sim sdk has been deinit\n");
360 return GSW_HAL_FAIL;
361 }
362
363 mbtk_sim_state_enum sim = MBTK_SIM_ABSENT;
364
365 LOGD("mbtk_get_sim_status start\n");
366 ret = mbtk_sim_state_get(sim_info_handle, &sim);
367 if(ret)
368 {
369 LOGE("[gsw_get_sim_status] mbtk_sim_state_get fail [err = %d].", ret);
370 return GSW_HAL_FAIL;
371 }
372
373 else
374 {
375 LOGD("[gsw_get_sim_status] sim = %d\n", sim);
376 switch (sim)
377 {
378 case MBTK_SIM_ABSENT:
379 {
380 *sim_state = SIM_STATUS_ABSENT;
381 break;
382 }
383 case MBTK_SIM_NOT_READY:
384 {
385 *sim_state = SIM_STATUS_PRESENT;
386 break;
387 }
388
389 case MBTK_SIM_READY:
390 {
391 *sim_state = SIM_STATUS_READY;
392 break;
393 }
394
395 case MBTK_SIM_PIN:
396 {
397 *sim_state = SIM_STATUS_PIN;
398 break;
399 }
400
401 case MBTK_SIM_PUK:
402 {
403 break;
404 }
405
406 case MBTK_SIM_NETWORK_PERSONALIZATION:
407 {
408 break;
409 }
410
411 }
412 }
413
414 return GSW_HAL_SUCCESS;
415}
416
417/**
418 * @brief get iccid function
419 * @param [in] len iccid length,max is 20
420 * @param [out] iccid return iccid from this func
421 * @retval 0: success
422 * @retval other: fail
423 */
424int gsw_get_sim_iccid(int len, char *iccid)
425{
426 int ret = -1;
427
428 if(sim_init_flag == 0 && sim_info_handle == NULL)
429 {
430 LOGE("sim sdk has been deinit\n");
431 return GSW_HAL_FAIL;
432 }
433
434 if(iccid == NULL)
435 {
436 LOGE("iccid is NULL.");
437 return GSW_HAL_MEM_INVAILD;
438 }
439
440 if(len < GSW_SIM_ICCID_LENGTH)
441 {
442 LOGE("iccid len is too short,len = %d\n", len);
443 return GSW_HAL_FAIL;
444 }
445
446 ret = mbtk_iccid_get(sim_info_handle, (void *)iccid);
447 if(ret != MBTK_ERR_OK)
448 {
449 LOGE("[gsw_sim] mbtk_iccid_get fail [err = %d].", ret);
450 return GSW_HAL_FAIL;
451 }
452
453 return GSW_HAL_SUCCESS;
454}
455
456/**
457 * @brief get imsi function
458 * @param [in] len imsi length,max is 20
459 * @param [out] iccid return imsi from this func
460 * @retval 0: success
461 * @retval other: fail
462 */
463int gsw_get_sim_imsi(int len, char *imsi)
464{
465 int ret = -1;
466
467 if(sim_init_flag == 0 && sim_info_handle == NULL)
468 {
469 LOGE("sim sdk has been deinit\n");
470 return GSW_HAL_FAIL;
471 }
472
473 if(imsi == NULL)
474 {
475 LOGE("imsi is NULL.");
476 return GSW_HAL_MEM_INVAILD;
477 }
478
479 if(len < GSW_SIM_IMSI_LENGTH)
480 {
481 LOGE("imsi len is too short,len = %d\n", len);
482 return GSW_HAL_FAIL;
483 }
484
485 ret = mbtk_imsi_get(sim_info_handle, (void *)imsi);
486 if(ret != MBTK_ERR_OK)
487 {
488 LOGE("[gsw_sim] mbtk_imsi_get fail [err = %d].", ret);
489 return GSW_HAL_FAIL;
490 }
491
492 return GSW_HAL_SUCCESS;
493}
494
495/**
496 * @brief get sim msisdn function
497 * @param [in] len msisdn length,max is 20
498 * @param [out] msisdn msisdn length,max is 20
499 * @retval 0: success
500 * @retval other: fail
501 */
502int gsw_get_sim_msisdn(int len, char *msisdn)
503{
504 int ret = -1;
505
506 if(sim_init_flag == 0 && sim_info_handle == NULL)
507 {
508 printf("sim sdk has been deinit\n");
509 return GSW_HAL_FAIL;
510 }
511
512 if(msisdn == NULL)
513 {
514 printf("msisdn is NULL.");
515 return GSW_HAL_MEM_INVAILD;
516 }
517
518 if(len < GSW_SIM_MSISDN_LENGTH)
519 {
520 printf("msisdn len is too short,len = %d\n", len);
521 return GSW_HAL_FAIL;
522 }
523
524 ret = mbtk_phone_number_get(sim_info_handle, (void *)msisdn);
525 if(ret != MBTK_ERR_OK)
526 {
527 LOGE("[gsw_sim] mbtk_phone_number_get fail [err = %d].", ret);
528 return GSW_HAL_FAIL;
529 }
530
531 return GSW_HAL_SUCCESS;
532}
533
534/**
535 * @brief get imei function
536 * @param [in] len imei length,max is 20
537 * @param [out] imei return imei from this func
538 * @retval 0: success
539 * @retval other: fail
540 */
541int gsw_get_imei(int len, char *imei)
542{
543 int ret = -1;
544
545 if(sim_init_flag == 0 && sim_info_handle == NULL)
546 {
547 LOGE("sim sdk has been deinit\n");
548 return GSW_HAL_FAIL;
549 }
550
551 if(imei == NULL)
552 {
553 LOGE("imei is NULL.");
554 return GSW_HAL_MEM_INVAILD;
555 }
556
557 if(len < GSW_SIM_MSISDN_LENGTH)
558 {
559 LOGE("imei len is too short,len = %d\n", len);
560 return GSW_HAL_FAIL;
561 }
562
563 ret = mbtk_imei_get(sim_info_handle, (void *)imei);
564 if(ret != MBTK_ERR_OK)
565 {
566 LOGE("[gsw_sim] mbtk_imei_get fail [err = %d].", ret);
567 return GSW_HAL_FAIL;
568 }
569
570 return GSW_HAL_SUCCESS;
571}
572
573
574/**
575 * @brief set sim power down
576 * @param
577 * @retval 0: success
578 * @retval other: fail
579 */
580int gsw_set_sim_power_down(void)
581{
582 int ret = -1;
583 if(sim_init_flag == 0 && sim_info_handle == NULL)
584 {
585 LOGE("sim sdk has been deinit\n");
586 return GSW_HAL_FAIL;
587 }
588
589 ret = mbtk_sim_power_set(0);
590 if(ret != MBTK_ERR_OK)
591 {
592 LOGE("[gsw_sim] mbtk_sim_power_set fail [err = %d].", ret);
593 return GSW_HAL_FAIL;
594 }
595 return GSW_HAL_SUCCESS;
596}
597
598
599
600/**
601 * @brief set sim power up
602 * @param
603 * @retval 0: success
604 * @retval other: fail
605 */
606int gsw_set_sim_power_up(void)
607{
608 int ret = -1;
609 if(sim_init_flag == 0 && sim_info_handle == NULL)
610 {
611 LOGE("sim sdk has been deinit\n");
612 return GSW_HAL_FAIL;
613 }
614
615 ret = mbtk_sim_power_set(1);
616 if(ret != MBTK_ERR_OK)
617 {
618 LOGE("[gsw_sim] mbtk_sim_power_set fail [err = %d].", ret);
619 return GSW_HAL_FAIL;
620 }
621 return GSW_HAL_SUCCESS;
622}
623
624
625/**
626 * @brief reset modem stack only, notice: after use this method, all ril sdk
627 * need restart by app, means network, sim, sms, data need deinit then init!
628 * @param
629 * @retval 0: success
630 * @retval other: fail
631 */
632int gsw_reset_modem(void)
633{
634 int ret = -1;
635 if(sim_init_flag == 0 && sim_info_handle == NULL)
636 {
637 LOGE("sim sdk has been deinit\n");
638 return GSW_HAL_FAIL;
639 }
640
641 mbtk_modem_info_t info;
642 info.fun = MBTK_DEV_MODEM_MIN_FUN;
643 info.rst = 0;
644
645 ret = mbtk_set_modem_fun(sim_info_handle, &info);
646 if(ret)
647 {
648 LOGE("[gsw_sim] mbtk_set_modem_fun fail [err = %d].", ret);
649 return GSW_HAL_FAIL;
650 }
651
652 sleep(1);
653
654 info.fun = MBTK_DEV_MODEM_FULL_FUN;
655 ret = mbtk_set_modem_fun(sim_info_handle, &info);
656 if(ret)
657 {
658 LOGE("[gsw_sim] mbtk_set_modem_fun fail [err = %d].", ret);
659 return GSW_HAL_FAIL;
660 }
661 return GSW_HAL_SUCCESS;
662}