blob: 886a512dfc1585f7b6a902e28becc76b4d6107ba [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]"
35
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
hong.liucd370792025-05-28 06:29:19 -0700107
b.liu68a94c92025-05-24 12:53:41 +0800108#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL
109#define LOCK_MAX_SIZE 129
hong.liucd370792025-05-28 06:29:19 -0700110typedef void (*GSW_PM_WAKEUPCALLBACK)(int32_t wakeup_in);
b.liu68a94c92025-05-24 12:53:41 +0800111typedef void (*mbtk_lpm_handler_t)(int32_t wakeup_in);
112typedef void (*mbtk_log)(int level, const char *format,...);
113
114int (*mbtk_autosuspend_enable)(char);
115int (*mbtk_wakelock_create)(const char* name , size_t);
116int (*mbtk_wakelock_lock)(int);
117int (*mbtk_wakelock_unlock)(int);
118int (*mbtk_wakelock_destroy)(int);
119int (*mbtk_lpm_init)(mbtk_lpm_handler_t );
120int lock_fd = -1;
121
122typedef struct
123{
124 int fd;
125 char *name;
126} mbtk_lock_name_s;
127static mbtk_lock_name_s lock_name[LOCK_MAX_SIZE]={0};
128
129static mbtk_log fun_ptr_log = NULL;
lichengzhangea38e902025-06-14 11:53:03 +0800130static void *dlHandle_sleep = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800131char *lynqLib_sleep = "/lib/libmbtk_lib.so";
132
133
134/**
135* @brief Enable autosleep
136* @param void
hong.liucd370792025-05-28 06:29:19 -0700137* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800138*/
139
140static int handle()
141{
142 if(dlHandle_sleep == NULL || fun_ptr_log == NULL)
143 {
144 dlHandle_sleep = dlopen(lynqLib_sleep, RTLD_NOW);
145 fun_ptr_log = (mbtk_log)dlsym(dlHandle_sleep, "mbtk_log");
146 if(fun_ptr_log == NULL || dlHandle_sleep == NULL)
147 {
hong.liucd370792025-05-28 06:29:19 -0700148 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800149 }
150 }
151 return GSW_HAL_SUCCESS;
152}
153
154int32_t gsw_autosleep_enable(void)
155{
156 int ret;
157 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700158 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800159 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
160 ret = mbtk_autosuspend_enable(1);
161 if(ret < 0)
162 {
163 LOGE("mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700164 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800165 }
b.liu68a94c92025-05-24 12:53:41 +0800166 return GSW_HAL_SUCCESS;
167}
168
169/**
170* @brief Disable autosleep
171* @param void
hong.liucd370792025-05-28 06:29:19 -0700172* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800173*/
174int32_t gsw_autosleep_disenable(void)
175{
176 int ret;
177 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700178 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800179 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
180 ret = mbtk_autosuspend_enable(0);
181 if(ret < 0)
182 {
183 LOGE("mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700184 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800185 }
b.liu68a94c92025-05-24 12:53:41 +0800186 return GSW_HAL_SUCCESS;
187}
188
189/**
190* @brief Init power manager module
191* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback
hong.liucd370792025-05-28 06:29:19 -0700192* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800193*/
194int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback)
195{
196 int ret;
197 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700198 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800199 mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");
200 ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);
201 if(ret < 0)
202 {
203 LOGE("mbtk_lpm_init FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700204 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800205 }
206 return GSW_HAL_SUCCESS;
207}
208
209/**
210* @brief Release wake lock, enter sleep
211* @param [in]int32_t wakeup_in
212* @retval int
213*/
214int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)
215{
216 int ret;
217 int i;
218 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700219 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800220 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700221 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800222 for(i=0 ;i<LOCK_MAX_SIZE;i++)
223 {
224 if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)
225 {
226 lock_fd = lock_name[i].fd;
227 break;
228 }
229 }
230 if (i >= LOCK_MAX_SIZE)
231 {
232 LOGE("mbtk_wakelock_lock not create.\n");
hong.liucd370792025-05-28 06:29:19 -0700233 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800234 }
235
236 mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");
237 ret = mbtk_wakelock_unlock(lock_fd);
238 if(ret < 0)
239 {
240 LOGE("mbtk_wakelock_unlock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700241 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800242 }
243
244 mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");
245 ret = mbtk_wakelock_destroy(lock_fd);
246 if(ret < 0)
247 {
248 LOGE("mbtk_wakelock_destroy FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700249 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800250 }
251 if (lock_name[i].name != NULL)
252 {
253 free(lock_name[i].name);
254 lock_name[i].name = NULL;
255 lock_name[i].fd = -1;
256 }
b.liu68a94c92025-05-24 12:53:41 +0800257 return GSW_HAL_SUCCESS;
258}
259
260/**
261* @brief Creat wakeup lock
262* @param [in]int32_t wakeup_in
263* @retval int
264*/
265int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)
266{
267 int ret;
268 int i;
269 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700270 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800271 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700272 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800273 mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");
274 lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));
275 if(lock_fd < 0)
276 {
277 LOGE("mbtk_wakelock_create FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700278 ret = GSW_HAL_NORMAL_FAIL;
279 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800280 }
281 mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");
282
283 ret = mbtk_wakelock_lock(lock_fd);
284 if(ret < 0)
285 {
286 LOGE("mbtk_wakelock_lock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700287 ret = GSW_HAL_NORMAL_FAIL;
288 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800289 }
290 for(i=0 ;i<LOCK_MAX_SIZE;i++)
291 {
292 if(lock_name[i].name == NULL)
293 break;
294 }
hong.liucd370792025-05-28 06:29:19 -0700295 if(i == LOCK_MAX_SIZE)
296 {
297 LOGE("mbtk_wakelock_lock not space FAIL.\n");
298 ret = GSW_HAL_NORMAL_FAIL;
299 goto end;
300 }
b.liu68a94c92025-05-24 12:53:41 +0800301 lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);
302 if (lock_name[i].name == NULL)
303 {
304 LOGE("mbtk_wakelock_lock remeber FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700305 ret = GSW_HAL_NORMAL_FAIL;
306 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800307 }
308 memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);
309 lock_name[i].fd = lock_fd;
hong.liucd370792025-05-28 06:29:19 -0700310 ret = GSW_HAL_SUCCESS;
311end:
hong.liucd370792025-05-28 06:29:19 -0700312 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800313}
314
315/**
316* @brief Module log disk drop, used when restarting or hibernating
317* @param [in]void
318* @retval void
319*/
320void gsw_modem_log_sync(void)
321{
322 FILE *fp;
323 char command[256];
324 char buffer[256];
325 int pid = -1;
326 const char *process_name = "mbtk_logd";
327
328 snprintf(command, sizeof(command), "pgrep %s", process_name);
329 fp = popen(command, "r");
330 if (fp == NULL)
331 {
332 perror("error comman");
333 return;
334 }
335
336 if (fgets(buffer, sizeof(buffer), fp) != NULL)
337 {
338 pid = atoi(buffer);
339 }
340 pclose(fp);
341
342 if (pid != -1)
343 {
344 if (kill(pid, SIGTERM) == -1)
345 {
346 perror("send SIGTERM signal failed");
347 return;
348 }
349 }
350 return;
351}