blob: 9a28e712e354a177c99fe134731f6af850b277cb [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>
16#include "gsw_pm.h"
17
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
107#define GSW_HAL_SUCCESS 0
108#define GSW_HAL_FAIL -1 //表示失败(通用性)
109#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL
110#define LOCK_MAX_SIZE 129
111
112typedef void (*mbtk_lpm_handler_t)(int32_t wakeup_in);
113typedef void (*mbtk_log)(int level, const char *format,...);
114
115int (*mbtk_autosuspend_enable)(char);
116int (*mbtk_wakelock_create)(const char* name , size_t);
117int (*mbtk_wakelock_lock)(int);
118int (*mbtk_wakelock_unlock)(int);
119int (*mbtk_wakelock_destroy)(int);
120int (*mbtk_lpm_init)(mbtk_lpm_handler_t );
121int lock_fd = -1;
122
123typedef struct
124{
125 int fd;
126 char *name;
127} mbtk_lock_name_s;
128static mbtk_lock_name_s lock_name[LOCK_MAX_SIZE]={0};
129
130static mbtk_log fun_ptr_log = NULL;
131void *dlHandle_sleep = NULL;
132char *lynqLib_sleep = "/lib/libmbtk_lib.so";
133
134
135/**
136* @brief Enable autosleep
137* @param void
138* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
139*/
140
141static int handle()
142{
143 if(dlHandle_sleep == NULL || fun_ptr_log == NULL)
144 {
145 dlHandle_sleep = dlopen(lynqLib_sleep, RTLD_NOW);
146 fun_ptr_log = (mbtk_log)dlsym(dlHandle_sleep, "mbtk_log");
147 if(fun_ptr_log == NULL || dlHandle_sleep == NULL)
148 {
149 return GSW_HAL_FAIL;
150 }
151 }
152 return GSW_HAL_SUCCESS;
153}
154
155int32_t gsw_autosleep_enable(void)
156{
157 int ret;
158 if (handle())
159 return GSW_HAL_FAIL;
160 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
161 ret = mbtk_autosuspend_enable(1);
162 if(ret < 0)
163 {
164 LOGE("mbtk_autosuspend_enable FAIL.\n");
165 dlclose(dlHandle_sleep);
166 dlHandle_sleep = NULL;
167 return GSW_HAL_FAIL;
168 }
169 dlclose(dlHandle_sleep);
170 dlHandle_sleep = NULL;
171 return GSW_HAL_SUCCESS;
172}
173
174/**
175* @brief Disable autosleep
176* @param void
177* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
178*/
179int32_t gsw_autosleep_disenable(void)
180{
181 int ret;
182 if (handle())
183 return GSW_HAL_FAIL;
184 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
185 ret = mbtk_autosuspend_enable(0);
186 if(ret < 0)
187 {
188 LOGE("mbtk_autosuspend_enable FAIL.\n");
189 dlclose(dlHandle_sleep);
190 dlHandle_sleep = NULL;
191 return GSW_HAL_FAIL;
192 }
193 dlclose(dlHandle_sleep);
194 dlHandle_sleep = NULL;
195 return GSW_HAL_SUCCESS;
196}
197
198/**
199* @brief Init power manager module
200* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback
201* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
202*/
203int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback)
204{
205 int ret;
206 if (handle())
207 return GSW_HAL_FAIL;
208 mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");
209 ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);
210 if(ret < 0)
211 {
212 LOGE("mbtk_lpm_init FAIL.\n");
213 dlclose(dlHandle_sleep);
214 dlHandle_sleep = NULL;
215 return GSW_HAL_FAIL;
216 }
217 return GSW_HAL_SUCCESS;
218}
219
220/**
221* @brief Release wake lock, enter sleep
222* @param [in]int32_t wakeup_in
223* @retval int
224*/
225int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)
226{
227 int ret;
228 int i;
229 if (handle())
230 return GSW_HAL_FAIL;
231 if (gsw_wakelock_name == NULL)
232 return GSW_HAL_FAIL;
233 for(i=0 ;i<LOCK_MAX_SIZE;i++)
234 {
235 if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)
236 {
237 lock_fd = lock_name[i].fd;
238 break;
239 }
240 }
241 if (i >= LOCK_MAX_SIZE)
242 {
243 LOGE("mbtk_wakelock_lock not create.\n");
244 return GSW_HAL_FAIL;
245 }
246
247 mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");
248 ret = mbtk_wakelock_unlock(lock_fd);
249 if(ret < 0)
250 {
251 LOGE("mbtk_wakelock_unlock FAIL.\n");
252 dlclose(dlHandle_sleep);
253 dlHandle_sleep = NULL;
254 return GSW_HAL_FAIL;
255 }
256
257 mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");
258 ret = mbtk_wakelock_destroy(lock_fd);
259 if(ret < 0)
260 {
261 LOGE("mbtk_wakelock_destroy FAIL.\n");
262 dlclose(dlHandle_sleep);
263 dlHandle_sleep = NULL;
264 return GSW_HAL_FAIL;
265 }
266 if (lock_name[i].name != NULL)
267 {
268 free(lock_name[i].name);
269 lock_name[i].name = NULL;
270 lock_name[i].fd = -1;
271 }
272
273 dlclose(dlHandle_sleep);
274 dlHandle_sleep = NULL;
275 return GSW_HAL_SUCCESS;
276}
277
278/**
279* @brief Creat wakeup lock
280* @param [in]int32_t wakeup_in
281* @retval int
282*/
283int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)
284{
285 int ret;
286 int i;
287 if (handle())
288 return GSW_HAL_FAIL;
289 if (gsw_wakelock_name == NULL)
290 return GSW_HAL_FAIL;
291 mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");
292 lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));
293 if(lock_fd < 0)
294 {
295 LOGE("mbtk_wakelock_create FAIL.\n");
296 dlclose(dlHandle_sleep);
297 dlHandle_sleep = NULL;
298 return GSW_HAL_FAIL;
299 }
300 mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");
301
302 ret = mbtk_wakelock_lock(lock_fd);
303 if(ret < 0)
304 {
305 LOGE("mbtk_wakelock_lock FAIL.\n");
306 dlclose(dlHandle_sleep);
307 dlHandle_sleep = NULL;
308 return GSW_HAL_FAIL;
309 }
310 for(i=0 ;i<LOCK_MAX_SIZE;i++)
311 {
312 if(lock_name[i].name == NULL)
313 break;
314 }
315 lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);
316 if (lock_name[i].name == NULL)
317 {
318 LOGE("mbtk_wakelock_lock remeber FAIL.\n");
319 return GSW_HAL_FAIL;
320 }
321 memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);
322 lock_name[i].fd = lock_fd;
323
324 dlclose(dlHandle_sleep);
325 dlHandle_sleep = NULL;
326 return GSW_HAL_SUCCESS;
327}
328
329/**
330* @brief Module log disk drop, used when restarting or hibernating
331* @param [in]void
332* @retval void
333*/
334void gsw_modem_log_sync(void)
335{
336 FILE *fp;
337 char command[256];
338 char buffer[256];
339 int pid = -1;
340 const char *process_name = "mbtk_logd";
341
342 snprintf(command, sizeof(command), "pgrep %s", process_name);
343 fp = popen(command, "r");
344 if (fp == NULL)
345 {
346 perror("error comman");
347 return;
348 }
349
350 if (fgets(buffer, sizeof(buffer), fp) != NULL)
351 {
352 pid = atoi(buffer);
353 }
354 pclose(fp);
355
356 if (pid != -1)
357 {
358 if (kill(pid, SIGTERM) == -1)
359 {
360 perror("send SIGTERM signal failed");
361 return;
362 }
363 }
364 return;
365}