blob: c8853c0723421f214d2b6a3384d488edf5acdcc6 [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
xf.li56b78fb2025-06-13 03:29:21 -070018#define GSW_IMEI_LENGTH 15+1
q.huang238b22a2025-06-10 14:36:59 +080019
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;
q.huangc8b93122025-06-17 17:46:05 +0800309static GSW_NW_AirplaneModeHandlePtr airplane_cb;
b.liu68a94c92025-05-24 12:53:41 +0800310
311static void *dlHandle_mbtk;
312int nw_init_flag = 0;
313int mode = -1;
314int fplmn_max_length = 0;
315
316gsw_nw_plmn_list_t gsw_nw_plmn_list;
317char fplmn_array[FPLMN_ARRAY_SIZE][7];
318int fplmn_index = 0;
319
320static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
321static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
322int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
323int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
324int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
325int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
326static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
327int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
328int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
329int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
330int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
331int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
332int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
333int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
334int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
335int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
336int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
337int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800338int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
339
b.liu68a94c92025-05-24 12:53:41 +0800340
341static void (*mbtk_log)(int level, const char *format, ...);
342static void (*mbtk_log_init)(char *path, char *tag);
343
344#ifndef LOG_ERR_LEVEL
345#define LOG_ERR_LEVEL 3 /* error conditions */
346#endif
347#ifndef LOG_WARN_LEVEL
348#define LOG_WARN_LEVEL 4 /* warning conditions */
349#endif
350#ifndef LOG_INFO_LEVEL
351#define LOG_INFO_LEVEL 6 /* informational */
352#endif
353#ifndef LOG_DEBUG_LEVEL
354#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
355#endif
356#ifndef LOG_VERBOSE_LEVEL
357#define LOG_VERBOSE_LEVEL 8
358#endif
359
l.yang6a42e4d2025-05-28 01:04:20 -0700360#define GSW_NW "[HAL][GSW_NW]"
361
b.liu68a94c92025-05-24 12:53:41 +0800362#define LOGV(fmt, args ...) \
363 do{ \
364 char *file_ptr_1001 = __FILE__; \
365 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
366 char line_1001[10] = {0}; \
367 sprintf(line_1001, "%d", __LINE__); \
368 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
369 if(*ptr_1001 == '/') \
370 break; \
371 ptr_1001--; \
372 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700373 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800374 } while(0)
375
376#define LOGI(fmt, args...) \
377 do{ \
378 char *file_ptr_1001 = __FILE__; \
379 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
380 char line_1001[10] = {0}; \
381 sprintf(line_1001, "%d", __LINE__); \
382 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
383 if(*ptr_1001 == '/') \
384 break; \
385 ptr_1001--; \
386 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700387 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800388 } while(0)
389
390#define LOGD(fmt, args...) \
391 do{ \
392 char *file_ptr_1001 = __FILE__; \
393 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
394 char line_1001[10] = {0}; \
395 sprintf(line_1001, "%d", __LINE__); \
396 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
397 if(*ptr_1001 == '/') \
398 break; \
399 ptr_1001--; \
400 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700401 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800402 } while(0)
403
404#define LOGW(fmt, args...) \
405 do{ \
406 char *file_ptr_1001 = __FILE__; \
407 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
408 char line_1001[10] = {0}; \
409 sprintf(line_1001, "%d", __LINE__); \
410 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
411 if(*ptr_1001 == '/') \
412 break; \
413 ptr_1001--; \
414 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700415 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800416 } while(0)
417
418#define LOGE(fmt, args...) \
419 do{ \
q.huangfa0a0a32025-06-12 17:07:23 +0800420 char *file_ptr_1001 = __FILE__; \
b.liu68a94c92025-05-24 12:53:41 +0800421 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
422 char line_1001[10] = {0}; \
423 sprintf(line_1001, "%d", __LINE__); \
424 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
425 if(*ptr_1001 == '/') \
426 break; \
427 ptr_1001--; \
428 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700429 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800430 } while(0)
431
432
433
434typedef struct
435{
436 char *lynq_operator_l;
437 char *lynq_operator_s;
438 uint32 lynq_mcc_mnc;
439} lynq_operator_mcc_mnc_t;
440
441static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
442{
443 {"China Mobile","CMCC",46000},
444 {"China Unicom","CU",46001},
445 {"China Mobile","CMCC",46002},
446 {"China Telecom","CT",46003},
447 {"China Mobile","CMCC",46004},
448 {"China Telecom","CT",46005},
449 {"China Unicom","CU",46006},
450 {"China Mobile","CMCC",46007},
451 {"China Mobile","CMCC",46008},
452 {"China Unicom","CU",46009},
453 {"China Telecom","CT",46011}
454};
455
456
457//GSW include
458typedef enum prefer_mode
459{
460 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
461 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
462 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
463 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
464 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
465 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
466 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
467 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
468} PREFER_MODE_E;
469
470static int mbtk_nw_api_import()
471{
472 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
473 if (dlHandle_mbtk == NULL)
474 {
xy.heb41615b2025-05-28 16:33:20 +0800475 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800476 }
477
478 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
479 if (mbtk_log_init == NULL)
480 {
xy.heb41615b2025-05-28 16:33:20 +0800481 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800482 }
483
484 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
485 if (mbtk_log == NULL)
486 {
xy.heb41615b2025-05-28 16:33:20 +0800487 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800488 }
489
490 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
491 if (mbtk_info_handle_get == NULL)
492 {
493 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800494 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800495 }
496
497 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
498 if (mbtk_info_handle_free == NULL)
499 {
500 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800501 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800502 }
503
504 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
505 if (mbtk_net_sel_mode_get == NULL)
506 {
507 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800508 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800509 }
510
511 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
512 if (mbtk_net_reg_get == NULL)
513 {
514 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800515 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800516 }
517
518 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
519 if (mbtk_get_modem_fun == NULL)
520 {
521 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800522 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800523 }
524
525 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
526 if (mbtk_set_modem_fun == NULL)
527 {
528 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800529 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800530 }
531
532 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
533 if (mbtk_current_band_get == NULL)
534 {
535 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800536 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800537 }
538
539 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
540 if (mbtk_current_band_set == NULL)
541 {
542 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800543 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800544 }
545
546 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
547 if (mbtk_net_signal_get == NULL)
548 {
549 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800550 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800551 }
552
553 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
554 if (mbtk_wakeup_state_set == NULL)
555 {
556 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800557 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800558 }
559
560 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");
561 if (mbtk_cell_get == NULL)
562 {
563 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800564 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800565 }
566
567 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");
568 if (mbtk_signal_state_change_cb_reg == NULL)
569 {
570 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800571 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800572 }
573
574 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");
575 if (mbtk_net_state_change_cb_reg == NULL)
576 {
577 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800578 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800579 }
580
581 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
582 if (mbtk_fplmn_get == NULL)
583 {
584 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800585 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800586 }
587
588 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
589 if (mbtk_fplmn_set == NULL)
590 {
591 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800592 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800593 }
594
595 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");
596 if (mbtk_radio_state_change_cb_reg == NULL)
597 {
598 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800599 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800600 }
601
602 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
603 if (mbtk_oos_get == NULL)
604 {
605 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800606 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800607 }
608
609 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
610 if (mbtk_oos_set == NULL)
611 {
612 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800613 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800614 }
q.huang238b22a2025-06-10 14:36:59 +0800615
616 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
617 if (mbtk_imei_get == NULL)
618 {
619 LOGE("mbtk_imei_get dlsym fail\n");
620 return GSW_HAL_NORMAL_FAIL;
621 }
b.liu68a94c92025-05-24 12:53:41 +0800622
623 return GSW_HAL_SUCCESS;
624}
625
626void list_first(list_node_t *list)
627{
628 if (list) {
629 list->cur_index = 0;
630 list->cur_array_data = list->array_data.next;
631 }
632}
633
634void* list_next(list_node_t *list)
635{
636 if (list) {
637 list_arraynode_t *node = list->cur_array_data;
638 if (node) {
639 LOGE("node is not null\n");
640 list->cur_array_data = list->cur_array_data->next;
641 list->cur_index++;
642 return node->data;
643 } else {
644 LOGE("node is null\n");
645 return NULL;
646 }
647 } else {
648 LOGE("list is null\n");
649 return NULL;
650 }
651}
652
653void list_free(list_node_t *list)
654{
655 if (list) {
656 list_arraynode_t *node = &(list->array_data); // Head node
657 list_arraynode_t *node_temp = NULL;
658 while (node->next) {
659 node_temp = node->next;
660 node->next = node->next->next;
661
662 if (list->free_func) {
663 list->free_func(node_temp->data);
664 } else {
665 free(node_temp->data);
666 }
667 free(node_temp);
668 }
669 free(list);
670 }
671}
672
q.huangfa0a0a32025-06-12 17:07:23 +0800673static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800674{
q.huangfa0a0a32025-06-12 17:07:23 +0800675 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800676 {
q.huangfa0a0a32025-06-12 17:07:23 +0800677 return 121-rscp; // 96 map 25
678 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800679 }
b.liu68a94c92025-05-24 12:53:41 +0800680 else
681 {
q.huangfa0a0a32025-06-12 17:07:23 +0800682 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800683 }
684}
685
q.huangfa0a0a32025-06-12 17:07:23 +0800686static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800687{
q.huangfa0a0a32025-06-12 17:07:23 +0800688 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800689 {
q.huangfa0a0a32025-06-12 17:07:23 +0800690 return 141-rsrp; // 97 map 44
691 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800692 }
693 else
694 {
q.huangfa0a0a32025-06-12 17:07:23 +0800695 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800696 }
697}
698
q.huangfa0a0a32025-06-12 17:07:23 +0800699static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800700{
q.huangfa0a0a32025-06-12 17:07:23 +0800701 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800702 {
q.huangfa0a0a32025-06-12 17:07:23 +0800703 return (40-rsrq)/2; //=20-rsrq / 2;
704 // 34 map 3
705 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800706 }
707 else
708 {
q.huangfa0a0a32025-06-12 17:07:23 +0800709 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800710 }
711}
712
713
q.huangfa0a0a32025-06-12 17:07:23 +0800714//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
715// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
716// * will be 125.*/
717//uint8 ecno; // 0: Ec/Io < -24 dB
718 // 1: -24 dB �� Ec/Io < -23.5 dB
719 // 2: -23.5 dB �� Ec/Io < -23 dB
720 // ......
721 // 47: -1 dB �� Ec/Io < -0.5 dB
722 // 48: -0.5 dB �� Ec/Io < 0 dB
723 // 49: 0 dB �� Ec/Io
724 // 255: not known or not detectabl
725static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800726{
q.huangfa0a0a32025-06-12 17:07:23 +0800727 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800728 {
q.huangfa0a0a32025-06-12 17:07:23 +0800729 return 245-ecno*5; //49 map 0 db
730 // 1 map 240 db
731 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800732 }
q.huangfa0a0a32025-06-12 17:07:23 +0800733 else
b.liu68a94c92025-05-24 12:53:41 +0800734 {
q.huangfa0a0a32025-06-12 17:07:23 +0800735 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800736 }
737}
738
b.liu68a94c92025-05-24 12:53:41 +0800739
b.liu68a94c92025-05-24 12:53:41 +0800740
q.huangfa0a0a32025-06-12 17:07:23 +0800741/* change realCsq to level */
742static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800743{
q.huangfa0a0a32025-06-12 17:07:23 +0800744
745 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800746 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800747 } else if (rscp <= -95) {
748 return rscp+111; // to 16
749 } else if (rscp >=-93 && rscp <=-90) {
750 return rscp+110; // to 20
751 } else if (rscp >=-89 && rscp <=-59) {
752 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
753 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
754 return 16;
755 } else if(rscp <= -25) {
756 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800757 }
q.huangfa0a0a32025-06-12 17:07:23 +0800758 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800759}
760
q.huangfa0a0a32025-06-12 17:07:23 +0800761static int rsrpToLevel(int rsrp)
762{
763 if (rsrp < -130) {
764 return 0;
765 } else if (rsrp <= -118) {
766 return (rsrp+132)/2; // to 7
767 } else if (rsrp <=-109) {
768 return rsrp+125; // to 16
769 } else if (rsrp <=-103) {
770 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
771 } else if (rsrp <=- 85) {
772 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
773 } else if(rsrp <= -55) {
774 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
775 } else if(rsrp <=-44)
776 {
777 return 31;
778 }
779 return 99;
780}
781
782
783
784
b.liu68a94c92025-05-24 12:53:41 +0800785
786static int convert_reg_state(int reg_state_t)
787{
788 LOGD("reg_state_t = %d\n",reg_state_t);
789 int reg_state = 0;
790
791 switch (reg_state_t)
792 {
793 case MBTK_NET_REG_STATE_NON:
794 {
795 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
796 break;
797 }
798 case MBTK_NET_REG_STATE_HOME:
799 {
800 reg_state = GSW_NETWORK_REG_REGISTERED;
801 break;
802 }
803 case MBTK_NET_REG_STATE_SEARCHING:
804 {
805 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
806 break;
807 }
808 case MBTK_NET_REG_STATE_DENIED:
809 {
810 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
811 break;
812 }
813 case MBTK_NET_REG_STATE_UNKNOWN:
814 {
815 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
816 break;
817 }
818 case MBTK_NET_REG_STATE_ROAMING:
819 {
820 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
821 break;
822 }
823 case MBTK_NET_REG_STATE_SMS_ONLY:
824 case MBTK_NET_REG_STATE_ROAMING_SMS:
825 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
826 case MBTK_NET_REG_STATE_CSFB_HOME:
827 case MBTK_NET_REG_STATE_CSFB_ROAMING:
828 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
829 {
830 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
831 break;
832 }
833 }
834
835 return reg_state;
836}
837
838
839static int convert_net_mode(int net_mode)
840{
841 LOGD("net_mode = %d\n",net_mode);
842 switch(net_mode)
843 {
844 case MBTK_RADIO_TECH_GSM:
845 case MBTK_RADIO_TECH_GSM_COMPACT:
846 case MBTK_RADIO_TECH_GSM_EGPRS:
847 {
848 return GSW_NETWORK_RADIO_GSM;
849 }
850 case MBTK_RADIO_TECH_UTRAN:
851 case MBTK_RADIO_TECH_UTRAN_HSDPA:
852 case MBTK_RADIO_TECH_UTRAN_HSUPA:
853 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
854 case MBTK_RADIO_TECH_UTRAN_HSPA:
855 {
856 return GSW_NETWORK_RADIO_UMTS;
857 }
858 case MBTK_RADIO_TECH_E_UTRAN:
859 {
860 return GSW_NETWORK_RADIO_LTE;
861 }
862
863 default:
864 {
865 return GSW_NETWORK_RADIO_NO_SVC;
866 }
867 }
868
869 return GSW_NETWORK_RADIO_NO_SVC;
870}
871
872static int convert_mbtk_net_config(int config)
873{
874 int net_pref = -1;
875
876 switch(config)
877 {
878 case GSW_PREFER_MODE_GSW:
879 {
880 net_pref = 0;
881 break;
882 }
883
884 case GSW_PREFER_MODE_WCDMA:
885 {
886 net_pref = 1;
887 break;
888 }
889
890 case GSW_PREFER_MODE_WCDMA_GSM:
891 {
892 net_pref = 2;
893 break;
894 }
895
896 case GSW_PREFER_MODE_LTE:
897 case GSW_PREFER_MODE_NR5G:
898 case GSW_PREFER_MODE_NR5G_LTE:
899 {
900 net_pref = 5;
901 break;
902 }
903
904 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
905 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
906 {
907 net_pref = 15;
908 break;
909 }
910 }
911
912 return net_pref;
913}
914
915
916static int convert_gsw_net_config(int config)
917{
918 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +0800919 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +0800920
921 switch (config)
922 {
923 case 0:
924 {
925 net_config = GSW_PREFER_MODE_GSW;
926 break;
927 }
928
929 case 1:
930 {
931 net_config = GSW_PREFER_MODE_WCDMA;
932 break;
933 }
934
935 case 2:
936 {
937 net_config = GSW_PREFER_MODE_WCDMA_GSM;
938 break;
939 }
940
941 case 5:
942 {
943 net_config = GSW_PREFER_MODE_LTE;
944 break;
945 }
946
947 case 15:
948 {
949 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
950 break;
951 }
952 }
953
954 return net_config;
955}
956
957//64F010 -> 46001 (64->46,F0->0,10->01)
958static void transform_fplmn_str_to_plmn(char *entry)
959{
960 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
961 return; //if FFFFFF,means invalid fplmn, do nothing
962 }
963
964 char temp = entry[0];
965 entry[0] = entry[1];
966 entry[1] = temp;
967
968 temp = entry[ENTRY_LENGTH - 2];
969 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
970 entry[ENTRY_LENGTH - 1] = temp;
971
972 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
973
974 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
975
976 //valid fplmn
977 fplmn_index++;
978}
979
980static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
981{
982 strncpy(mcc,entry,3);
983 mcc[3] = '\0';
984 strncpy(mnc,entry + 3,2);
985 mnc[2] = '\0';
986
987 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
988}
989
990
991static void update_fplmn_list(char *fplmn_str)
992{
993 LOGE("fplmn_str = %s\n",fplmn_str);
994 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
995 memset(fplmn_array, 0, sizeof(fplmn_array));
996 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
997 fplmn_index = 0;
998 int array_length = 0;
999
1000 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1001
1002 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1003 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1004 temp_fplmn_array[array_length][length] = '\0';
1005 array_length++;
1006 if (i + 6 >= strlen(fplmn_str)) {
1007 break;
1008 }
1009 }
1010
1011 for (int i = 0; i < array_length; i++) {
1012 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1013 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1014 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1015 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1016 }
1017
1018}
1019
1020static void format_plmn(char *result, char *plmn_entry)
1021{
1022 strncpy(result, plmn_entry, strlen(plmn_entry));
1023 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1024
1025 if (strlen(result) >= 2) {
1026 char temp = result[0];
1027 result[0] = result[1];
1028 result[1] = temp;
1029 }
1030
1031 LOGE("1.result = %s\n",result);
1032
1033 if (strlen(result) >= 3) {
1034 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1035 result[2] = 'F';
1036 }
1037
1038 LOGE("2.result = %s\n",result);
1039
1040 if (strlen(result) >= 2) {
1041 char temp = result[strlen(result) - 1];
1042 result[strlen(result) - 1] = result[strlen(result) - 2];
1043 result[strlen(result) - 2] = temp;
1044 }
1045
1046 LOGE("3.result = %s\n",result);
1047}
1048
1049
1050static void convert_plmn_to_fplmn_str(char *fplmn_str)
1051{
1052 char temp_fplmn_str[128] = {0};
1053 char temp[20]; // 临时存储单个格式化后的数字
1054 int index = 0;
1055
1056 for (int i = 0; i < fplmn_index; i++) {
1057 memset(temp, 0x0, sizeof(temp));
1058 format_plmn(temp, fplmn_array[i]);
1059 strcat(temp_fplmn_str, temp);
1060 index += strlen(temp);
1061 }
1062
1063 while(index < (6 * fplmn_max_length))
1064 {
1065 temp_fplmn_str[index++] = 'F';
1066 }
1067
1068 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1069 if (index > (6 * fplmn_max_length)) {
1070 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1071 }
1072
1073 LOGE("%s\n", temp_fplmn_str);
1074 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1075 LOGE("fplmn_str = %s\n", fplmn_str);
1076}
1077
1078static int check_index(char *mcc, char *mnc)
1079{
1080 int i = 0;
1081
1082 for(i = 0; i < fplmn_index; i++)
1083 {
1084 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1085 {
1086 LOGE("index = %d\n", i);
1087 return i;
1088 }
1089 }
1090
1091 LOGE("not find\n");
1092 return -1;
1093}
1094
1095static void remove_fplmn(int index)
1096{
1097 int write_index = 0;
1098 for (int i = 0; i < fplmn_index; i++) {
1099 if (i != index) {
1100 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1101 }
1102 }
1103 fplmn_index--;
1104}
1105
q.huangfa0a0a32025-06-12 17:07:23 +08001106static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1107{
1108 LOGD("signal->type=%d", signal->type);
1109 memset(sig_strength,0,sizeof (signalStrength_t));
1110 switch(signal->type)
1111 {
1112 case MBTK_RADIO_TECH_E_UTRAN:
1113 {
1114 LOGI("rsrp = %d",signal->rsrp);
1115 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001116 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1117 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huangfa0a0a32025-06-12 17:07:23 +08001118 sig_strength->rssi =rsrpToLevel(signal->rsrp-141);
1119 sig_strength->rssnr=INT_32_MAX;
1120 break;
1121 }
1122 case MBTK_RADIO_TECH_UTRAN:
1123 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1124 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1125 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1126 case MBTK_RADIO_TECH_UTRAN_HSPA:
1127 {
1128 LOGI("rscp = %d",signal->rscp);
1129 sig_strength->wcdma_sig_valid = 1;
1130 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1131 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
1132 sig_strength->rssi =rscpToLevel(signal->rscp-121);
1133 break;
1134 }
1135 case MBTK_RADIO_TECH_GSM:
1136 case MBTK_RADIO_TECH_GSM_COMPACT:
1137 case MBTK_RADIO_TECH_GSM_EGPRS:
1138 {
1139 LOGI("g rssi = %d",signal->rssi);
1140 sig_strength->gw_sig_valid = 1;
1141 sig_strength->rssi = signal->rssi;
1142 break;
1143 }
1144 default:
1145 {
1146 LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
1147 }
1148 }
1149
1150}
1151
1152
b.liu68a94c92025-05-24 12:53:41 +08001153static void gsw_serving_info_callback_thread()
1154{
1155 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1156 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1157 int ret = -1;
1158 ret = gsw_get_nwinfo(serving_info);
1159 if(ret != 0)
1160 {
1161 LOGE("gsw_get_nwinfo failed\n");
1162 free(serving_info);
1163 return;
1164 }
1165
1166 if(serving_cb)
1167 {
1168 serving_cb(*serving_info);
1169 free(serving_info);
1170 }
1171}
1172
1173static void gsw_serving_info_callback(const void* data, int data_len)
1174{
1175 LOGE("gsw_serving_info_callback start\n");
1176
1177 if(data && data_len > 0)
1178 {
1179 pthread_t thread;
1180 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1181 }
1182
1183 else
1184 {
1185 LOGE("data is NULL\n");
1186 return;
1187 }
1188
1189}
1190
q.huangfa0a0a32025-06-12 17:07:23 +08001191/*typedef struct
1192{
11930 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
11941 uint8 rssi; // 0: 113 dBm or less
1195 // 1: 111 dBm
1196 // 2��30: 109��53 dBm
1197 // 31: 51 dBm or greater
1198 // 99: not known or not detectable
11992 uint8 rxlev;// 0:rssi < -110 dBm
1200 // 1: -110 dBm �� rssi < -109 dBm
1201 // 2: -109 dBm �� rssi < -108 dBm
1202 // ......
1203 // 61: -50 dBm �� rssi < -49 dBm
1204 // 62: -49 dBm �� rssi < -48 dBm
1205 // 63: -48 dBm �� rssi
1206 // 99: not known or not detectable
12073 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
1208 // 99 not known or not detectable
12094 uint8 rscp; // 0: rscp < -120 dBm
1210 // 1: -120 dBm �� rscp < -119 dBm
1211 // 2: -119 dBm �� rscp < -118 dBm
1212 // ......
1213 // 94: -27 dBm �� rscp < -26 dBm
1214 // 95: -26 dBm �� rscp < -25 dBm
1215 // 96: - 25 dBm �� rscp
1216 // 255: not known or not detectable
12175 uint8 ecno; // 0: Ec/Io < -24 dB
1218 // 1: -24 dB �� Ec/Io < -23.5 dB
1219 // 2: -23.5 dB �� Ec/Io < -23 dB
1220 // ......
1221 // 47: -1 dB �� Ec/Io < -0.5 dB
1222 // 48: -0.5 dB �� Ec/Io < 0 dB
1223 // 49: 0 dB �� Ec/Io
1224 // 255: not known or not detectable
12256 uint8 rsrq; // 0: rsrq < -19.5 dB
1226 // 1: -19.5 dB �� rsrq < -19 dB
1227 // 2: -19 dB �� rsrq < -18.5 dB
1228 // ......
1229 // 32: -4 dB �� rsrq < -3.5 dB
1230 // 33: -3.5 dB �� rsrq < -3 dB
1231 // 34: -3 dB �� rsrq
1232 // 255: not known or not detectable
12337 uint8 rsrp; // 0: rsrp < -140 dBm
1234 // 1: -140 dBm �� rsrp < -139 dBm
1235 // 2: -139 dBm �� rsrp < -138 dBm
1236 // ......
1237 // 95: -46 dBm �� rsrp < -45 dBm
1238 // 96: -45 dBm �� rsrp < -44 dBm
1239 // 97: -44 dBm �� rsrp
1240 // 255: not known or not detectable
12418 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
1242 // 1: -43 dB <= ss_rsrq < -42.5 dB
1243 // 2: -42.5 dB <= ss_rsrq < -42 dB
1244 // ......
1245 // 125: 19 dB <= ss_rsrq < 19.5 dB
1246 // 126: 19.5 dB <= ss_rsrq < 20 dB
1247 // 255: not known or not detectable
1248 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1249 // 1: -156 dBm <= ss_rsrp < -155 dBm
1250 // 2: -155 dBm <= ss_rsrp < -154 dBm
1251 // ......
1252 // 125: -32 dBm <= ss_rsrp < -31 dBm
1253 // 126: -31 dBm <= ss_rsrp
1254 // 255: not known or not detectable
1255 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1256 // 1: -23 dB  ss_sinr < -22.5 dB
1257 // 2: -22.5 dB  ss_sinr < -22 dB
1258 // ......
1259 // 125: 39 dB  ss_sinr < 39.5 dBm
1260 // 126: 39.5 dB  ss_sinr < 40 dB
1261 // 127: 40 dB  ss_sinr
1262 // 255: not known or not detectable
1263} __attribute__((packed)) mbtk_signal_info_t;
1264*/
b.liu68a94c92025-05-24 12:53:41 +08001265static void gsw_sig_info_callback(const void* data, int data_len)
1266{
q.huangfa0a0a32025-06-12 17:07:23 +08001267 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001268 {
b.liu68a94c92025-05-24 12:53:41 +08001269 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001270 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1271
b.liu68a94c92025-05-24 12:53:41 +08001272 if(sig_cb != NULL)
1273 {
1274 sig_cb(sig_strength);
1275 }
1276 }
b.liu68a94c92025-05-24 12:53:41 +08001277 else
1278 {
q.huangfa0a0a32025-06-12 17:07:23 +08001279 LOGE("data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001280 }
1281}
1282
q.huangc8b93122025-06-17 17:46:05 +08001283static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001284{
q.huangc8b93122025-06-17 17:46:05 +08001285 LOGE("gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001286
q.huangc8b93122025-06-17 17:46:05 +08001287
b.liu68a94c92025-05-24 12:53:41 +08001288 if(data && data_len > 0)
1289 {
q.huangc8b93122025-06-17 17:46:05 +08001290 const uint8 *cfun_state = (const uint8*)data;
1291 LOGE("gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
1292 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001293 {
q.huangc8b93122025-06-17 17:46:05 +08001294 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001295 }
1296 }
1297
1298}
1299
q.huangc8b93122025-06-17 17:46:05 +08001300
b.liu68a94c92025-05-24 12:53:41 +08001301static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1302{
1303 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1304
1305 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1306 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1307
1308 rej_cause->rej_cause = cause;
1309 rej_cause->rej_rat = rat;
1310 rej_cause->rej_domain = domain;
1311
1312 if(reject_cb != NULL)
1313 {
1314 LOGE("reject_cb is not NULL\n");
1315 reject_cb(rej_cause);
1316 }
1317 else
1318 {
1319 LOGE("reject_cb is NULL\n");
1320 }
1321
1322 free(rej_cause);
1323 LOGE("gsw_reject_callback end\n");
1324}
1325
xy.hec89938f2025-05-29 14:08:47 +08001326void gsw_sig_info_timer()
1327{
xy.hec89938f2025-05-29 14:08:47 +08001328 if(nw_init_flag == 0 || nw_info_handle == NULL)
1329 {
1330 return;
1331 }
1332
1333 mbtk_signal_info_t signal;
1334 signalStrength_t sig_strength;
1335
1336 while(nw_init_flag)
1337 {
q.huangfa0a0a32025-06-12 17:07:23 +08001338 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001339 if(ret != 0)
1340 {
q.huangfa0a0a32025-06-12 17:07:23 +08001341 LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
xy.hec89938f2025-05-29 14:08:47 +08001342 }
1343
1344 else
1345 {
q.huangfa0a0a32025-06-12 17:07:23 +08001346 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
1347
xy.hec89938f2025-05-29 14:08:47 +08001348 }
1349
1350 if(sig_cb != NULL)
1351 {
1352 sig_cb(sig_strength);
1353 }
1354
1355 sleep(SIG_TIMER);
1356 }
1357}
1358
b.liu68a94c92025-05-24 12:53:41 +08001359
1360/**
1361 * @brief SDK interface to call back serving info
1362 * @param [in] handle_ptr
1363 * @retval 0: success
1364 * @retval other: fail
1365 */
1366int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1367{
1368 if (nw_init_flag == 0 || nw_info_handle == NULL)
1369 {
xy.heb41615b2025-05-28 16:33:20 +08001370 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001371 }
1372
1373 if(handle_ptr == NULL)
1374 {
1375 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001376 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001377 }
1378
1379 serving_cb = handle_ptr;
1380
1381 return GSW_HAL_SUCCESS;
1382
1383}
1384
1385
1386/**
1387 * @brief SDK interface to call back sig info
1388 * @param [in] handle_ptr
1389 * @retval 0: success
1390 * @retval other: fail
1391 */
1392int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1393{
1394 if (nw_init_flag == 0 || nw_info_handle == NULL)
1395 {
xy.heb41615b2025-05-28 16:33:20 +08001396 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001397 }
1398
1399 if(handle_ptr == NULL)
1400 {
1401 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001402 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001403 }
1404
1405 sig_cb = handle_ptr;
1406
1407 return GSW_HAL_SUCCESS;
1408
1409}
1410
1411
1412/**
1413 * @brief SDK interface to call back rej cause
1414 * @param [in] handle_ptr
1415 * @retval 0: success
1416 * @retval other: fail
1417 */
1418int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1419{
1420 if (nw_init_flag == 0 || nw_info_handle == NULL)
1421 {
xy.heb41615b2025-05-28 16:33:20 +08001422 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001423 }
1424
1425 if(handle_ptr == NULL)
1426 {
1427 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001428 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001429 }
1430
1431 reject_cb = handle_ptr;
1432
1433 return GSW_HAL_SUCCESS;
1434}
1435
1436
1437/**
1438 * @brief network sdk init
1439 * @param [in] token usr id define by who use
1440 * @retval 0: success
1441 * @retval other: fail
1442 */
1443int gsw_nw_sdk_init(int token)
1444{
1445 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001446 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001447
1448 if (nw_init_flag == 1 && nw_info_handle != NULL)
1449 {
1450 return GSW_HAL_SUCCESS;
1451 }
1452
1453 ret = mbtk_nw_api_import();
1454 if (ret != 0)
1455 {
1456 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001457 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001458 }
1459
1460 nw_info_handle = mbtk_info_handle_get();
1461
1462 if (nw_info_handle == NULL)
1463 {
1464 LOGE("mbtk_info_handle_get 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 char fplmn[256] = {0};
1469 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1470 if(ret != 0)
1471 {
1472 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001473 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001474 }
1475 fplmn_max_length = (strlen(fplmn)/6);
1476 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1477 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1478
1479 if (ret != 0)
1480 {
1481 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001482 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001483 }
1484
1485 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1486 if (ret != 0)
1487 {
1488 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001489 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001490 }
1491
xy.hec89938f2025-05-29 14:08:47 +08001492 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1493 if (ret != 0)
1494 {
1495 LOGE("pthread_create fail\n");
1496 return GSW_HAL_NORMAL_FAIL;
1497 }
1498
b.liu68a94c92025-05-24 12:53:41 +08001499 nw_init_flag = 1;
1500
1501 return GSW_HAL_SUCCESS;
1502}
1503
1504
1505/**
1506 * @brief network sdk deinit
1507 * @param
1508 * @retval 0: success
1509 * @retval other: fail
1510 */
1511int gsw_nw_sdk_deinit(void)
1512{
1513 int ret = -1;
1514
1515 if (nw_init_flag == 0 || nw_info_handle == NULL)
1516 {
xy.heb41615b2025-05-28 16:33:20 +08001517 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001518 }
1519
1520 ret = mbtk_info_handle_free(&nw_info_handle);
1521 if(ret != GSW_HAL_SUCCESS)
1522 {
1523 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001524 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001525 }
1526
1527 dlclose(dlHandle_mbtk);
1528 nw_info_handle = NULL;
1529 nw_init_flag = 0;
1530
1531 return GSW_HAL_SUCCESS;
1532
1533}
1534
1535
1536/**
1537 * @brief get current network reg info
1538 * @param [out] serving_info struct for network info
1539 * include regstate ps_state opreator name mcc mcn etc
1540 * @retval 0: success
1541 * @retval other: fail
1542 */
1543int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1544{
1545
1546 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001547 if (nw_init_flag == 0 || nw_info_handle == NULL)
1548 {
q.huang238b22a2025-06-10 14:36:59 +08001549 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001550 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001551 }
1552
1553 LOGE("mbtk_net_reg_get start \n");
1554 //regstate
1555 mbtk_net_reg_info_t reg;
1556 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1557 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1558 if(ret)
1559 {
1560 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001561 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001562 }
1563
1564 LOGE("convert_cs_reg_state\n");
1565 //cs_state
1566 serving_info->reg_state = convert_reg_state(reg.call_state);
1567 LOGE("convert_ps_reg_state\n");
1568 //ps_state
1569 serving_info->ps_state = convert_reg_state(reg.data_state);
1570 LOGE("convert_rat_mode\n");
1571 //reg_rat
1572 serving_info->reg_rat = convert_net_mode(reg.type);
1573 //srv_domain
1574 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1575 {
1576 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1577 {
1578 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1579 }
1580
1581 else
1582 {
1583 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1584 }
1585 }
1586
1587 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1588 {
1589 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1590 }
1591
1592 else
1593 {
1594 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1595 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1596 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1597 }
1598
1599 LOGD("roaming_ind\n");
1600 //roaming_ind
1601 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1602 {
1603 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1604 }
1605 else
1606 {
1607 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1608 }
1609
1610 LOGD("reject\n");
1611 //reject
1612 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1613 {
1614 LOGD("reject_callback\n");
1615 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1616 }
1617
1618 LOGD("reg_plmn / operator name\n");
1619 //reg_plmn / operator name
1620 mbtk_net_info_t net;
1621 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1622 LOGD("mbtk_net_sel_mode_get start \n");
1623 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1624 LOGD("mbtk_net_sel_mode_get end \n");
1625 if(ret == 0 && net.plmn > 0)
1626 {
1627 int i = 0;
1628
1629 LOGD("start to find mcc");
1630 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1631 {
1632 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1633 {
1634 LOGD("find mcc\n");
1635 break;
1636 }
1637 i++;
1638 }
1639
1640
1641 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1642 {
1643 LOGD("not find mcc");
1644 strcpy(serving_info->operator_name, "unknown");
1645 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1646 }
1647
1648 else
1649 {
1650 LOGD("find mcc\n");
1651 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1652 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1653 }
1654
1655 LOGE("operator_name = %s\n", serving_info->operator_name);
1656 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1657 }
1658
1659
1660 LOGD("get cell id/tac/lac/sid/nid\n");
1661 //cell id/tac/lac/sid/nid
1662 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001663 list_node_t* cell_list = NULL;
1664
1665 LOGD("mbtk_cell_get start\n");
1666 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1667 if(ret != 0 || cell_list == NULL)
1668 {
1669 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001670 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001671 }
1672 else
1673 {
1674 LOGE("mbtk_cell_get end,start to get node\n");
1675 list_first(cell_list);
1676 LOGE("list_first end\n");
1677 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1678 if(cell)
1679 {
1680 LOGE("cell is not null,value2 = %u\n",cell->value2);
1681 switch(cell_type)
1682 {
1683 case MBTK_CELL_TYPE_LTE:
1684 {
1685 LOGE("is lte\n");
1686 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1687 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1688 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1689 strcpy(serving_info->lac,"");
q.huangc8b93122025-06-17 17:46:05 +08001690 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001691 break;
1692 }
1693
1694 case MBTK_CELL_TYPE_GSM:
1695 {
1696 LOGE("is gsm\n");
1697 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1698 sprintf(serving_info->lac,"%d",cell->value1);
1699 memset(serving_info->tac,0,sizeof(serving_info->tac));
1700 sprintf(serving_info->cell_id,"%d",cell->value2);
1701 break;
1702 }
1703 case MBTK_CELL_TYPE_UMTS:
1704 {
1705 LOGE("is wcdma\n");
1706 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1707 sprintf(serving_info->lac,"%d",cell->value1);
1708 memset(serving_info->tac,0,sizeof(serving_info->tac));
1709 sprintf(serving_info->cell_id,"%d",cell->value2);
1710 break;
1711 }
1712
1713 default:
1714 break;
1715 }
1716 }
1717 else
1718 {
1719 LOGE("cell is null\n");
1720 }
1721 }
1722
1723 //not support now
1724 serving_info->sid = 0;
1725 serving_info->nid = 0;
1726
1727 return GSW_HAL_SUCCESS;
1728}
1729
1730
1731/**
1732 * @brief get current network type
1733 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1734 * @retval 0: success
1735 * @retval other: fail
1736 */
1737int gsw_get_netype(int *netype)
1738{
1739 int ret = -1;
1740
1741 if (nw_init_flag == 0 || nw_info_handle == NULL)
1742 {
xy.heb41615b2025-05-28 16:33:20 +08001743 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001744 }
1745
1746 //regstate
1747 mbtk_net_reg_info_t reg;
1748 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1749 if(ret)
1750 {
1751 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001752 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001753 }
1754
1755 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1756 {
1757 *netype = convert_net_mode(reg.type);
1758 }
1759 else
1760 {
1761 *netype = GSW_NETWORK_RADIO_NO_SVC;
1762 }
1763
1764 return GSW_HAL_SUCCESS;
1765}
1766
1767
1768/**
1769 * @brief get radio opmode, as open and close airplane mode
1770 * @param [out] op_mode 1 is radio on, 0 is radio off
1771 * @retval 0: success
1772 * @retval other: fail
1773 */
1774int gsw_get_opmode(int *op_mode)
1775{
1776 int tmp_rf = -1;
1777 int ret = -1;
1778 if (nw_init_flag == 0 || nw_info_handle == NULL)
1779 {
xy.heb41615b2025-05-28 16:33:20 +08001780 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001781 }
1782
1783 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1784 if (ret != 0)
1785 {
1786 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001787 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001788 }
1789 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1790 {
1791 *op_mode = GSW_OP_MODE_LPM;
1792 }
1793
1794 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1795 {
1796 *op_mode = GSW_OP_MODE_OFFLINE;
1797 }
1798
1799 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1800 {
1801 *op_mode = GSW_OP_MODE_ONLINE;
1802 }
1803
1804 return GSW_HAL_SUCCESS;
1805}
1806
1807
1808
1809/**
1810 * @brief set radio opmode, as open and close airplane mode
1811 * @param [in] op_mode 1 is radio on, 0 is radio off
1812 * @retval 0: success
1813 * @retval other: fail
1814 */
1815int gsw_set_opmode(int op_mode)
1816{
1817 mbtk_modem_info_t info;
1818 int rf_mode = -1;
1819 int ret = -1;
1820
1821 if (nw_init_flag == 0 || nw_info_handle == NULL)
1822 {
xy.heb41615b2025-05-28 16:33:20 +08001823 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001824 }
1825
1826 if(op_mode == GSW_OP_MODE_LPM)
1827 {
1828 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1829 }
1830
1831 if(op_mode == GSW_OP_MODE_ONLINE)
1832 {
1833 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1834 }
1835
1836 if(op_mode == GSW_OP_MODE_OFFLINE)
1837 {
1838 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1839 }
1840
1841 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1842 {
1843 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001844 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001845 }
1846
1847 info.fun = rf_mode;
1848 info.rst = 0;
1849 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1850 if (ret != 0)
1851 {
1852 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001853 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001854 }
1855
1856 return GSW_HAL_SUCCESS;
1857
1858}
1859
1860
1861/**
1862 * @brief get network mode preference of mdm search network scale
1863 * @param [out] mode_pref net_work pref mode:
1864 * enum prefer_mode
1865 * @retval 0: success
1866 * @retval other: fail
1867 */
1868int gsw_get_mode_preference(int *mode_pref)
1869{
1870 if (nw_init_flag == 0 || nw_info_handle == NULL)
1871 {
xy.heb41615b2025-05-28 16:33:20 +08001872 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001873 }
1874
1875 int ret = -1;
1876 mbtk_band_info_t band;
1877 memset(&band, 0, sizeof(mbtk_band_info_t));
1878
1879 ret = mbtk_current_band_get(nw_info_handle, &band);
1880 if(ret != 0)
1881 {
1882 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001883 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001884 }
1885
1886 *mode_pref = convert_gsw_net_config(band.net_pref);
1887 LOGE("band.net_pref = %d\n", *mode_pref);
1888 if(*mode_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 return GSW_HAL_SUCCESS;
1894
1895
1896}
1897
1898/**
1899 * @brief set network mode preference of mdm search network scale
1900 * @param [in] mode_pref net_work pref mode:
1901 * enum prefer_mode
1902 * @retval 0: success
1903 * @retval other: fail
1904 */
1905int gsw_set_mode_preference(int mode_pref)
1906{
1907 if (nw_init_flag == 0 || nw_info_handle == NULL)
1908 {
xy.heb41615b2025-05-28 16:33:20 +08001909 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001910 }
1911
1912 int ret = -1;
1913
1914 mbtk_band_info_t band;
1915 memset(&band, 0, sizeof(mbtk_band_info_t));
1916
1917 band.net_pref = convert_mbtk_net_config(mode_pref);
1918 LOGE("band.net_pref = %d\n", band.net_pref);
1919
1920 if(band.net_pref < 0)
1921 {
1922 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001923 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001924 }
1925
1926 ret = mbtk_current_band_set(nw_info_handle, &band);
1927 if(ret != 0)
1928 {
1929 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001930 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001931 }
1932
1933 return GSW_HAL_SUCCESS;
1934}
1935
1936/**
1937 * @brief get signal csq value
1938 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
1939 * @retval 0: success
1940 * @retval other: fail
1941 */
1942int gsw_get_sig_info(int *csq_value)
1943{
b.liu68a94c92025-05-24 12:53:41 +08001944 if (nw_init_flag == 0 || nw_info_handle == NULL)
1945 {
xy.heb41615b2025-05-28 16:33:20 +08001946 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001947 }
1948
1949 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08001950 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08001951 if(ret != 0)
1952 {
1953 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001954 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001955 }
1956
1957 LOGD("signal.type=%d\n", signal.type);
1958 switch(signal.type)
1959 {
q.huangfa0a0a32025-06-12 17:07:23 +08001960
b.liu68a94c92025-05-24 12:53:41 +08001961 case MBTK_RADIO_TECH_E_UTRAN:
1962 {
q.huangfa0a0a32025-06-12 17:07:23 +08001963 LOGD("lte rsrp = %d dbm",signal.rsrp-141);
1964 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08001965 break;
1966 }
1967 case MBTK_RADIO_TECH_UTRAN:
1968 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1969 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1970 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1971 case MBTK_RADIO_TECH_UTRAN_HSPA:
1972 {
q.huangfa0a0a32025-06-12 17:07:23 +08001973 LOGD("w rscp = %d dbm",signal.rscp-121);
1974 *csq_value = rscpToLevel(signal.rscp-121);
1975 break;
1976 }
1977 case MBTK_RADIO_TECH_GSM:
1978 case MBTK_RADIO_TECH_GSM_COMPACT:
1979 case MBTK_RADIO_TECH_GSM_EGPRS:
1980 {
1981 LOGD("gsm rssi = %d (0-31)",signal.rssi);
1982 *csq_value = signal.rssi;
b.liu68a94c92025-05-24 12:53:41 +08001983 break;
1984 }
1985 default:
1986 {
q.huangfa0a0a32025-06-12 17:07:23 +08001987 LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08001988 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001989 }
1990 }
1991 return GSW_HAL_SUCCESS;
1992}
1993
1994/**
1995 * @brief set nework power mode, for tcam enter standby or exit standby
1996 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
1997 * @retval 0: success
1998 * @retval other: fail
1999 */
2000int gsw_network_set_power_mode(char mode)
2001{
2002 int ret = -1;
2003
2004 if (nw_init_flag == 0 || nw_info_handle == NULL)
2005 {
xy.heb41615b2025-05-28 16:33:20 +08002006 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002007 }
2008
2009 if(mode != 0 && mode != 1)
2010 {
2011 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002012 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002013 }
2014
2015 if(mode == 1)
2016 {
2017 mode = 6;
2018 }
2019
2020 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
2021 if(ret != 0)
2022 {
2023 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002024 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002025 }
2026
2027 return GSW_HAL_SUCCESS;
2028
2029
2030
2031}
2032
2033/**
2034 * @brief convert rsrp rscp rssi to csq value.
2035 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2036 * @param [in] sigvalue input signal_strength for different nettype
2037 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2038
2039 * @retval csq
2040 * @retval other: fail
2041 */
2042int gsw_sigInfo_to_csq(int netType, int sigValue)
2043{
q.huang238b22a2025-06-10 14:36:59 +08002044 if (nw_init_flag == 0 || nw_info_handle == NULL)
2045 {
2046 return GSW_HAL_NORMAL_FAIL;
2047 }
b.liu68a94c92025-05-24 12:53:41 +08002048 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002049 {
2050 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002051 {
q.huangfa0a0a32025-06-12 17:07:23 +08002052 return rsrpToLevel(sigValue);
2053 }
2054 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002055 {
q.huangfa0a0a32025-06-12 17:07:23 +08002056 return rscpToLevel(sigValue);
2057 }
2058 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002059 {
q.huangfa0a0a32025-06-12 17:07:23 +08002060 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002061 }
2062
2063 default:
2064 {
2065 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002066 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002067 }
2068 }
2069}
2070
2071/*
2072 * @brief get mobile operator name
2073 @param [out] nw_operator_name_infos get the long and short operator name info
2074 @retval 0: success
2075 @retval 0: other: fail
2076 */
2077int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2078{
2079 char OperatorFN[128];
2080 char OperatorSH[128];
2081 char temp[12] = {0};
2082 mbtk_net_info_t net;
2083
2084 if (nw_init_flag == 0 || nw_info_handle == NULL)
2085 {
xy.heb41615b2025-05-28 16:33:20 +08002086 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002087 }
2088
2089 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2090 {
2091 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2092 int i = 0;
2093 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2094 {
2095 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2096 break;
2097 i++;
2098 }
2099
2100 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2101 {
2102 strcpy(OperatorFN, "UNKNOWN");
2103 strcpy(OperatorSH, "UNKNOWN");
2104 }
2105 else
2106 {
2107 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2108 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2109
2110 memset(temp,0,12);
2111 memset(nw_operator_name_infos->mcc,0,4);
2112 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
2113 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2114
2115 memset(temp,0,12);
2116 memset(nw_operator_name_infos->mnc,0,4);
2117 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2118 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2119 }
2120
2121 memset(nw_operator_name_infos->long_eons,0,128);
2122 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2123 memset(nw_operator_name_infos->short_eons,0,128);
2124 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2125
2126 return GSW_HAL_SUCCESS;
2127 }
2128
2129 else
2130 {
2131 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002132 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002133 }
2134
2135 return GSW_HAL_SUCCESS;
2136}
2137
2138
2139/*
2140 * @brief get current serving cell info
2141 * @param cell_info: [out] struct for current cell info
2142 * include earfcn mcc mnc pci psc tac lac etc.
2143 * @return int: 0 is success, other failed
2144 */
2145int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2146{
2147 int ret = -1;
2148
2149 if (nw_init_flag == 0 || nw_info_handle == NULL)
2150 {
q.huang238b22a2025-06-10 14:36:59 +08002151 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002152 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002153 }
2154
2155 list_node_t* cell_list = NULL;
2156 int neibor_count = 0;
2157 mbtk_cell_type_enum type;
2158 ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
2159 if(ret || cell_list == NULL) {
2160 LOGE("mbtk_cell_get failed : %d\n", ret);
2161 } else {
2162 list_first(cell_list);
2163 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2164 if(cell) { // Current server cell.
2165 switch(type)
2166 {
2167 case 0:
2168 {
2169 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2170 char gsm_temp[12] = {0};
2171
2172 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2173
2174 cell_info->mcc_valid = 1;
2175 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);
2176 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2177
2178 memset(gsm_temp, 0, sizeof(gsm_temp));
2179
2180 cell_info->mnc_valid = 1;
2181 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);
2182 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2183
2184 cell_info->cell_id_valid = 1;
2185 cell_info->cell_id = cell->value2;
2186
2187 cell_info->lac_valid = 1;
2188 cell_info->lac = cell->value1;
2189
2190 cell_info->arfcn_valid = 1;
2191 cell_info->arfcn = cell->value3;
2192
2193 break;
2194 }
2195
2196 case 1:
2197 {
2198 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2199 char wcdma_temp[12] = {0};
2200
2201 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2202
2203 cell_info->mcc_valid = 1;
2204 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);
2205 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2206
2207 memset(wcdma_temp, 0, sizeof(wcdma_temp));
2208
2209 cell_info->mnc_valid = 1;
2210 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);
2211 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2212
2213 cell_info->lac_valid = 1;
2214 cell_info->lac = cell->value1;
2215
2216 cell_info->cell_id_valid = 1;
2217 cell_info->cell_id = cell->value2;
2218
2219 cell_info->uarfcn_valid = 1;
2220 cell_info->uarfcn = cell->value3;
2221
2222 cell_info->psc_valid = 1;
2223 cell_info->psc = cell->value6;
2224 break;
2225 }
2226
2227 case 2:
2228 {
2229 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
2230
2231 char lte_temp[12] = {0};
2232
2233 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2234
2235 cell_info->mcc_valid = 1;
2236 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2237 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2238
2239 memset(lte_temp, 0, sizeof(lte_temp));
2240
2241 cell_info->mnc_valid = 1;
2242 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2243 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2244
2245 cell_info->tac_valid = 1;
2246 cell_info->tac = cell->value1;
2247
2248 cell_info->pci_valid = 1;
2249 cell_info->pci = cell->value2;
2250
2251 cell_info->earfcn_valid = 1;
2252 cell_info->earfcn = cell->value3;
2253
2254 cell_info->bler_valid = 1;
2255 cell_info->bler = cell->value4;
2256
2257 cell_info->band_valid = 1;
2258 cell_info->band = cell->value5;
2259
2260 cell_info->rsrp_valid = 1;
2261 cell_info->rsrp = cell->value8;
2262
2263 cell_info->rsrq_valid = 1;
2264 cell_info->rsrq = cell->value9;
2265
2266 cell_info->cell_id_valid = 1;
2267 cell_info->cell_id = cell->value10;
2268
2269 break;
2270 }
2271
2272 default:
2273 break;
2274 }
2275 }
2276
2277 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2278 {
2279 switch(type)
2280 {
2281 //GSM
2282 case 0:
2283 {
2284
2285 }
2286 //WCDMA
2287 case 1:
2288 {
2289 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2290
2291 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2292
2293 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2294 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2295
2296 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2297 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2298
2299 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2300
2301 neibor_count++;
2302
2303 }
2304 //LTE
2305 case 2:
2306 {
2307 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2308 char lte_temp[12] = {0};
2309 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2310
2311 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2312 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->mcc));
2313
2314 memset(lte_temp, 0, sizeof(lte_temp));
2315
2316 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2317 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->mnc));
2318
2319 cell_info->ext_info[neibor_count].pci = cell->value1;
2320 cell_info->ext_info[neibor_count].pci_valid = 1;
2321
2322 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2323 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2324
2325 cell_info->ext_info[neibor_count].rsrp = cell->value3;
2326 cell_info->ext_info[neibor_count].rsrp_valid = 1;
2327
2328 cell_info->ext_info[neibor_count].rsrq = cell->value4;
2329 cell_info->ext_info[neibor_count].rsrq_valid = 1;
2330
2331 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2332 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2333
2334 cell_info->ext_info[neibor_count].band = cell->value9;
2335 cell_info->ext_info[neibor_count].band_valid = 1;
2336
2337 cell_info->ext_info[neibor_count].rssi = cell->value10;
2338 cell_info->ext_info[neibor_count].rssi_valid = 1;
2339
2340 neibor_count++;
2341 }
2342
2343 default:
2344 break;
2345 }
2346 }
2347 }
2348 list_free(cell_list);
2349
2350 return GSW_HAL_SUCCESS;
2351}
2352
2353/*
2354 * @brief set modem status event callback
2355 @param [in] handle_ptr callback function address
2356 @retval 0: success
2357 @retval 0: other: fail
2358 */
2359int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2360{
2361
2362 if (nw_init_flag == 0 || nw_info_handle == NULL)
2363 {
xy.heb41615b2025-05-28 16:33:20 +08002364 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002365 }
2366
b.liu68a94c92025-05-24 12:53:41 +08002367 if(handle_ptr == NULL)
2368 {
2369 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08002370 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002371 }
2372
2373 modem_cb = handle_ptr;
2374
b.liu68a94c92025-05-24 12:53:41 +08002375 return GSW_HAL_SUCCESS;
2376
2377}
2378
2379
2380/*
2381 * @brief get PLMNs from the FPLMN list
2382 * @param [inout] plmn_list:
2383 * @retval 0: success
2384 * @retval other: fail
2385 */
2386int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2387{
2388 if (nw_init_flag == 0 || nw_info_handle == NULL)
2389 {
xy.heb41615b2025-05-28 16:33:20 +08002390 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002391 }
2392
2393 int ret = -1;
2394 char fplmn[256] = {0};
2395 LOGE("mbtk_fplmn_get enter\n");
2396 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2397 LOGE("mbtk_fplmn_get exit\n");
2398 if(ret != 0)
2399 {
2400 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002401 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002402 }
2403
2404 update_fplmn_list(fplmn);
2405 for(int i = 0; i < fplmn_index; i++)
2406 {
2407 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2408 {
2409 continue;
2410 }
2411 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);
2412 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);
2413 plmn_list->plmn_list_len++;
2414 }
2415
2416 LOGE("fplmn = %s\n", fplmn);
2417 return GSW_HAL_SUCCESS;
2418}
2419
2420/*
2421 * @brief add PLMNs from the plmn_list to the FPLMN list
2422 * @param [in] plmn_list:
2423 * @retval 0: success
2424 * @retval other: fail
2425 */
2426int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2427{
2428
2429 if (nw_init_flag == 0 || nw_info_handle == NULL)
2430 {
xy.heb41615b2025-05-28 16:33:20 +08002431 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002432 }
2433
2434 if(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 int i = 0;
2441 int index = -1;
2442
2443 for(i = 0; i < plmn_list->plmn_list_len; i++)
2444 {
2445 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2446
2447 if(index == -1)
2448 {
2449 LOGE("no this PLMN, add it\n");
2450 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2451 {
2452 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002453 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002454 }
2455
2456 else
2457 {
2458 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2459 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2460 fplmn_array[fplmn_index][5] = '\0';
2461 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2462 fplmn_index++;
2463 }
2464 }
2465
2466 else
2467 {
2468 LOGE("already have this PLMN, don't add it\n");
2469 }
2470 }
2471
2472 char fplmn_str[256] = {0};
2473 convert_plmn_to_fplmn_str(fplmn_str);
2474
2475 LOGE("fplmn_str = %s\n", fplmn_str);
2476
2477 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2478 if(ret != 0)
2479 {
2480 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002481 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002482 }
2483
2484 LOGE("gsw_add_forbidden_networks exit\n");
2485 return GSW_HAL_SUCCESS;
2486}
2487
2488/*
2489 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2490 * @param [in] plmn_list:
2491 * @retval 0: success
2492 * @retval other: fail
2493 */
2494int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2495{
b.liu68a94c92025-05-24 12:53:41 +08002496 if (nw_init_flag == 0 || nw_info_handle == NULL)
2497 {
q.huangfa0a0a32025-06-12 17:07:23 +08002498 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002499 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002500 }
2501
2502 int i = 0;
2503 int index = -1;
2504
2505 for(i = 0; i < plmn_list->plmn_list_len; i++)
2506 {
2507 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2508 if(index != -1)
2509 {
2510 remove_fplmn(index);
2511 }
2512 else
2513 {
2514 LOGE("no this PLMN, can't remove it\n");
2515 }
2516 }
2517
2518 for(i = 0; i < fplmn_index; i++)
2519 {
2520 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2521 }
2522
2523 char fplmn_str[256] = {0};
2524 convert_plmn_to_fplmn_str(fplmn_str);
2525 LOGE("fplmn_str = %s\n", fplmn_str);
2526
2527 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2528 if(ret != 0)
2529 {
2530 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002531 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002532 }
2533
2534 LOGE("gsw_remove_forbidden_networks exit\n");
2535 return GSW_HAL_SUCCESS;
2536}
2537
2538/*
2539 * @brief clear FPLMN list
2540 * @param
2541 * @retval 0: success
2542 * @retval other: fail
2543 */
2544int gsw_clear_forbidden_networks(void)
2545{
2546 if (nw_init_flag == 0 || nw_info_handle == NULL)
2547 {
xy.heb41615b2025-05-28 16:33:20 +08002548 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002549 }
2550
2551 char fplmn_str[FPLMN_STRING_LENGTH+1];
2552 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2553 fplmn_str[(6 * fplmn_max_length)] = '\0';
2554
2555 LOGE("%s\n", fplmn_str);
2556 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2557 if(ret != 0)
2558 {
2559 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002560 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002561 }
2562
2563 return GSW_HAL_SUCCESS;
2564}
2565
2566/*
2567 * @brief get oos config
2568 * @param [in] oos_config
2569 * @retval 0: success
2570 * @retval other: fail
2571 */
2572int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2573{
2574 if (nw_init_flag == 0 || nw_info_handle == NULL)
2575 {
xy.heb41615b2025-05-28 16:33:20 +08002576 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002577 }
2578
2579 if(pt_info == NULL)
2580 {
2581 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002582 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002583 }
2584
2585 int ret = -1;
2586
2587 mbtk_oos_info oos_info;
2588 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2589
2590 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2591 if(ret != 0)
2592 {
2593 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002594 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002595 }
2596
2597 if(oos_info.mode == 0)
2598 {
2599 pt_info->t_min = 0;
2600 pt_info->t_step = 0;
2601 pt_info->t_max = 0;
2602 }
2603
2604 else
2605 {
2606 pt_info->t_min = (int)oos_info.oosPhase[0];
2607 pt_info->t_step = (int)oos_info.oosPhase[1];
2608 pt_info->t_max = (int)oos_info.oosPhase[2];
2609 }
2610
2611 return GSW_HAL_SUCCESS;
2612}
2613
2614
2615/*
2616 * @brief set oos config
2617 * @param [in] oos_config
2618 * @retval 0: success
2619 * @retval other: fail
2620 */
2621int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2622{
2623 if (nw_init_flag == 0 || nw_info_handle == NULL)
2624 {
xy.heb41615b2025-05-28 16:33:20 +08002625 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002626 }
2627
2628 if(pt_info == NULL)
2629 {
2630 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002631 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002632 }
2633
2634 int ret = -1;
2635 mbtk_oos_info oos_info;
2636 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2637
2638 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2639 {
2640 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002641 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002642 }
2643 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2644 {
2645 oos_info.mode = 1;
2646 oos_info.oosPhase[0] = pt_info->t_min;
2647 }
2648 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)
2649 {
2650 oos_info.mode = 1;
2651 oos_info.oosPhase[0] = pt_info->t_min;
2652 oos_info.oosPhase[1] = pt_info->t_step;
2653 }
2654 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))
2655 {
2656 oos_info.mode = 1;
2657 oos_info.oosPhase[0] = pt_info->t_min;
2658 oos_info.oosPhase[1] = pt_info->t_step;
2659 oos_info.oosPhase[2] = pt_info->t_max;
2660 }
2661 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2662 {
2663 oos_info.mode = 0;
2664 }
2665 else
2666 {
2667 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002668 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002669 }
2670
2671 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2672 if(ret != 0)
2673 {
2674 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002675 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002676 }
2677
2678 return GSW_HAL_SUCCESS;
2679}
2680
q.huang238b22a2025-06-10 14:36:59 +08002681/**
2682 * @brief get imei function
2683 * @param [in] len imei length,max is 20
2684 * @param [out] imei return imei from this func
2685 * @retval 0: success
2686 * @retval other: fail
2687 */
2688int gsw_get_imei(int len, char *imei)
2689{
2690 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08002691
q.huang238b22a2025-06-10 14:36:59 +08002692 if (nw_init_flag == 0 || nw_info_handle == NULL)
2693 {
2694 printf("nw sdk has been deinit\n");
2695 return GSW_HAL_NORMAL_FAIL;
2696 }
2697
2698 if(imei == NULL)
2699 {
2700 LOGE("imei is NULL.");
2701 return GSW_HAL_ARG_INVALID;
2702 }
2703
2704 if(len < GSW_IMEI_LENGTH)
2705 {
2706 LOGE("imei len is too short,len = %d\n", len);
2707 return GSW_HAL_NORMAL_FAIL;
2708 }
2709
2710 ret = mbtk_imei_get(nw_info_handle, (void *)imei);
2711 if(ret != MBTK_ERR_OK)
2712 {
2713 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2714 return GSW_HAL_NORMAL_FAIL;
2715 }
2716
2717 return GSW_HAL_SUCCESS;
2718}
2719
2720/**
2721 * @brief reset modem stack only, notice: after use this method, all ril sdk
2722 * need restart by app, means network, sim, sms, data need deinit then init!
2723 * @param
2724 * @retval 0: success
2725 * @retval other: fail
2726 */
2727int gsw_reset_modem(void)
2728{
2729 int ret = -1;
2730 if (nw_init_flag == 0 || nw_info_handle == NULL)
2731 {
2732 printf("nw sdk has been deinit\n");
2733 return GSW_HAL_NORMAL_FAIL;
2734 }
2735 mbtk_modem_info_t info;
2736 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2737 info.rst = 0;
2738
2739 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2740 if(ret)
2741 {
2742 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2743 return GSW_HAL_NORMAL_FAIL;
2744 }
2745
2746 sleep(1);
2747
2748 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2749 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2750 if(ret)
2751 {
2752 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2753 return GSW_HAL_NORMAL_FAIL;
2754 }
2755 return GSW_HAL_SUCCESS;
2756}
b.liu68a94c92025-05-24 12:53:41 +08002757
q.huangc8b93122025-06-17 17:46:05 +08002758int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2759{
2760 if (nw_init_flag == 0 || nw_info_handle == NULL)
2761 {
2762 return GSW_HAL_NORMAL_FAIL;
2763 }
2764
2765 if(handle_ptr == NULL)
2766 {
2767 LOGE("handle_ptr is NULL\n");
2768 return GSW_HAL_NORMAL_FAIL;
2769 }
2770
2771 airplane_cb = handle_ptr;
2772
2773 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_operating_mode_event_callback);
2774 if(ret != 0)
2775 {
2776 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
2777 airplane_cb=NULL;
2778 return GSW_HAL_NORMAL_FAIL;
2779 }
2780
2781 return GSW_HAL_SUCCESS;
2782
2783}
2784