blob: 94a7630c3afacdca6ef42c9007e585a9e084373e [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
q.huangfa0a0a32025-06-12 17:07:23 +080020#define INT_32_MAX (0x7FFFFFFF)
21
q.huang238b22a2025-06-10 14:36:59 +080022
b.liu68a94c92025-05-24 12:53:41 +080023#ifndef FALSE
24#define FALSE (0)
25#endif
26
27
28#ifndef TRUE
29#define TRUE (!FALSE)
30#endif
31
32typedef unsigned int uint32;
33typedef unsigned char uint8;
34typedef unsigned short uint16;
35typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
36
37typedef enum
38{
39 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
40 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
41 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
42 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
43 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
44 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
45}MBTK_DEV_MODEM_FUNCTION;
46
47typedef enum
48{
49 MBTK_CELL_TYPE_GSM = 0,
50 MBTK_CELL_TYPE_UMTS,
51 MBTK_CELL_TYPE_LTE
52} mbtk_cell_type_enum;
53
54typedef struct
55{
56 MBTK_DEV_MODEM_FUNCTION fun;
57 int rst;
58} mbtk_modem_info_t;
59
60typedef struct
61{
62 int client_fd;
63 pthread_t read_thread_id;
64 int exit_fd[2];
65 bool is_waitting;
66 pthread_cond_t cond;
67 pthread_mutex_t mutex;
68
69 pthread_mutex_t send_mutex;
70
71 // Temp response data.
72 uint16 info_err;
73 uint16 data_len;
74 void *data;
75
76 //mbtk wyq for server_ready_status add start
77 char server_ready_status;
78 //mbtk wyq for server_ready_status add end
79
80 mbtk_info_callback_func net_state_cb;
81 mbtk_info_callback_func call_state_cb;
82 mbtk_info_callback_func sms_state_cb;
83 mbtk_info_callback_func radio_state_cb;
84 mbtk_info_callback_func sim_state_cb;
85 mbtk_info_callback_func pdp_state_cb;
86 //add signal by xr
87 mbtk_info_callback_func signal_state_cb;
88} mbtk_info_handle_t;
89
90
91
92typedef struct
93{
94 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
95 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
96 // WCDMA server cell: lac, ci, arfcn
97 // WCDMA cell: lac, ci, arfcn
98 // GSM server cell: lac, ci, arfcn, bsic
99 // GSM cell:
100 uint32 value1;
101 uint32 value2;
102 uint32 value3;
103 uint32 value4;
104 uint32 value5;
q.huangfa0a0a32025-06-12 17:07:23 +0800105 uint32 value6;
b.liu68a94c92025-05-24 12:53:41 +0800106 uint32 value7;
107 uint32 value8;
108 uint32 value9;
109 uint32 value10;
110} __attribute__((packed)) mbtk_cell_info_t;
111
112
113
114
115
116typedef struct
117{
118 uint8 net_pref; // mbtk_net_pref_enum
119 uint16 gsm_band; // mbtk_gsm_band_enum
120 uint16 umts_band; // mbtk_umts_band_enum
121 uint32 tdlte_band; // mbtk_tdlte_band_enum
122 uint32 fddlte_band; // mbtk_fddlte_band_enum
123 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
124} __attribute__((packed)) mbtk_band_info_t;
125
126typedef struct list_arraynode
127{
128 void *data;
129 struct list_arraynode *next;
130} list_arraynode_t;
131
132typedef struct list_treenode
133{
134 list_arraynode_t *data;
135 int count;
136 struct list_treenode *left;
137 struct list_treenode *right;
138} list_treenode_t;
139
140typedef int (*list_sort_func)(void *data1, void *data2);
141typedef void (*list_free_func)(void *data);
142
143typedef struct list_node
144{
145 uint32 size;
146 list_sort_func sort_func;
147 list_free_func free_func;
148
149 uint32 cur_index;
150 list_arraynode_t *cur_array_data;
151
152 list_arraynode_t array_data;
153 list_treenode_t tree_data;
154} list_node_t;
155
156/*
1570: GSM
1581: GSM Compact
1592: UTRAN
1603: GSM w/EGPRS
1614: UTRAN w/HSDPA
1625: UTRAN w/HSUPA
1636: UTRAN w/HSDPA and HSUPA
1647: E-UTRAN
1658: UTRAN HSPA+
166*/
167typedef enum {
168 MBTK_RADIO_TECH_GSM = 0,
169 MBTK_RADIO_TECH_GSM_COMPACT,
170 MBTK_RADIO_TECH_UTRAN,
171 MBTK_RADIO_TECH_GSM_EGPRS,
172 MBTK_RADIO_TECH_UTRAN_HSDPA,
173 MBTK_RADIO_TECH_UTRAN_HSUPA,
174 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
175 MBTK_RADIO_TECH_E_UTRAN, // LTE
176 MBTK_RADIO_TECH_UTRAN_HSPA
177} mbtk_radio_technology_enum;
178
179typedef struct
180{
181 /*
182 0: automatic
183 1: manual
184 */
185 uint8 net_sel_mode;
186 /*
187 0: GSM
188 1: GSM Compact
189 2: UTRAN
190 3: GSM w/EGPRS
191 4: UTRAN w/HSDPA
192 5: UTRAN w/HSUPA
193 6: UTRAN w/HSDPA and HSUPA
194 7: E-UTRAN
195 8: UTRAN HSPA+
196 0xFF: Unused
197 */
198 uint8 net_type;
199 //uint8 plmn[10]; // 46000
200 /*
201 0: unknown
202 1: available
203 2: current
204 3: forbidden
205 */
206 uint8 net_state;
207 uint32 plmn;
208} __attribute__((packed)) mbtk_net_info_t;
209
210
211typedef enum
212{
213 MBTK_NET_REG_STATE_NON = 0,
214 MBTK_NET_REG_STATE_HOME,
215 MBTK_NET_REG_STATE_SEARCHING,
216 MBTK_NET_REG_STATE_DENIED,
217 MBTK_NET_REG_STATE_UNKNOWN,
218 MBTK_NET_REG_STATE_ROAMING,
219 MBTK_NET_REG_STATE_SMS_ONLY,
220 MBTK_NET_REG_STATE_ROAMING_SMS,
221 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
222 MBTK_NET_REG_STATE_CSFB_HOME,
223 MBTK_NET_REG_STATE_CSFB_ROAMING,
224 MBTK_NET_REG_STATE_EMERGENCY_ONLY
225} mbtk_net_reg_state_enum;
226
227typedef struct
228{
229 uint8 call_state;// mbtk_net_reg_state_enum
230 uint8 data_state;// mbtk_net_reg_state_enum
231 uint8 ims_state;// mbtk_net_reg_state_enum
232 uint8 type; // mbtk_radio_technology_enum
233 uint16 lac;
234 uint32 ci;
235} __attribute__((packed)) mbtk_net_reg_info_t;
236
237typedef struct
238{
239 uint8 type; // mbtk_radio_technology_enum
240 uint8 rssi; // 0: 113 dBm or less
241 // 1: 111 dBm
242 // 2��30: 109��53 dBm
243 // 31: 51 dBm or greater
244 // 99: not known or not detectable
245 uint8 rxlev;// 0:rssi < -110 dBm
246 // 1: -110 dBm �� rssi < -109 dBm
247 // 2: -109 dBm �� rssi < -108 dBm
248 // ......
249 // 61: -50 dBm �� rssi < -49 dBm
250 // 62: -49 dBm �� rssi < -48 dBm
251 // 63: -48 dBm �� rssi
252 // 99: not known or not detectable
253 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
254 // 99 not known or not detectable
255 uint8 rscp; // 0: rscp < -120 dBm
256 // 1: -120 dBm �� rscp < -119 dBm
257 // 2: -119 dBm �� rscp < -118 dBm
258 // ......
259 // 94: -27 dBm �� rscp < -26 dBm
260 // 95: -26 dBm �� rscp < -25 dBm
261 // 96: - 25 dBm �� rscp
262 // 255: not known or not detectable
263 uint8 ecno; // 0: Ec/Io < -24 dB
264 // 1: -24 dB �� Ec/Io < -23.5 dB
265 // 2: -23.5 dB �� Ec/Io < -23 dB
266 // ......
267 // 47: -1 dB �� Ec/Io < -0.5 dB
268 // 48: -0.5 dB �� Ec/Io < 0 dB
269 // 49: 0 dB �� Ec/Io
270 // 255: not known or not detectable
271 uint8 rsrq; // 0: rsrq < -19.5 dB
272 // 1: -19.5 dB �� rsrq < -19 dB
273 // 2: -19 dB �� rsrq < -18.5 dB
274 // ......
275 // 32: -4 dB �� rsrq < -3.5 dB
276 // 33: -3.5 dB �� rsrq < -3 dB
277 // 34: -3 dB �� rsrq
278 // 255: not known or not detectable
279 uint8 rsrp; // 0: rsrp < -140 dBm
280 // 1: -140 dBm �� rsrp < -139 dBm
281 // 2: -139 dBm �� rsrp < -138 dBm
282 // ......
283 // 95: -46 dBm �� rsrp < -45 dBm
284 // 96: -45 dBm �� rsrp < -44 dBm
285 // 97: -44 dBm �� rsrp
286 // 255: not known or not detectable
287} __attribute__((packed)) mbtk_signal_info_t;
288
289typedef struct{
290 uint8_t mode;
291 uint32_t oosPhase[3]; //单位为秒
292} mbtk_oos_info;
293
294typedef struct
295{
296 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
297 int t_min;
298 int t_step;
299 int t_max;
300}GSW_NW_OOS_CONFIG_INFO_T;
301
b.liu68a94c92025-05-24 12:53:41 +0800302#define lib_mbtk_path "/lib/libmbtk_lib.so"
303mbtk_info_handle_t* nw_info_handle = NULL;
304
305static GSW_NW_ServingInfoHandlePtr serving_cb;
306static GSW_NW_SigInfoHandlePtr sig_cb;
307static GSW_NW_RejectCauseHandlePtr reject_cb;
308static GSW_NW_ModemStateHandlePtr modem_cb;
309
310static void *dlHandle_mbtk;
311int nw_init_flag = 0;
312int mode = -1;
313int fplmn_max_length = 0;
314
315gsw_nw_plmn_list_t gsw_nw_plmn_list;
316char fplmn_array[FPLMN_ARRAY_SIZE][7];
317int fplmn_index = 0;
318
319static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
320static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
321int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
322int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
323int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
324int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
325static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
326int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
327int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
328int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
329int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
330int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
331int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
332int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
333int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
334int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
335int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
336int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800337int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
338
b.liu68a94c92025-05-24 12:53:41 +0800339
340static void (*mbtk_log)(int level, const char *format, ...);
341static void (*mbtk_log_init)(char *path, char *tag);
342
343#ifndef LOG_ERR_LEVEL
344#define LOG_ERR_LEVEL 3 /* error conditions */
345#endif
346#ifndef LOG_WARN_LEVEL
347#define LOG_WARN_LEVEL 4 /* warning conditions */
348#endif
349#ifndef LOG_INFO_LEVEL
350#define LOG_INFO_LEVEL 6 /* informational */
351#endif
352#ifndef LOG_DEBUG_LEVEL
353#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
354#endif
355#ifndef LOG_VERBOSE_LEVEL
356#define LOG_VERBOSE_LEVEL 8
357#endif
358
l.yang6a42e4d2025-05-28 01:04:20 -0700359#define GSW_NW "[HAL][GSW_NW]"
360
b.liu68a94c92025-05-24 12:53:41 +0800361#define LOGV(fmt, args ...) \
362 do{ \
363 char *file_ptr_1001 = __FILE__; \
364 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
365 char line_1001[10] = {0}; \
366 sprintf(line_1001, "%d", __LINE__); \
367 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
368 if(*ptr_1001 == '/') \
369 break; \
370 ptr_1001--; \
371 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700372 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800373 } while(0)
374
375#define LOGI(fmt, args...) \
376 do{ \
377 char *file_ptr_1001 = __FILE__; \
378 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
379 char line_1001[10] = {0}; \
380 sprintf(line_1001, "%d", __LINE__); \
381 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
382 if(*ptr_1001 == '/') \
383 break; \
384 ptr_1001--; \
385 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700386 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800387 } while(0)
388
389#define LOGD(fmt, args...) \
390 do{ \
391 char *file_ptr_1001 = __FILE__; \
392 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
393 char line_1001[10] = {0}; \
394 sprintf(line_1001, "%d", __LINE__); \
395 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
396 if(*ptr_1001 == '/') \
397 break; \
398 ptr_1001--; \
399 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700400 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800401 } while(0)
402
403#define LOGW(fmt, args...) \
404 do{ \
405 char *file_ptr_1001 = __FILE__; \
406 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
407 char line_1001[10] = {0}; \
408 sprintf(line_1001, "%d", __LINE__); \
409 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
410 if(*ptr_1001 == '/') \
411 break; \
412 ptr_1001--; \
413 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700414 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800415 } while(0)
416
417#define LOGE(fmt, args...) \
418 do{ \
q.huangfa0a0a32025-06-12 17:07:23 +0800419 char *file_ptr_1001 = __FILE__; \
b.liu68a94c92025-05-24 12:53:41 +0800420 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
421 char line_1001[10] = {0}; \
422 sprintf(line_1001, "%d", __LINE__); \
423 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
424 if(*ptr_1001 == '/') \
425 break; \
426 ptr_1001--; \
427 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700428 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800429 } while(0)
430
431
432
433typedef struct
434{
435 char *lynq_operator_l;
436 char *lynq_operator_s;
437 uint32 lynq_mcc_mnc;
438} lynq_operator_mcc_mnc_t;
439
440static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
441{
442 {"China Mobile","CMCC",46000},
443 {"China Unicom","CU",46001},
444 {"China Mobile","CMCC",46002},
445 {"China Telecom","CT",46003},
446 {"China Mobile","CMCC",46004},
447 {"China Telecom","CT",46005},
448 {"China Unicom","CU",46006},
449 {"China Mobile","CMCC",46007},
450 {"China Mobile","CMCC",46008},
451 {"China Unicom","CU",46009},
452 {"China Telecom","CT",46011}
453};
454
455
456//GSW include
457typedef enum prefer_mode
458{
459 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
460 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
461 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
462 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
463 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
464 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
465 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
466 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
467} PREFER_MODE_E;
468
469static int mbtk_nw_api_import()
470{
471 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
472 if (dlHandle_mbtk == NULL)
473 {
xy.heb41615b2025-05-28 16:33:20 +0800474 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800475 }
476
477 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
478 if (mbtk_log_init == NULL)
479 {
xy.heb41615b2025-05-28 16:33:20 +0800480 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800481 }
482
483 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
484 if (mbtk_log == NULL)
485 {
xy.heb41615b2025-05-28 16:33:20 +0800486 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800487 }
488
489 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
490 if (mbtk_info_handle_get == NULL)
491 {
492 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800493 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800494 }
495
496 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
497 if (mbtk_info_handle_free == NULL)
498 {
499 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800500 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800501 }
502
503 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
504 if (mbtk_net_sel_mode_get == NULL)
505 {
506 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800507 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800508 }
509
510 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
511 if (mbtk_net_reg_get == NULL)
512 {
513 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800514 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800515 }
516
517 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
518 if (mbtk_get_modem_fun == NULL)
519 {
520 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800521 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800522 }
523
524 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
525 if (mbtk_set_modem_fun == NULL)
526 {
527 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800528 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800529 }
530
531 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
532 if (mbtk_current_band_get == NULL)
533 {
534 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800535 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800536 }
537
538 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
539 if (mbtk_current_band_set == NULL)
540 {
541 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800542 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800543 }
544
545 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
546 if (mbtk_net_signal_get == NULL)
547 {
548 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800549 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800550 }
551
552 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
553 if (mbtk_wakeup_state_set == NULL)
554 {
555 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800556 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800557 }
558
559 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");
560 if (mbtk_cell_get == NULL)
561 {
562 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800563 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800564 }
565
566 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");
567 if (mbtk_signal_state_change_cb_reg == NULL)
568 {
569 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800570 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800571 }
572
573 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");
574 if (mbtk_net_state_change_cb_reg == NULL)
575 {
576 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800577 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800578 }
579
580 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
581 if (mbtk_fplmn_get == NULL)
582 {
583 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800584 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800585 }
586
587 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
588 if (mbtk_fplmn_set == NULL)
589 {
590 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800591 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800592 }
593
594 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");
595 if (mbtk_radio_state_change_cb_reg == NULL)
596 {
597 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800598 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800599 }
600
601 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
602 if (mbtk_oos_get == NULL)
603 {
604 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800605 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800606 }
607
608 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
609 if (mbtk_oos_set == NULL)
610 {
611 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800612 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800613 }
q.huang238b22a2025-06-10 14:36:59 +0800614
615 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
616 if (mbtk_imei_get == NULL)
617 {
618 LOGE("mbtk_imei_get dlsym fail\n");
619 return GSW_HAL_NORMAL_FAIL;
620 }
b.liu68a94c92025-05-24 12:53:41 +0800621
622 return GSW_HAL_SUCCESS;
623}
624
625void list_first(list_node_t *list)
626{
627 if (list) {
628 list->cur_index = 0;
629 list->cur_array_data = list->array_data.next;
630 }
631}
632
633void* list_next(list_node_t *list)
634{
635 if (list) {
636 list_arraynode_t *node = list->cur_array_data;
637 if (node) {
638 LOGE("node is not null\n");
639 list->cur_array_data = list->cur_array_data->next;
640 list->cur_index++;
641 return node->data;
642 } else {
643 LOGE("node is null\n");
644 return NULL;
645 }
646 } else {
647 LOGE("list is null\n");
648 return NULL;
649 }
650}
651
652void list_free(list_node_t *list)
653{
654 if (list) {
655 list_arraynode_t *node = &(list->array_data); // Head node
656 list_arraynode_t *node_temp = NULL;
657 while (node->next) {
658 node_temp = node->next;
659 node->next = node->next->next;
660
661 if (list->free_func) {
662 list->free_func(node_temp->data);
663 } else {
664 free(node_temp->data);
665 }
666 free(node_temp);
667 }
668 free(list);
669 }
670}
671
q.huangfa0a0a32025-06-12 17:07:23 +0800672static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800673{
q.huangfa0a0a32025-06-12 17:07:23 +0800674 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800675 {
q.huangfa0a0a32025-06-12 17:07:23 +0800676 return 121-rscp; // 96 map 25
677 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800678 }
b.liu68a94c92025-05-24 12:53:41 +0800679 else
680 {
q.huangfa0a0a32025-06-12 17:07:23 +0800681 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800682 }
683}
684
q.huangfa0a0a32025-06-12 17:07:23 +0800685static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800686{
q.huangfa0a0a32025-06-12 17:07:23 +0800687 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800688 {
q.huangfa0a0a32025-06-12 17:07:23 +0800689 return 141-rsrp; // 97 map 44
690 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800691 }
692 else
693 {
q.huangfa0a0a32025-06-12 17:07:23 +0800694 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800695 }
696}
697
q.huangfa0a0a32025-06-12 17:07:23 +0800698static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800699{
q.huangfa0a0a32025-06-12 17:07:23 +0800700 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800701 {
q.huangfa0a0a32025-06-12 17:07:23 +0800702 return (40-rsrq)/2; //=20-rsrq / 2;
703 // 34 map 3
704 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800705 }
706 else
707 {
q.huangfa0a0a32025-06-12 17:07:23 +0800708 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800709 }
710}
711
712
q.huangfa0a0a32025-06-12 17:07:23 +0800713//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
714// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
715// * will be 125.*/
716//uint8 ecno; // 0: Ec/Io < -24 dB
717 // 1: -24 dB �� Ec/Io < -23.5 dB
718 // 2: -23.5 dB �� Ec/Io < -23 dB
719 // ......
720 // 47: -1 dB �� Ec/Io < -0.5 dB
721 // 48: -0.5 dB �� Ec/Io < 0 dB
722 // 49: 0 dB �� Ec/Io
723 // 255: not known or not detectabl
724static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800725{
q.huangfa0a0a32025-06-12 17:07:23 +0800726 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800727 {
q.huangfa0a0a32025-06-12 17:07:23 +0800728 return 245-ecno*5; //49 map 0 db
729 // 1 map 240 db
730 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800731 }
q.huangfa0a0a32025-06-12 17:07:23 +0800732 else
b.liu68a94c92025-05-24 12:53:41 +0800733 {
q.huangfa0a0a32025-06-12 17:07:23 +0800734 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800735 }
736}
737
b.liu68a94c92025-05-24 12:53:41 +0800738
b.liu68a94c92025-05-24 12:53:41 +0800739
q.huangfa0a0a32025-06-12 17:07:23 +0800740/* change realCsq to level */
741static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800742{
q.huangfa0a0a32025-06-12 17:07:23 +0800743
744 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800745 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800746 } else if (rscp <= -95) {
747 return rscp+111; // to 16
748 } else if (rscp >=-93 && rscp <=-90) {
749 return rscp+110; // to 20
750 } else if (rscp >=-89 && rscp <=-59) {
751 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
752 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
753 return 16;
754 } else if(rscp <= -25) {
755 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800756 }
q.huangfa0a0a32025-06-12 17:07:23 +0800757 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800758}
759
q.huangfa0a0a32025-06-12 17:07:23 +0800760static int rsrpToLevel(int rsrp)
761{
762 if (rsrp < -130) {
763 return 0;
764 } else if (rsrp <= -118) {
765 return (rsrp+132)/2; // to 7
766 } else if (rsrp <=-109) {
767 return rsrp+125; // to 16
768 } else if (rsrp <=-103) {
769 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
770 } else if (rsrp <=- 85) {
771 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
772 } else if(rsrp <= -55) {
773 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
774 } else if(rsrp <=-44)
775 {
776 return 31;
777 }
778 return 99;
779}
780
781
782
783
b.liu68a94c92025-05-24 12:53:41 +0800784
785static int convert_reg_state(int reg_state_t)
786{
787 LOGD("reg_state_t = %d\n",reg_state_t);
788 int reg_state = 0;
789
790 switch (reg_state_t)
791 {
792 case MBTK_NET_REG_STATE_NON:
793 {
794 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
795 break;
796 }
797 case MBTK_NET_REG_STATE_HOME:
798 {
799 reg_state = GSW_NETWORK_REG_REGISTERED;
800 break;
801 }
802 case MBTK_NET_REG_STATE_SEARCHING:
803 {
804 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
805 break;
806 }
807 case MBTK_NET_REG_STATE_DENIED:
808 {
809 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
810 break;
811 }
812 case MBTK_NET_REG_STATE_UNKNOWN:
813 {
814 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
815 break;
816 }
817 case MBTK_NET_REG_STATE_ROAMING:
818 {
819 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
820 break;
821 }
822 case MBTK_NET_REG_STATE_SMS_ONLY:
823 case MBTK_NET_REG_STATE_ROAMING_SMS:
824 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
825 case MBTK_NET_REG_STATE_CSFB_HOME:
826 case MBTK_NET_REG_STATE_CSFB_ROAMING:
827 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
828 {
829 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
830 break;
831 }
832 }
833
834 return reg_state;
835}
836
837
838static int convert_net_mode(int net_mode)
839{
840 LOGD("net_mode = %d\n",net_mode);
841 switch(net_mode)
842 {
843 case MBTK_RADIO_TECH_GSM:
844 case MBTK_RADIO_TECH_GSM_COMPACT:
845 case MBTK_RADIO_TECH_GSM_EGPRS:
846 {
847 return GSW_NETWORK_RADIO_GSM;
848 }
849 case MBTK_RADIO_TECH_UTRAN:
850 case MBTK_RADIO_TECH_UTRAN_HSDPA:
851 case MBTK_RADIO_TECH_UTRAN_HSUPA:
852 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
853 case MBTK_RADIO_TECH_UTRAN_HSPA:
854 {
855 return GSW_NETWORK_RADIO_UMTS;
856 }
857 case MBTK_RADIO_TECH_E_UTRAN:
858 {
859 return GSW_NETWORK_RADIO_LTE;
860 }
861
862 default:
863 {
864 return GSW_NETWORK_RADIO_NO_SVC;
865 }
866 }
867
868 return GSW_NETWORK_RADIO_NO_SVC;
869}
870
871static int convert_mbtk_net_config(int config)
872{
873 int net_pref = -1;
874
875 switch(config)
876 {
877 case GSW_PREFER_MODE_GSW:
878 {
879 net_pref = 0;
880 break;
881 }
882
883 case GSW_PREFER_MODE_WCDMA:
884 {
885 net_pref = 1;
886 break;
887 }
888
889 case GSW_PREFER_MODE_WCDMA_GSM:
890 {
891 net_pref = 2;
892 break;
893 }
894
895 case GSW_PREFER_MODE_LTE:
896 case GSW_PREFER_MODE_NR5G:
897 case GSW_PREFER_MODE_NR5G_LTE:
898 {
899 net_pref = 5;
900 break;
901 }
902
903 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
904 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
905 {
906 net_pref = 15;
907 break;
908 }
909 }
910
911 return net_pref;
912}
913
914
915static int convert_gsw_net_config(int config)
916{
917 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +0800918 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +0800919
920 switch (config)
921 {
922 case 0:
923 {
924 net_config = GSW_PREFER_MODE_GSW;
925 break;
926 }
927
928 case 1:
929 {
930 net_config = GSW_PREFER_MODE_WCDMA;
931 break;
932 }
933
934 case 2:
935 {
936 net_config = GSW_PREFER_MODE_WCDMA_GSM;
937 break;
938 }
939
940 case 5:
941 {
942 net_config = GSW_PREFER_MODE_LTE;
943 break;
944 }
945
946 case 15:
947 {
948 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
949 break;
950 }
951 }
952
953 return net_config;
954}
955
956//64F010 -> 46001 (64->46,F0->0,10->01)
957static void transform_fplmn_str_to_plmn(char *entry)
958{
959 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
960 return; //if FFFFFF,means invalid fplmn, do nothing
961 }
962
963 char temp = entry[0];
964 entry[0] = entry[1];
965 entry[1] = temp;
966
967 temp = entry[ENTRY_LENGTH - 2];
968 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
969 entry[ENTRY_LENGTH - 1] = temp;
970
971 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
972
973 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
974
975 //valid fplmn
976 fplmn_index++;
977}
978
979static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
980{
981 strncpy(mcc,entry,3);
982 mcc[3] = '\0';
983 strncpy(mnc,entry + 3,2);
984 mnc[2] = '\0';
985
986 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
987}
988
989
990static void update_fplmn_list(char *fplmn_str)
991{
992 LOGE("fplmn_str = %s\n",fplmn_str);
993 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
994 memset(fplmn_array, 0, sizeof(fplmn_array));
995 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
996 fplmn_index = 0;
997 int array_length = 0;
998
999 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1000
1001 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1002 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1003 temp_fplmn_array[array_length][length] = '\0';
1004 array_length++;
1005 if (i + 6 >= strlen(fplmn_str)) {
1006 break;
1007 }
1008 }
1009
1010 for (int i = 0; i < array_length; i++) {
1011 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1012 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1013 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1014 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1015 }
1016
1017}
1018
1019static void format_plmn(char *result, char *plmn_entry)
1020{
1021 strncpy(result, plmn_entry, strlen(plmn_entry));
1022 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1023
1024 if (strlen(result) >= 2) {
1025 char temp = result[0];
1026 result[0] = result[1];
1027 result[1] = temp;
1028 }
1029
1030 LOGE("1.result = %s\n",result);
1031
1032 if (strlen(result) >= 3) {
1033 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1034 result[2] = 'F';
1035 }
1036
1037 LOGE("2.result = %s\n",result);
1038
1039 if (strlen(result) >= 2) {
1040 char temp = result[strlen(result) - 1];
1041 result[strlen(result) - 1] = result[strlen(result) - 2];
1042 result[strlen(result) - 2] = temp;
1043 }
1044
1045 LOGE("3.result = %s\n",result);
1046}
1047
1048
1049static void convert_plmn_to_fplmn_str(char *fplmn_str)
1050{
1051 char temp_fplmn_str[128] = {0};
1052 char temp[20]; // 临时存储单个格式化后的数字
1053 int index = 0;
1054
1055 for (int i = 0; i < fplmn_index; i++) {
1056 memset(temp, 0x0, sizeof(temp));
1057 format_plmn(temp, fplmn_array[i]);
1058 strcat(temp_fplmn_str, temp);
1059 index += strlen(temp);
1060 }
1061
1062 while(index < (6 * fplmn_max_length))
1063 {
1064 temp_fplmn_str[index++] = 'F';
1065 }
1066
1067 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1068 if (index > (6 * fplmn_max_length)) {
1069 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1070 }
1071
1072 LOGE("%s\n", temp_fplmn_str);
1073 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1074 LOGE("fplmn_str = %s\n", fplmn_str);
1075}
1076
1077static int check_index(char *mcc, char *mnc)
1078{
1079 int i = 0;
1080
1081 for(i = 0; i < fplmn_index; i++)
1082 {
1083 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1084 {
1085 LOGE("index = %d\n", i);
1086 return i;
1087 }
1088 }
1089
1090 LOGE("not find\n");
1091 return -1;
1092}
1093
1094static void remove_fplmn(int index)
1095{
1096 int write_index = 0;
1097 for (int i = 0; i < fplmn_index; i++) {
1098 if (i != index) {
1099 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1100 }
1101 }
1102 fplmn_index--;
1103}
1104
q.huangfa0a0a32025-06-12 17:07:23 +08001105static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1106{
1107 LOGD("signal->type=%d", signal->type);
1108 memset(sig_strength,0,sizeof (signalStrength_t));
1109 switch(signal->type)
1110 {
1111 case MBTK_RADIO_TECH_E_UTRAN:
1112 {
1113 LOGI("rsrp = %d",signal->rsrp);
1114 sig_strength->lte_sig_valid = 1;
1115 sig_strength->rsrp = -rsrp_convert_to_minus_dBm(signal->rsrp);
1116 sig_strength->rsrq = -rsrq_convert_to_minus_dB(signal->rsrq);
1117 sig_strength->rssi =rsrpToLevel(signal->rsrp-141);
1118 sig_strength->rssnr=INT_32_MAX;
1119 break;
1120 }
1121 case MBTK_RADIO_TECH_UTRAN:
1122 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1123 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1124 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1125 case MBTK_RADIO_TECH_UTRAN_HSPA:
1126 {
1127 LOGI("rscp = %d",signal->rscp);
1128 sig_strength->wcdma_sig_valid = 1;
1129 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1130 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
1131 sig_strength->rssi =rscpToLevel(signal->rscp-121);
1132 break;
1133 }
1134 case MBTK_RADIO_TECH_GSM:
1135 case MBTK_RADIO_TECH_GSM_COMPACT:
1136 case MBTK_RADIO_TECH_GSM_EGPRS:
1137 {
1138 LOGI("g rssi = %d",signal->rssi);
1139 sig_strength->gw_sig_valid = 1;
1140 sig_strength->rssi = signal->rssi;
1141 break;
1142 }
1143 default:
1144 {
1145 LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
1146 }
1147 }
1148
1149}
1150
1151
b.liu68a94c92025-05-24 12:53:41 +08001152static void gsw_serving_info_callback_thread()
1153{
1154 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1155 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1156 int ret = -1;
1157 ret = gsw_get_nwinfo(serving_info);
1158 if(ret != 0)
1159 {
1160 LOGE("gsw_get_nwinfo failed\n");
1161 free(serving_info);
1162 return;
1163 }
1164
1165 if(serving_cb)
1166 {
1167 serving_cb(*serving_info);
1168 free(serving_info);
1169 }
1170}
1171
1172static void gsw_serving_info_callback(const void* data, int data_len)
1173{
1174 LOGE("gsw_serving_info_callback start\n");
1175
1176 if(data && data_len > 0)
1177 {
1178 pthread_t thread;
1179 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1180 }
1181
1182 else
1183 {
1184 LOGE("data is NULL\n");
1185 return;
1186 }
1187
1188}
1189
q.huangfa0a0a32025-06-12 17:07:23 +08001190/*typedef struct
1191{
11920 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
11931 uint8 rssi; // 0: 113 dBm or less
1194 // 1: 111 dBm
1195 // 2��30: 109��53 dBm
1196 // 31: 51 dBm or greater
1197 // 99: not known or not detectable
11982 uint8 rxlev;// 0:rssi < -110 dBm
1199 // 1: -110 dBm �� rssi < -109 dBm
1200 // 2: -109 dBm �� rssi < -108 dBm
1201 // ......
1202 // 61: -50 dBm �� rssi < -49 dBm
1203 // 62: -49 dBm �� rssi < -48 dBm
1204 // 63: -48 dBm �� rssi
1205 // 99: not known or not detectable
12063 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
1207 // 99 not known or not detectable
12084 uint8 rscp; // 0: rscp < -120 dBm
1209 // 1: -120 dBm �� rscp < -119 dBm
1210 // 2: -119 dBm �� rscp < -118 dBm
1211 // ......
1212 // 94: -27 dBm �� rscp < -26 dBm
1213 // 95: -26 dBm �� rscp < -25 dBm
1214 // 96: - 25 dBm �� rscp
1215 // 255: not known or not detectable
12165 uint8 ecno; // 0: Ec/Io < -24 dB
1217 // 1: -24 dB �� Ec/Io < -23.5 dB
1218 // 2: -23.5 dB �� Ec/Io < -23 dB
1219 // ......
1220 // 47: -1 dB �� Ec/Io < -0.5 dB
1221 // 48: -0.5 dB �� Ec/Io < 0 dB
1222 // 49: 0 dB �� Ec/Io
1223 // 255: not known or not detectable
12246 uint8 rsrq; // 0: rsrq < -19.5 dB
1225 // 1: -19.5 dB �� rsrq < -19 dB
1226 // 2: -19 dB �� rsrq < -18.5 dB
1227 // ......
1228 // 32: -4 dB �� rsrq < -3.5 dB
1229 // 33: -3.5 dB �� rsrq < -3 dB
1230 // 34: -3 dB �� rsrq
1231 // 255: not known or not detectable
12327 uint8 rsrp; // 0: rsrp < -140 dBm
1233 // 1: -140 dBm �� rsrp < -139 dBm
1234 // 2: -139 dBm �� rsrp < -138 dBm
1235 // ......
1236 // 95: -46 dBm �� rsrp < -45 dBm
1237 // 96: -45 dBm �� rsrp < -44 dBm
1238 // 97: -44 dBm �� rsrp
1239 // 255: not known or not detectable
12408 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
1241 // 1: -43 dB <= ss_rsrq < -42.5 dB
1242 // 2: -42.5 dB <= ss_rsrq < -42 dB
1243 // ......
1244 // 125: 19 dB <= ss_rsrq < 19.5 dB
1245 // 126: 19.5 dB <= ss_rsrq < 20 dB
1246 // 255: not known or not detectable
1247 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1248 // 1: -156 dBm <= ss_rsrp < -155 dBm
1249 // 2: -155 dBm <= ss_rsrp < -154 dBm
1250 // ......
1251 // 125: -32 dBm <= ss_rsrp < -31 dBm
1252 // 126: -31 dBm <= ss_rsrp
1253 // 255: not known or not detectable
1254 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1255 // 1: -23 dB  ss_sinr < -22.5 dB
1256 // 2: -22.5 dB  ss_sinr < -22 dB
1257 // ......
1258 // 125: 39 dB  ss_sinr < 39.5 dBm
1259 // 126: 39.5 dB  ss_sinr < 40 dB
1260 // 127: 40 dB  ss_sinr
1261 // 255: not known or not detectable
1262} __attribute__((packed)) mbtk_signal_info_t;
1263*/
b.liu68a94c92025-05-24 12:53:41 +08001264static void gsw_sig_info_callback(const void* data, int data_len)
1265{
q.huangfa0a0a32025-06-12 17:07:23 +08001266 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001267 {
b.liu68a94c92025-05-24 12:53:41 +08001268 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001269 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1270
b.liu68a94c92025-05-24 12:53:41 +08001271 if(sig_cb != NULL)
1272 {
1273 sig_cb(sig_strength);
1274 }
1275 }
b.liu68a94c92025-05-24 12:53:41 +08001276 else
1277 {
q.huangfa0a0a32025-06-12 17:07:23 +08001278 LOGE("data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001279 }
1280}
1281
1282static void gsw_modem_status_event_callback(const void* data, int data_len)
1283{
1284 LOGE("gsw_modem_status_event_callback start\n");
1285
1286 gsw_mode_state_e state = GSW_MODEM_STATE_UNKNOWN;
1287
1288 if(data && data_len > 0)
1289 {
1290 uint8 *net_data = (uint8*)data;
1291 LOGE("gsw_modem_status_event_callback,data = %d\n", *net_data);
1292 if(*net_data == 1)
1293 {
1294 state = GSW_MODEM_STATE_ONLINE;
1295 }
1296 else if(*net_data == 0)
1297 {
1298 state = GSW_MODEM_STATE_OFFLINE;
1299 }
1300
1301 if(modem_cb != NULL)
1302 {
1303 modem_cb(state);
1304 }
1305 }
1306
1307}
1308
1309static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1310{
1311 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1312
1313 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1314 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1315
1316 rej_cause->rej_cause = cause;
1317 rej_cause->rej_rat = rat;
1318 rej_cause->rej_domain = domain;
1319
1320 if(reject_cb != NULL)
1321 {
1322 LOGE("reject_cb is not NULL\n");
1323 reject_cb(rej_cause);
1324 }
1325 else
1326 {
1327 LOGE("reject_cb is NULL\n");
1328 }
1329
1330 free(rej_cause);
1331 LOGE("gsw_reject_callback end\n");
1332}
1333
xy.hec89938f2025-05-29 14:08:47 +08001334void gsw_sig_info_timer()
1335{
xy.hec89938f2025-05-29 14:08:47 +08001336 if(nw_init_flag == 0 || nw_info_handle == NULL)
1337 {
1338 return;
1339 }
1340
1341 mbtk_signal_info_t signal;
1342 signalStrength_t sig_strength;
1343
1344 while(nw_init_flag)
1345 {
q.huangfa0a0a32025-06-12 17:07:23 +08001346 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001347 if(ret != 0)
1348 {
q.huangfa0a0a32025-06-12 17:07:23 +08001349 LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
xy.hec89938f2025-05-29 14:08:47 +08001350 }
1351
1352 else
1353 {
q.huangfa0a0a32025-06-12 17:07:23 +08001354 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
1355
xy.hec89938f2025-05-29 14:08:47 +08001356 }
1357
1358 if(sig_cb != NULL)
1359 {
1360 sig_cb(sig_strength);
1361 }
1362
1363 sleep(SIG_TIMER);
1364 }
1365}
1366
b.liu68a94c92025-05-24 12:53:41 +08001367
1368/**
1369 * @brief SDK interface to call back serving info
1370 * @param [in] handle_ptr
1371 * @retval 0: success
1372 * @retval other: fail
1373 */
1374int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1375{
1376 if (nw_init_flag == 0 || nw_info_handle == NULL)
1377 {
xy.heb41615b2025-05-28 16:33:20 +08001378 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001379 }
1380
1381 if(handle_ptr == NULL)
1382 {
1383 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001384 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001385 }
1386
1387 serving_cb = handle_ptr;
1388
1389 return GSW_HAL_SUCCESS;
1390
1391}
1392
1393
1394/**
1395 * @brief SDK interface to call back sig info
1396 * @param [in] handle_ptr
1397 * @retval 0: success
1398 * @retval other: fail
1399 */
1400int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1401{
1402 if (nw_init_flag == 0 || nw_info_handle == NULL)
1403 {
xy.heb41615b2025-05-28 16:33:20 +08001404 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001405 }
1406
1407 if(handle_ptr == NULL)
1408 {
1409 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001410 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001411 }
1412
1413 sig_cb = handle_ptr;
1414
1415 return GSW_HAL_SUCCESS;
1416
1417}
1418
1419
1420/**
1421 * @brief SDK interface to call back rej cause
1422 * @param [in] handle_ptr
1423 * @retval 0: success
1424 * @retval other: fail
1425 */
1426int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1427{
1428 if (nw_init_flag == 0 || nw_info_handle == NULL)
1429 {
xy.heb41615b2025-05-28 16:33:20 +08001430 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001431 }
1432
1433 if(handle_ptr == NULL)
1434 {
1435 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001436 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001437 }
1438
1439 reject_cb = handle_ptr;
1440
1441 return GSW_HAL_SUCCESS;
1442}
1443
1444
1445/**
1446 * @brief network sdk init
1447 * @param [in] token usr id define by who use
1448 * @retval 0: success
1449 * @retval other: fail
1450 */
1451int gsw_nw_sdk_init(int token)
1452{
1453 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001454 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001455
1456 if (nw_init_flag == 1 && nw_info_handle != NULL)
1457 {
1458 return GSW_HAL_SUCCESS;
1459 }
1460
1461 ret = mbtk_nw_api_import();
1462 if (ret != 0)
1463 {
1464 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001465 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001466 }
1467
1468 nw_info_handle = mbtk_info_handle_get();
1469
1470 if (nw_info_handle == NULL)
1471 {
1472 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001473 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001474 }
1475
1476 char fplmn[256] = {0};
1477 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1478 if(ret != 0)
1479 {
1480 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001481 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001482 }
1483 fplmn_max_length = (strlen(fplmn)/6);
1484 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1485 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1486
1487 if (ret != 0)
1488 {
1489 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001490 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001491 }
1492
1493 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1494 if (ret != 0)
1495 {
1496 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001497 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001498 }
1499
xy.hec89938f2025-05-29 14:08:47 +08001500 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1501 if (ret != 0)
1502 {
1503 LOGE("pthread_create fail\n");
1504 return GSW_HAL_NORMAL_FAIL;
1505 }
1506
b.liu68a94c92025-05-24 12:53:41 +08001507 nw_init_flag = 1;
1508
1509 return GSW_HAL_SUCCESS;
1510}
1511
1512
1513/**
1514 * @brief network sdk deinit
1515 * @param
1516 * @retval 0: success
1517 * @retval other: fail
1518 */
1519int gsw_nw_sdk_deinit(void)
1520{
1521 int ret = -1;
1522
1523 if (nw_init_flag == 0 || nw_info_handle == NULL)
1524 {
xy.heb41615b2025-05-28 16:33:20 +08001525 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001526 }
1527
1528 ret = mbtk_info_handle_free(&nw_info_handle);
1529 if(ret != GSW_HAL_SUCCESS)
1530 {
1531 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001532 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001533 }
1534
1535 dlclose(dlHandle_mbtk);
1536 nw_info_handle = NULL;
1537 nw_init_flag = 0;
1538
1539 return GSW_HAL_SUCCESS;
1540
1541}
1542
1543
1544/**
1545 * @brief get current network reg info
1546 * @param [out] serving_info struct for network info
1547 * include regstate ps_state opreator name mcc mcn etc
1548 * @retval 0: success
1549 * @retval other: fail
1550 */
1551int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1552{
1553
1554 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001555 if (nw_init_flag == 0 || nw_info_handle == NULL)
1556 {
q.huang238b22a2025-06-10 14:36:59 +08001557 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001558 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001559 }
1560
1561 LOGE("mbtk_net_reg_get start \n");
1562 //regstate
1563 mbtk_net_reg_info_t reg;
1564 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1565 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1566 if(ret)
1567 {
1568 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001569 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001570 }
1571
1572 LOGE("convert_cs_reg_state\n");
1573 //cs_state
1574 serving_info->reg_state = convert_reg_state(reg.call_state);
1575 LOGE("convert_ps_reg_state\n");
1576 //ps_state
1577 serving_info->ps_state = convert_reg_state(reg.data_state);
1578 LOGE("convert_rat_mode\n");
1579 //reg_rat
1580 serving_info->reg_rat = convert_net_mode(reg.type);
1581 //srv_domain
1582 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1583 {
1584 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1585 {
1586 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1587 }
1588
1589 else
1590 {
1591 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1592 }
1593 }
1594
1595 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1596 {
1597 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1598 }
1599
1600 else
1601 {
1602 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1603 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1604 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1605 }
1606
1607 LOGD("roaming_ind\n");
1608 //roaming_ind
1609 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1610 {
1611 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1612 }
1613 else
1614 {
1615 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1616 }
1617
1618 LOGD("reject\n");
1619 //reject
1620 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1621 {
1622 LOGD("reject_callback\n");
1623 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1624 }
1625
1626 LOGD("reg_plmn / operator name\n");
1627 //reg_plmn / operator name
1628 mbtk_net_info_t net;
1629 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1630 LOGD("mbtk_net_sel_mode_get start \n");
1631 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1632 LOGD("mbtk_net_sel_mode_get end \n");
1633 if(ret == 0 && net.plmn > 0)
1634 {
1635 int i = 0;
1636
1637 LOGD("start to find mcc");
1638 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1639 {
1640 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1641 {
1642 LOGD("find mcc\n");
1643 break;
1644 }
1645 i++;
1646 }
1647
1648
1649 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1650 {
1651 LOGD("not find mcc");
1652 strcpy(serving_info->operator_name, "unknown");
1653 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1654 }
1655
1656 else
1657 {
1658 LOGD("find mcc\n");
1659 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1660 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1661 }
1662
1663 LOGE("operator_name = %s\n", serving_info->operator_name);
1664 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1665 }
1666
1667
1668 LOGD("get cell id/tac/lac/sid/nid\n");
1669 //cell id/tac/lac/sid/nid
1670 mbtk_cell_type_enum cell_type;
1671 if(serving_info->reg_rat == GSW_NETWORK_RADIO_GSM)
1672 {
1673 cell_type = MBTK_CELL_TYPE_GSM;
1674 }
1675 else if(serving_info->reg_rat == GSW_NETWORK_RADIO_UMTS)
1676 {
1677 cell_type = MBTK_CELL_TYPE_UMTS;
1678 }
1679 else
1680 {
1681 cell_type = MBTK_CELL_TYPE_LTE;
1682 }
1683
1684 list_node_t* cell_list = NULL;
1685
1686 LOGD("mbtk_cell_get start\n");
1687 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1688 if(ret != 0 || cell_list == NULL)
1689 {
1690 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001691 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001692 }
1693 else
1694 {
1695 LOGE("mbtk_cell_get end,start to get node\n");
1696 list_first(cell_list);
1697 LOGE("list_first end\n");
1698 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1699 if(cell)
1700 {
1701 LOGE("cell is not null,value2 = %u\n",cell->value2);
1702 switch(cell_type)
1703 {
1704 case MBTK_CELL_TYPE_LTE:
1705 {
1706 LOGE("is lte\n");
1707 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1708 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1709 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1710 strcpy(serving_info->lac,"");
1711 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value8);
1712 break;
1713 }
1714
1715 case MBTK_CELL_TYPE_GSM:
1716 {
1717 LOGE("is gsm\n");
1718 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1719 sprintf(serving_info->lac,"%d",cell->value1);
1720 memset(serving_info->tac,0,sizeof(serving_info->tac));
1721 sprintf(serving_info->cell_id,"%d",cell->value2);
1722 break;
1723 }
1724 case MBTK_CELL_TYPE_UMTS:
1725 {
1726 LOGE("is wcdma\n");
1727 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1728 sprintf(serving_info->lac,"%d",cell->value1);
1729 memset(serving_info->tac,0,sizeof(serving_info->tac));
1730 sprintf(serving_info->cell_id,"%d",cell->value2);
1731 break;
1732 }
1733
1734 default:
1735 break;
1736 }
1737 }
1738 else
1739 {
1740 LOGE("cell is null\n");
1741 }
1742 }
1743
1744 //not support now
1745 serving_info->sid = 0;
1746 serving_info->nid = 0;
1747
1748 return GSW_HAL_SUCCESS;
1749}
1750
1751
1752/**
1753 * @brief get current network type
1754 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1755 * @retval 0: success
1756 * @retval other: fail
1757 */
1758int gsw_get_netype(int *netype)
1759{
1760 int ret = -1;
1761
1762 if (nw_init_flag == 0 || nw_info_handle == NULL)
1763 {
xy.heb41615b2025-05-28 16:33:20 +08001764 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001765 }
1766
1767 //regstate
1768 mbtk_net_reg_info_t reg;
1769 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1770 if(ret)
1771 {
1772 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001773 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001774 }
1775
1776 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1777 {
1778 *netype = convert_net_mode(reg.type);
1779 }
1780 else
1781 {
1782 *netype = GSW_NETWORK_RADIO_NO_SVC;
1783 }
1784
1785 return GSW_HAL_SUCCESS;
1786}
1787
1788
1789/**
1790 * @brief get radio opmode, as open and close airplane mode
1791 * @param [out] op_mode 1 is radio on, 0 is radio off
1792 * @retval 0: success
1793 * @retval other: fail
1794 */
1795int gsw_get_opmode(int *op_mode)
1796{
1797 int tmp_rf = -1;
1798 int ret = -1;
1799 if (nw_init_flag == 0 || nw_info_handle == NULL)
1800 {
xy.heb41615b2025-05-28 16:33:20 +08001801 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001802 }
1803
1804 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1805 if (ret != 0)
1806 {
1807 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001808 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001809 }
1810 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1811 {
1812 *op_mode = GSW_OP_MODE_LPM;
1813 }
1814
1815 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1816 {
1817 *op_mode = GSW_OP_MODE_OFFLINE;
1818 }
1819
1820 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1821 {
1822 *op_mode = GSW_OP_MODE_ONLINE;
1823 }
1824
1825 return GSW_HAL_SUCCESS;
1826}
1827
1828
1829
1830/**
1831 * @brief set radio opmode, as open and close airplane mode
1832 * @param [in] op_mode 1 is radio on, 0 is radio off
1833 * @retval 0: success
1834 * @retval other: fail
1835 */
1836int gsw_set_opmode(int op_mode)
1837{
1838 mbtk_modem_info_t info;
1839 int rf_mode = -1;
1840 int ret = -1;
1841
1842 if (nw_init_flag == 0 || nw_info_handle == NULL)
1843 {
xy.heb41615b2025-05-28 16:33:20 +08001844 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001845 }
1846
1847 if(op_mode == GSW_OP_MODE_LPM)
1848 {
1849 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1850 }
1851
1852 if(op_mode == GSW_OP_MODE_ONLINE)
1853 {
1854 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1855 }
1856
1857 if(op_mode == GSW_OP_MODE_OFFLINE)
1858 {
1859 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1860 }
1861
1862 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1863 {
1864 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001865 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001866 }
1867
1868 info.fun = rf_mode;
1869 info.rst = 0;
1870 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1871 if (ret != 0)
1872 {
1873 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001874 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001875 }
1876
1877 return GSW_HAL_SUCCESS;
1878
1879}
1880
1881
1882/**
1883 * @brief get network mode preference of mdm search network scale
1884 * @param [out] mode_pref net_work pref mode:
1885 * enum prefer_mode
1886 * @retval 0: success
1887 * @retval other: fail
1888 */
1889int gsw_get_mode_preference(int *mode_pref)
1890{
1891 if (nw_init_flag == 0 || nw_info_handle == NULL)
1892 {
xy.heb41615b2025-05-28 16:33:20 +08001893 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001894 }
1895
1896 int ret = -1;
1897 mbtk_band_info_t band;
1898 memset(&band, 0, sizeof(mbtk_band_info_t));
1899
1900 ret = mbtk_current_band_get(nw_info_handle, &band);
1901 if(ret != 0)
1902 {
1903 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001904 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001905 }
1906
1907 *mode_pref = convert_gsw_net_config(band.net_pref);
1908 LOGE("band.net_pref = %d\n", *mode_pref);
1909 if(*mode_pref <= 0)
1910 {
1911 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001912 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001913 }
1914 return GSW_HAL_SUCCESS;
1915
1916
1917}
1918
1919/**
1920 * @brief set network mode preference of mdm search network scale
1921 * @param [in] mode_pref net_work pref mode:
1922 * enum prefer_mode
1923 * @retval 0: success
1924 * @retval other: fail
1925 */
1926int gsw_set_mode_preference(int mode_pref)
1927{
1928 if (nw_init_flag == 0 || nw_info_handle == NULL)
1929 {
xy.heb41615b2025-05-28 16:33:20 +08001930 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001931 }
1932
1933 int ret = -1;
1934
1935 mbtk_band_info_t band;
1936 memset(&band, 0, sizeof(mbtk_band_info_t));
1937
1938 band.net_pref = convert_mbtk_net_config(mode_pref);
1939 LOGE("band.net_pref = %d\n", band.net_pref);
1940
1941 if(band.net_pref < 0)
1942 {
1943 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001944 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001945 }
1946
1947 ret = mbtk_current_band_set(nw_info_handle, &band);
1948 if(ret != 0)
1949 {
1950 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001951 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001952 }
1953
1954 return GSW_HAL_SUCCESS;
1955}
1956
1957/**
1958 * @brief get signal csq value
1959 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
1960 * @retval 0: success
1961 * @retval other: fail
1962 */
1963int gsw_get_sig_info(int *csq_value)
1964{
b.liu68a94c92025-05-24 12:53:41 +08001965 if (nw_init_flag == 0 || nw_info_handle == NULL)
1966 {
xy.heb41615b2025-05-28 16:33:20 +08001967 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001968 }
1969
1970 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08001971 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08001972 if(ret != 0)
1973 {
1974 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001975 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001976 }
1977
1978 LOGD("signal.type=%d\n", signal.type);
1979 switch(signal.type)
1980 {
q.huangfa0a0a32025-06-12 17:07:23 +08001981
b.liu68a94c92025-05-24 12:53:41 +08001982 case MBTK_RADIO_TECH_E_UTRAN:
1983 {
q.huangfa0a0a32025-06-12 17:07:23 +08001984 LOGD("lte rsrp = %d dbm",signal.rsrp-141);
1985 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08001986 break;
1987 }
1988 case MBTK_RADIO_TECH_UTRAN:
1989 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1990 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1991 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1992 case MBTK_RADIO_TECH_UTRAN_HSPA:
1993 {
q.huangfa0a0a32025-06-12 17:07:23 +08001994 LOGD("w rscp = %d dbm",signal.rscp-121);
1995 *csq_value = rscpToLevel(signal.rscp-121);
1996 break;
1997 }
1998 case MBTK_RADIO_TECH_GSM:
1999 case MBTK_RADIO_TECH_GSM_COMPACT:
2000 case MBTK_RADIO_TECH_GSM_EGPRS:
2001 {
2002 LOGD("gsm rssi = %d (0-31)",signal.rssi);
2003 *csq_value = signal.rssi;
b.liu68a94c92025-05-24 12:53:41 +08002004 break;
2005 }
2006 default:
2007 {
q.huangfa0a0a32025-06-12 17:07:23 +08002008 LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002009 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002010 }
2011 }
2012 return GSW_HAL_SUCCESS;
2013}
2014
2015/**
2016 * @brief set nework power mode, for tcam enter standby or exit standby
2017 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2018 * @retval 0: success
2019 * @retval other: fail
2020 */
2021int gsw_network_set_power_mode(char mode)
2022{
2023 int ret = -1;
2024
2025 if (nw_init_flag == 0 || nw_info_handle == NULL)
2026 {
xy.heb41615b2025-05-28 16:33:20 +08002027 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002028 }
2029
2030 if(mode != 0 && mode != 1)
2031 {
2032 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002033 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002034 }
2035
2036 if(mode == 1)
2037 {
2038 mode = 6;
2039 }
2040
2041 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
2042 if(ret != 0)
2043 {
2044 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002045 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002046 }
2047
2048 return GSW_HAL_SUCCESS;
2049
2050
2051
2052}
2053
2054/**
2055 * @brief convert rsrp rscp rssi to csq value.
2056 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2057 * @param [in] sigvalue input signal_strength for different nettype
2058 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2059
2060 * @retval csq
2061 * @retval other: fail
2062 */
2063int gsw_sigInfo_to_csq(int netType, int sigValue)
2064{
q.huang238b22a2025-06-10 14:36:59 +08002065 if (nw_init_flag == 0 || nw_info_handle == NULL)
2066 {
2067 return GSW_HAL_NORMAL_FAIL;
2068 }
b.liu68a94c92025-05-24 12:53:41 +08002069 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002070 {
2071 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002072 {
q.huangfa0a0a32025-06-12 17:07:23 +08002073 return rsrpToLevel(sigValue);
2074 }
2075 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002076 {
q.huangfa0a0a32025-06-12 17:07:23 +08002077 return rscpToLevel(sigValue);
2078 }
2079 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002080 {
q.huangfa0a0a32025-06-12 17:07:23 +08002081 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002082 }
2083
2084 default:
2085 {
2086 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002087 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002088 }
2089 }
2090}
2091
2092/*
2093 * @brief get mobile operator name
2094 @param [out] nw_operator_name_infos get the long and short operator name info
2095 @retval 0: success
2096 @retval 0: other: fail
2097 */
2098int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2099{
2100 char OperatorFN[128];
2101 char OperatorSH[128];
2102 char temp[12] = {0};
2103 mbtk_net_info_t net;
2104
2105 if (nw_init_flag == 0 || nw_info_handle == NULL)
2106 {
xy.heb41615b2025-05-28 16:33:20 +08002107 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002108 }
2109
2110 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2111 {
2112 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2113 int i = 0;
2114 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2115 {
2116 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2117 break;
2118 i++;
2119 }
2120
2121 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2122 {
2123 strcpy(OperatorFN, "UNKNOWN");
2124 strcpy(OperatorSH, "UNKNOWN");
2125 }
2126 else
2127 {
2128 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2129 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2130
2131 memset(temp,0,12);
2132 memset(nw_operator_name_infos->mcc,0,4);
2133 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
2134 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2135
2136 memset(temp,0,12);
2137 memset(nw_operator_name_infos->mnc,0,4);
2138 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2139 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2140 }
2141
2142 memset(nw_operator_name_infos->long_eons,0,128);
2143 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2144 memset(nw_operator_name_infos->short_eons,0,128);
2145 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2146
2147 return GSW_HAL_SUCCESS;
2148 }
2149
2150 else
2151 {
2152 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002153 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002154 }
2155
2156 return GSW_HAL_SUCCESS;
2157}
2158
2159
2160/*
2161 * @brief get current serving cell info
2162 * @param cell_info: [out] struct for current cell info
2163 * include earfcn mcc mnc pci psc tac lac etc.
2164 * @return int: 0 is success, other failed
2165 */
2166int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2167{
2168 int ret = -1;
2169
2170 if (nw_init_flag == 0 || nw_info_handle == NULL)
2171 {
q.huang238b22a2025-06-10 14:36:59 +08002172 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002173 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002174 }
2175
2176 list_node_t* cell_list = NULL;
2177 int neibor_count = 0;
2178 mbtk_cell_type_enum type;
2179 ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
2180 if(ret || cell_list == NULL) {
2181 LOGE("mbtk_cell_get failed : %d\n", ret);
2182 } else {
2183 list_first(cell_list);
2184 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2185 if(cell) { // Current server cell.
2186 switch(type)
2187 {
2188 case 0:
2189 {
2190 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2191 char gsm_temp[12] = {0};
2192
2193 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2194
2195 cell_info->mcc_valid = 1;
2196 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);
2197 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2198
2199 memset(gsm_temp, 0, sizeof(gsm_temp));
2200
2201 cell_info->mnc_valid = 1;
2202 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);
2203 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2204
2205 cell_info->cell_id_valid = 1;
2206 cell_info->cell_id = cell->value2;
2207
2208 cell_info->lac_valid = 1;
2209 cell_info->lac = cell->value1;
2210
2211 cell_info->arfcn_valid = 1;
2212 cell_info->arfcn = cell->value3;
2213
2214 break;
2215 }
2216
2217 case 1:
2218 {
2219 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2220 char wcdma_temp[12] = {0};
2221
2222 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2223
2224 cell_info->mcc_valid = 1;
2225 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);
2226 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2227
2228 memset(wcdma_temp, 0, sizeof(wcdma_temp));
2229
2230 cell_info->mnc_valid = 1;
2231 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);
2232 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2233
2234 cell_info->lac_valid = 1;
2235 cell_info->lac = cell->value1;
2236
2237 cell_info->cell_id_valid = 1;
2238 cell_info->cell_id = cell->value2;
2239
2240 cell_info->uarfcn_valid = 1;
2241 cell_info->uarfcn = cell->value3;
2242
2243 cell_info->psc_valid = 1;
2244 cell_info->psc = cell->value6;
2245 break;
2246 }
2247
2248 case 2:
2249 {
2250 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
2251
2252 char lte_temp[12] = {0};
2253
2254 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2255
2256 cell_info->mcc_valid = 1;
2257 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2258 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2259
2260 memset(lte_temp, 0, sizeof(lte_temp));
2261
2262 cell_info->mnc_valid = 1;
2263 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2264 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2265
2266 cell_info->tac_valid = 1;
2267 cell_info->tac = cell->value1;
2268
2269 cell_info->pci_valid = 1;
2270 cell_info->pci = cell->value2;
2271
2272 cell_info->earfcn_valid = 1;
2273 cell_info->earfcn = cell->value3;
2274
2275 cell_info->bler_valid = 1;
2276 cell_info->bler = cell->value4;
2277
2278 cell_info->band_valid = 1;
2279 cell_info->band = cell->value5;
2280
2281 cell_info->rsrp_valid = 1;
2282 cell_info->rsrp = cell->value8;
2283
2284 cell_info->rsrq_valid = 1;
2285 cell_info->rsrq = cell->value9;
2286
2287 cell_info->cell_id_valid = 1;
2288 cell_info->cell_id = cell->value10;
2289
2290 break;
2291 }
2292
2293 default:
2294 break;
2295 }
2296 }
2297
2298 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2299 {
2300 switch(type)
2301 {
2302 //GSM
2303 case 0:
2304 {
2305
2306 }
2307 //WCDMA
2308 case 1:
2309 {
2310 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2311
2312 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2313
2314 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2315 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2316
2317 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2318 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2319
2320 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2321
2322 neibor_count++;
2323
2324 }
2325 //LTE
2326 case 2:
2327 {
2328 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2329 char lte_temp[12] = {0};
2330 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2331
2332 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2333 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->mcc));
2334
2335 memset(lte_temp, 0, sizeof(lte_temp));
2336
2337 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2338 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->mnc));
2339
2340 cell_info->ext_info[neibor_count].pci = cell->value1;
2341 cell_info->ext_info[neibor_count].pci_valid = 1;
2342
2343 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2344 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2345
2346 cell_info->ext_info[neibor_count].rsrp = cell->value3;
2347 cell_info->ext_info[neibor_count].rsrp_valid = 1;
2348
2349 cell_info->ext_info[neibor_count].rsrq = cell->value4;
2350 cell_info->ext_info[neibor_count].rsrq_valid = 1;
2351
2352 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2353 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2354
2355 cell_info->ext_info[neibor_count].band = cell->value9;
2356 cell_info->ext_info[neibor_count].band_valid = 1;
2357
2358 cell_info->ext_info[neibor_count].rssi = cell->value10;
2359 cell_info->ext_info[neibor_count].rssi_valid = 1;
2360
2361 neibor_count++;
2362 }
2363
2364 default:
2365 break;
2366 }
2367 }
2368 }
2369 list_free(cell_list);
2370
2371 return GSW_HAL_SUCCESS;
2372}
2373
2374/*
2375 * @brief set modem status event callback
2376 @param [in] handle_ptr callback function address
2377 @retval 0: success
2378 @retval 0: other: fail
2379 */
2380int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2381{
2382
2383 if (nw_init_flag == 0 || nw_info_handle == NULL)
2384 {
xy.heb41615b2025-05-28 16:33:20 +08002385 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002386 }
2387
2388 int ret = -1;
2389
2390 if(handle_ptr == NULL)
2391 {
2392 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08002393 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002394 }
2395
2396 modem_cb = handle_ptr;
2397
2398 ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_modem_status_event_callback);
2399 if(ret != 0)
2400 {
2401 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +08002402 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002403 }
2404
2405 return GSW_HAL_SUCCESS;
2406
2407}
2408
2409
2410/*
2411 * @brief get PLMNs from the FPLMN list
2412 * @param [inout] plmn_list:
2413 * @retval 0: success
2414 * @retval other: fail
2415 */
2416int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2417{
2418 if (nw_init_flag == 0 || nw_info_handle == NULL)
2419 {
xy.heb41615b2025-05-28 16:33:20 +08002420 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002421 }
2422
2423 int ret = -1;
2424 char fplmn[256] = {0};
2425 LOGE("mbtk_fplmn_get enter\n");
2426 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2427 LOGE("mbtk_fplmn_get exit\n");
2428 if(ret != 0)
2429 {
2430 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002431 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002432 }
2433
2434 update_fplmn_list(fplmn);
2435 for(int i = 0; i < fplmn_index; i++)
2436 {
2437 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2438 {
2439 continue;
2440 }
2441 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);
2442 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);
2443 plmn_list->plmn_list_len++;
2444 }
2445
2446 LOGE("fplmn = %s\n", fplmn);
2447 return GSW_HAL_SUCCESS;
2448}
2449
2450/*
2451 * @brief add PLMNs from the plmn_list to the FPLMN list
2452 * @param [in] plmn_list:
2453 * @retval 0: success
2454 * @retval other: fail
2455 */
2456int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2457{
2458
2459 if (nw_init_flag == 0 || nw_info_handle == NULL)
2460 {
xy.heb41615b2025-05-28 16:33:20 +08002461 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002462 }
2463
2464 if(plmn_list->plmn_list_len >= fplmn_max_length)
2465 {
2466 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002467 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002468 }
2469
2470 int i = 0;
2471 int index = -1;
2472
2473 for(i = 0; i < plmn_list->plmn_list_len; i++)
2474 {
2475 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2476
2477 if(index == -1)
2478 {
2479 LOGE("no this PLMN, add it\n");
2480 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2481 {
2482 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002483 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002484 }
2485
2486 else
2487 {
2488 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2489 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2490 fplmn_array[fplmn_index][5] = '\0';
2491 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2492 fplmn_index++;
2493 }
2494 }
2495
2496 else
2497 {
2498 LOGE("already have this PLMN, don't add it\n");
2499 }
2500 }
2501
2502 char fplmn_str[256] = {0};
2503 convert_plmn_to_fplmn_str(fplmn_str);
2504
2505 LOGE("fplmn_str = %s\n", fplmn_str);
2506
2507 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2508 if(ret != 0)
2509 {
2510 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002511 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002512 }
2513
2514 LOGE("gsw_add_forbidden_networks exit\n");
2515 return GSW_HAL_SUCCESS;
2516}
2517
2518/*
2519 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2520 * @param [in] plmn_list:
2521 * @retval 0: success
2522 * @retval other: fail
2523 */
2524int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2525{
b.liu68a94c92025-05-24 12:53:41 +08002526 if (nw_init_flag == 0 || nw_info_handle == NULL)
2527 {
q.huangfa0a0a32025-06-12 17:07:23 +08002528 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002529 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002530 }
2531
2532 int i = 0;
2533 int index = -1;
2534
2535 for(i = 0; i < plmn_list->plmn_list_len; i++)
2536 {
2537 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2538 if(index != -1)
2539 {
2540 remove_fplmn(index);
2541 }
2542 else
2543 {
2544 LOGE("no this PLMN, can't remove it\n");
2545 }
2546 }
2547
2548 for(i = 0; i < fplmn_index; i++)
2549 {
2550 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2551 }
2552
2553 char fplmn_str[256] = {0};
2554 convert_plmn_to_fplmn_str(fplmn_str);
2555 LOGE("fplmn_str = %s\n", fplmn_str);
2556
2557 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2558 if(ret != 0)
2559 {
2560 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002561 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002562 }
2563
2564 LOGE("gsw_remove_forbidden_networks exit\n");
2565 return GSW_HAL_SUCCESS;
2566}
2567
2568/*
2569 * @brief clear FPLMN list
2570 * @param
2571 * @retval 0: success
2572 * @retval other: fail
2573 */
2574int gsw_clear_forbidden_networks(void)
2575{
2576 if (nw_init_flag == 0 || nw_info_handle == NULL)
2577 {
xy.heb41615b2025-05-28 16:33:20 +08002578 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002579 }
2580
2581 char fplmn_str[FPLMN_STRING_LENGTH+1];
2582 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2583 fplmn_str[(6 * fplmn_max_length)] = '\0';
2584
2585 LOGE("%s\n", fplmn_str);
2586 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2587 if(ret != 0)
2588 {
2589 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002590 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002591 }
2592
2593 return GSW_HAL_SUCCESS;
2594}
2595
2596/*
2597 * @brief get oos config
2598 * @param [in] oos_config
2599 * @retval 0: success
2600 * @retval other: fail
2601 */
2602int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2603{
2604 if (nw_init_flag == 0 || nw_info_handle == NULL)
2605 {
xy.heb41615b2025-05-28 16:33:20 +08002606 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002607 }
2608
2609 if(pt_info == NULL)
2610 {
2611 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002612 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002613 }
2614
2615 int ret = -1;
2616
2617 mbtk_oos_info oos_info;
2618 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2619
2620 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2621 if(ret != 0)
2622 {
2623 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002624 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002625 }
2626
2627 if(oos_info.mode == 0)
2628 {
2629 pt_info->t_min = 0;
2630 pt_info->t_step = 0;
2631 pt_info->t_max = 0;
2632 }
2633
2634 else
2635 {
2636 pt_info->t_min = (int)oos_info.oosPhase[0];
2637 pt_info->t_step = (int)oos_info.oosPhase[1];
2638 pt_info->t_max = (int)oos_info.oosPhase[2];
2639 }
2640
2641 return GSW_HAL_SUCCESS;
2642}
2643
2644
2645/*
2646 * @brief set oos config
2647 * @param [in] oos_config
2648 * @retval 0: success
2649 * @retval other: fail
2650 */
2651int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2652{
2653 if (nw_init_flag == 0 || nw_info_handle == NULL)
2654 {
xy.heb41615b2025-05-28 16:33:20 +08002655 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002656 }
2657
2658 if(pt_info == NULL)
2659 {
2660 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002661 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002662 }
2663
2664 int ret = -1;
2665 mbtk_oos_info oos_info;
2666 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2667
2668 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2669 {
2670 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002671 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002672 }
2673 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2674 {
2675 oos_info.mode = 1;
2676 oos_info.oosPhase[0] = pt_info->t_min;
2677 }
2678 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)
2679 {
2680 oos_info.mode = 1;
2681 oos_info.oosPhase[0] = pt_info->t_min;
2682 oos_info.oosPhase[1] = pt_info->t_step;
2683 }
2684 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))
2685 {
2686 oos_info.mode = 1;
2687 oos_info.oosPhase[0] = pt_info->t_min;
2688 oos_info.oosPhase[1] = pt_info->t_step;
2689 oos_info.oosPhase[2] = pt_info->t_max;
2690 }
2691 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2692 {
2693 oos_info.mode = 0;
2694 }
2695 else
2696 {
2697 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002698 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002699 }
2700
2701 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2702 if(ret != 0)
2703 {
2704 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002705 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002706 }
2707
2708 return GSW_HAL_SUCCESS;
2709}
2710
q.huang238b22a2025-06-10 14:36:59 +08002711/**
2712 * @brief get imei function
2713 * @param [in] len imei length,max is 20
2714 * @param [out] imei return imei from this func
2715 * @retval 0: success
2716 * @retval other: fail
2717 */
2718int gsw_get_imei(int len, char *imei)
2719{
2720 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08002721
q.huang238b22a2025-06-10 14:36:59 +08002722 if (nw_init_flag == 0 || nw_info_handle == NULL)
2723 {
2724 printf("nw sdk has been deinit\n");
2725 return GSW_HAL_NORMAL_FAIL;
2726 }
2727
2728 if(imei == NULL)
2729 {
2730 LOGE("imei is NULL.");
2731 return GSW_HAL_ARG_INVALID;
2732 }
2733
2734 if(len < GSW_IMEI_LENGTH)
2735 {
2736 LOGE("imei len is too short,len = %d\n", len);
2737 return GSW_HAL_NORMAL_FAIL;
2738 }
2739
2740 ret = mbtk_imei_get(nw_info_handle, (void *)imei);
2741 if(ret != MBTK_ERR_OK)
2742 {
2743 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2744 return GSW_HAL_NORMAL_FAIL;
2745 }
2746
2747 return GSW_HAL_SUCCESS;
2748}
2749
2750/**
2751 * @brief reset modem stack only, notice: after use this method, all ril sdk
2752 * need restart by app, means network, sim, sms, data need deinit then init!
2753 * @param
2754 * @retval 0: success
2755 * @retval other: fail
2756 */
2757int gsw_reset_modem(void)
2758{
2759 int ret = -1;
2760 if (nw_init_flag == 0 || nw_info_handle == NULL)
2761 {
2762 printf("nw sdk has been deinit\n");
2763 return GSW_HAL_NORMAL_FAIL;
2764 }
2765 mbtk_modem_info_t info;
2766 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2767 info.rst = 0;
2768
2769 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2770 if(ret)
2771 {
2772 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2773 return GSW_HAL_NORMAL_FAIL;
2774 }
2775
2776 sleep(1);
2777
2778 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2779 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2780 if(ret)
2781 {
2782 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2783 return GSW_HAL_NORMAL_FAIL;
2784 }
2785 return GSW_HAL_SUCCESS;
2786}
b.liu68a94c92025-05-24 12:53:41 +08002787