blob: f16b5daba4c7f88ab9f99147cea5d04ade330fe2 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include <stdio.h>
2#include <string.h>
3#include <strings.h>
4#include <stdlib.h>
5#include <errno.h>
6#include <termios.h>
7#include <fcntl.h>
8#include <signal.h>
9#include <sys/types.h>
10#include <unistd.h>
11#include <pthread.h>
12#include <time.h>
13#include <sys/ioctl.h>
14#include <dlfcn.h>
15#include <stdint.h>
hong.liucd370792025-05-28 06:29:19 -070016#include "gsw_pm_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080017
18#ifndef LOG_ERR_LEVEL
19#define LOG_ERR_LEVEL 3 /* error conditions */
20#endif
21#ifndef LOG_WARN_LEVEL
22#define LOG_WARN_LEVEL 4 /* warning conditions */
23#endif
24#ifndef LOG_INFO_LEVEL
25#define LOG_INFO_LEVEL 6 /* informational */
26#endif
27#ifndef LOG_DEBUG_LEVEL
28#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
29#endif
30#ifndef LOG_VERBOSE_LEVEL
31#define LOG_VERBOSE_LEVEL 8
32#endif
33
l.yang6a42e4d2025-05-28 01:04:20 -070034#define GSW_PM "[HAL][GSW_PM]"
hong.liud2417072025-06-27 07:10:37 -070035#define GSW_WAKELOCK_NAME "gsw_app_wakelock"
b.liu68a94c92025-05-24 12:53:41 +080036#define LOGV(fmt, args ...) \
37 do{ \
38 char *file_ptr_1001 = __FILE__; \
39 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
40 char line_1001[10] = {0}; \
41 sprintf(line_1001, "%d", __LINE__); \
42 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
43 if(*ptr_1001 == '/') \
44 break; \
45 ptr_1001--; \
46 } \
l.yang6a42e4d2025-05-28 01:04:20 -070047 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080048 } while(0)
49
50#define LOGI(fmt, args...) \
51 do{ \
52 char *file_ptr_1001 = __FILE__; \
53 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
54 char line_1001[10] = {0}; \
55 sprintf(line_1001, "%d", __LINE__); \
56 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
57 if(*ptr_1001 == '/') \
58 break; \
59 ptr_1001--; \
60 } \
l.yang6a42e4d2025-05-28 01:04:20 -070061 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080062 } while(0)
63
64#define LOGD(fmt, args...) \
65 do{ \
66 char *file_ptr_1001 = __FILE__; \
67 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
68 char line_1001[10] = {0}; \
69 sprintf(line_1001, "%d", __LINE__); \
70 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
71 if(*ptr_1001 == '/') \
72 break; \
73 ptr_1001--; \
74 } \
l.yang6a42e4d2025-05-28 01:04:20 -070075 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080076 } while(0)
77
78#define LOGW(fmt, args...) \
79 do{ \
80 char *file_ptr_1001 = __FILE__; \
81 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
82 char line_1001[10] = {0}; \
83 sprintf(line_1001, "%d", __LINE__); \
84 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
85 if(*ptr_1001 == '/') \
86 break; \
87 ptr_1001--; \
88 } \
l.yang6a42e4d2025-05-28 01:04:20 -070089 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080090 } while(0)
91
92#define LOGE(fmt, args...) \
93 do{ \
94 char *file_ptr_1001 = __FILE__; \
95 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
96 char line_1001[10] = {0}; \
97 sprintf(line_1001, "%d", __LINE__); \
98 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
99 if(*ptr_1001 == '/') \
100 break; \
101 ptr_1001--; \
102 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700103 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800104 } while(0)
105
106
b.liu68a94c92025-05-24 12:53:41 +0800107#define LOCK_MAX_SIZE 129
hong.liucd370792025-05-28 06:29:19 -0700108typedef void (*GSW_PM_WAKEUPCALLBACK)(int32_t wakeup_in);
b.liu68a94c92025-05-24 12:53:41 +0800109typedef void (*mbtk_lpm_handler_t)(int32_t wakeup_in);
110typedef void (*mbtk_log)(int level, const char *format,...);
111
112int (*mbtk_autosuspend_enable)(char);
113int (*mbtk_wakelock_create)(const char* name , size_t);
114int (*mbtk_wakelock_lock)(int);
115int (*mbtk_wakelock_unlock)(int);
116int (*mbtk_wakelock_destroy)(int);
117int (*mbtk_lpm_init)(mbtk_lpm_handler_t );
118int lock_fd = -1;
119
120typedef struct
121{
122 int fd;
123 char *name;
124} mbtk_lock_name_s;
125static mbtk_lock_name_s lock_name[LOCK_MAX_SIZE]={0};
126
127static mbtk_log fun_ptr_log = NULL;
lichengzhangea38e902025-06-14 11:53:03 +0800128static void *dlHandle_sleep = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800129char *lynqLib_sleep = "/lib/libmbtk_lib.so";
130
131
132/**
133* @brief Enable autosleep
134* @param void
hong.liucd370792025-05-28 06:29:19 -0700135* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800136*/
137
138static int handle()
139{
140 if(dlHandle_sleep == NULL || fun_ptr_log == NULL)
141 {
142 dlHandle_sleep = dlopen(lynqLib_sleep, RTLD_NOW);
143 fun_ptr_log = (mbtk_log)dlsym(dlHandle_sleep, "mbtk_log");
144 if(fun_ptr_log == NULL || dlHandle_sleep == NULL)
145 {
hong.liucd370792025-05-28 06:29:19 -0700146 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800147 }
148 }
149 return GSW_HAL_SUCCESS;
150}
151
152int32_t gsw_autosleep_enable(void)
153{
154 int ret;
155 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700156 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800157 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
158 ret = mbtk_autosuspend_enable(1);
159 if(ret < 0)
160 {
161 LOGE("mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700162 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800163 }
b.liu68a94c92025-05-24 12:53:41 +0800164 return GSW_HAL_SUCCESS;
165}
166
167/**
168* @brief Disable autosleep
169* @param void
hong.liucd370792025-05-28 06:29:19 -0700170* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800171*/
172int32_t gsw_autosleep_disenable(void)
173{
174 int ret;
175 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700176 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800177 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
178 ret = mbtk_autosuspend_enable(0);
179 if(ret < 0)
180 {
181 LOGE("mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700182 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800183 }
b.liu68a94c92025-05-24 12:53:41 +0800184 return GSW_HAL_SUCCESS;
185}
186
187/**
188* @brief Init power manager module
189* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback
hong.liucd370792025-05-28 06:29:19 -0700190* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800191*/
192int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback)
193{
194 int ret;
195 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700196 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800197 mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");
198 ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);
199 if(ret < 0)
200 {
201 LOGE("mbtk_lpm_init FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700202 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800203 }
204 return GSW_HAL_SUCCESS;
205}
206
207/**
208* @brief Release wake lock, enter sleep
209* @param [in]int32_t wakeup_in
210* @retval int
211*/
212int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)
213{
214 int ret;
215 int i;
216 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700217 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800218 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700219 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800220 for(i=0 ;i<LOCK_MAX_SIZE;i++)
221 {
222 if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)
223 {
224 lock_fd = lock_name[i].fd;
225 break;
226 }
227 }
228 if (i >= LOCK_MAX_SIZE)
229 {
230 LOGE("mbtk_wakelock_lock not create.\n");
hong.liucd370792025-05-28 06:29:19 -0700231 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800232 }
233
234 mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");
235 ret = mbtk_wakelock_unlock(lock_fd);
236 if(ret < 0)
237 {
238 LOGE("mbtk_wakelock_unlock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700239 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800240 }
241
242 mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");
243 ret = mbtk_wakelock_destroy(lock_fd);
244 if(ret < 0)
245 {
246 LOGE("mbtk_wakelock_destroy FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700247 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800248 }
249 if (lock_name[i].name != NULL)
250 {
251 free(lock_name[i].name);
252 lock_name[i].name = NULL;
253 lock_name[i].fd = -1;
254 }
b.liu68a94c92025-05-24 12:53:41 +0800255 return GSW_HAL_SUCCESS;
256}
257
258/**
259* @brief Creat wakeup lock
260* @param [in]int32_t wakeup_in
261* @retval int
262*/
263int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)
264{
265 int ret;
266 int i;
267 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700268 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800269 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700270 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800271 mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");
272 lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));
273 if(lock_fd < 0)
274 {
275 LOGE("mbtk_wakelock_create FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700276 ret = GSW_HAL_NORMAL_FAIL;
277 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800278 }
279 mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");
280
281 ret = mbtk_wakelock_lock(lock_fd);
282 if(ret < 0)
283 {
284 LOGE("mbtk_wakelock_lock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700285 ret = GSW_HAL_NORMAL_FAIL;
286 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800287 }
288 for(i=0 ;i<LOCK_MAX_SIZE;i++)
289 {
290 if(lock_name[i].name == NULL)
291 break;
292 }
hong.liucd370792025-05-28 06:29:19 -0700293 if(i == LOCK_MAX_SIZE)
294 {
295 LOGE("mbtk_wakelock_lock not space FAIL.\n");
296 ret = GSW_HAL_NORMAL_FAIL;
297 goto end;
298 }
b.liu68a94c92025-05-24 12:53:41 +0800299 lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);
300 if (lock_name[i].name == NULL)
301 {
302 LOGE("mbtk_wakelock_lock remeber FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700303 ret = GSW_HAL_NORMAL_FAIL;
304 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800305 }
306 memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);
307 lock_name[i].fd = lock_fd;
hong.liucd370792025-05-28 06:29:19 -0700308 ret = GSW_HAL_SUCCESS;
309end:
hong.liucd370792025-05-28 06:29:19 -0700310 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800311}
312
313/**
314* @brief Module log disk drop, used when restarting or hibernating
315* @param [in]void
316* @retval void
317*/
318void gsw_modem_log_sync(void)
319{
320 FILE *fp;
321 char command[256];
322 char buffer[256];
323 int pid = -1;
324 const char *process_name = "mbtk_logd";
325
326 snprintf(command, sizeof(command), "pgrep %s", process_name);
327 fp = popen(command, "r");
328 if (fp == NULL)
329 {
330 perror("error comman");
331 return;
332 }
333
334 if (fgets(buffer, sizeof(buffer), fp) != NULL)
335 {
336 pid = atoi(buffer);
337 }
338 pclose(fp);
339
340 if (pid != -1)
341 {
342 if (kill(pid, SIGTERM) == -1)
343 {
344 perror("send SIGTERM signal failed");
345 return;
346 }
347 }
348 return;
hong.liud2417072025-06-27 07:10:37 -0700349}
350/**
351 * @brief enable autosleep
352 * @return int : 0 is success , other failed
353 */
354int gswAutoSleepEnable(void)
355{
356 return gsw_autosleep_enable();
357}
358
359/**
360 * @brief disenable autosleep
361 * @return int : 0 is success , other failed
362 */
363int gswAutoSleepDisable(void)
364{
365 return gsw_autosleep_disenable();
366}
367
368/**
369 * @brief modem relase wakeuplock
370 * @return void
371 */
372void gswPMStartSleep(void)
373{
374 gsw_pm_enter_sleep(GSW_WAKELOCK_NAME);
375}
376
377/**
378 * @brief modem add wakeuplock
379 * @return int : 0 is success , other failed
380 */
381int gswPMStopSleep(void)
382{
383 return gsw_pm_exit_sleep(GSW_WAKELOCK_NAME);
384}
385
386int gswPmSDKInit(gsw_pm_wakeup_handler gswPmCallBack)
387{
388 return gsw_pm_sdk_init(gswPmCallBack);
389}