blob: 774e23b94197645f8243d3795b16dc9d295b3197 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw_nw_interface.h"
2#include <dlfcn.h>
3#include <time.h>
4#include <pthread.h>
cz.lif4a9a932025-06-05 11:37:59 +08005#define SIG_TIMER 5
b.liu68a94c92025-05-24 12:53:41 +08006//mbtk include
7#define LYNQ_AIR_PLANE_MODE_OFF 1 //at+cfun = 1
8#define LYNQ_AIR_PLANE_MODE_ON 4 // at+cfun = 4
9#define LYNQ_AIR_CFUN_MODE_OFF 0 // at+cfun = 0
10
11#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
12
13#define FPLMN_STRING_LENGTH 120
14#define ENTRY_LENGTH 6
15#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1
16
q.huang238b22a2025-06-10 14:36:59 +080017#define MBTK_ERR_OK 0
18#define GSW_IMEI_LENGTH 20+1
19
20
b.liu68a94c92025-05-24 12:53:41 +080021#ifndef FALSE
22#define FALSE (0)
23#endif
24
25
26#ifndef TRUE
27#define TRUE (!FALSE)
28#endif
29
30typedef unsigned int uint32;
31typedef unsigned char uint8;
32typedef unsigned short uint16;
33typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
34
35typedef enum
36{
37 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
38 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
39 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
40 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
41 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
42 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
43}MBTK_DEV_MODEM_FUNCTION;
44
45typedef enum
46{
47 MBTK_CELL_TYPE_GSM = 0,
48 MBTK_CELL_TYPE_UMTS,
49 MBTK_CELL_TYPE_LTE
50} mbtk_cell_type_enum;
51
52typedef struct
53{
54 MBTK_DEV_MODEM_FUNCTION fun;
55 int rst;
56} mbtk_modem_info_t;
57
58typedef struct
59{
60 int client_fd;
61 pthread_t read_thread_id;
62 int exit_fd[2];
63 bool is_waitting;
64 pthread_cond_t cond;
65 pthread_mutex_t mutex;
66
67 pthread_mutex_t send_mutex;
68
69 // Temp response data.
70 uint16 info_err;
71 uint16 data_len;
72 void *data;
73
74 //mbtk wyq for server_ready_status add start
75 char server_ready_status;
76 //mbtk wyq for server_ready_status add end
77
78 mbtk_info_callback_func net_state_cb;
79 mbtk_info_callback_func call_state_cb;
80 mbtk_info_callback_func sms_state_cb;
81 mbtk_info_callback_func radio_state_cb;
82 mbtk_info_callback_func sim_state_cb;
83 mbtk_info_callback_func pdp_state_cb;
84 //add signal by xr
85 mbtk_info_callback_func signal_state_cb;
86} mbtk_info_handle_t;
87
88
89
90typedef struct
91{
92 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
93 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
94 // WCDMA server cell: lac, ci, arfcn
95 // WCDMA cell: lac, ci, arfcn
96 // GSM server cell: lac, ci, arfcn, bsic
97 // GSM cell:
98 uint32 value1;
99 uint32 value2;
100 uint32 value3;
101 uint32 value4;
102 uint32 value5;
103 uint32 value6;
104 uint32 value7;
105 uint32 value8;
106 uint32 value9;
107 uint32 value10;
108} __attribute__((packed)) mbtk_cell_info_t;
109
110
111
112
113
114typedef struct
115{
116 uint8 net_pref; // mbtk_net_pref_enum
117 uint16 gsm_band; // mbtk_gsm_band_enum
118 uint16 umts_band; // mbtk_umts_band_enum
119 uint32 tdlte_band; // mbtk_tdlte_band_enum
120 uint32 fddlte_band; // mbtk_fddlte_band_enum
121 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
122} __attribute__((packed)) mbtk_band_info_t;
123
124typedef struct list_arraynode
125{
126 void *data;
127 struct list_arraynode *next;
128} list_arraynode_t;
129
130typedef struct list_treenode
131{
132 list_arraynode_t *data;
133 int count;
134 struct list_treenode *left;
135 struct list_treenode *right;
136} list_treenode_t;
137
138typedef int (*list_sort_func)(void *data1, void *data2);
139typedef void (*list_free_func)(void *data);
140
141typedef struct list_node
142{
143 uint32 size;
144 list_sort_func sort_func;
145 list_free_func free_func;
146
147 uint32 cur_index;
148 list_arraynode_t *cur_array_data;
149
150 list_arraynode_t array_data;
151 list_treenode_t tree_data;
152} list_node_t;
153
154/*
1550: GSM
1561: GSM Compact
1572: UTRAN
1583: GSM w/EGPRS
1594: UTRAN w/HSDPA
1605: UTRAN w/HSUPA
1616: UTRAN w/HSDPA and HSUPA
1627: E-UTRAN
1638: UTRAN HSPA+
164*/
165typedef enum {
166 MBTK_RADIO_TECH_GSM = 0,
167 MBTK_RADIO_TECH_GSM_COMPACT,
168 MBTK_RADIO_TECH_UTRAN,
169 MBTK_RADIO_TECH_GSM_EGPRS,
170 MBTK_RADIO_TECH_UTRAN_HSDPA,
171 MBTK_RADIO_TECH_UTRAN_HSUPA,
172 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
173 MBTK_RADIO_TECH_E_UTRAN, // LTE
174 MBTK_RADIO_TECH_UTRAN_HSPA
175} mbtk_radio_technology_enum;
176
177typedef struct
178{
179 /*
180 0: automatic
181 1: manual
182 */
183 uint8 net_sel_mode;
184 /*
185 0: GSM
186 1: GSM Compact
187 2: UTRAN
188 3: GSM w/EGPRS
189 4: UTRAN w/HSDPA
190 5: UTRAN w/HSUPA
191 6: UTRAN w/HSDPA and HSUPA
192 7: E-UTRAN
193 8: UTRAN HSPA+
194 0xFF: Unused
195 */
196 uint8 net_type;
197 //uint8 plmn[10]; // 46000
198 /*
199 0: unknown
200 1: available
201 2: current
202 3: forbidden
203 */
204 uint8 net_state;
205 uint32 plmn;
206} __attribute__((packed)) mbtk_net_info_t;
207
208
209typedef enum
210{
211 MBTK_NET_REG_STATE_NON = 0,
212 MBTK_NET_REG_STATE_HOME,
213 MBTK_NET_REG_STATE_SEARCHING,
214 MBTK_NET_REG_STATE_DENIED,
215 MBTK_NET_REG_STATE_UNKNOWN,
216 MBTK_NET_REG_STATE_ROAMING,
217 MBTK_NET_REG_STATE_SMS_ONLY,
218 MBTK_NET_REG_STATE_ROAMING_SMS,
219 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
220 MBTK_NET_REG_STATE_CSFB_HOME,
221 MBTK_NET_REG_STATE_CSFB_ROAMING,
222 MBTK_NET_REG_STATE_EMERGENCY_ONLY
223} mbtk_net_reg_state_enum;
224
225typedef struct
226{
227 uint8 call_state;// mbtk_net_reg_state_enum
228 uint8 data_state;// mbtk_net_reg_state_enum
229 uint8 ims_state;// mbtk_net_reg_state_enum
230 uint8 type; // mbtk_radio_technology_enum
231 uint16 lac;
232 uint32 ci;
233} __attribute__((packed)) mbtk_net_reg_info_t;
234
235typedef struct
236{
237 uint8 type; // mbtk_radio_technology_enum
238 uint8 rssi; // 0: 113 dBm or less
239 // 1: 111 dBm
240 // 2��30: 109��53 dBm
241 // 31: 51 dBm or greater
242 // 99: not known or not detectable
243 uint8 rxlev;// 0:rssi < -110 dBm
244 // 1: -110 dBm �� rssi < -109 dBm
245 // 2: -109 dBm �� rssi < -108 dBm
246 // ......
247 // 61: -50 dBm �� rssi < -49 dBm
248 // 62: -49 dBm �� rssi < -48 dBm
249 // 63: -48 dBm �� rssi
250 // 99: not known or not detectable
251 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
252 // 99 not known or not detectable
253 uint8 rscp; // 0: rscp < -120 dBm
254 // 1: -120 dBm �� rscp < -119 dBm
255 // 2: -119 dBm �� rscp < -118 dBm
256 // ......
257 // 94: -27 dBm �� rscp < -26 dBm
258 // 95: -26 dBm �� rscp < -25 dBm
259 // 96: - 25 dBm �� rscp
260 // 255: not known or not detectable
261 uint8 ecno; // 0: Ec/Io < -24 dB
262 // 1: -24 dB �� Ec/Io < -23.5 dB
263 // 2: -23.5 dB �� Ec/Io < -23 dB
264 // ......
265 // 47: -1 dB �� Ec/Io < -0.5 dB
266 // 48: -0.5 dB �� Ec/Io < 0 dB
267 // 49: 0 dB �� Ec/Io
268 // 255: not known or not detectable
269 uint8 rsrq; // 0: rsrq < -19.5 dB
270 // 1: -19.5 dB �� rsrq < -19 dB
271 // 2: -19 dB �� rsrq < -18.5 dB
272 // ......
273 // 32: -4 dB �� rsrq < -3.5 dB
274 // 33: -3.5 dB �� rsrq < -3 dB
275 // 34: -3 dB �� rsrq
276 // 255: not known or not detectable
277 uint8 rsrp; // 0: rsrp < -140 dBm
278 // 1: -140 dBm �� rsrp < -139 dBm
279 // 2: -139 dBm �� rsrp < -138 dBm
280 // ......
281 // 95: -46 dBm �� rsrp < -45 dBm
282 // 96: -45 dBm �� rsrp < -44 dBm
283 // 97: -44 dBm �� rsrp
284 // 255: not known or not detectable
285} __attribute__((packed)) mbtk_signal_info_t;
286
287typedef struct{
288 uint8_t mode;
289 uint32_t oosPhase[3]; //单位为秒
290} mbtk_oos_info;
291
292typedef struct
293{
294 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
295 int t_min;
296 int t_step;
297 int t_max;
298}GSW_NW_OOS_CONFIG_INFO_T;
299
b.liu68a94c92025-05-24 12:53:41 +0800300#define lib_mbtk_path "/lib/libmbtk_lib.so"
301mbtk_info_handle_t* nw_info_handle = NULL;
302
303static GSW_NW_ServingInfoHandlePtr serving_cb;
304static GSW_NW_SigInfoHandlePtr sig_cb;
305static GSW_NW_RejectCauseHandlePtr reject_cb;
306static GSW_NW_ModemStateHandlePtr modem_cb;
307
308static void *dlHandle_mbtk;
309int nw_init_flag = 0;
310int mode = -1;
311int fplmn_max_length = 0;
312
313gsw_nw_plmn_list_t gsw_nw_plmn_list;
314char fplmn_array[FPLMN_ARRAY_SIZE][7];
315int fplmn_index = 0;
316
317static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
318static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
319int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
320int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
321int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
322int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
323static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
324int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
325int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
326int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
327int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
328int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
329int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
330int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
331int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
332int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
333int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
334int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800335int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
336
b.liu68a94c92025-05-24 12:53:41 +0800337
338static void (*mbtk_log)(int level, const char *format, ...);
339static void (*mbtk_log_init)(char *path, char *tag);
340
341#ifndef LOG_ERR_LEVEL
342#define LOG_ERR_LEVEL 3 /* error conditions */
343#endif
344#ifndef LOG_WARN_LEVEL
345#define LOG_WARN_LEVEL 4 /* warning conditions */
346#endif
347#ifndef LOG_INFO_LEVEL
348#define LOG_INFO_LEVEL 6 /* informational */
349#endif
350#ifndef LOG_DEBUG_LEVEL
351#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
352#endif
353#ifndef LOG_VERBOSE_LEVEL
354#define LOG_VERBOSE_LEVEL 8
355#endif
356
l.yang6a42e4d2025-05-28 01:04:20 -0700357#define GSW_NW "[HAL][GSW_NW]"
358
b.liu68a94c92025-05-24 12:53:41 +0800359#define LOGV(fmt, args ...) \
360 do{ \
361 char *file_ptr_1001 = __FILE__; \
362 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
363 char line_1001[10] = {0}; \
364 sprintf(line_1001, "%d", __LINE__); \
365 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
366 if(*ptr_1001 == '/') \
367 break; \
368 ptr_1001--; \
369 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700370 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800371 } while(0)
372
373#define LOGI(fmt, args...) \
374 do{ \
375 char *file_ptr_1001 = __FILE__; \
376 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
377 char line_1001[10] = {0}; \
378 sprintf(line_1001, "%d", __LINE__); \
379 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
380 if(*ptr_1001 == '/') \
381 break; \
382 ptr_1001--; \
383 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700384 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800385 } while(0)
386
387#define LOGD(fmt, args...) \
388 do{ \
389 char *file_ptr_1001 = __FILE__; \
390 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
391 char line_1001[10] = {0}; \
392 sprintf(line_1001, "%d", __LINE__); \
393 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
394 if(*ptr_1001 == '/') \
395 break; \
396 ptr_1001--; \
397 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700398 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800399 } while(0)
400
401#define LOGW(fmt, args...) \
402 do{ \
403 char *file_ptr_1001 = __FILE__; \
404 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
405 char line_1001[10] = {0}; \
406 sprintf(line_1001, "%d", __LINE__); \
407 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
408 if(*ptr_1001 == '/') \
409 break; \
410 ptr_1001--; \
411 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700412 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800413 } while(0)
414
415#define LOGE(fmt, args...) \
416 do{ \
417 char *file_ptr_1001 = __FILE__; \
418 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
419 char line_1001[10] = {0}; \
420 sprintf(line_1001, "%d", __LINE__); \
421 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
422 if(*ptr_1001 == '/') \
423 break; \
424 ptr_1001--; \
425 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700426 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800427 } while(0)
428
429
430
431typedef struct
432{
433 char *lynq_operator_l;
434 char *lynq_operator_s;
435 uint32 lynq_mcc_mnc;
436} lynq_operator_mcc_mnc_t;
437
438static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
439{
440 {"China Mobile","CMCC",46000},
441 {"China Unicom","CU",46001},
442 {"China Mobile","CMCC",46002},
443 {"China Telecom","CT",46003},
444 {"China Mobile","CMCC",46004},
445 {"China Telecom","CT",46005},
446 {"China Unicom","CU",46006},
447 {"China Mobile","CMCC",46007},
448 {"China Mobile","CMCC",46008},
449 {"China Unicom","CU",46009},
450 {"China Telecom","CT",46011}
451};
452
453
454//GSW include
455typedef enum prefer_mode
456{
457 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
458 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
459 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
460 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
461 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
462 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
463 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
464 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
465} PREFER_MODE_E;
466
467static int mbtk_nw_api_import()
468{
469 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
470 if (dlHandle_mbtk == NULL)
471 {
xy.heb41615b2025-05-28 16:33:20 +0800472 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800473 }
474
475 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
476 if (mbtk_log_init == NULL)
477 {
xy.heb41615b2025-05-28 16:33:20 +0800478 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800479 }
480
481 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
482 if (mbtk_log == NULL)
483 {
xy.heb41615b2025-05-28 16:33:20 +0800484 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800485 }
486
487 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
488 if (mbtk_info_handle_get == NULL)
489 {
490 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800491 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800492 }
493
494 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
495 if (mbtk_info_handle_free == NULL)
496 {
497 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800498 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800499 }
500
501 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
502 if (mbtk_net_sel_mode_get == NULL)
503 {
504 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800505 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800506 }
507
508 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
509 if (mbtk_net_reg_get == NULL)
510 {
511 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800512 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800513 }
514
515 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
516 if (mbtk_get_modem_fun == NULL)
517 {
518 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800519 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800520 }
521
522 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
523 if (mbtk_set_modem_fun == NULL)
524 {
525 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800526 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800527 }
528
529 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
530 if (mbtk_current_band_get == NULL)
531 {
532 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800533 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800534 }
535
536 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
537 if (mbtk_current_band_set == NULL)
538 {
539 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800540 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800541 }
542
543 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
544 if (mbtk_net_signal_get == NULL)
545 {
546 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800547 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800548 }
549
550 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
551 if (mbtk_wakeup_state_set == NULL)
552 {
553 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800554 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800555 }
556
557 mbtk_cell_get = (int (*)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list))dlsym(dlHandle_mbtk, "mbtk_cell_get");
558 if (mbtk_cell_get == NULL)
559 {
560 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800561 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800562 }
563
564 mbtk_signal_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_signal_state_change_cb_reg");
565 if (mbtk_signal_state_change_cb_reg == NULL)
566 {
567 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800568 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800569 }
570
571 mbtk_net_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_net_state_change_cb_reg");
572 if (mbtk_net_state_change_cb_reg == NULL)
573 {
574 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800575 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800576 }
577
578 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
579 if (mbtk_fplmn_get == NULL)
580 {
581 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800582 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800583 }
584
585 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
586 if (mbtk_fplmn_set == NULL)
587 {
588 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800589 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800590 }
591
592 mbtk_radio_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_radio_state_change_cb_reg");
593 if (mbtk_radio_state_change_cb_reg == NULL)
594 {
595 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800596 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800597 }
598
599 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
600 if (mbtk_oos_get == NULL)
601 {
602 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800603 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800604 }
605
606 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
607 if (mbtk_oos_set == NULL)
608 {
609 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800610 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800611 }
q.huang238b22a2025-06-10 14:36:59 +0800612
613 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
614 if (mbtk_imei_get == NULL)
615 {
616 LOGE("mbtk_imei_get dlsym fail\n");
617 return GSW_HAL_NORMAL_FAIL;
618 }
b.liu68a94c92025-05-24 12:53:41 +0800619
620 return GSW_HAL_SUCCESS;
621}
622
623void list_first(list_node_t *list)
624{
625 if (list) {
626 list->cur_index = 0;
627 list->cur_array_data = list->array_data.next;
628 }
629}
630
631void* list_next(list_node_t *list)
632{
633 if (list) {
634 list_arraynode_t *node = list->cur_array_data;
635 if (node) {
636 LOGE("node is not null\n");
637 list->cur_array_data = list->cur_array_data->next;
638 list->cur_index++;
639 return node->data;
640 } else {
641 LOGE("node is null\n");
642 return NULL;
643 }
644 } else {
645 LOGE("list is null\n");
646 return NULL;
647 }
648}
649
650void list_free(list_node_t *list)
651{
652 if (list) {
653 list_arraynode_t *node = &(list->array_data); // Head node
654 list_arraynode_t *node_temp = NULL;
655 while (node->next) {
656 node_temp = node->next;
657 node->next = node->next->next;
658
659 if (list->free_func) {
660 list->free_func(node_temp->data);
661 } else {
662 free(node_temp->data);
663 }
664 free(node_temp);
665 }
666 free(list);
667 }
668}
669
670static int gsw_rssi_to_csq(int rssi)
671{
672 LOGD("rssi = %d\n",rssi);
673 if(rssi >= -113 && rssi <= -51)
674 {
675 return (rssi + 113) / 2;
676 }
677
678 else
679 {
680 return 99;
681 }
682}
683
684static int gsw_rscp_to_csq(int rscp)
685{
686 LOGD("rscp = %d\n",rscp);
687 if(rscp <= -25 && rscp > -120)
688 {
689 return rscp + 120;
690 }
691 else
692 {
693 return 255;
694 }
695
696}
697
698static int gsw_rsrp_to_csq(int rsrp)
699{
700 LOGD("rsrp = %d\n",rsrp);
701
702 if(rsrp <= -44 && rsrp > -140)
703 {
704 return rsrp + 140;
705 }
706
707 else
708 {
709 return 255;
710 }
711}
712
713static int rscp_convert_to_dBm(int rscp)
714{
715 if(rscp <= 96 && rscp >= 0)
716 {
717 return rscp - 120;
718 }
719 else
720 {
721 return -25;
722 }
723}
724
725
726static int8_t rssi_convert_to_dBm(uint8 rssi)
727{
728 if(rssi <= 31)
729 {
730 return rssi * 2 - 113;
731 }
732 else
733 {
734 return -125;
735 }
736}
737
738static int16_t rsrp_convert_to_dBm(uint8 rsrp)
739{
740 if(rsrp <= 96)
741 {
742 return rsrp - 140;
743 }
744 else
745 {
746 return -44;
747 }
748}
749
750static int16_t rsrq_convert_to_dB(uint8 rsrq)
751{
752 if(rsrq >= 1 && rsrq <= 34)
753 {
754 return (rsrq + 1) / 2 - 20;
755 }
756 else
757 {
758 return -20;
759 }
760}
761
762static int16_t ecno_convert_to_dB(uint8 ecno)
763{
764 if(ecno >= 48)
765 {
766 return 0;
767 }
768 else if(ecno == 255)
769 {
770 return 255;
771 }
772 else
773 {
774 return 48 - ecno;
775 }
776}
777
778
779static int convert_reg_state(int reg_state_t)
780{
781 LOGD("reg_state_t = %d\n",reg_state_t);
782 int reg_state = 0;
783
784 switch (reg_state_t)
785 {
786 case MBTK_NET_REG_STATE_NON:
787 {
788 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
789 break;
790 }
791 case MBTK_NET_REG_STATE_HOME:
792 {
793 reg_state = GSW_NETWORK_REG_REGISTERED;
794 break;
795 }
796 case MBTK_NET_REG_STATE_SEARCHING:
797 {
798 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
799 break;
800 }
801 case MBTK_NET_REG_STATE_DENIED:
802 {
803 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
804 break;
805 }
806 case MBTK_NET_REG_STATE_UNKNOWN:
807 {
808 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
809 break;
810 }
811 case MBTK_NET_REG_STATE_ROAMING:
812 {
813 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
814 break;
815 }
816 case MBTK_NET_REG_STATE_SMS_ONLY:
817 case MBTK_NET_REG_STATE_ROAMING_SMS:
818 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
819 case MBTK_NET_REG_STATE_CSFB_HOME:
820 case MBTK_NET_REG_STATE_CSFB_ROAMING:
821 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
822 {
823 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
824 break;
825 }
826 }
827
828 return reg_state;
829}
830
831
832static int convert_net_mode(int net_mode)
833{
834 LOGD("net_mode = %d\n",net_mode);
835 switch(net_mode)
836 {
837 case MBTK_RADIO_TECH_GSM:
838 case MBTK_RADIO_TECH_GSM_COMPACT:
839 case MBTK_RADIO_TECH_GSM_EGPRS:
840 {
841 return GSW_NETWORK_RADIO_GSM;
842 }
843 case MBTK_RADIO_TECH_UTRAN:
844 case MBTK_RADIO_TECH_UTRAN_HSDPA:
845 case MBTK_RADIO_TECH_UTRAN_HSUPA:
846 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
847 case MBTK_RADIO_TECH_UTRAN_HSPA:
848 {
849 return GSW_NETWORK_RADIO_UMTS;
850 }
851 case MBTK_RADIO_TECH_E_UTRAN:
852 {
853 return GSW_NETWORK_RADIO_LTE;
854 }
855
856 default:
857 {
858 return GSW_NETWORK_RADIO_NO_SVC;
859 }
860 }
861
862 return GSW_NETWORK_RADIO_NO_SVC;
863}
864
865static int convert_mbtk_net_config(int config)
866{
867 int net_pref = -1;
868
869 switch(config)
870 {
871 case GSW_PREFER_MODE_GSW:
872 {
873 net_pref = 0;
874 break;
875 }
876
877 case GSW_PREFER_MODE_WCDMA:
878 {
879 net_pref = 1;
880 break;
881 }
882
883 case GSW_PREFER_MODE_WCDMA_GSM:
884 {
885 net_pref = 2;
886 break;
887 }
888
889 case GSW_PREFER_MODE_LTE:
890 case GSW_PREFER_MODE_NR5G:
891 case GSW_PREFER_MODE_NR5G_LTE:
892 {
893 net_pref = 5;
894 break;
895 }
896
897 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
898 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
899 {
900 net_pref = 15;
901 break;
902 }
903 }
904
905 return net_pref;
906}
907
908
909static int convert_gsw_net_config(int config)
910{
911 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +0800912 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +0800913
914 switch (config)
915 {
916 case 0:
917 {
918 net_config = GSW_PREFER_MODE_GSW;
919 break;
920 }
921
922 case 1:
923 {
924 net_config = GSW_PREFER_MODE_WCDMA;
925 break;
926 }
927
928 case 2:
929 {
930 net_config = GSW_PREFER_MODE_WCDMA_GSM;
931 break;
932 }
933
934 case 5:
935 {
936 net_config = GSW_PREFER_MODE_LTE;
937 break;
938 }
939
940 case 15:
941 {
942 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
943 break;
944 }
945 }
946
947 return net_config;
948}
949
950//64F010 -> 46001 (64->46,F0->0,10->01)
951static void transform_fplmn_str_to_plmn(char *entry)
952{
953 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
954 return; //if FFFFFF,means invalid fplmn, do nothing
955 }
956
957 char temp = entry[0];
958 entry[0] = entry[1];
959 entry[1] = temp;
960
961 temp = entry[ENTRY_LENGTH - 2];
962 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
963 entry[ENTRY_LENGTH - 1] = temp;
964
965 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
966
967 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
968
969 //valid fplmn
970 fplmn_index++;
971}
972
973static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
974{
975 strncpy(mcc,entry,3);
976 mcc[3] = '\0';
977 strncpy(mnc,entry + 3,2);
978 mnc[2] = '\0';
979
980 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
981}
982
983
984static void update_fplmn_list(char *fplmn_str)
985{
986 LOGE("fplmn_str = %s\n",fplmn_str);
987 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
988 memset(fplmn_array, 0, sizeof(fplmn_array));
989 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
990 fplmn_index = 0;
991 int array_length = 0;
992
993 for (int i = 0; i < strlen(fplmn_str); i += 6) {
994
995 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
996 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
997 temp_fplmn_array[array_length][length] = '\0';
998 array_length++;
999 if (i + 6 >= strlen(fplmn_str)) {
1000 break;
1001 }
1002 }
1003
1004 for (int i = 0; i < array_length; i++) {
1005 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1006 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1007 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1008 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1009 }
1010
1011}
1012
1013static void format_plmn(char *result, char *plmn_entry)
1014{
1015 strncpy(result, plmn_entry, strlen(plmn_entry));
1016 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1017
1018 if (strlen(result) >= 2) {
1019 char temp = result[0];
1020 result[0] = result[1];
1021 result[1] = temp;
1022 }
1023
1024 LOGE("1.result = %s\n",result);
1025
1026 if (strlen(result) >= 3) {
1027 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1028 result[2] = 'F';
1029 }
1030
1031 LOGE("2.result = %s\n",result);
1032
1033 if (strlen(result) >= 2) {
1034 char temp = result[strlen(result) - 1];
1035 result[strlen(result) - 1] = result[strlen(result) - 2];
1036 result[strlen(result) - 2] = temp;
1037 }
1038
1039 LOGE("3.result = %s\n",result);
1040}
1041
1042
1043static void convert_plmn_to_fplmn_str(char *fplmn_str)
1044{
1045 char temp_fplmn_str[128] = {0};
1046 char temp[20]; // 临时存储单个格式化后的数字
1047 int index = 0;
1048
1049 for (int i = 0; i < fplmn_index; i++) {
1050 memset(temp, 0x0, sizeof(temp));
1051 format_plmn(temp, fplmn_array[i]);
1052 strcat(temp_fplmn_str, temp);
1053 index += strlen(temp);
1054 }
1055
1056 while(index < (6 * fplmn_max_length))
1057 {
1058 temp_fplmn_str[index++] = 'F';
1059 }
1060
1061 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1062 if (index > (6 * fplmn_max_length)) {
1063 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1064 }
1065
1066 LOGE("%s\n", temp_fplmn_str);
1067 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1068 LOGE("fplmn_str = %s\n", fplmn_str);
1069}
1070
1071static int check_index(char *mcc, char *mnc)
1072{
1073 int i = 0;
1074
1075 for(i = 0; i < fplmn_index; i++)
1076 {
1077 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1078 {
1079 LOGE("index = %d\n", i);
1080 return i;
1081 }
1082 }
1083
1084 LOGE("not find\n");
1085 return -1;
1086}
1087
1088static void remove_fplmn(int index)
1089{
1090 int write_index = 0;
1091 for (int i = 0; i < fplmn_index; i++) {
1092 if (i != index) {
1093 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1094 }
1095 }
1096 fplmn_index--;
1097}
1098
1099static void gsw_serving_info_callback_thread()
1100{
1101 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1102 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1103 int ret = -1;
1104 ret = gsw_get_nwinfo(serving_info);
1105 if(ret != 0)
1106 {
1107 LOGE("gsw_get_nwinfo failed\n");
1108 free(serving_info);
1109 return;
1110 }
1111
1112 if(serving_cb)
1113 {
1114 serving_cb(*serving_info);
1115 free(serving_info);
1116 }
1117}
1118
1119static void gsw_serving_info_callback(const void* data, int data_len)
1120{
1121 LOGE("gsw_serving_info_callback start\n");
1122
1123 if(data && data_len > 0)
1124 {
1125 pthread_t thread;
1126 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1127 }
1128
1129 else
1130 {
1131 LOGE("data is NULL\n");
1132 return;
1133 }
1134
1135}
1136
1137static void gsw_sig_info_callback(const void* data, int data_len)
1138{
1139 LOGE("gsw_sig_info_callback start\n");
1140
1141 if(data && data_len == 8)
1142 {
1143 uint8 *net_data = (uint8*)data;
1144 mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];
1145
1146 signalStrength_t sig_strength;
1147 memset(&sig_strength, 0x0, sizeof(signalStrength_t));
1148
1149 sig_strength.gw_sig_valid = 0;
1150 sig_strength.wcdma_sig_valid = 0;
1151 sig_strength.lte_sig_valid = 0;
1152 sig_strength.nr_sig_valid = 0;
1153
1154 if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \
1155 type == MBTK_RADIO_TECH_GSM_EGPRS) //GSM
1156 {
1157 sig_strength.gw_sig_valid = 1;
1158 sig_strength.rssi = rssi_convert_to_dBm(net_data[1]);
1159 }
1160
1161 else if(type == MBTK_RADIO_TECH_E_UTRAN)
1162 {
1163 sig_strength.lte_sig_valid = 1;
1164 sig_strength.rsrp = rsrp_convert_to_dBm(net_data[7]);
1165 sig_strength.rsrq = rsrq_convert_to_dB(net_data[6]);
1166 sig_strength.rssnr = -99;
1167 }
1168
1169 else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
1170 type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA || \
1171 type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
1172 {
1173 sig_strength.wcdma_sig_valid = 1;
1174 sig_strength.rscp = rssi_convert_to_dBm(net_data[1]);
1175 sig_strength.ecno = ecno_convert_to_dB(net_data[5]);
1176 }
1177
1178 if(sig_cb != NULL)
1179 {
1180 sig_cb(sig_strength);
1181 }
1182 }
1183
1184 else
1185 {
1186 LOGE("data is NULL\n");
1187 }
1188}
1189
1190static void gsw_modem_status_event_callback(const void* data, int data_len)
1191{
1192 LOGE("gsw_modem_status_event_callback start\n");
1193
1194 gsw_mode_state_e state = GSW_MODEM_STATE_UNKNOWN;
1195
1196 if(data && data_len > 0)
1197 {
1198 uint8 *net_data = (uint8*)data;
1199 LOGE("gsw_modem_status_event_callback,data = %d\n", *net_data);
1200 if(*net_data == 1)
1201 {
1202 state = GSW_MODEM_STATE_ONLINE;
1203 }
1204 else if(*net_data == 0)
1205 {
1206 state = GSW_MODEM_STATE_OFFLINE;
1207 }
1208
1209 if(modem_cb != NULL)
1210 {
1211 modem_cb(state);
1212 }
1213 }
1214
1215}
1216
1217static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1218{
1219 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1220
1221 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1222 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1223
1224 rej_cause->rej_cause = cause;
1225 rej_cause->rej_rat = rat;
1226 rej_cause->rej_domain = domain;
1227
1228 if(reject_cb != NULL)
1229 {
1230 LOGE("reject_cb is not NULL\n");
1231 reject_cb(rej_cause);
1232 }
1233 else
1234 {
1235 LOGE("reject_cb is NULL\n");
1236 }
1237
1238 free(rej_cause);
1239 LOGE("gsw_reject_callback end\n");
1240}
1241
1242
xy.hec89938f2025-05-29 14:08:47 +08001243void gsw_sig_info_timer()
1244{
1245 int ret = -1;
1246 if(nw_init_flag == 0 || nw_info_handle == NULL)
1247 {
1248 return;
1249 }
1250
1251 mbtk_signal_info_t signal;
1252 signalStrength_t sig_strength;
1253
1254 while(nw_init_flag)
1255 {
1256 memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
1257 memset(&sig_strength, 0x0, sizeof(signalStrength_t));
1258 ret = mbtk_net_signal_get(nw_info_handle, &signal);
1259 if(ret != 0)
1260 {
1261 LOGE("mbtk_net_signal_get fail\n");
1262 }
1263
1264 else
1265 {
1266 LOGD("signal.type=%d\n", signal.type);
1267 switch(signal.type)
1268 {
1269 case MBTK_RADIO_TECH_GSM:
1270 case MBTK_RADIO_TECH_GSM_COMPACT:
1271 case MBTK_RADIO_TECH_GSM_EGPRS:
1272 {
1273 LOGD("rssi = %d\n",signal.rssi);
1274 sig_strength.gw_sig_valid = 1;
1275 sig_strength.rssi = rssi_convert_to_dBm(signal.rssi);
1276 break;
1277 }
1278 case MBTK_RADIO_TECH_E_UTRAN:
1279 {
1280 LOGD("rsrp = %d\n",signal.rsrp);
1281 sig_strength.lte_sig_valid = 1;
1282 sig_strength.rsrp = rsrp_convert_to_dBm(signal.rsrp);
1283 sig_strength.rsrq = rsrq_convert_to_dB(signal.rsrq);
1284 break;
1285 }
1286 case MBTK_RADIO_TECH_UTRAN:
1287 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1288 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1289 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1290 case MBTK_RADIO_TECH_UTRAN_HSPA:
1291 {
1292 LOGD("rscp = %d\n",signal.rscp);
1293 sig_strength.wcdma_sig_valid = 1;
1294 sig_strength.rscp = rssi_convert_to_dBm(signal.rscp);
1295 sig_strength.ecno = ecno_convert_to_dB(signal.ecno);
1296 break;
1297 }
1298 default:
1299 {
1300 LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
1301 }
1302 }
1303 }
1304
1305 if(sig_cb != NULL)
1306 {
1307 sig_cb(sig_strength);
1308 }
1309
1310 sleep(SIG_TIMER);
1311 }
1312}
1313
b.liu68a94c92025-05-24 12:53:41 +08001314
1315/**
1316 * @brief SDK interface to call back serving info
1317 * @param [in] handle_ptr
1318 * @retval 0: success
1319 * @retval other: fail
1320 */
1321int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1322{
1323 if (nw_init_flag == 0 || nw_info_handle == NULL)
1324 {
xy.heb41615b2025-05-28 16:33:20 +08001325 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001326 }
1327
1328 if(handle_ptr == NULL)
1329 {
1330 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001331 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001332 }
1333
1334 serving_cb = handle_ptr;
1335
1336 return GSW_HAL_SUCCESS;
1337
1338}
1339
1340
1341/**
1342 * @brief SDK interface to call back sig info
1343 * @param [in] handle_ptr
1344 * @retval 0: success
1345 * @retval other: fail
1346 */
1347int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1348{
1349 if (nw_init_flag == 0 || nw_info_handle == NULL)
1350 {
xy.heb41615b2025-05-28 16:33:20 +08001351 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001352 }
1353
1354 if(handle_ptr == NULL)
1355 {
1356 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001357 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001358 }
1359
1360 sig_cb = handle_ptr;
1361
1362 return GSW_HAL_SUCCESS;
1363
1364}
1365
1366
1367/**
1368 * @brief SDK interface to call back rej cause
1369 * @param [in] handle_ptr
1370 * @retval 0: success
1371 * @retval other: fail
1372 */
1373int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1374{
1375 if (nw_init_flag == 0 || nw_info_handle == NULL)
1376 {
xy.heb41615b2025-05-28 16:33:20 +08001377 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001378 }
1379
1380 if(handle_ptr == NULL)
1381 {
1382 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001383 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001384 }
1385
1386 reject_cb = handle_ptr;
1387
1388 return GSW_HAL_SUCCESS;
1389}
1390
1391
1392/**
1393 * @brief network sdk init
1394 * @param [in] token usr id define by who use
1395 * @retval 0: success
1396 * @retval other: fail
1397 */
1398int gsw_nw_sdk_init(int token)
1399{
1400 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001401 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001402
1403 if (nw_init_flag == 1 && nw_info_handle != NULL)
1404 {
1405 return GSW_HAL_SUCCESS;
1406 }
1407
1408 ret = mbtk_nw_api_import();
1409 if (ret != 0)
1410 {
1411 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001412 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001413 }
1414
1415 nw_info_handle = mbtk_info_handle_get();
1416
1417 if (nw_info_handle == NULL)
1418 {
1419 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001420 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001421 }
1422
1423 char fplmn[256] = {0};
1424 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1425 if(ret != 0)
1426 {
1427 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001428 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001429 }
1430 fplmn_max_length = (strlen(fplmn)/6);
1431 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1432 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1433
1434 if (ret != 0)
1435 {
1436 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001437 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001438 }
1439
1440 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1441 if (ret != 0)
1442 {
1443 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001444 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001445 }
1446
xy.hec89938f2025-05-29 14:08:47 +08001447 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1448 if (ret != 0)
1449 {
1450 LOGE("pthread_create fail\n");
1451 return GSW_HAL_NORMAL_FAIL;
1452 }
1453
b.liu68a94c92025-05-24 12:53:41 +08001454 nw_init_flag = 1;
1455
1456 return GSW_HAL_SUCCESS;
1457}
1458
1459
1460/**
1461 * @brief network sdk deinit
1462 * @param
1463 * @retval 0: success
1464 * @retval other: fail
1465 */
1466int gsw_nw_sdk_deinit(void)
1467{
1468 int ret = -1;
1469
1470 if (nw_init_flag == 0 || nw_info_handle == NULL)
1471 {
xy.heb41615b2025-05-28 16:33:20 +08001472 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001473 }
1474
1475 ret = mbtk_info_handle_free(&nw_info_handle);
1476 if(ret != GSW_HAL_SUCCESS)
1477 {
1478 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001479 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001480 }
1481
1482 dlclose(dlHandle_mbtk);
1483 nw_info_handle = NULL;
1484 nw_init_flag = 0;
1485
1486 return GSW_HAL_SUCCESS;
1487
1488}
1489
1490
1491/**
1492 * @brief get current network reg info
1493 * @param [out] serving_info struct for network info
1494 * include regstate ps_state opreator name mcc mcn etc
1495 * @retval 0: success
1496 * @retval other: fail
1497 */
1498int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1499{
1500
1501 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001502 if (nw_init_flag == 0 || nw_info_handle == NULL)
1503 {
q.huang238b22a2025-06-10 14:36:59 +08001504 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001505 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001506 }
1507
1508 LOGE("mbtk_net_reg_get start \n");
1509 //regstate
1510 mbtk_net_reg_info_t reg;
1511 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1512 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1513 if(ret)
1514 {
1515 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001516 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001517 }
1518
1519 LOGE("convert_cs_reg_state\n");
1520 //cs_state
1521 serving_info->reg_state = convert_reg_state(reg.call_state);
1522 LOGE("convert_ps_reg_state\n");
1523 //ps_state
1524 serving_info->ps_state = convert_reg_state(reg.data_state);
1525 LOGE("convert_rat_mode\n");
1526 //reg_rat
1527 serving_info->reg_rat = convert_net_mode(reg.type);
1528 //srv_domain
1529 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1530 {
1531 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1532 {
1533 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1534 }
1535
1536 else
1537 {
1538 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1539 }
1540 }
1541
1542 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1543 {
1544 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1545 }
1546
1547 else
1548 {
1549 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1550 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1551 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1552 }
1553
1554 LOGD("roaming_ind\n");
1555 //roaming_ind
1556 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1557 {
1558 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1559 }
1560 else
1561 {
1562 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1563 }
1564
1565 LOGD("reject\n");
1566 //reject
1567 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1568 {
1569 LOGD("reject_callback\n");
1570 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1571 }
1572
1573 LOGD("reg_plmn / operator name\n");
1574 //reg_plmn / operator name
1575 mbtk_net_info_t net;
1576 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1577 LOGD("mbtk_net_sel_mode_get start \n");
1578 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1579 LOGD("mbtk_net_sel_mode_get end \n");
1580 if(ret == 0 && net.plmn > 0)
1581 {
1582 int i = 0;
1583
1584 LOGD("start to find mcc");
1585 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1586 {
1587 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1588 {
1589 LOGD("find mcc\n");
1590 break;
1591 }
1592 i++;
1593 }
1594
1595
1596 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1597 {
1598 LOGD("not find mcc");
1599 strcpy(serving_info->operator_name, "unknown");
1600 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1601 }
1602
1603 else
1604 {
1605 LOGD("find mcc\n");
1606 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1607 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1608 }
1609
1610 LOGE("operator_name = %s\n", serving_info->operator_name);
1611 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1612 }
1613
1614
1615 LOGD("get cell id/tac/lac/sid/nid\n");
1616 //cell id/tac/lac/sid/nid
1617 mbtk_cell_type_enum cell_type;
1618 if(serving_info->reg_rat == GSW_NETWORK_RADIO_GSM)
1619 {
1620 cell_type = MBTK_CELL_TYPE_GSM;
1621 }
1622 else if(serving_info->reg_rat == GSW_NETWORK_RADIO_UMTS)
1623 {
1624 cell_type = MBTK_CELL_TYPE_UMTS;
1625 }
1626 else
1627 {
1628 cell_type = MBTK_CELL_TYPE_LTE;
1629 }
1630
1631 list_node_t* cell_list = NULL;
1632
1633 LOGD("mbtk_cell_get start\n");
1634 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1635 if(ret != 0 || cell_list == NULL)
1636 {
1637 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001638 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001639 }
1640 else
1641 {
1642 LOGE("mbtk_cell_get end,start to get node\n");
1643 list_first(cell_list);
1644 LOGE("list_first end\n");
1645 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1646 if(cell)
1647 {
1648 LOGE("cell is not null,value2 = %u\n",cell->value2);
1649 switch(cell_type)
1650 {
1651 case MBTK_CELL_TYPE_LTE:
1652 {
1653 LOGE("is lte\n");
1654 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1655 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1656 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1657 strcpy(serving_info->lac,"");
1658 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value8);
1659 break;
1660 }
1661
1662 case MBTK_CELL_TYPE_GSM:
1663 {
1664 LOGE("is gsm\n");
1665 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1666 sprintf(serving_info->lac,"%d",cell->value1);
1667 memset(serving_info->tac,0,sizeof(serving_info->tac));
1668 sprintf(serving_info->cell_id,"%d",cell->value2);
1669 break;
1670 }
1671 case MBTK_CELL_TYPE_UMTS:
1672 {
1673 LOGE("is wcdma\n");
1674 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1675 sprintf(serving_info->lac,"%d",cell->value1);
1676 memset(serving_info->tac,0,sizeof(serving_info->tac));
1677 sprintf(serving_info->cell_id,"%d",cell->value2);
1678 break;
1679 }
1680
1681 default:
1682 break;
1683 }
1684 }
1685 else
1686 {
1687 LOGE("cell is null\n");
1688 }
1689 }
1690
1691 //not support now
1692 serving_info->sid = 0;
1693 serving_info->nid = 0;
1694
1695 return GSW_HAL_SUCCESS;
1696}
1697
1698
1699/**
1700 * @brief get current network type
1701 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1702 * @retval 0: success
1703 * @retval other: fail
1704 */
1705int gsw_get_netype(int *netype)
1706{
1707 int ret = -1;
1708
1709 if (nw_init_flag == 0 || nw_info_handle == NULL)
1710 {
xy.heb41615b2025-05-28 16:33:20 +08001711 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001712 }
1713
1714 //regstate
1715 mbtk_net_reg_info_t reg;
1716 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1717 if(ret)
1718 {
1719 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001720 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001721 }
1722
1723 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1724 {
1725 *netype = convert_net_mode(reg.type);
1726 }
1727 else
1728 {
1729 *netype = GSW_NETWORK_RADIO_NO_SVC;
1730 }
1731
1732 return GSW_HAL_SUCCESS;
1733}
1734
1735
1736/**
1737 * @brief get radio opmode, as open and close airplane mode
1738 * @param [out] op_mode 1 is radio on, 0 is radio off
1739 * @retval 0: success
1740 * @retval other: fail
1741 */
1742int gsw_get_opmode(int *op_mode)
1743{
1744 int tmp_rf = -1;
1745 int ret = -1;
1746 if (nw_init_flag == 0 || nw_info_handle == NULL)
1747 {
xy.heb41615b2025-05-28 16:33:20 +08001748 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001749 }
1750
1751 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1752 if (ret != 0)
1753 {
1754 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001755 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001756 }
1757 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1758 {
1759 *op_mode = GSW_OP_MODE_LPM;
1760 }
1761
1762 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1763 {
1764 *op_mode = GSW_OP_MODE_OFFLINE;
1765 }
1766
1767 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1768 {
1769 *op_mode = GSW_OP_MODE_ONLINE;
1770 }
1771
1772 return GSW_HAL_SUCCESS;
1773}
1774
1775
1776
1777/**
1778 * @brief set radio opmode, as open and close airplane mode
1779 * @param [in] op_mode 1 is radio on, 0 is radio off
1780 * @retval 0: success
1781 * @retval other: fail
1782 */
1783int gsw_set_opmode(int op_mode)
1784{
1785 mbtk_modem_info_t info;
1786 int rf_mode = -1;
1787 int ret = -1;
1788
1789 if (nw_init_flag == 0 || nw_info_handle == NULL)
1790 {
xy.heb41615b2025-05-28 16:33:20 +08001791 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001792 }
1793
1794 if(op_mode == GSW_OP_MODE_LPM)
1795 {
1796 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1797 }
1798
1799 if(op_mode == GSW_OP_MODE_ONLINE)
1800 {
1801 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1802 }
1803
1804 if(op_mode == GSW_OP_MODE_OFFLINE)
1805 {
1806 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1807 }
1808
1809 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1810 {
1811 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001812 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001813 }
1814
1815 info.fun = rf_mode;
1816 info.rst = 0;
1817 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1818 if (ret != 0)
1819 {
1820 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001821 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001822 }
1823
1824 return GSW_HAL_SUCCESS;
1825
1826}
1827
1828
1829/**
1830 * @brief get network mode preference of mdm search network scale
1831 * @param [out] mode_pref net_work pref mode:
1832 * enum prefer_mode
1833 * @retval 0: success
1834 * @retval other: fail
1835 */
1836int gsw_get_mode_preference(int *mode_pref)
1837{
1838 if (nw_init_flag == 0 || nw_info_handle == NULL)
1839 {
xy.heb41615b2025-05-28 16:33:20 +08001840 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001841 }
1842
1843 int ret = -1;
1844 mbtk_band_info_t band;
1845 memset(&band, 0, sizeof(mbtk_band_info_t));
1846
1847 ret = mbtk_current_band_get(nw_info_handle, &band);
1848 if(ret != 0)
1849 {
1850 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001851 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001852 }
1853
1854 *mode_pref = convert_gsw_net_config(band.net_pref);
1855 LOGE("band.net_pref = %d\n", *mode_pref);
1856 if(*mode_pref <= 0)
1857 {
1858 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001859 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001860 }
1861 return GSW_HAL_SUCCESS;
1862
1863
1864}
1865
1866/**
1867 * @brief set network mode preference of mdm search network scale
1868 * @param [in] mode_pref net_work pref mode:
1869 * enum prefer_mode
1870 * @retval 0: success
1871 * @retval other: fail
1872 */
1873int gsw_set_mode_preference(int mode_pref)
1874{
1875 if (nw_init_flag == 0 || nw_info_handle == NULL)
1876 {
xy.heb41615b2025-05-28 16:33:20 +08001877 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001878 }
1879
1880 int ret = -1;
1881
1882 mbtk_band_info_t band;
1883 memset(&band, 0, sizeof(mbtk_band_info_t));
1884
1885 band.net_pref = convert_mbtk_net_config(mode_pref);
1886 LOGE("band.net_pref = %d\n", band.net_pref);
1887
1888 if(band.net_pref < 0)
1889 {
1890 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001891 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001892 }
1893
1894 ret = mbtk_current_band_set(nw_info_handle, &band);
1895 if(ret != 0)
1896 {
1897 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001898 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001899 }
1900
1901 return GSW_HAL_SUCCESS;
1902}
1903
1904/**
1905 * @brief get signal csq value
1906 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
1907 * @retval 0: success
1908 * @retval other: fail
1909 */
1910int gsw_get_sig_info(int *csq_value)
1911{
1912 int ret = -1;
1913
1914 if (nw_init_flag == 0 || nw_info_handle == NULL)
1915 {
xy.heb41615b2025-05-28 16:33:20 +08001916 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001917 }
1918
1919 mbtk_signal_info_t signal;
1920 memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
1921 ret = mbtk_net_signal_get(nw_info_handle, &signal);
1922 if(ret != 0)
1923 {
1924 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001925 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001926 }
1927
1928 LOGD("signal.type=%d\n", signal.type);
1929 switch(signal.type)
1930 {
1931 case MBTK_RADIO_TECH_GSM:
1932 case MBTK_RADIO_TECH_GSM_COMPACT:
1933 case MBTK_RADIO_TECH_GSM_EGPRS:
1934 {
1935 LOGD("rssi = %d\n",signal.rssi);
1936 *csq_value = rssi_convert_to_dBm(signal.rssi);
1937 break;
1938 }
1939 case MBTK_RADIO_TECH_E_UTRAN:
1940 {
1941 LOGD("rsrp = %d\n",signal.rsrp);
1942 *csq_value = rsrp_convert_to_dBm(signal.rsrp);
1943 break;
1944 }
1945 case MBTK_RADIO_TECH_UTRAN:
1946 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1947 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1948 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1949 case MBTK_RADIO_TECH_UTRAN_HSPA:
1950 {
1951 LOGD("rscp = %d\n",signal.rscp);
1952 *csq_value = rscp_convert_to_dBm(signal.rscp);
1953 break;
1954 }
1955 default:
1956 {
1957 LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08001958 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001959 }
1960 }
1961 return GSW_HAL_SUCCESS;
1962}
1963
1964/**
1965 * @brief set nework power mode, for tcam enter standby or exit standby
1966 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
1967 * @retval 0: success
1968 * @retval other: fail
1969 */
1970int gsw_network_set_power_mode(char mode)
1971{
1972 int ret = -1;
1973
1974 if (nw_init_flag == 0 || nw_info_handle == NULL)
1975 {
xy.heb41615b2025-05-28 16:33:20 +08001976 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001977 }
1978
1979 if(mode != 0 && mode != 1)
1980 {
1981 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001982 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001983 }
1984
1985 if(mode == 1)
1986 {
1987 mode = 6;
1988 }
1989
1990 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
1991 if(ret != 0)
1992 {
1993 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001994 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001995 }
1996
1997 return GSW_HAL_SUCCESS;
1998
1999
2000
2001}
2002
2003/**
2004 * @brief convert rsrp rscp rssi to csq value.
2005 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2006 * @param [in] sigvalue input signal_strength for different nettype
2007 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2008
2009 * @retval csq
2010 * @retval other: fail
2011 */
2012int gsw_sigInfo_to_csq(int netType, int sigValue)
2013{
q.huang238b22a2025-06-10 14:36:59 +08002014 if (nw_init_flag == 0 || nw_info_handle == NULL)
2015 {
2016 return GSW_HAL_NORMAL_FAIL;
2017 }
b.liu68a94c92025-05-24 12:53:41 +08002018 switch(netType)
2019 {
2020 case 1:
2021 case 2:
2022 case 3:
2023 case 4: //GSM
2024 {
2025 return gsw_rssi_to_csq(sigValue);
2026 }
2027
2028 case 5: //WCDMA
2029 {
2030 return gsw_rscp_to_csq(sigValue);
2031 }
2032
2033 case 6: //LTE
2034 {
2035 return gsw_rsrp_to_csq(sigValue);
2036 }
2037
2038 default:
2039 {
2040 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002041 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002042 }
2043 }
2044}
2045
2046/*
2047 * @brief get mobile operator name
2048 @param [out] nw_operator_name_infos get the long and short operator name info
2049 @retval 0: success
2050 @retval 0: other: fail
2051 */
2052int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2053{
2054 char OperatorFN[128];
2055 char OperatorSH[128];
2056 char temp[12] = {0};
2057 mbtk_net_info_t net;
2058
2059 if (nw_init_flag == 0 || nw_info_handle == NULL)
2060 {
xy.heb41615b2025-05-28 16:33:20 +08002061 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002062 }
2063
2064 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2065 {
2066 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2067 int i = 0;
2068 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2069 {
2070 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2071 break;
2072 i++;
2073 }
2074
2075 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2076 {
2077 strcpy(OperatorFN, "UNKNOWN");
2078 strcpy(OperatorSH, "UNKNOWN");
2079 }
2080 else
2081 {
2082 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2083 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2084
2085 memset(temp,0,12);
2086 memset(nw_operator_name_infos->mcc,0,4);
2087 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
2088 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2089
2090 memset(temp,0,12);
2091 memset(nw_operator_name_infos->mnc,0,4);
2092 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2093 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2094 }
2095
2096 memset(nw_operator_name_infos->long_eons,0,128);
2097 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2098 memset(nw_operator_name_infos->short_eons,0,128);
2099 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2100
2101 return GSW_HAL_SUCCESS;
2102 }
2103
2104 else
2105 {
2106 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002107 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002108 }
2109
2110 return GSW_HAL_SUCCESS;
2111}
2112
2113
2114/*
2115 * @brief get current serving cell info
2116 * @param cell_info: [out] struct for current cell info
2117 * include earfcn mcc mnc pci psc tac lac etc.
2118 * @return int: 0 is success, other failed
2119 */
2120int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2121{
2122 int ret = -1;
2123
2124 if (nw_init_flag == 0 || nw_info_handle == NULL)
2125 {
q.huang238b22a2025-06-10 14:36:59 +08002126 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002127 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002128 }
2129
2130 list_node_t* cell_list = NULL;
2131 int neibor_count = 0;
2132 mbtk_cell_type_enum type;
2133 ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
2134 if(ret || cell_list == NULL) {
2135 LOGE("mbtk_cell_get failed : %d\n", ret);
2136 } else {
2137 list_first(cell_list);
2138 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2139 if(cell) { // Current server cell.
2140 switch(type)
2141 {
2142 case 0:
2143 {
2144 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2145 char gsm_temp[12] = {0};
2146
2147 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2148
2149 cell_info->mcc_valid = 1;
2150 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);
2151 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2152
2153 memset(gsm_temp, 0, sizeof(gsm_temp));
2154
2155 cell_info->mnc_valid = 1;
2156 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);
2157 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2158
2159 cell_info->cell_id_valid = 1;
2160 cell_info->cell_id = cell->value2;
2161
2162 cell_info->lac_valid = 1;
2163 cell_info->lac = cell->value1;
2164
2165 cell_info->arfcn_valid = 1;
2166 cell_info->arfcn = cell->value3;
2167
2168 break;
2169 }
2170
2171 case 1:
2172 {
2173 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2174 char wcdma_temp[12] = {0};
2175
2176 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2177
2178 cell_info->mcc_valid = 1;
2179 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);
2180 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2181
2182 memset(wcdma_temp, 0, sizeof(wcdma_temp));
2183
2184 cell_info->mnc_valid = 1;
2185 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);
2186 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2187
2188 cell_info->lac_valid = 1;
2189 cell_info->lac = cell->value1;
2190
2191 cell_info->cell_id_valid = 1;
2192 cell_info->cell_id = cell->value2;
2193
2194 cell_info->uarfcn_valid = 1;
2195 cell_info->uarfcn = cell->value3;
2196
2197 cell_info->psc_valid = 1;
2198 cell_info->psc = cell->value6;
2199 break;
2200 }
2201
2202 case 2:
2203 {
2204 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
2205
2206 char lte_temp[12] = {0};
2207
2208 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2209
2210 cell_info->mcc_valid = 1;
2211 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2212 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2213
2214 memset(lte_temp, 0, sizeof(lte_temp));
2215
2216 cell_info->mnc_valid = 1;
2217 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2218 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2219
2220 cell_info->tac_valid = 1;
2221 cell_info->tac = cell->value1;
2222
2223 cell_info->pci_valid = 1;
2224 cell_info->pci = cell->value2;
2225
2226 cell_info->earfcn_valid = 1;
2227 cell_info->earfcn = cell->value3;
2228
2229 cell_info->bler_valid = 1;
2230 cell_info->bler = cell->value4;
2231
2232 cell_info->band_valid = 1;
2233 cell_info->band = cell->value5;
2234
2235 cell_info->rsrp_valid = 1;
2236 cell_info->rsrp = cell->value8;
2237
2238 cell_info->rsrq_valid = 1;
2239 cell_info->rsrq = cell->value9;
2240
2241 cell_info->cell_id_valid = 1;
2242 cell_info->cell_id = cell->value10;
2243
2244 break;
2245 }
2246
2247 default:
2248 break;
2249 }
2250 }
2251
2252 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2253 {
2254 switch(type)
2255 {
2256 //GSM
2257 case 0:
2258 {
2259
2260 }
2261 //WCDMA
2262 case 1:
2263 {
2264 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2265
2266 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2267
2268 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2269 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2270
2271 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2272 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2273
2274 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2275
2276 neibor_count++;
2277
2278 }
2279 //LTE
2280 case 2:
2281 {
2282 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2283 char lte_temp[12] = {0};
2284 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2285
2286 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2287 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->mcc));
2288
2289 memset(lte_temp, 0, sizeof(lte_temp));
2290
2291 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2292 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->mnc));
2293
2294 cell_info->ext_info[neibor_count].pci = cell->value1;
2295 cell_info->ext_info[neibor_count].pci_valid = 1;
2296
2297 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2298 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2299
2300 cell_info->ext_info[neibor_count].rsrp = cell->value3;
2301 cell_info->ext_info[neibor_count].rsrp_valid = 1;
2302
2303 cell_info->ext_info[neibor_count].rsrq = cell->value4;
2304 cell_info->ext_info[neibor_count].rsrq_valid = 1;
2305
2306 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2307 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2308
2309 cell_info->ext_info[neibor_count].band = cell->value9;
2310 cell_info->ext_info[neibor_count].band_valid = 1;
2311
2312 cell_info->ext_info[neibor_count].rssi = cell->value10;
2313 cell_info->ext_info[neibor_count].rssi_valid = 1;
2314
2315 neibor_count++;
2316 }
2317
2318 default:
2319 break;
2320 }
2321 }
2322 }
2323 list_free(cell_list);
2324
2325 return GSW_HAL_SUCCESS;
2326}
2327
2328/*
2329 * @brief set modem status event callback
2330 @param [in] handle_ptr callback function address
2331 @retval 0: success
2332 @retval 0: other: fail
2333 */
2334int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2335{
2336
2337 if (nw_init_flag == 0 || nw_info_handle == NULL)
2338 {
xy.heb41615b2025-05-28 16:33:20 +08002339 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002340 }
2341
2342 int ret = -1;
2343
2344 if(handle_ptr == NULL)
2345 {
2346 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08002347 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002348 }
2349
2350 modem_cb = handle_ptr;
2351
2352 ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_modem_status_event_callback);
2353 if(ret != 0)
2354 {
2355 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +08002356 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002357 }
2358
2359 return GSW_HAL_SUCCESS;
2360
2361}
2362
2363
2364/*
2365 * @brief get PLMNs from the FPLMN list
2366 * @param [inout] plmn_list:
2367 * @retval 0: success
2368 * @retval other: fail
2369 */
2370int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2371{
2372 if (nw_init_flag == 0 || nw_info_handle == NULL)
2373 {
xy.heb41615b2025-05-28 16:33:20 +08002374 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002375 }
2376
2377 int ret = -1;
2378 char fplmn[256] = {0};
2379 LOGE("mbtk_fplmn_get enter\n");
2380 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2381 LOGE("mbtk_fplmn_get exit\n");
2382 if(ret != 0)
2383 {
2384 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002385 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002386 }
2387
2388 update_fplmn_list(fplmn);
2389 for(int i = 0; i < fplmn_index; i++)
2390 {
2391 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2392 {
2393 continue;
2394 }
2395 extract_mcc_mnc(fplmn_array[i], plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
2396 LOGE("mcc = %s, mnc = %s\n", plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
2397 plmn_list->plmn_list_len++;
2398 }
2399
2400 LOGE("fplmn = %s\n", fplmn);
2401 return GSW_HAL_SUCCESS;
2402}
2403
2404/*
2405 * @brief add PLMNs from the plmn_list to the FPLMN list
2406 * @param [in] plmn_list:
2407 * @retval 0: success
2408 * @retval other: fail
2409 */
2410int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2411{
2412
2413 if (nw_init_flag == 0 || nw_info_handle == NULL)
2414 {
xy.heb41615b2025-05-28 16:33:20 +08002415 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002416 }
2417
2418 if(plmn_list->plmn_list_len >= fplmn_max_length)
2419 {
2420 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002421 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002422 }
2423
2424 int i = 0;
2425 int index = -1;
2426
2427 for(i = 0; i < plmn_list->plmn_list_len; i++)
2428 {
2429 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2430
2431 if(index == -1)
2432 {
2433 LOGE("no this PLMN, add it\n");
2434 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2435 {
2436 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002437 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002438 }
2439
2440 else
2441 {
2442 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2443 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2444 fplmn_array[fplmn_index][5] = '\0';
2445 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2446 fplmn_index++;
2447 }
2448 }
2449
2450 else
2451 {
2452 LOGE("already have this PLMN, don't add it\n");
2453 }
2454 }
2455
2456 char fplmn_str[256] = {0};
2457 convert_plmn_to_fplmn_str(fplmn_str);
2458
2459 LOGE("fplmn_str = %s\n", fplmn_str);
2460
2461 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2462 if(ret != 0)
2463 {
2464 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002465 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002466 }
2467
2468 LOGE("gsw_add_forbidden_networks exit\n");
2469 return GSW_HAL_SUCCESS;
2470}
2471
2472/*
2473 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2474 * @param [in] plmn_list:
2475 * @retval 0: success
2476 * @retval other: fail
2477 */
2478int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2479{
b.liu68a94c92025-05-24 12:53:41 +08002480 if (nw_init_flag == 0 || nw_info_handle == NULL)
2481 {
q.huang72680852025-06-11 13:42:21 +08002482 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002483 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002484 }
2485
2486 int i = 0;
2487 int index = -1;
2488
2489 for(i = 0; i < plmn_list->plmn_list_len; i++)
2490 {
2491 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2492 if(index != -1)
2493 {
2494 remove_fplmn(index);
2495 }
2496 else
2497 {
2498 LOGE("no this PLMN, can't remove it\n");
2499 }
2500 }
2501
2502 for(i = 0; i < fplmn_index; i++)
2503 {
2504 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2505 }
2506
2507 char fplmn_str[256] = {0};
2508 convert_plmn_to_fplmn_str(fplmn_str);
2509 LOGE("fplmn_str = %s\n", fplmn_str);
2510
2511 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2512 if(ret != 0)
2513 {
2514 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002515 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002516 }
2517
2518 LOGE("gsw_remove_forbidden_networks exit\n");
2519 return GSW_HAL_SUCCESS;
2520}
2521
2522/*
2523 * @brief clear FPLMN list
2524 * @param
2525 * @retval 0: success
2526 * @retval other: fail
2527 */
2528int gsw_clear_forbidden_networks(void)
2529{
2530 if (nw_init_flag == 0 || nw_info_handle == NULL)
2531 {
xy.heb41615b2025-05-28 16:33:20 +08002532 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002533 }
2534
2535 char fplmn_str[FPLMN_STRING_LENGTH+1];
2536 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2537 fplmn_str[(6 * fplmn_max_length)] = '\0';
2538
2539 LOGE("%s\n", fplmn_str);
2540 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2541 if(ret != 0)
2542 {
2543 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002544 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002545 }
2546
2547 return GSW_HAL_SUCCESS;
2548}
2549
2550/*
2551 * @brief get oos config
2552 * @param [in] oos_config
2553 * @retval 0: success
2554 * @retval other: fail
2555 */
2556int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2557{
2558 if (nw_init_flag == 0 || nw_info_handle == NULL)
2559 {
xy.heb41615b2025-05-28 16:33:20 +08002560 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002561 }
2562
2563 if(pt_info == NULL)
2564 {
2565 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002566 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002567 }
2568
2569 int ret = -1;
2570
2571 mbtk_oos_info oos_info;
2572 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2573
2574 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2575 if(ret != 0)
2576 {
2577 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002578 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002579 }
2580
2581 if(oos_info.mode == 0)
2582 {
2583 pt_info->t_min = 0;
2584 pt_info->t_step = 0;
2585 pt_info->t_max = 0;
2586 }
2587
2588 else
2589 {
2590 pt_info->t_min = (int)oos_info.oosPhase[0];
2591 pt_info->t_step = (int)oos_info.oosPhase[1];
2592 pt_info->t_max = (int)oos_info.oosPhase[2];
2593 }
2594
2595 return GSW_HAL_SUCCESS;
2596}
2597
2598
2599/*
2600 * @brief set oos config
2601 * @param [in] oos_config
2602 * @retval 0: success
2603 * @retval other: fail
2604 */
2605int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2606{
2607 if (nw_init_flag == 0 || nw_info_handle == NULL)
2608 {
xy.heb41615b2025-05-28 16:33:20 +08002609 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002610 }
2611
2612 if(pt_info == NULL)
2613 {
2614 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002615 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002616 }
2617
2618 int ret = -1;
2619 mbtk_oos_info oos_info;
2620 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2621
2622 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2623 {
2624 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002625 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002626 }
2627 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2628 {
2629 oos_info.mode = 1;
2630 oos_info.oosPhase[0] = pt_info->t_min;
2631 }
2632 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && pt_info->t_max == 0)
2633 {
2634 oos_info.mode = 1;
2635 oos_info.oosPhase[0] = pt_info->t_min;
2636 oos_info.oosPhase[1] = pt_info->t_step;
2637 }
2638 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && (pt_info->t_max > 0 && pt_info->t_max <= 255))
2639 {
2640 oos_info.mode = 1;
2641 oos_info.oosPhase[0] = pt_info->t_min;
2642 oos_info.oosPhase[1] = pt_info->t_step;
2643 oos_info.oosPhase[2] = pt_info->t_max;
2644 }
2645 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2646 {
2647 oos_info.mode = 0;
2648 }
2649 else
2650 {
2651 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002652 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002653 }
2654
2655 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2656 if(ret != 0)
2657 {
2658 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002659 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002660 }
2661
2662 return GSW_HAL_SUCCESS;
2663}
2664
q.huang238b22a2025-06-10 14:36:59 +08002665/**
2666 * @brief get imei function
2667 * @param [in] len imei length,max is 20
2668 * @param [out] imei return imei from this func
2669 * @retval 0: success
2670 * @retval other: fail
2671 */
2672int gsw_get_imei(int len, char *imei)
2673{
2674 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08002675
q.huang238b22a2025-06-10 14:36:59 +08002676 if (nw_init_flag == 0 || nw_info_handle == NULL)
2677 {
2678 printf("nw sdk has been deinit\n");
2679 return GSW_HAL_NORMAL_FAIL;
2680 }
2681
2682 if(imei == NULL)
2683 {
2684 LOGE("imei is NULL.");
2685 return GSW_HAL_ARG_INVALID;
2686 }
2687
2688 if(len < GSW_IMEI_LENGTH)
2689 {
2690 LOGE("imei len is too short,len = %d\n", len);
2691 return GSW_HAL_NORMAL_FAIL;
2692 }
2693
2694 ret = mbtk_imei_get(nw_info_handle, (void *)imei);
2695 if(ret != MBTK_ERR_OK)
2696 {
2697 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2698 return GSW_HAL_NORMAL_FAIL;
2699 }
2700
2701 return GSW_HAL_SUCCESS;
2702}
2703
2704/**
2705 * @brief reset modem stack only, notice: after use this method, all ril sdk
2706 * need restart by app, means network, sim, sms, data need deinit then init!
2707 * @param
2708 * @retval 0: success
2709 * @retval other: fail
2710 */
2711int gsw_reset_modem(void)
2712{
2713 int ret = -1;
2714 if (nw_init_flag == 0 || nw_info_handle == NULL)
2715 {
2716 printf("nw sdk has been deinit\n");
2717 return GSW_HAL_NORMAL_FAIL;
2718 }
2719 mbtk_modem_info_t info;
2720 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2721 info.rst = 0;
2722
2723 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2724 if(ret)
2725 {
2726 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2727 return GSW_HAL_NORMAL_FAIL;
2728 }
2729
2730 sleep(1);
2731
2732 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2733 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2734 if(ret)
2735 {
2736 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2737 return GSW_HAL_NORMAL_FAIL;
2738 }
2739 return GSW_HAL_SUCCESS;
2740}
b.liu68a94c92025-05-24 12:53:41 +08002741