blob: 90da70b0ebbc06e05df922c2f84e55e91f938dc6 [file] [log] [blame]
hong.liud2417072025-06-27 07:10:37 -07001#include <stdbool.h>
b.liu68a94c92025-05-24 12:53:41 +08002#include <dlfcn.h>
3#include <time.h>
4#include <pthread.h>
q.huang66b79162025-06-27 17:45:34 +08005#include <cutils/properties.h>
hong.liud2417072025-06-27 07:10:37 -07006#include "gsw_nw_interface.h"
cz.lif4a9a932025-06-05 11:37:59 +08007#define SIG_TIMER 5
q.huang66b79162025-06-27 17:45:34 +08008#define MODEM_TIMER 5
9
b.liu68a94c92025-05-24 12:53:41 +080010//mbtk include
11#define LYNQ_AIR_PLANE_MODE_OFF 1 //at+cfun = 1
12#define LYNQ_AIR_PLANE_MODE_ON 4 // at+cfun = 4
13#define LYNQ_AIR_CFUN_MODE_OFF 0 // at+cfun = 0
14
15#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
16
17#define FPLMN_STRING_LENGTH 120
18#define ENTRY_LENGTH 6
19#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1
20
q.huang238b22a2025-06-10 14:36:59 +080021#define MBTK_ERR_OK 0
xf.li56b78fb2025-06-13 03:29:21 -070022#define GSW_IMEI_LENGTH 15+1
q.huang238b22a2025-06-10 14:36:59 +080023
q.huangfa0a0a32025-06-12 17:07:23 +080024#define INT_32_MAX (0x7FFFFFFF)
25
q.huang238b22a2025-06-10 14:36:59 +080026
b.liu68a94c92025-05-24 12:53:41 +080027#ifndef FALSE
28#define FALSE (0)
29#endif
30
31
32#ifndef TRUE
33#define TRUE (!FALSE)
34#endif
35
36typedef unsigned int uint32;
37typedef unsigned char uint8;
q.huang861c07d2025-06-24 16:54:58 +080038typedef signed char int8;
b.liu68a94c92025-05-24 12:53:41 +080039typedef unsigned short uint16;
40typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
41
q.huang66b79162025-06-27 17:45:34 +080042#define MBTK_READY_UCI "persist.mbtk.sdk.state"
43#define MBTK_READY_STRING_SIZE_MAX (3+1)
44
45
46typedef enum{
47 MBTK_READY_INIT = -1,
48 MBTK_READY_SUCCESS,
49 MBTK_READY_MODEM_FAIL,
50 MBTK_READY_RESPONSE_FAIL,
51 MBTK_READY_SOCKET_FAIL,
52 MBTK_READY_RIL_FAIL
53}mbtk_ready_status_type;
54
55bool str_empty(const void *str);
56
b.liu68a94c92025-05-24 12:53:41 +080057typedef enum
58{
59 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
60 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
61 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
62 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
63 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
64 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
65}MBTK_DEV_MODEM_FUNCTION;
66
67typedef enum
68{
69 MBTK_CELL_TYPE_GSM = 0,
70 MBTK_CELL_TYPE_UMTS,
71 MBTK_CELL_TYPE_LTE
72} mbtk_cell_type_enum;
73
74typedef struct
75{
76 MBTK_DEV_MODEM_FUNCTION fun;
77 int rst;
78} mbtk_modem_info_t;
79
80typedef struct
81{
82 int client_fd;
83 pthread_t read_thread_id;
84 int exit_fd[2];
85 bool is_waitting;
86 pthread_cond_t cond;
87 pthread_mutex_t mutex;
88
89 pthread_mutex_t send_mutex;
90
91 // Temp response data.
92 uint16 info_err;
93 uint16 data_len;
94 void *data;
95
96 //mbtk wyq for server_ready_status add start
97 char server_ready_status;
98 //mbtk wyq for server_ready_status add end
99
100 mbtk_info_callback_func net_state_cb;
101 mbtk_info_callback_func call_state_cb;
102 mbtk_info_callback_func sms_state_cb;
103 mbtk_info_callback_func radio_state_cb;
104 mbtk_info_callback_func sim_state_cb;
105 mbtk_info_callback_func pdp_state_cb;
106 //add signal by xr
107 mbtk_info_callback_func signal_state_cb;
108} mbtk_info_handle_t;
109
110
111
112typedef struct
113{
q.huang638d5872025-06-21 13:44:43 +0800114 // NR server cell:
115 // NR cell:
b.liu68a94c92025-05-24 12:53:41 +0800116 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
117 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
118 // WCDMA server cell: lac, ci, arfcn
119 // WCDMA cell: lac, ci, arfcn
120 // GSM server cell: lac, ci, arfcn, bsic
121 // GSM cell:
q.huang638d5872025-06-21 13:44:43 +0800122 uint32 value1; //tac
123 uint32 value2; //pci
124 uint32 value3; //dlEuarfcn
125 uint32 value4; //bler
126 uint32 value5; //band
127 uint32 value6; //mcc
128 uint32 value7; //mnc
129 uint32 value8; //rsrp
130 uint32 value9; //rsrq
131 uint32 value10; //cell identiy
132 uint32 value11; //sinr
133 uint32 value12; //is tdd
134 uint32 value13;
135 uint32 value14;
136 uint32 value15;
b.liu68a94c92025-05-24 12:53:41 +0800137} __attribute__((packed)) mbtk_cell_info_t;
138
b.liu68a94c92025-05-24 12:53:41 +0800139typedef struct
140{
141 uint8 net_pref; // mbtk_net_pref_enum
142 uint16 gsm_band; // mbtk_gsm_band_enum
143 uint16 umts_band; // mbtk_umts_band_enum
144 uint32 tdlte_band; // mbtk_tdlte_band_enum
145 uint32 fddlte_band; // mbtk_fddlte_band_enum
146 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
147} __attribute__((packed)) mbtk_band_info_t;
148
149typedef struct list_arraynode
150{
151 void *data;
152 struct list_arraynode *next;
153} list_arraynode_t;
154
155typedef struct list_treenode
156{
157 list_arraynode_t *data;
158 int count;
159 struct list_treenode *left;
160 struct list_treenode *right;
161} list_treenode_t;
162
163typedef int (*list_sort_func)(void *data1, void *data2);
164typedef void (*list_free_func)(void *data);
165
166typedef struct list_node
167{
168 uint32 size;
169 list_sort_func sort_func;
170 list_free_func free_func;
171
172 uint32 cur_index;
173 list_arraynode_t *cur_array_data;
174
175 list_arraynode_t array_data;
176 list_treenode_t tree_data;
177} list_node_t;
178
179/*
1800: GSM
1811: GSM Compact
1822: UTRAN
1833: GSM w/EGPRS
1844: UTRAN w/HSDPA
1855: UTRAN w/HSUPA
1866: UTRAN w/HSDPA and HSUPA
1877: E-UTRAN
1888: UTRAN HSPA+
189*/
190typedef enum {
191 MBTK_RADIO_TECH_GSM = 0,
192 MBTK_RADIO_TECH_GSM_COMPACT,
193 MBTK_RADIO_TECH_UTRAN,
194 MBTK_RADIO_TECH_GSM_EGPRS,
195 MBTK_RADIO_TECH_UTRAN_HSDPA,
196 MBTK_RADIO_TECH_UTRAN_HSUPA,
197 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
198 MBTK_RADIO_TECH_E_UTRAN, // LTE
199 MBTK_RADIO_TECH_UTRAN_HSPA
200} mbtk_radio_technology_enum;
201
202typedef struct
203{
204 /*
205 0: automatic
206 1: manual
207 */
208 uint8 net_sel_mode;
209 /*
210 0: GSM
211 1: GSM Compact
212 2: UTRAN
213 3: GSM w/EGPRS
214 4: UTRAN w/HSDPA
215 5: UTRAN w/HSUPA
216 6: UTRAN w/HSDPA and HSUPA
217 7: E-UTRAN
218 8: UTRAN HSPA+
219 0xFF: Unused
220 */
221 uint8 net_type;
222 //uint8 plmn[10]; // 46000
223 /*
224 0: unknown
225 1: available
226 2: current
227 3: forbidden
228 */
229 uint8 net_state;
230 uint32 plmn;
231} __attribute__((packed)) mbtk_net_info_t;
232
233
234typedef enum
235{
236 MBTK_NET_REG_STATE_NON = 0,
237 MBTK_NET_REG_STATE_HOME,
238 MBTK_NET_REG_STATE_SEARCHING,
239 MBTK_NET_REG_STATE_DENIED,
240 MBTK_NET_REG_STATE_UNKNOWN,
241 MBTK_NET_REG_STATE_ROAMING,
242 MBTK_NET_REG_STATE_SMS_ONLY,
243 MBTK_NET_REG_STATE_ROAMING_SMS,
244 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
245 MBTK_NET_REG_STATE_CSFB_HOME,
246 MBTK_NET_REG_STATE_CSFB_ROAMING,
247 MBTK_NET_REG_STATE_EMERGENCY_ONLY
248} mbtk_net_reg_state_enum;
249
250typedef struct
251{
252 uint8 call_state;// mbtk_net_reg_state_enum
253 uint8 data_state;// mbtk_net_reg_state_enum
254 uint8 ims_state;// mbtk_net_reg_state_enum
255 uint8 type; // mbtk_radio_technology_enum
256 uint16 lac;
257 uint32 ci;
258} __attribute__((packed)) mbtk_net_reg_info_t;
259
260typedef struct
261{
262 uint8 type; // mbtk_radio_technology_enum
263 uint8 rssi; // 0: 113 dBm or less
264 // 1: 111 dBm
265 // 2��30: 109��53 dBm
266 // 31: 51 dBm or greater
267 // 99: not known or not detectable
268 uint8 rxlev;// 0:rssi < -110 dBm
269 // 1: -110 dBm �� rssi < -109 dBm
270 // 2: -109 dBm �� rssi < -108 dBm
271 // ......
272 // 61: -50 dBm �� rssi < -49 dBm
273 // 62: -49 dBm �� rssi < -48 dBm
274 // 63: -48 dBm �� rssi
275 // 99: not known or not detectable
276 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
277 // 99 not known or not detectable
278 uint8 rscp; // 0: rscp < -120 dBm
279 // 1: -120 dBm �� rscp < -119 dBm
280 // 2: -119 dBm �� rscp < -118 dBm
281 // ......
282 // 94: -27 dBm �� rscp < -26 dBm
283 // 95: -26 dBm �� rscp < -25 dBm
284 // 96: - 25 dBm �� rscp
285 // 255: not known or not detectable
286 uint8 ecno; // 0: Ec/Io < -24 dB
287 // 1: -24 dB �� Ec/Io < -23.5 dB
288 // 2: -23.5 dB �� Ec/Io < -23 dB
289 // ......
290 // 47: -1 dB �� Ec/Io < -0.5 dB
291 // 48: -0.5 dB �� Ec/Io < 0 dB
292 // 49: 0 dB �� Ec/Io
293 // 255: not known or not detectable
294 uint8 rsrq; // 0: rsrq < -19.5 dB
295 // 1: -19.5 dB �� rsrq < -19 dB
296 // 2: -19 dB �� rsrq < -18.5 dB
297 // ......
298 // 32: -4 dB �� rsrq < -3.5 dB
299 // 33: -3.5 dB �� rsrq < -3 dB
300 // 34: -3 dB �� rsrq
301 // 255: not known or not detectable
302 uint8 rsrp; // 0: rsrp < -140 dBm
303 // 1: -140 dBm �� rsrp < -139 dBm
304 // 2: -139 dBm �� rsrp < -138 dBm
305 // ......
306 // 95: -46 dBm �� rsrp < -45 dBm
307 // 96: -45 dBm �� rsrp < -44 dBm
308 // 97: -44 dBm �� rsrp
309 // 255: not known or not detectable
q.huang861c07d2025-06-24 16:54:58 +0800310 int8 sinr; //-20-35 dbm
b.liu68a94c92025-05-24 12:53:41 +0800311} __attribute__((packed)) mbtk_signal_info_t;
312
313typedef struct{
314 uint8_t mode;
315 uint32_t oosPhase[3]; //单位为秒
316} mbtk_oos_info;
317
318typedef struct
319{
320 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
321 int t_min;
322 int t_step;
323 int t_max;
324}GSW_NW_OOS_CONFIG_INFO_T;
325
b.liu68a94c92025-05-24 12:53:41 +0800326#define lib_mbtk_path "/lib/libmbtk_lib.so"
327mbtk_info_handle_t* nw_info_handle = NULL;
328
q.huang638d5872025-06-21 13:44:43 +0800329static GSW_NW_ServingInfoHandlePtr serving_cb=NULL;
330static GSW_NW_SigInfoHandlePtr sig_cb=NULL;
331static GSW_NW_RejectCauseHandlePtr reject_cb=NULL;
332static GSW_NW_ModemStateHandlePtr modem_cb=NULL;
333static GSW_NW_AirplaneModeHandlePtr airplane_cb=NULL;
b.liu68a94c92025-05-24 12:53:41 +0800334
335static void *dlHandle_mbtk;
336int nw_init_flag = 0;
337int mode = -1;
338int fplmn_max_length = 0;
339
340gsw_nw_plmn_list_t gsw_nw_plmn_list;
341char fplmn_array[FPLMN_ARRAY_SIZE][7];
342int fplmn_index = 0;
343
344static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
345static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
346int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
347int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
348int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
349int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
350static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
351int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
352int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
353int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
354int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
355int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
356int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
357int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
358int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
359int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
360int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
361int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800362int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
363
b.liu68a94c92025-05-24 12:53:41 +0800364
365static void (*mbtk_log)(int level, const char *format, ...);
366static void (*mbtk_log_init)(char *path, char *tag);
367
368#ifndef LOG_ERR_LEVEL
369#define LOG_ERR_LEVEL 3 /* error conditions */
370#endif
371#ifndef LOG_WARN_LEVEL
372#define LOG_WARN_LEVEL 4 /* warning conditions */
373#endif
374#ifndef LOG_INFO_LEVEL
375#define LOG_INFO_LEVEL 6 /* informational */
376#endif
377#ifndef LOG_DEBUG_LEVEL
378#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
379#endif
380#ifndef LOG_VERBOSE_LEVEL
381#define LOG_VERBOSE_LEVEL 8
382#endif
383
l.yang6a42e4d2025-05-28 01:04:20 -0700384#define GSW_NW "[HAL][GSW_NW]"
385
b.liu68a94c92025-05-24 12:53:41 +0800386#define LOGV(fmt, args ...) \
387 do{ \
388 char *file_ptr_1001 = __FILE__; \
389 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
390 char line_1001[10] = {0}; \
391 sprintf(line_1001, "%d", __LINE__); \
392 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
393 if(*ptr_1001 == '/') \
394 break; \
395 ptr_1001--; \
396 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700397 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800398 } while(0)
399
400#define LOGI(fmt, args...) \
401 do{ \
402 char *file_ptr_1001 = __FILE__; \
403 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
404 char line_1001[10] = {0}; \
405 sprintf(line_1001, "%d", __LINE__); \
406 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
407 if(*ptr_1001 == '/') \
408 break; \
409 ptr_1001--; \
410 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700411 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800412 } while(0)
413
414#define LOGD(fmt, args...) \
415 do{ \
416 char *file_ptr_1001 = __FILE__; \
417 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
418 char line_1001[10] = {0}; \
419 sprintf(line_1001, "%d", __LINE__); \
420 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
421 if(*ptr_1001 == '/') \
422 break; \
423 ptr_1001--; \
424 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700425 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800426 } while(0)
427
428#define LOGW(fmt, args...) \
429 do{ \
430 char *file_ptr_1001 = __FILE__; \
431 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
432 char line_1001[10] = {0}; \
433 sprintf(line_1001, "%d", __LINE__); \
434 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
435 if(*ptr_1001 == '/') \
436 break; \
437 ptr_1001--; \
438 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700439 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800440 } while(0)
441
442#define LOGE(fmt, args...) \
443 do{ \
q.huangfa0a0a32025-06-12 17:07:23 +0800444 char *file_ptr_1001 = __FILE__; \
b.liu68a94c92025-05-24 12:53:41 +0800445 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
446 char line_1001[10] = {0}; \
447 sprintf(line_1001, "%d", __LINE__); \
448 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
449 if(*ptr_1001 == '/') \
450 break; \
451 ptr_1001--; \
452 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700453 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800454 } while(0)
455
456
457
458typedef struct
459{
460 char *lynq_operator_l;
461 char *lynq_operator_s;
462 uint32 lynq_mcc_mnc;
463} lynq_operator_mcc_mnc_t;
464
465static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
466{
467 {"China Mobile","CMCC",46000},
468 {"China Unicom","CU",46001},
469 {"China Mobile","CMCC",46002},
470 {"China Telecom","CT",46003},
471 {"China Mobile","CMCC",46004},
472 {"China Telecom","CT",46005},
473 {"China Unicom","CU",46006},
474 {"China Mobile","CMCC",46007},
475 {"China Mobile","CMCC",46008},
476 {"China Unicom","CU",46009},
477 {"China Telecom","CT",46011}
478};
479
480
481//GSW include
482typedef enum prefer_mode
483{
484 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
485 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
486 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
487 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
488 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
489 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
490 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
491 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
492} PREFER_MODE_E;
493
494static int mbtk_nw_api_import()
495{
496 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
497 if (dlHandle_mbtk == NULL)
498 {
xy.heb41615b2025-05-28 16:33:20 +0800499 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800500 }
501
502 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
503 if (mbtk_log_init == NULL)
504 {
xy.heb41615b2025-05-28 16:33:20 +0800505 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800506 }
507
508 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
509 if (mbtk_log == NULL)
510 {
xy.heb41615b2025-05-28 16:33:20 +0800511 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800512 }
513
514 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
515 if (mbtk_info_handle_get == NULL)
516 {
517 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800518 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800519 }
520
521 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
522 if (mbtk_info_handle_free == NULL)
523 {
524 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800525 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800526 }
527
528 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
529 if (mbtk_net_sel_mode_get == NULL)
530 {
531 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800532 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800533 }
534
535 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
536 if (mbtk_net_reg_get == NULL)
537 {
538 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800539 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800540 }
541
542 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
543 if (mbtk_get_modem_fun == NULL)
544 {
545 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800546 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800547 }
548
549 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
550 if (mbtk_set_modem_fun == NULL)
551 {
552 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800553 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800554 }
555
556 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
557 if (mbtk_current_band_get == NULL)
558 {
559 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800560 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800561 }
562
563 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
564 if (mbtk_current_band_set == NULL)
565 {
566 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800567 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800568 }
569
570 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
571 if (mbtk_net_signal_get == NULL)
572 {
573 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800574 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800575 }
576
577 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
578 if (mbtk_wakeup_state_set == NULL)
579 {
580 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800581 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800582 }
583
584 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");
585 if (mbtk_cell_get == NULL)
586 {
587 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800588 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800589 }
590
591 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");
592 if (mbtk_signal_state_change_cb_reg == NULL)
593 {
594 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800595 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800596 }
597
598 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");
599 if (mbtk_net_state_change_cb_reg == NULL)
600 {
601 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800602 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800603 }
604
605 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
606 if (mbtk_fplmn_get == NULL)
607 {
608 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800609 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800610 }
611
612 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
613 if (mbtk_fplmn_set == NULL)
614 {
615 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800616 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800617 }
618
619 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");
620 if (mbtk_radio_state_change_cb_reg == NULL)
621 {
622 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800623 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800624 }
625
626 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
627 if (mbtk_oos_get == NULL)
628 {
629 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800630 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800631 }
632
633 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
634 if (mbtk_oos_set == NULL)
635 {
636 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800637 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800638 }
q.huang238b22a2025-06-10 14:36:59 +0800639
640 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
641 if (mbtk_imei_get == NULL)
642 {
643 LOGE("mbtk_imei_get dlsym fail\n");
644 return GSW_HAL_NORMAL_FAIL;
645 }
b.liu68a94c92025-05-24 12:53:41 +0800646
647 return GSW_HAL_SUCCESS;
648}
649
650void list_first(list_node_t *list)
651{
652 if (list) {
653 list->cur_index = 0;
654 list->cur_array_data = list->array_data.next;
655 }
656}
657
658void* list_next(list_node_t *list)
659{
660 if (list) {
661 list_arraynode_t *node = list->cur_array_data;
662 if (node) {
663 LOGE("node is not null\n");
664 list->cur_array_data = list->cur_array_data->next;
665 list->cur_index++;
666 return node->data;
667 } else {
668 LOGE("node is null\n");
669 return NULL;
670 }
671 } else {
672 LOGE("list is null\n");
673 return NULL;
674 }
675}
676
677void list_free(list_node_t *list)
678{
679 if (list) {
680 list_arraynode_t *node = &(list->array_data); // Head node
681 list_arraynode_t *node_temp = NULL;
682 while (node->next) {
683 node_temp = node->next;
684 node->next = node->next->next;
685
686 if (list->free_func) {
687 list->free_func(node_temp->data);
688 } else {
689 free(node_temp->data);
690 }
691 free(node_temp);
692 }
693 free(list);
694 }
695}
696
q.huang861c07d2025-06-24 16:54:58 +0800697#if 0
q.huang638d5872025-06-21 13:44:43 +0800698static int32_t gsm_rssi_convert_to_dBm(uint8 rssi)
699{
700 if(rssi <= 31)
701 {
702 return rssi * 2 - 113; //0 map -113
703 //31 map -51
704 }
705 else
706 {
707 return INT_32_MAX;
708 }
709}
q.huang861c07d2025-06-24 16:54:58 +0800710#endif
q.huang638d5872025-06-21 13:44:43 +0800711
q.huangfa0a0a32025-06-12 17:07:23 +0800712static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800713{
q.huangfa0a0a32025-06-12 17:07:23 +0800714 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800715 {
q.huangfa0a0a32025-06-12 17:07:23 +0800716 return 121-rscp; // 96 map 25
717 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800718 }
b.liu68a94c92025-05-24 12:53:41 +0800719 else
720 {
q.huangfa0a0a32025-06-12 17:07:23 +0800721 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800722 }
723}
724
q.huangfa0a0a32025-06-12 17:07:23 +0800725static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800726{
q.huangfa0a0a32025-06-12 17:07:23 +0800727 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800728 {
q.huangfa0a0a32025-06-12 17:07:23 +0800729 return 141-rsrp; // 97 map 44
730 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800731 }
732 else
733 {
q.huangfa0a0a32025-06-12 17:07:23 +0800734 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800735 }
736}
737
q.huangfa0a0a32025-06-12 17:07:23 +0800738static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800739{
q.huangfa0a0a32025-06-12 17:07:23 +0800740 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800741 {
q.huangfa0a0a32025-06-12 17:07:23 +0800742 return (40-rsrq)/2; //=20-rsrq / 2;
743 // 34 map 3
744 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800745 }
746 else
747 {
q.huangfa0a0a32025-06-12 17:07:23 +0800748 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800749 }
750}
751
q.huang861c07d2025-06-24 16:54:58 +0800752static int32_t sinr_convert_to_10_times_dB(int8 sinr)
q.huang638d5872025-06-21 13:44:43 +0800753{
754 if(sinr <=35 && sinr>=-20)
755 {
756 return sinr*10; //35 map 350 db
757 // -20 map -2000 db
758 }
759 else
760 {
761 return INT_32_MAX;
762 }
763}
764
765
766static int32_t rscp_minus_dbm_convert_to_rssi_dBm(int32_t rscp)
767{
768 if(rscp!=INT_32_MAX)
769 {
770 return -rscp;
771 }
772 else
773 {
774 return INT_32_MAX;
775 }
776}
777
778static int32_t rsrp_minus_dbm_convert_to_rssi_dBm(int32_t rsrp)
779{
780 if(rsrp!=INT_32_MAX)
781 {
782 return -rsrp;
783 }
784 else
785 {
786 return INT_32_MAX;
787 }
788}
789
q.huang861c07d2025-06-24 16:54:58 +0800790static int32_t rxlev_convert_to_rssi_dBm(uint8 rxlev)
791{
792 if(rxlev<=63)
793 {
794 return rxlev-111; //0 map -111, below -110
795 // 63 map -48
796 }
797 else
798 {
799 return INT_32_MAX;
800 }
801
802}
b.liu68a94c92025-05-24 12:53:41 +0800803
q.huangfa0a0a32025-06-12 17:07:23 +0800804//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
805// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
806// * will be 125.*/
807//uint8 ecno; // 0: Ec/Io < -24 dB
808 // 1: -24 dB �� Ec/Io < -23.5 dB
809 // 2: -23.5 dB �� Ec/Io < -23 dB
810 // ......
811 // 47: -1 dB �� Ec/Io < -0.5 dB
812 // 48: -0.5 dB �� Ec/Io < 0 dB
813 // 49: 0 dB �� Ec/Io
814 // 255: not known or not detectabl
815static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800816{
q.huangfa0a0a32025-06-12 17:07:23 +0800817 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800818 {
q.huangfa0a0a32025-06-12 17:07:23 +0800819 return 245-ecno*5; //49 map 0 db
820 // 1 map 240 db
821 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800822 }
q.huangfa0a0a32025-06-12 17:07:23 +0800823 else
b.liu68a94c92025-05-24 12:53:41 +0800824 {
q.huangfa0a0a32025-06-12 17:07:23 +0800825 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800826 }
827}
828
b.liu68a94c92025-05-24 12:53:41 +0800829
b.liu68a94c92025-05-24 12:53:41 +0800830
q.huangfa0a0a32025-06-12 17:07:23 +0800831/* change realCsq to level */
832static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800833{
q.huangfa0a0a32025-06-12 17:07:23 +0800834
835 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800836 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800837 } else if (rscp <= -95) {
838 return rscp+111; // to 16
839 } else if (rscp >=-93 && rscp <=-90) {
840 return rscp+110; // to 20
841 } else if (rscp >=-89 && rscp <=-59) {
842 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
843 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
844 return 16;
845 } else if(rscp <= -25) {
846 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800847 }
q.huangfa0a0a32025-06-12 17:07:23 +0800848 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800849}
850
q.huangfa0a0a32025-06-12 17:07:23 +0800851static int rsrpToLevel(int rsrp)
852{
853 if (rsrp < -130) {
854 return 0;
855 } else if (rsrp <= -118) {
856 return (rsrp+132)/2; // to 7
857 } else if (rsrp <=-109) {
858 return rsrp+125; // to 16
859 } else if (rsrp <=-103) {
860 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
861 } else if (rsrp <=- 85) {
862 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
863 } else if(rsrp <= -55) {
864 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
865 } else if(rsrp <=-44)
866 {
867 return 31;
868 }
869 return 99;
870}
871
q.huang861c07d2025-06-24 16:54:58 +0800872//uint8 rssi; // 0: 113 dBm or less
873 // 1: 111 dBm
874 // 2��30: 109��53 dBm
875 // 31: 51 dBm or greater
876 // 99: not known or not detectable
877//uint8 rxlev;// 0:rssi < -110 dBm
878 // 1: -110 dBm �� rssi < -109 dBm
879 // 2: -109 dBm �� rssi < -108 dBm
880 // 60 ......
881 // 61: -50 dBm �� rssi < -49 dBm
882 // 62: -49 dBm �� rssi < -48 dBm
883 // 63: -48 dBm �� rssi
884 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +0800885
q.huang861c07d2025-06-24 16:54:58 +0800886/* change realCsq to level */
887static int rxlevToLevel(uint8 rxlev)
888{
889 if (rxlev <=60) {
890 return (rxlev+3)/2; // =(rxlev+1)/2+1,
891 // 0 map 1
892 // 1,2 map 2
893 // 59,60 map 31
894 }
895 else if(rxlev <=63)
896 {
897 return 31;
898 }
899 return 99;
900}
b.liu68a94c92025-05-24 12:53:41 +0800901
902static int convert_reg_state(int reg_state_t)
903{
904 LOGD("reg_state_t = %d\n",reg_state_t);
905 int reg_state = 0;
906
907 switch (reg_state_t)
908 {
909 case MBTK_NET_REG_STATE_NON:
910 {
911 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
912 break;
913 }
914 case MBTK_NET_REG_STATE_HOME:
915 {
916 reg_state = GSW_NETWORK_REG_REGISTERED;
917 break;
918 }
919 case MBTK_NET_REG_STATE_SEARCHING:
920 {
921 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
922 break;
923 }
924 case MBTK_NET_REG_STATE_DENIED:
925 {
926 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
927 break;
928 }
929 case MBTK_NET_REG_STATE_UNKNOWN:
930 {
931 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
932 break;
933 }
934 case MBTK_NET_REG_STATE_ROAMING:
935 {
936 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
937 break;
938 }
939 case MBTK_NET_REG_STATE_SMS_ONLY:
940 case MBTK_NET_REG_STATE_ROAMING_SMS:
941 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
942 case MBTK_NET_REG_STATE_CSFB_HOME:
943 case MBTK_NET_REG_STATE_CSFB_ROAMING:
944 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
945 {
946 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
947 break;
948 }
949 }
950
951 return reg_state;
952}
953
954
955static int convert_net_mode(int net_mode)
956{
957 LOGD("net_mode = %d\n",net_mode);
958 switch(net_mode)
959 {
960 case MBTK_RADIO_TECH_GSM:
961 case MBTK_RADIO_TECH_GSM_COMPACT:
962 case MBTK_RADIO_TECH_GSM_EGPRS:
963 {
964 return GSW_NETWORK_RADIO_GSM;
965 }
966 case MBTK_RADIO_TECH_UTRAN:
967 case MBTK_RADIO_TECH_UTRAN_HSDPA:
968 case MBTK_RADIO_TECH_UTRAN_HSUPA:
969 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
970 case MBTK_RADIO_TECH_UTRAN_HSPA:
971 {
972 return GSW_NETWORK_RADIO_UMTS;
973 }
974 case MBTK_RADIO_TECH_E_UTRAN:
975 {
976 return GSW_NETWORK_RADIO_LTE;
977 }
978
979 default:
980 {
981 return GSW_NETWORK_RADIO_NO_SVC;
982 }
983 }
984
985 return GSW_NETWORK_RADIO_NO_SVC;
986}
987
988static int convert_mbtk_net_config(int config)
989{
990 int net_pref = -1;
991
992 switch(config)
993 {
994 case GSW_PREFER_MODE_GSW:
995 {
996 net_pref = 0;
997 break;
998 }
999
1000 case GSW_PREFER_MODE_WCDMA:
1001 {
1002 net_pref = 1;
1003 break;
1004 }
1005
1006 case GSW_PREFER_MODE_WCDMA_GSM:
1007 {
1008 net_pref = 2;
1009 break;
1010 }
1011
1012 case GSW_PREFER_MODE_LTE:
1013 case GSW_PREFER_MODE_NR5G:
1014 case GSW_PREFER_MODE_NR5G_LTE:
1015 {
1016 net_pref = 5;
1017 break;
1018 }
1019
1020 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
1021 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
1022 {
1023 net_pref = 15;
1024 break;
1025 }
1026 }
1027
1028 return net_pref;
1029}
1030
1031
1032static int convert_gsw_net_config(int config)
1033{
1034 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +08001035 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +08001036
1037 switch (config)
1038 {
1039 case 0:
1040 {
1041 net_config = GSW_PREFER_MODE_GSW;
1042 break;
1043 }
1044
1045 case 1:
1046 {
1047 net_config = GSW_PREFER_MODE_WCDMA;
1048 break;
1049 }
1050
1051 case 2:
1052 {
1053 net_config = GSW_PREFER_MODE_WCDMA_GSM;
1054 break;
1055 }
1056
1057 case 5:
1058 {
1059 net_config = GSW_PREFER_MODE_LTE;
1060 break;
1061 }
1062
1063 case 15:
1064 {
1065 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
1066 break;
1067 }
1068 }
1069
1070 return net_config;
1071}
1072
1073//64F010 -> 46001 (64->46,F0->0,10->01)
1074static void transform_fplmn_str_to_plmn(char *entry)
1075{
1076 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
1077 return; //if FFFFFF,means invalid fplmn, do nothing
1078 }
1079
1080 char temp = entry[0];
1081 entry[0] = entry[1];
1082 entry[1] = temp;
1083
1084 temp = entry[ENTRY_LENGTH - 2];
1085 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
1086 entry[ENTRY_LENGTH - 1] = temp;
1087
1088 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
1089
1090 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
1091
1092 //valid fplmn
1093 fplmn_index++;
1094}
1095
1096static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
1097{
1098 strncpy(mcc,entry,3);
1099 mcc[3] = '\0';
1100 strncpy(mnc,entry + 3,2);
1101 mnc[2] = '\0';
1102
1103 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
1104}
1105
1106
1107static void update_fplmn_list(char *fplmn_str)
1108{
1109 LOGE("fplmn_str = %s\n",fplmn_str);
1110 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
1111 memset(fplmn_array, 0, sizeof(fplmn_array));
1112 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
1113 fplmn_index = 0;
1114 int array_length = 0;
1115
1116 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1117
1118 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1119 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1120 temp_fplmn_array[array_length][length] = '\0';
1121 array_length++;
1122 if (i + 6 >= strlen(fplmn_str)) {
1123 break;
1124 }
1125 }
1126
1127 for (int i = 0; i < array_length; i++) {
1128 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1129 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1130 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1131 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1132 }
1133
1134}
1135
1136static void format_plmn(char *result, char *plmn_entry)
1137{
1138 strncpy(result, plmn_entry, strlen(plmn_entry));
1139 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1140
1141 if (strlen(result) >= 2) {
1142 char temp = result[0];
1143 result[0] = result[1];
1144 result[1] = temp;
1145 }
1146
1147 LOGE("1.result = %s\n",result);
1148
1149 if (strlen(result) >= 3) {
1150 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1151 result[2] = 'F';
1152 }
1153
1154 LOGE("2.result = %s\n",result);
1155
1156 if (strlen(result) >= 2) {
1157 char temp = result[strlen(result) - 1];
1158 result[strlen(result) - 1] = result[strlen(result) - 2];
1159 result[strlen(result) - 2] = temp;
1160 }
1161
1162 LOGE("3.result = %s\n",result);
1163}
1164
1165
1166static void convert_plmn_to_fplmn_str(char *fplmn_str)
1167{
1168 char temp_fplmn_str[128] = {0};
1169 char temp[20]; // 临时存储单个格式化后的数字
1170 int index = 0;
1171
1172 for (int i = 0; i < fplmn_index; i++) {
1173 memset(temp, 0x0, sizeof(temp));
1174 format_plmn(temp, fplmn_array[i]);
1175 strcat(temp_fplmn_str, temp);
1176 index += strlen(temp);
1177 }
1178
1179 while(index < (6 * fplmn_max_length))
1180 {
1181 temp_fplmn_str[index++] = 'F';
1182 }
1183
1184 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1185 if (index > (6 * fplmn_max_length)) {
1186 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1187 }
1188
1189 LOGE("%s\n", temp_fplmn_str);
1190 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1191 LOGE("fplmn_str = %s\n", fplmn_str);
1192}
1193
1194static int check_index(char *mcc, char *mnc)
1195{
1196 int i = 0;
1197
1198 for(i = 0; i < fplmn_index; i++)
1199 {
1200 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1201 {
1202 LOGE("index = %d\n", i);
1203 return i;
1204 }
1205 }
1206
1207 LOGE("not find\n");
1208 return -1;
1209}
1210
1211static void remove_fplmn(int index)
1212{
1213 int write_index = 0;
1214 for (int i = 0; i < fplmn_index; i++) {
1215 if (i != index) {
1216 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1217 }
1218 }
1219 fplmn_index--;
1220}
1221
q.huangfa0a0a32025-06-12 17:07:23 +08001222static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1223{
1224 LOGD("signal->type=%d", signal->type);
1225 memset(sig_strength,0,sizeof (signalStrength_t));
1226 switch(signal->type)
1227 {
1228 case MBTK_RADIO_TECH_E_UTRAN:
1229 {
1230 LOGI("rsrp = %d",signal->rsrp);
1231 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001232 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1233 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huang638d5872025-06-21 13:44:43 +08001234 sig_strength->rssi = rsrp_minus_dbm_convert_to_rssi_dBm(sig_strength->rsrp);
q.huang861c07d2025-06-24 16:54:58 +08001235 sig_strength->rssnr= sinr_convert_to_10_times_dB(signal->sinr);
q.huangfa0a0a32025-06-12 17:07:23 +08001236 break;
1237 }
1238 case MBTK_RADIO_TECH_UTRAN:
1239 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1240 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1241 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1242 case MBTK_RADIO_TECH_UTRAN_HSPA:
1243 {
1244 LOGI("rscp = %d",signal->rscp);
1245 sig_strength->wcdma_sig_valid = 1;
1246 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1247 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
q.huang638d5872025-06-21 13:44:43 +08001248 sig_strength->rssi = rscp_minus_dbm_convert_to_rssi_dBm(sig_strength->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001249 break;
1250 }
1251 case MBTK_RADIO_TECH_GSM:
1252 case MBTK_RADIO_TECH_GSM_COMPACT:
1253 case MBTK_RADIO_TECH_GSM_EGPRS:
1254 {
q.huang861c07d2025-06-24 16:54:58 +08001255 LOGI("g rxlev = %d",signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001256 sig_strength->gw_sig_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08001257 sig_strength->rssi = rxlev_convert_to_rssi_dBm(signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001258 break;
1259 }
1260 default:
1261 {
1262 LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
1263 }
1264 }
1265
1266}
1267
q.huang66b79162025-06-27 17:45:34 +08001268/*
hong.liud2417072025-06-27 07:10:37 -07001269typedef enum{
1270 MBTK_READY_INIT = -1,
1271 MBTK_READY_SUCCESS,
1272 MBTK_READY_MODEM_FAIL,
1273 MBTK_READY_RESPONSE_FAIL,
1274 MBTK_READY_SOCKET_FAIL,
1275 MBTK_READY_RIL_FAIL
q.huang66b79162025-06-27 17:45:34 +08001276}mbtk_ready_status_type;
1277
hong.liud2417072025-06-27 07:10:37 -07001278typedef enum gsw_hal_nw_mode_state_type
1279{
1280 GSW_MODEM_STATE_UNKNOWN = 0,
1281 GSW_MODEM_STATE_ONLINE,
1282 GSW_MODEM_STATE_OFFLINE,
1283 GSW_SDK_STATE_SERVICE_DOWN,
1284 GSW_SDK_STATE_SERVICE_UP,// service down->up 需要routectl 重启
1285 GSW_SDK_STATE_GPS_DOWN,
1286 GSW_SDK_STATE_GPS_UP,
q.huang66b79162025-06-27 17:45:34 +08001287} gsw_mode_state_e;
1288
1289*/
1290
1291static void convert_uci_to_gsw_modem_state(int uci, int *state)
1292{
1293 switch(uci)
1294 {
1295 case MBTK_READY_SUCCESS:
1296 *state=GSW_MODEM_STATE_ONLINE;
1297 return;
1298 case MBTK_READY_INIT:
1299 *state=GSW_MODEM_STATE_UNKNOWN;
1300 return;
1301 }
1302 *state=GSW_MODEM_STATE_OFFLINE;
1303 return;
1304}
1305
1306
1307
1308
1309
q.huangfa0a0a32025-06-12 17:07:23 +08001310
b.liu68a94c92025-05-24 12:53:41 +08001311static void gsw_serving_info_callback_thread()
1312{
1313 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1314 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1315 int ret = -1;
1316 ret = gsw_get_nwinfo(serving_info);
1317 if(ret != 0)
1318 {
1319 LOGE("gsw_get_nwinfo failed\n");
1320 free(serving_info);
1321 return;
1322 }
1323
1324 if(serving_cb)
1325 {
1326 serving_cb(*serving_info);
1327 free(serving_info);
1328 }
1329}
1330
1331static void gsw_serving_info_callback(const void* data, int data_len)
1332{
1333 LOGE("gsw_serving_info_callback start\n");
1334
1335 if(data && data_len > 0)
1336 {
1337 pthread_t thread;
1338 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1339 }
1340
1341 else
1342 {
1343 LOGE("data is NULL\n");
1344 return;
1345 }
1346
1347}
1348
q.huangfa0a0a32025-06-12 17:07:23 +08001349/*typedef struct
1350{
13510 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
13521 uint8 rssi; // 0: 113 dBm or less
1353 // 1: 111 dBm
1354 // 2��30: 109��53 dBm
1355 // 31: 51 dBm or greater
1356 // 99: not known or not detectable
13572 uint8 rxlev;// 0:rssi < -110 dBm
1358 // 1: -110 dBm �� rssi < -109 dBm
1359 // 2: -109 dBm �� rssi < -108 dBm
1360 // ......
1361 // 61: -50 dBm �� rssi < -49 dBm
1362 // 62: -49 dBm �� rssi < -48 dBm
1363 // 63: -48 dBm �� rssi
1364 // 99: not known or not detectable
13653 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
1366 // 99 not known or not detectable
13674 uint8 rscp; // 0: rscp < -120 dBm
1368 // 1: -120 dBm �� rscp < -119 dBm
1369 // 2: -119 dBm �� rscp < -118 dBm
1370 // ......
1371 // 94: -27 dBm �� rscp < -26 dBm
1372 // 95: -26 dBm �� rscp < -25 dBm
1373 // 96: - 25 dBm �� rscp
1374 // 255: not known or not detectable
13755 uint8 ecno; // 0: Ec/Io < -24 dB
1376 // 1: -24 dB �� Ec/Io < -23.5 dB
1377 // 2: -23.5 dB �� Ec/Io < -23 dB
1378 // ......
1379 // 47: -1 dB �� Ec/Io < -0.5 dB
1380 // 48: -0.5 dB �� Ec/Io < 0 dB
1381 // 49: 0 dB �� Ec/Io
1382 // 255: not known or not detectable
13836 uint8 rsrq; // 0: rsrq < -19.5 dB
1384 // 1: -19.5 dB �� rsrq < -19 dB
1385 // 2: -19 dB �� rsrq < -18.5 dB
1386 // ......
1387 // 32: -4 dB �� rsrq < -3.5 dB
1388 // 33: -3.5 dB �� rsrq < -3 dB
1389 // 34: -3 dB �� rsrq
1390 // 255: not known or not detectable
13917 uint8 rsrp; // 0: rsrp < -140 dBm
1392 // 1: -140 dBm �� rsrp < -139 dBm
1393 // 2: -139 dBm �� rsrp < -138 dBm
1394 // ......
1395 // 95: -46 dBm �� rsrp < -45 dBm
1396 // 96: -45 dBm �� rsrp < -44 dBm
1397 // 97: -44 dBm �� rsrp
1398 // 255: not known or not detectable
13998 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
1400 // 1: -43 dB <= ss_rsrq < -42.5 dB
1401 // 2: -42.5 dB <= ss_rsrq < -42 dB
1402 // ......
1403 // 125: 19 dB <= ss_rsrq < 19.5 dB
1404 // 126: 19.5 dB <= ss_rsrq < 20 dB
1405 // 255: not known or not detectable
1406 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1407 // 1: -156 dBm <= ss_rsrp < -155 dBm
1408 // 2: -155 dBm <= ss_rsrp < -154 dBm
1409 // ......
1410 // 125: -32 dBm <= ss_rsrp < -31 dBm
1411 // 126: -31 dBm <= ss_rsrp
1412 // 255: not known or not detectable
1413 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1414 // 1: -23 dB  ss_sinr < -22.5 dB
1415 // 2: -22.5 dB  ss_sinr < -22 dB
1416 // ......
1417 // 125: 39 dB  ss_sinr < 39.5 dBm
1418 // 126: 39.5 dB  ss_sinr < 40 dB
1419 // 127: 40 dB  ss_sinr
1420 // 255: not known or not detectable
1421} __attribute__((packed)) mbtk_signal_info_t;
1422*/
b.liu68a94c92025-05-24 12:53:41 +08001423static void gsw_sig_info_callback(const void* data, int data_len)
1424{
q.huangfa0a0a32025-06-12 17:07:23 +08001425 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001426 {
b.liu68a94c92025-05-24 12:53:41 +08001427 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001428 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1429
b.liu68a94c92025-05-24 12:53:41 +08001430 if(sig_cb != NULL)
1431 {
1432 sig_cb(sig_strength);
1433 }
1434 }
b.liu68a94c92025-05-24 12:53:41 +08001435 else
1436 {
q.huangfa0a0a32025-06-12 17:07:23 +08001437 LOGE("data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001438 }
1439}
1440
q.huangc8b93122025-06-17 17:46:05 +08001441static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001442{
q.huangc8b93122025-06-17 17:46:05 +08001443 LOGE("gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001444
q.huangc8b93122025-06-17 17:46:05 +08001445
b.liu68a94c92025-05-24 12:53:41 +08001446 if(data && data_len > 0)
1447 {
q.huangc8b93122025-06-17 17:46:05 +08001448 const uint8 *cfun_state = (const uint8*)data;
1449 LOGE("gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
1450 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001451 {
q.huangc8b93122025-06-17 17:46:05 +08001452 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001453 }
1454 }
1455
1456}
1457
1458static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1459{
1460 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1461
1462 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1463 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1464
1465 rej_cause->rej_cause = cause;
1466 rej_cause->rej_rat = rat;
1467 rej_cause->rej_domain = domain;
1468
1469 if(reject_cb != NULL)
1470 {
1471 LOGE("reject_cb is not NULL\n");
1472 reject_cb(rej_cause);
1473 }
1474 else
1475 {
1476 LOGE("reject_cb is NULL\n");
1477 }
1478
1479 free(rej_cause);
1480 LOGE("gsw_reject_callback end\n");
1481}
1482
xy.hec89938f2025-05-29 14:08:47 +08001483void gsw_sig_info_timer()
1484{
xy.hec89938f2025-05-29 14:08:47 +08001485 if(nw_init_flag == 0 || nw_info_handle == NULL)
1486 {
1487 return;
1488 }
1489
1490 mbtk_signal_info_t signal;
1491 signalStrength_t sig_strength;
1492
1493 while(nw_init_flag)
1494 {
q.huangfa0a0a32025-06-12 17:07:23 +08001495 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001496 if(ret != 0)
1497 {
q.huangfa0a0a32025-06-12 17:07:23 +08001498 LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
q.huang66b79162025-06-27 17:45:34 +08001499
xy.hec89938f2025-05-29 14:08:47 +08001500 }
xy.hec89938f2025-05-29 14:08:47 +08001501 else
1502 {
q.huangfa0a0a32025-06-12 17:07:23 +08001503 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
q.huang66b79162025-06-27 17:45:34 +08001504 if(sig_cb != NULL)
1505 {
1506 sig_cb(sig_strength);
1507 }
xy.hec89938f2025-05-29 14:08:47 +08001508 }
xy.hec89938f2025-05-29 14:08:47 +08001509 sleep(SIG_TIMER);
1510 }
1511}
1512
q.huang66b79162025-06-27 17:45:34 +08001513int gsw_get_modem_state(int *state)
1514{
1515 char buf[MBTK_READY_STRING_SIZE_MAX];
1516 if(property_get(MBTK_READY_UCI, buf, "") > 0 && !str_empty(buf))
1517 {
1518 int uci_value=atoi(buf);
1519 convert_uci_to_gsw_modem_state(uci_value,state);
1520 return GSW_HAL_SUCCESS;
1521 }
1522 return GSW_HAL_NORMAL_FAIL;
1523}
1524
1525int g_mode_state=((int)(GSW_MODEM_STATE_UNKNOWN))-1;
1526void gsw_modem_state_timer()
1527{
1528 while(nw_init_flag)
1529 {
1530 if(modem_cb != NULL)
1531 {
1532 int state;
1533 int ret = gsw_get_modem_state(&state);
1534 if(ret != 0)
1535 {
1536 LOGE("gsw_get_modem_state fail, ret is %d",ret);
1537 }
1538 else if(state!=g_mode_state)
1539 {
1540 LOGE("modem state changed from %d to %d",g_mode_state,state);
1541 g_mode_state=state;
1542 modem_cb(state);
1543 }
1544 }
1545 sleep(MODEM_TIMER);
1546 }
1547}
1548
1549
b.liu68a94c92025-05-24 12:53:41 +08001550
1551/**
1552 * @brief SDK interface to call back serving info
1553 * @param [in] handle_ptr
1554 * @retval 0: success
1555 * @retval other: fail
1556 */
1557int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1558{
1559 if (nw_init_flag == 0 || nw_info_handle == NULL)
1560 {
xy.heb41615b2025-05-28 16:33:20 +08001561 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001562 }
1563
1564 if(handle_ptr == NULL)
1565 {
1566 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001567 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001568 }
1569
1570 serving_cb = handle_ptr;
1571
1572 return GSW_HAL_SUCCESS;
1573
1574}
1575
1576
1577/**
1578 * @brief SDK interface to call back sig info
1579 * @param [in] handle_ptr
1580 * @retval 0: success
1581 * @retval other: fail
1582 */
1583int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1584{
1585 if (nw_init_flag == 0 || nw_info_handle == NULL)
1586 {
xy.heb41615b2025-05-28 16:33:20 +08001587 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001588 }
1589
1590 if(handle_ptr == NULL)
1591 {
1592 LOGE("handle_ptr is NULL\n");
q.huang66b79162025-06-27 17:45:34 +08001593 sig_cb=NULL;
1594 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08001595 }
1596
1597 sig_cb = handle_ptr;
1598
1599 return GSW_HAL_SUCCESS;
1600
1601}
1602
1603
1604/**
1605 * @brief SDK interface to call back rej cause
1606 * @param [in] handle_ptr
1607 * @retval 0: success
1608 * @retval other: fail
1609 */
1610int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1611{
1612 if (nw_init_flag == 0 || nw_info_handle == NULL)
1613 {
xy.heb41615b2025-05-28 16:33:20 +08001614 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001615 }
1616
1617 if(handle_ptr == NULL)
1618 {
1619 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001620 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001621 }
1622
1623 reject_cb = handle_ptr;
1624
1625 return GSW_HAL_SUCCESS;
1626}
1627
1628
1629/**
1630 * @brief network sdk init
1631 * @param [in] token usr id define by who use
1632 * @retval 0: success
1633 * @retval other: fail
1634 */
1635int gsw_nw_sdk_init(int token)
1636{
1637 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001638 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001639
1640 if (nw_init_flag == 1 && nw_info_handle != NULL)
1641 {
1642 return GSW_HAL_SUCCESS;
1643 }
1644
1645 ret = mbtk_nw_api_import();
1646 if (ret != 0)
1647 {
1648 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001649 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001650 }
1651
1652 nw_info_handle = mbtk_info_handle_get();
1653
1654 if (nw_info_handle == NULL)
1655 {
1656 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001657 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001658 }
1659
1660 char fplmn[256] = {0};
1661 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1662 if(ret != 0)
1663 {
1664 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001665 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001666 }
1667 fplmn_max_length = (strlen(fplmn)/6);
1668 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1669 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1670
1671 if (ret != 0)
1672 {
1673 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001674 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001675 }
1676
1677 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1678 if (ret != 0)
1679 {
1680 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001681 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001682 }
1683
q.huang66b79162025-06-27 17:45:34 +08001684 nw_init_flag = 1;
1685
xy.hec89938f2025-05-29 14:08:47 +08001686 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1687 if (ret != 0)
1688 {
q.huang66b79162025-06-27 17:45:34 +08001689 LOGE("pthread_create fail,ret is %d", ret);
1690 nw_init_flag = 0;
1691 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
xy.hec89938f2025-05-29 14:08:47 +08001692 }
1693
q.huang66b79162025-06-27 17:45:34 +08001694
1695 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_modem_state_timer, NULL);
1696 if (ret != 0)
1697 {
1698 LOGE("pthread_create fail 2,ret is %d", ret);
1699 nw_init_flag = 0;
1700 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
1701 }
b.liu68a94c92025-05-24 12:53:41 +08001702
1703 return GSW_HAL_SUCCESS;
1704}
1705
1706
1707/**
1708 * @brief network sdk deinit
1709 * @param
1710 * @retval 0: success
1711 * @retval other: fail
1712 */
1713int gsw_nw_sdk_deinit(void)
1714{
1715 int ret = -1;
1716
1717 if (nw_init_flag == 0 || nw_info_handle == NULL)
1718 {
xy.heb41615b2025-05-28 16:33:20 +08001719 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001720 }
1721
1722 ret = mbtk_info_handle_free(&nw_info_handle);
1723 if(ret != GSW_HAL_SUCCESS)
1724 {
1725 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001726 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001727 }
1728
1729 dlclose(dlHandle_mbtk);
1730 nw_info_handle = NULL;
1731 nw_init_flag = 0;
1732
1733 return GSW_HAL_SUCCESS;
1734
1735}
1736
1737
1738/**
1739 * @brief get current network reg info
1740 * @param [out] serving_info struct for network info
1741 * include regstate ps_state opreator name mcc mcn etc
1742 * @retval 0: success
1743 * @retval other: fail
1744 */
1745int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1746{
1747
1748 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001749 if (nw_init_flag == 0 || nw_info_handle == NULL)
1750 {
q.huang238b22a2025-06-10 14:36:59 +08001751 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001752 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001753 }
1754
1755 LOGE("mbtk_net_reg_get start \n");
1756 //regstate
1757 mbtk_net_reg_info_t reg;
1758 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1759 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1760 if(ret)
1761 {
1762 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001763 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001764 }
1765
1766 LOGE("convert_cs_reg_state\n");
1767 //cs_state
1768 serving_info->reg_state = convert_reg_state(reg.call_state);
1769 LOGE("convert_ps_reg_state\n");
1770 //ps_state
1771 serving_info->ps_state = convert_reg_state(reg.data_state);
1772 LOGE("convert_rat_mode\n");
1773 //reg_rat
1774 serving_info->reg_rat = convert_net_mode(reg.type);
1775 //srv_domain
1776 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1777 {
1778 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1779 {
1780 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1781 }
1782
1783 else
1784 {
1785 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1786 }
1787 }
1788
1789 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1790 {
1791 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1792 }
1793
1794 else
1795 {
1796 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1797 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1798 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1799 }
1800
1801 LOGD("roaming_ind\n");
1802 //roaming_ind
1803 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1804 {
1805 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1806 }
1807 else
1808 {
1809 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1810 }
1811
1812 LOGD("reject\n");
1813 //reject
1814 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1815 {
1816 LOGD("reject_callback\n");
1817 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1818 }
1819
1820 LOGD("reg_plmn / operator name\n");
1821 //reg_plmn / operator name
1822 mbtk_net_info_t net;
1823 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1824 LOGD("mbtk_net_sel_mode_get start \n");
1825 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1826 LOGD("mbtk_net_sel_mode_get end \n");
1827 if(ret == 0 && net.plmn > 0)
1828 {
1829 int i = 0;
1830
1831 LOGD("start to find mcc");
1832 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1833 {
1834 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1835 {
1836 LOGD("find mcc\n");
1837 break;
1838 }
1839 i++;
1840 }
1841
1842
1843 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1844 {
1845 LOGD("not find mcc");
1846 strcpy(serving_info->operator_name, "unknown");
hong.liud2417072025-06-27 07:10:37 -07001847 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001848 }
1849
1850 else
1851 {
1852 LOGD("find mcc\n");
1853 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
hong.liud2417072025-06-27 07:10:37 -07001854 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001855 }
1856
1857 LOGE("operator_name = %s\n", serving_info->operator_name);
1858 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1859 }
1860
1861
1862 LOGD("get cell id/tac/lac/sid/nid\n");
1863 //cell id/tac/lac/sid/nid
1864 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001865 list_node_t* cell_list = NULL;
1866
1867 LOGD("mbtk_cell_get start\n");
1868 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1869 if(ret != 0 || cell_list == NULL)
1870 {
1871 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001872 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001873 }
1874 else
1875 {
1876 LOGE("mbtk_cell_get end,start to get node\n");
1877 list_first(cell_list);
1878 LOGE("list_first end\n");
1879 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1880 if(cell)
1881 {
1882 LOGE("cell is not null,value2 = %u\n",cell->value2);
1883 switch(cell_type)
1884 {
1885 case MBTK_CELL_TYPE_LTE:
1886 {
1887 LOGE("is lte\n");
1888 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1889 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
hong.liud2417072025-06-27 07:10:37 -07001890 snprintf(serving_info->tac,sizeof(serving_info->tac),"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001891 strcpy(serving_info->lac,"");
hong.liud2417072025-06-27 07:10:37 -07001892 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%u",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001893 break;
1894 }
1895
1896 case MBTK_CELL_TYPE_GSM:
1897 {
1898 LOGE("is gsm\n");
1899 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
hong.liud2417072025-06-27 07:10:37 -07001900 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001901 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001902 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001903 break;
1904 }
1905 case MBTK_CELL_TYPE_UMTS:
1906 {
1907 LOGE("is wcdma\n");
1908 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
hong.liud2417072025-06-27 07:10:37 -07001909 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001910 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001911 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001912 break;
1913 }
1914
1915 default:
1916 break;
1917 }
1918 }
1919 else
1920 {
1921 LOGE("cell is null\n");
1922 }
1923 }
1924
1925 //not support now
1926 serving_info->sid = 0;
1927 serving_info->nid = 0;
1928
1929 return GSW_HAL_SUCCESS;
1930}
1931
1932
1933/**
1934 * @brief get current network type
1935 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1936 * @retval 0: success
1937 * @retval other: fail
1938 */
hong.liud2417072025-06-27 07:10:37 -07001939int gsw_get_netype(int32_t *netype)
b.liu68a94c92025-05-24 12:53:41 +08001940{
1941 int ret = -1;
1942
1943 if (nw_init_flag == 0 || nw_info_handle == NULL)
1944 {
xy.heb41615b2025-05-28 16:33:20 +08001945 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001946 }
1947
1948 //regstate
1949 mbtk_net_reg_info_t reg;
1950 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1951 if(ret)
1952 {
1953 LOGE("mbtk_net_reg_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 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1958 {
1959 *netype = convert_net_mode(reg.type);
1960 }
1961 else
1962 {
1963 *netype = GSW_NETWORK_RADIO_NO_SVC;
1964 }
1965
1966 return GSW_HAL_SUCCESS;
1967}
1968
1969
1970/**
1971 * @brief get radio opmode, as open and close airplane mode
1972 * @param [out] op_mode 1 is radio on, 0 is radio off
1973 * @retval 0: success
1974 * @retval other: fail
1975 */
1976int gsw_get_opmode(int *op_mode)
1977{
1978 int tmp_rf = -1;
1979 int ret = -1;
1980 if (nw_init_flag == 0 || nw_info_handle == NULL)
1981 {
xy.heb41615b2025-05-28 16:33:20 +08001982 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001983 }
1984
1985 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1986 if (ret != 0)
1987 {
1988 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001989 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001990 }
1991 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1992 {
1993 *op_mode = GSW_OP_MODE_LPM;
1994 }
1995
1996 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1997 {
1998 *op_mode = GSW_OP_MODE_OFFLINE;
1999 }
2000
2001 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
2002 {
2003 *op_mode = GSW_OP_MODE_ONLINE;
2004 }
2005
2006 return GSW_HAL_SUCCESS;
2007}
2008
2009
2010
2011/**
2012 * @brief set radio opmode, as open and close airplane mode
2013 * @param [in] op_mode 1 is radio on, 0 is radio off
2014 * @retval 0: success
2015 * @retval other: fail
2016 */
hong.liud2417072025-06-27 07:10:37 -07002017int gsw_set_opmode(int32_t op_mode)
b.liu68a94c92025-05-24 12:53:41 +08002018{
2019 mbtk_modem_info_t info;
2020 int rf_mode = -1;
2021 int ret = -1;
2022
2023 if (nw_init_flag == 0 || nw_info_handle == NULL)
2024 {
xy.heb41615b2025-05-28 16:33:20 +08002025 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002026 }
2027
2028 if(op_mode == GSW_OP_MODE_LPM)
2029 {
2030 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
2031 }
2032
2033 if(op_mode == GSW_OP_MODE_ONLINE)
2034 {
2035 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
2036 }
2037
2038 if(op_mode == GSW_OP_MODE_OFFLINE)
2039 {
2040 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
2041 }
2042
2043 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
2044 {
2045 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002046 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002047 }
2048
2049 info.fun = rf_mode;
2050 info.rst = 0;
2051 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2052 if (ret != 0)
2053 {
2054 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002055 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002056 }
2057
2058 return GSW_HAL_SUCCESS;
2059
2060}
2061
2062
2063/**
2064 * @brief get network mode preference of mdm search network scale
2065 * @param [out] mode_pref net_work pref mode:
2066 * enum prefer_mode
2067 * @retval 0: success
2068 * @retval other: fail
2069 */
hong.liud2417072025-06-27 07:10:37 -07002070int gsw_get_mode_preference(int32_t *mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002071{
2072 if (nw_init_flag == 0 || nw_info_handle == NULL)
2073 {
xy.heb41615b2025-05-28 16:33:20 +08002074 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002075 }
2076
2077 int ret = -1;
2078 mbtk_band_info_t band;
2079 memset(&band, 0, sizeof(mbtk_band_info_t));
2080
2081 ret = mbtk_current_band_get(nw_info_handle, &band);
2082 if(ret != 0)
2083 {
2084 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002085 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002086 }
2087
2088 *mode_pref = convert_gsw_net_config(band.net_pref);
2089 LOGE("band.net_pref = %d\n", *mode_pref);
2090 if(*mode_pref <= 0)
2091 {
2092 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002093 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002094 }
2095 return GSW_HAL_SUCCESS;
2096
2097
2098}
2099
2100/**
2101 * @brief set network mode preference of mdm search network scale
2102 * @param [in] mode_pref net_work pref mode:
2103 * enum prefer_mode
2104 * @retval 0: success
2105 * @retval other: fail
2106 */
hong.liud2417072025-06-27 07:10:37 -07002107int gsw_set_mode_preference(int32_t mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002108{
2109 if (nw_init_flag == 0 || nw_info_handle == NULL)
2110 {
xy.heb41615b2025-05-28 16:33:20 +08002111 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002112 }
2113
2114 int ret = -1;
2115
2116 mbtk_band_info_t band;
2117 memset(&band, 0, sizeof(mbtk_band_info_t));
2118
2119 band.net_pref = convert_mbtk_net_config(mode_pref);
2120 LOGE("band.net_pref = %d\n", band.net_pref);
2121
2122 if(band.net_pref < 0)
2123 {
2124 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002125 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002126 }
2127
2128 ret = mbtk_current_band_set(nw_info_handle, &band);
2129 if(ret != 0)
2130 {
2131 LOGE("mbtk_current_band_set 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 * @brief get signal csq value
2140 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
2141 * @retval 0: success
2142 * @retval other: fail
2143 */
hong.liud2417072025-06-27 07:10:37 -07002144int gsw_get_sig_info(int32_t *csq_value)
b.liu68a94c92025-05-24 12:53:41 +08002145{
b.liu68a94c92025-05-24 12:53:41 +08002146 if (nw_init_flag == 0 || nw_info_handle == NULL)
2147 {
xy.heb41615b2025-05-28 16:33:20 +08002148 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002149 }
2150
hong.liud2417072025-06-27 07:10:37 -07002151 mbtk_signal_info_t signal = {0};
q.huangfa0a0a32025-06-12 17:07:23 +08002152 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002153 if(ret != 0)
2154 {
2155 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002156 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002157 }
2158
2159 LOGD("signal.type=%d\n", signal.type);
2160 switch(signal.type)
2161 {
q.huangfa0a0a32025-06-12 17:07:23 +08002162
b.liu68a94c92025-05-24 12:53:41 +08002163 case MBTK_RADIO_TECH_E_UTRAN:
2164 {
q.huangfa0a0a32025-06-12 17:07:23 +08002165 LOGD("lte rsrp = %d dbm",signal.rsrp-141);
2166 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002167 break;
2168 }
2169 case MBTK_RADIO_TECH_UTRAN:
2170 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2171 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2172 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2173 case MBTK_RADIO_TECH_UTRAN_HSPA:
2174 {
q.huangfa0a0a32025-06-12 17:07:23 +08002175 LOGD("w rscp = %d dbm",signal.rscp-121);
2176 *csq_value = rscpToLevel(signal.rscp-121);
2177 break;
2178 }
2179 case MBTK_RADIO_TECH_GSM:
2180 case MBTK_RADIO_TECH_GSM_COMPACT:
2181 case MBTK_RADIO_TECH_GSM_EGPRS:
2182 {
q.huang861c07d2025-06-24 16:54:58 +08002183 LOGD("gsm rxlev = %d (0-63)",signal.rxlev);
2184 *csq_value = rxlevToLevel(signal.rxlev);
b.liu68a94c92025-05-24 12:53:41 +08002185 break;
2186 }
2187 default:
2188 {
q.huangfa0a0a32025-06-12 17:07:23 +08002189 LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002190 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002191 }
2192 }
2193 return GSW_HAL_SUCCESS;
2194}
2195
2196/**
2197 * @brief set nework power mode, for tcam enter standby or exit standby
2198 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2199 * @retval 0: success
2200 * @retval other: fail
2201 */
2202int gsw_network_set_power_mode(char mode)
2203{
2204 int ret = -1;
2205
2206 if (nw_init_flag == 0 || nw_info_handle == NULL)
2207 {
xy.heb41615b2025-05-28 16:33:20 +08002208 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002209 }
2210
2211 if(mode != 0 && mode != 1)
2212 {
2213 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002214 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002215 }
2216
2217 if(mode == 1)
2218 {
2219 mode = 6;
2220 }
2221
2222 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
2223 if(ret != 0)
2224 {
2225 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002226 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002227 }
2228
2229 return GSW_HAL_SUCCESS;
2230
2231
2232
2233}
2234
2235/**
2236 * @brief convert rsrp rscp rssi to csq value.
2237 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2238 * @param [in] sigvalue input signal_strength for different nettype
2239 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2240
2241 * @retval csq
2242 * @retval other: fail
2243 */
hong.liud2417072025-06-27 07:10:37 -07002244int gsw_sigInfo_to_csq(int32_t netType, int32_t sigValue)
b.liu68a94c92025-05-24 12:53:41 +08002245{
q.huang238b22a2025-06-10 14:36:59 +08002246 if (nw_init_flag == 0 || nw_info_handle == NULL)
2247 {
2248 return GSW_HAL_NORMAL_FAIL;
2249 }
b.liu68a94c92025-05-24 12:53:41 +08002250 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002251 {
2252 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002253 {
q.huangfa0a0a32025-06-12 17:07:23 +08002254 return rsrpToLevel(sigValue);
2255 }
2256 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002257 {
q.huangfa0a0a32025-06-12 17:07:23 +08002258 return rscpToLevel(sigValue);
2259 }
2260 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002261 {
q.huangfa0a0a32025-06-12 17:07:23 +08002262 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002263 }
2264
2265 default:
2266 {
2267 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002268 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002269 }
2270 }
2271}
2272
2273/*
2274 * @brief get mobile operator name
2275 @param [out] nw_operator_name_infos get the long and short operator name info
2276 @retval 0: success
2277 @retval 0: other: fail
2278 */
2279int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2280{
2281 char OperatorFN[128];
2282 char OperatorSH[128];
hong.liud2417072025-06-27 07:10:37 -07002283 char temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002284 mbtk_net_info_t net;
2285
2286 if (nw_init_flag == 0 || nw_info_handle == NULL)
2287 {
xy.heb41615b2025-05-28 16:33:20 +08002288 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002289 }
2290
2291 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2292 {
2293 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2294 int i = 0;
2295 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2296 {
2297 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2298 break;
2299 i++;
2300 }
2301
2302 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2303 {
2304 strcpy(OperatorFN, "UNKNOWN");
2305 strcpy(OperatorSH, "UNKNOWN");
2306 }
2307 else
2308 {
2309 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2310 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2311
hong.liud2417072025-06-27 07:10:37 -07002312 memset(temp,0,sizeof(temp));
2313 memset(nw_operator_name_infos->mcc,0,sizeof(nw_operator_name_infos->mcc));
2314 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
b.liu68a94c92025-05-24 12:53:41 +08002315 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2316
hong.liud2417072025-06-27 07:10:37 -07002317 memset(temp,0,sizeof(temp));
2318 memset(nw_operator_name_infos->mnc,0,sizeof(nw_operator_name_infos->mnc));
2319 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
b.liu68a94c92025-05-24 12:53:41 +08002320 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2321 }
2322
2323 memset(nw_operator_name_infos->long_eons,0,128);
2324 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2325 memset(nw_operator_name_infos->short_eons,0,128);
2326 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2327
2328 return GSW_HAL_SUCCESS;
2329 }
2330
2331 else
2332 {
2333 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002334 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002335 }
2336
2337 return GSW_HAL_SUCCESS;
2338}
2339
2340
2341/*
2342 * @brief get current serving cell info
2343 * @param cell_info: [out] struct for current cell info
2344 * include earfcn mcc mnc pci psc tac lac etc.
2345 * @return int: 0 is success, other failed
2346 */
2347int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2348{
b.liu68a94c92025-05-24 12:53:41 +08002349
2350 if (nw_init_flag == 0 || nw_info_handle == NULL)
2351 {
q.huang238b22a2025-06-10 14:36:59 +08002352 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002353 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002354 }
2355
2356 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002357 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002358 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002359 if(ret || cell_list == NULL) {
2360 LOGE("mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002361 list_free(cell_list);
2362 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002363 } else {
q.huang638d5872025-06-21 13:44:43 +08002364 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002365 list_first(cell_list);
2366 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2367 if(cell) { // Current server cell.
2368 switch(type)
2369 {
2370 case 0:
2371 {
2372 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
hong.liud2417072025-06-27 07:10:37 -07002373 char gsm_temp[12] = {0};
b.liu68a94c92025-05-24 12:53:41 +08002374
2375 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2376
2377 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002378 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002379 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2380
b.liu68a94c92025-05-24 12:53:41 +08002381 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002382 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002383 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2384
2385 cell_info->cell_id_valid = 1;
2386 cell_info->cell_id = cell->value2;
2387
2388 cell_info->lac_valid = 1;
2389 cell_info->lac = cell->value1;
2390
2391 cell_info->arfcn_valid = 1;
2392 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002393
2394 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2395 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002396 break;
2397 }
2398
2399 case 1:
2400 {
2401 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
hong.liud2417072025-06-27 07:10:37 -07002402 char wcdma_temp[12] = {0};
b.liu68a94c92025-05-24 12:53:41 +08002403
2404 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2405
2406 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002407 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002408 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2409
b.liu68a94c92025-05-24 12:53:41 +08002410 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002411 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002412 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2413
2414 cell_info->lac_valid = 1;
2415 cell_info->lac = cell->value1;
2416
2417 cell_info->cell_id_valid = 1;
2418 cell_info->cell_id = cell->value2;
2419
2420 cell_info->uarfcn_valid = 1;
2421 cell_info->uarfcn = cell->value3;
2422
2423 cell_info->psc_valid = 1;
2424 cell_info->psc = cell->value6;
2425 break;
2426 }
2427
2428 case 2:
2429 {
2430 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
hong.liud2417072025-06-27 07:10:37 -07002431
2432 char lte_temp[12] = {0};
b.liu68a94c92025-05-24 12:53:41 +08002433
2434 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2435
2436 cell_info->mcc_valid = 1;
2437 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2438 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2439
b.liu68a94c92025-05-24 12:53:41 +08002440 cell_info->mnc_valid = 1;
2441 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2442 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2443
2444 cell_info->tac_valid = 1;
2445 cell_info->tac = cell->value1;
2446
2447 cell_info->pci_valid = 1;
2448 cell_info->pci = cell->value2;
2449
2450 cell_info->earfcn_valid = 1;
2451 cell_info->earfcn = cell->value3;
2452
2453 cell_info->bler_valid = 1;
2454 cell_info->bler = cell->value4;
2455
2456 cell_info->band_valid = 1;
2457 cell_info->band = cell->value5;
2458
q.huang638d5872025-06-21 13:44:43 +08002459 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2460 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002461
q.huang638d5872025-06-21 13:44:43 +08002462 cell_info->lteMode_valid = 1;
2463 cell_info->lteMode =(!(cell->value12));
2464
2465
2466 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2467 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2468
2469 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2470 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002471
2472 cell_info->cell_id_valid = 1;
2473 cell_info->cell_id = cell->value10;
2474
q.huang638d5872025-06-21 13:44:43 +08002475 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2476 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2477
b.liu68a94c92025-05-24 12:53:41 +08002478 break;
2479 }
2480
2481 default:
2482 break;
2483 }
2484 }
q.huang638d5872025-06-21 13:44:43 +08002485 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002486 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2487 {
2488 switch(type)
2489 {
2490 //GSM
2491 case 0:
2492 {
2493
2494 }
2495 //WCDMA
2496 case 1:
2497 {
2498 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2499
2500 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2501
2502 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2503 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2504
2505 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2506 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2507
2508 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2509
2510 neibor_count++;
2511
2512 }
2513 //LTE
2514 case 2:
2515 {
2516 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2517 char lte_temp[12] = {0};
2518 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2519
b.liu68a94c92025-05-24 12:53:41 +08002520 cell_info->ext_info[neibor_count].pci = cell->value1;
2521 cell_info->ext_info[neibor_count].pci_valid = 1;
2522
2523 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2524 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2525
q.huang638d5872025-06-21 13:44:43 +08002526 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2527 cell_info->ext_info[neibor_count].rsrp_valid = (cell_info->ext_info[neibor_count].rsrp!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002528
q.huang638d5872025-06-21 13:44:43 +08002529 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2530 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2531
2532 if(cell->value7!=INT_32_MAX)
2533 {
2534 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2535 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2536
2537 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2538 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mcc));
b.liu68a94c92025-05-24 12:53:41 +08002539
hong.liud2417072025-06-27 07:10:37 -07002540 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2541 cell_info->ext_info[neibor_count].cell_id_valid = 1;
b.liu68a94c92025-05-24 12:53:41 +08002542
q.huang638d5872025-06-21 13:44:43 +08002543 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2544 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2545
2546
2547 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002548
q.huang638d5872025-06-21 13:44:43 +08002549 cell_info->ext_info[neibor_count].band = cell->value9;
2550 cell_info->ext_info[neibor_count].band_valid = 1;
2551
2552 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2553 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2554 }
b.liu68a94c92025-05-24 12:53:41 +08002555
2556 neibor_count++;
2557 }
2558
2559 default:
2560 break;
2561 }
2562 }
q.huang638d5872025-06-21 13:44:43 +08002563 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002564 }
2565 list_free(cell_list);
2566
2567 return GSW_HAL_SUCCESS;
2568}
2569
2570/*
2571 * @brief set modem status event callback
2572 @param [in] handle_ptr callback function address
2573 @retval 0: success
2574 @retval 0: other: fail
2575 */
2576int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2577{
2578
2579 if (nw_init_flag == 0 || nw_info_handle == NULL)
2580 {
xy.heb41615b2025-05-28 16:33:20 +08002581 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002582 }
2583
b.liu68a94c92025-05-24 12:53:41 +08002584 if(handle_ptr == NULL)
2585 {
2586 LOGE("handle_ptr is NULL\n");
q.huang66b79162025-06-27 17:45:34 +08002587 modem_cb=NULL;
2588 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08002589 }
2590
2591 modem_cb = handle_ptr;
2592
b.liu68a94c92025-05-24 12:53:41 +08002593 return GSW_HAL_SUCCESS;
2594
2595}
2596
2597
2598/*
2599 * @brief get PLMNs from the FPLMN list
2600 * @param [inout] plmn_list:
2601 * @retval 0: success
2602 * @retval other: fail
2603 */
2604int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2605{
2606 if (nw_init_flag == 0 || nw_info_handle == NULL)
2607 {
xy.heb41615b2025-05-28 16:33:20 +08002608 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002609 }
2610
2611 int ret = -1;
2612 char fplmn[256] = {0};
2613 LOGE("mbtk_fplmn_get enter\n");
2614 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2615 LOGE("mbtk_fplmn_get exit\n");
2616 if(ret != 0)
2617 {
2618 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002619 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002620 }
2621
2622 update_fplmn_list(fplmn);
2623 for(int i = 0; i < fplmn_index; i++)
2624 {
2625 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2626 {
2627 continue;
2628 }
2629 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);
2630 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);
2631 plmn_list->plmn_list_len++;
2632 }
2633
2634 LOGE("fplmn = %s\n", fplmn);
2635 return GSW_HAL_SUCCESS;
2636}
2637
2638/*
2639 * @brief add PLMNs from the plmn_list to the FPLMN list
2640 * @param [in] plmn_list:
2641 * @retval 0: success
2642 * @retval other: fail
2643 */
2644int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2645{
2646
2647 if (nw_init_flag == 0 || nw_info_handle == NULL)
2648 {
xy.heb41615b2025-05-28 16:33:20 +08002649 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002650 }
2651
2652 if(plmn_list->plmn_list_len >= fplmn_max_length)
2653 {
2654 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002655 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002656 }
2657
2658 int i = 0;
2659 int index = -1;
2660
2661 for(i = 0; i < plmn_list->plmn_list_len; i++)
2662 {
2663 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2664
2665 if(index == -1)
2666 {
2667 LOGE("no this PLMN, add it\n");
2668 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2669 {
2670 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002671 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002672 }
2673
2674 else
2675 {
2676 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2677 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2678 fplmn_array[fplmn_index][5] = '\0';
2679 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2680 fplmn_index++;
2681 }
2682 }
2683
2684 else
2685 {
2686 LOGE("already have this PLMN, don't add it\n");
2687 }
2688 }
2689
2690 char fplmn_str[256] = {0};
2691 convert_plmn_to_fplmn_str(fplmn_str);
2692
2693 LOGE("fplmn_str = %s\n", fplmn_str);
2694
2695 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2696 if(ret != 0)
2697 {
2698 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002699 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002700 }
2701
2702 LOGE("gsw_add_forbidden_networks exit\n");
2703 return GSW_HAL_SUCCESS;
2704}
2705
2706/*
2707 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2708 * @param [in] plmn_list:
2709 * @retval 0: success
2710 * @retval other: fail
2711 */
2712int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2713{
b.liu68a94c92025-05-24 12:53:41 +08002714 if (nw_init_flag == 0 || nw_info_handle == NULL)
2715 {
q.huangfa0a0a32025-06-12 17:07:23 +08002716 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002717 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002718 }
2719
2720 int i = 0;
2721 int index = -1;
2722
2723 for(i = 0; i < plmn_list->plmn_list_len; i++)
2724 {
2725 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2726 if(index != -1)
2727 {
2728 remove_fplmn(index);
2729 }
2730 else
2731 {
2732 LOGE("no this PLMN, can't remove it\n");
2733 }
2734 }
2735
2736 for(i = 0; i < fplmn_index; i++)
2737 {
2738 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2739 }
2740
2741 char fplmn_str[256] = {0};
2742 convert_plmn_to_fplmn_str(fplmn_str);
2743 LOGE("fplmn_str = %s\n", fplmn_str);
2744
2745 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2746 if(ret != 0)
2747 {
2748 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002749 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002750 }
2751
2752 LOGE("gsw_remove_forbidden_networks exit\n");
2753 return GSW_HAL_SUCCESS;
2754}
2755
2756/*
2757 * @brief clear FPLMN list
2758 * @param
2759 * @retval 0: success
2760 * @retval other: fail
2761 */
2762int gsw_clear_forbidden_networks(void)
2763{
2764 if (nw_init_flag == 0 || nw_info_handle == NULL)
2765 {
xy.heb41615b2025-05-28 16:33:20 +08002766 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002767 }
2768
2769 char fplmn_str[FPLMN_STRING_LENGTH+1];
2770 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2771 fplmn_str[(6 * fplmn_max_length)] = '\0';
2772
2773 LOGE("%s\n", fplmn_str);
2774 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2775 if(ret != 0)
2776 {
2777 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002778 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002779 }
2780
2781 return GSW_HAL_SUCCESS;
2782}
2783
2784/*
2785 * @brief get oos config
2786 * @param [in] oos_config
2787 * @retval 0: success
2788 * @retval other: fail
2789 */
2790int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2791{
2792 if (nw_init_flag == 0 || nw_info_handle == NULL)
2793 {
xy.heb41615b2025-05-28 16:33:20 +08002794 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002795 }
2796
2797 if(pt_info == NULL)
2798 {
2799 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002800 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002801 }
2802
2803 int ret = -1;
2804
2805 mbtk_oos_info oos_info;
2806 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2807
2808 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2809 if(ret != 0)
2810 {
2811 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002812 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002813 }
2814
2815 if(oos_info.mode == 0)
2816 {
2817 pt_info->t_min = 0;
2818 pt_info->t_step = 0;
2819 pt_info->t_max = 0;
2820 }
2821
2822 else
2823 {
2824 pt_info->t_min = (int)oos_info.oosPhase[0];
2825 pt_info->t_step = (int)oos_info.oosPhase[1];
2826 pt_info->t_max = (int)oos_info.oosPhase[2];
2827 }
2828
2829 return GSW_HAL_SUCCESS;
2830}
2831
2832
2833/*
2834 * @brief set oos config
2835 * @param [in] oos_config
2836 * @retval 0: success
2837 * @retval other: fail
2838 */
2839int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2840{
2841 if (nw_init_flag == 0 || nw_info_handle == NULL)
2842 {
xy.heb41615b2025-05-28 16:33:20 +08002843 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002844 }
2845
2846 if(pt_info == NULL)
2847 {
2848 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002849 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002850 }
2851
2852 int ret = -1;
2853 mbtk_oos_info oos_info;
2854 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2855
2856 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2857 {
2858 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002859 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002860 }
2861 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2862 {
2863 oos_info.mode = 1;
2864 oos_info.oosPhase[0] = pt_info->t_min;
2865 }
2866 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)
2867 {
2868 oos_info.mode = 1;
2869 oos_info.oosPhase[0] = pt_info->t_min;
2870 oos_info.oosPhase[1] = pt_info->t_step;
2871 }
2872 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))
2873 {
2874 oos_info.mode = 1;
2875 oos_info.oosPhase[0] = pt_info->t_min;
2876 oos_info.oosPhase[1] = pt_info->t_step;
2877 oos_info.oosPhase[2] = pt_info->t_max;
2878 }
2879 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2880 {
2881 oos_info.mode = 0;
2882 }
2883 else
2884 {
2885 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002886 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002887 }
2888
2889 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2890 if(ret != 0)
2891 {
2892 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002893 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002894 }
2895
2896 return GSW_HAL_SUCCESS;
2897}
2898
q.huang238b22a2025-06-10 14:36:59 +08002899/**
2900 * @brief get imei function
2901 * @param [in] len imei length,max is 20
2902 * @param [out] imei return imei from this func
2903 * @retval 0: success
2904 * @retval other: fail
2905 */
2906int gsw_get_imei(int len, char *imei)
2907{
q.huang238b22a2025-06-10 14:36:59 +08002908 if (nw_init_flag == 0 || nw_info_handle == NULL)
2909 {
2910 printf("nw sdk has been deinit\n");
2911 return GSW_HAL_NORMAL_FAIL;
2912 }
2913
2914 if(imei == NULL)
2915 {
2916 LOGE("imei is NULL.");
2917 return GSW_HAL_ARG_INVALID;
2918 }
2919
2920 if(len < GSW_IMEI_LENGTH)
2921 {
2922 LOGE("imei len is too short,len = %d\n", len);
2923 return GSW_HAL_NORMAL_FAIL;
2924 }
2925
q.huang861c07d2025-06-24 16:54:58 +08002926 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002927 if(ret != MBTK_ERR_OK)
2928 {
2929 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2930 return GSW_HAL_NORMAL_FAIL;
2931 }
2932
2933 return GSW_HAL_SUCCESS;
2934}
2935
2936/**
2937 * @brief reset modem stack only, notice: after use this method, all ril sdk
2938 * need restart by app, means network, sim, sms, data need deinit then init!
2939 * @param
2940 * @retval 0: success
2941 * @retval other: fail
2942 */
2943int gsw_reset_modem(void)
2944{
2945 int ret = -1;
2946 if (nw_init_flag == 0 || nw_info_handle == NULL)
2947 {
2948 printf("nw sdk has been deinit\n");
2949 return GSW_HAL_NORMAL_FAIL;
2950 }
2951 mbtk_modem_info_t info;
2952 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2953 info.rst = 0;
2954
2955 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2956 if(ret)
2957 {
2958 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2959 return GSW_HAL_NORMAL_FAIL;
2960 }
2961
2962 sleep(1);
2963
2964 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2965 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2966 if(ret)
2967 {
2968 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2969 return GSW_HAL_NORMAL_FAIL;
2970 }
2971 return GSW_HAL_SUCCESS;
2972}
b.liu68a94c92025-05-24 12:53:41 +08002973
q.huangc8b93122025-06-17 17:46:05 +08002974int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2975{
2976 if (nw_init_flag == 0 || nw_info_handle == NULL)
2977 {
2978 return GSW_HAL_NORMAL_FAIL;
2979 }
2980
2981 if(handle_ptr == NULL)
2982 {
2983 LOGE("handle_ptr is NULL\n");
2984 return GSW_HAL_NORMAL_FAIL;
2985 }
2986
2987 airplane_cb = handle_ptr;
2988
2989 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_operating_mode_event_callback);
2990 if(ret != 0)
2991 {
2992 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
2993 airplane_cb=NULL;
2994 return GSW_HAL_NORMAL_FAIL;
2995 }
2996
2997 return GSW_HAL_SUCCESS;
2998
2999}
3000
hong.liud2417072025-06-27 07:10:37 -07003001int gsw_get_apn_reserved_id(const char *apn)
3002{
3003 return 0;
3004}
3005
3006int gsw_set_apn_reserved_id(int reserved_id, const char *apn)
3007{
3008 return 0;
3009}
3010
3011int gsw_data_call_clear_session(int linkid, Link_Info_s *LinkInf)
3012{
3013 return 0;
3014}
3015
3016void *gsw_onUnsolicited(void *arg)
3017{
3018 return 0;
3019}
3020
3021int gsw_sdk_init(void)
3022{
3023 return 0;
3024}
3025
3026int gsw_get_modem_state_exp(void)
3027{
3028 return 0;
3029}