blob: 517b13499c711a9da281078ae1f219f67ea98007 [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.liufa3dc0a2025-06-30 17:30:59 +080016#include <sys/time.h>
hong.liucd370792025-05-28 06:29:19 -070017#include "gsw_pm_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080018
19#ifndef LOG_ERR_LEVEL
20#define LOG_ERR_LEVEL 3 /* error conditions */
21#endif
22#ifndef LOG_WARN_LEVEL
23#define LOG_WARN_LEVEL 4 /* warning conditions */
24#endif
25#ifndef LOG_INFO_LEVEL
26#define LOG_INFO_LEVEL 6 /* informational */
27#endif
28#ifndef LOG_DEBUG_LEVEL
29#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
30#endif
31#ifndef LOG_VERBOSE_LEVEL
32#define LOG_VERBOSE_LEVEL 8
33#endif
34
l.yang6a42e4d2025-05-28 01:04:20 -070035#define GSW_PM "[HAL][GSW_PM]"
hong.liud2417072025-06-27 07:10:37 -070036#define GSW_WAKELOCK_NAME "gsw_app_wakelock"
b.liu68a94c92025-05-24 12:53:41 +080037#define LOGV(fmt, args ...) \
38 do{ \
39 char *file_ptr_1001 = __FILE__; \
40 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
41 char line_1001[10] = {0}; \
42 sprintf(line_1001, "%d", __LINE__); \
43 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
44 if(*ptr_1001 == '/') \
45 break; \
46 ptr_1001--; \
47 } \
l.yang6a42e4d2025-05-28 01:04:20 -070048 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080049 } while(0)
50
51#define LOGI(fmt, args...) \
52 do{ \
53 char *file_ptr_1001 = __FILE__; \
54 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
55 char line_1001[10] = {0}; \
56 sprintf(line_1001, "%d", __LINE__); \
57 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
58 if(*ptr_1001 == '/') \
59 break; \
60 ptr_1001--; \
61 } \
l.yang6a42e4d2025-05-28 01:04:20 -070062 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080063 } while(0)
64
65#define LOGD(fmt, args...) \
66 do{ \
67 char *file_ptr_1001 = __FILE__; \
68 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
69 char line_1001[10] = {0}; \
70 sprintf(line_1001, "%d", __LINE__); \
71 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
72 if(*ptr_1001 == '/') \
73 break; \
74 ptr_1001--; \
75 } \
l.yang6a42e4d2025-05-28 01:04:20 -070076 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080077 } while(0)
78
79#define LOGW(fmt, args...) \
80 do{ \
81 char *file_ptr_1001 = __FILE__; \
82 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
83 char line_1001[10] = {0}; \
84 sprintf(line_1001, "%d", __LINE__); \
85 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
86 if(*ptr_1001 == '/') \
87 break; \
88 ptr_1001--; \
89 } \
l.yang6a42e4d2025-05-28 01:04:20 -070090 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080091 } while(0)
92
93#define LOGE(fmt, args...) \
94 do{ \
95 char *file_ptr_1001 = __FILE__; \
96 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
97 char line_1001[10] = {0}; \
98 sprintf(line_1001, "%d", __LINE__); \
99 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
100 if(*ptr_1001 == '/') \
101 break; \
102 ptr_1001--; \
103 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700104 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_PM"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800105 } while(0)
106
b.liu68a94c92025-05-24 12:53:41 +0800107#define LOCK_MAX_SIZE 129
hong.liufa3dc0a2025-06-30 17:30:59 +0800108#define SDK_READY_CMD "uci get persist.mbtk.sdk__state"
rx.xiee12806a2025-07-16 06:17:08 -0700109#define MBTK_REBOOT_REASON "uci get persist.mbtk.reboot_reason"
hong.liufa3dc0a2025-06-30 17:30:59 +0800110#define CHECK_SYSTEM(cmd) do { \
111 int _ret = system(cmd); \
112 if (_ret == -1) perror("system error"); \
113} while(0)
rx.xiee12806a2025-07-16 06:17:08 -0700114
hong.liucd370792025-05-28 06:29:19 -0700115typedef void (*GSW_PM_WAKEUPCALLBACK)(int32_t wakeup_in);
b.liu68a94c92025-05-24 12:53:41 +0800116typedef void (*mbtk_lpm_handler_t)(int32_t wakeup_in);
117typedef void (*mbtk_log)(int level, const char *format,...);
118
119int (*mbtk_autosuspend_enable)(char);
120int (*mbtk_wakelock_create)(const char* name , size_t);
121int (*mbtk_wakelock_lock)(int);
122int (*mbtk_wakelock_unlock)(int);
123int (*mbtk_wakelock_destroy)(int);
124int (*mbtk_lpm_init)(mbtk_lpm_handler_t );
rx.xiee12806a2025-07-16 06:17:08 -0700125
b.liu68a94c92025-05-24 12:53:41 +0800126int lock_fd = -1;
127
128typedef struct
129{
130 int fd;
131 char *name;
132} mbtk_lock_name_s;
133static mbtk_lock_name_s lock_name[LOCK_MAX_SIZE]={0};
134
135static mbtk_log fun_ptr_log = NULL;
lichengzhangea38e902025-06-14 11:53:03 +0800136static void *dlHandle_sleep = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800137char *lynqLib_sleep = "/lib/libmbtk_lib.so";
138
hong.liufa3dc0a2025-06-30 17:30:59 +0800139//0 success,1 timeout,the timeout is 60s
140static int wait_sdk_ready()
141{
142 char buffer[8] = {0};
143 int sdk_value = -1;
144 int timeout = 0;
145 const char *s_kmsg = "echo \"check_sdk_ready ready\" > /dev/kmsg";
146 const char *f_kmsg = "echo \"check_sdk_ready timeout\" > /dev/kmsg";
147 while(timeout < 500) // ~= 60s
148 {
149 timeout++;
150 FILE *fp = popen(SDK_READY_CMD, "r");
151 if(NULL == fp)
152 {
153 continue;
154 }
155 memset(buffer,0,sizeof(buffer));
156 if(fgets(buffer, sizeof(buffer), fp) == NULL)
157 {
158 pclose(fp);
159 perror("fgets failed:");
160 continue;
161 }
162 pclose(fp);
163 printf("gsw wait_sdk_ready:%s",buffer);
164 sdk_value = atoi(buffer);
165 if(sdk_value == 0) //sdk ready
166 {
167 CHECK_SYSTEM(s_kmsg);
168 return 0;
169 }
170 usleep(1000*100);//100ms
171 }
172 CHECK_SYSTEM(f_kmsg);
173 return 1;
174}
b.liu68a94c92025-05-24 12:53:41 +0800175
176/**
177* @brief Enable autosleep
178* @param void
hong.liucd370792025-05-28 06:29:19 -0700179* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800180*/
181
182static int handle()
183{
184 if(dlHandle_sleep == NULL || fun_ptr_log == NULL)
185 {
186 dlHandle_sleep = dlopen(lynqLib_sleep, RTLD_NOW);
187 fun_ptr_log = (mbtk_log)dlsym(dlHandle_sleep, "mbtk_log");
188 if(fun_ptr_log == NULL || dlHandle_sleep == NULL)
189 {
hong.liucd370792025-05-28 06:29:19 -0700190 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800191 }
192 }
193 return GSW_HAL_SUCCESS;
194}
195
196int32_t gsw_autosleep_enable(void)
197{
198 int ret;
199 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700200 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800201 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
202 ret = mbtk_autosuspend_enable(1);
203 if(ret < 0)
204 {
205 LOGE("mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700206 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800207 }
b.liu68a94c92025-05-24 12:53:41 +0800208 return GSW_HAL_SUCCESS;
209}
210
211/**
212* @brief Disable autosleep
213* @param void
hong.liucd370792025-05-28 06:29:19 -0700214* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800215*/
216int32_t gsw_autosleep_disenable(void)
217{
218 int ret;
219 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700220 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800221 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
222 ret = mbtk_autosuspend_enable(0);
223 if(ret < 0)
224 {
225 LOGE("mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700226 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800227 }
b.liu68a94c92025-05-24 12:53:41 +0800228 return GSW_HAL_SUCCESS;
229}
230
231/**
232* @brief Init power manager module
233* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback
hong.liucd370792025-05-28 06:29:19 -0700234* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800235*/
236int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback)
237{
hong.liufa3dc0a2025-06-30 17:30:59 +0800238 int ret = 0;
239 ret = wait_sdk_ready(); //Continue to execute even if timed out
240 printf("wait_sdk_ready ret:%d\n",ret); //due to the LOG* can not use
b.liu68a94c92025-05-24 12:53:41 +0800241 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700242 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800243 mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");
244 ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);
245 if(ret < 0)
246 {
247 LOGE("mbtk_lpm_init FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700248 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800249 }
250 return GSW_HAL_SUCCESS;
251}
252
253/**
254* @brief Release wake lock, enter sleep
255* @param [in]int32_t wakeup_in
256* @retval int
257*/
258int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)
259{
260 int ret;
261 int i;
262 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700263 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800264 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700265 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800266 for(i=0 ;i<LOCK_MAX_SIZE;i++)
267 {
268 if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)
269 {
270 lock_fd = lock_name[i].fd;
271 break;
272 }
273 }
274 if (i >= LOCK_MAX_SIZE)
275 {
276 LOGE("mbtk_wakelock_lock not create.\n");
hong.liucd370792025-05-28 06:29:19 -0700277 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800278 }
279
280 mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");
281 ret = mbtk_wakelock_unlock(lock_fd);
282 if(ret < 0)
283 {
284 LOGE("mbtk_wakelock_unlock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700285 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800286 }
287
288 mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");
289 ret = mbtk_wakelock_destroy(lock_fd);
290 if(ret < 0)
291 {
292 LOGE("mbtk_wakelock_destroy FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700293 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800294 }
295 if (lock_name[i].name != NULL)
296 {
297 free(lock_name[i].name);
298 lock_name[i].name = NULL;
299 lock_name[i].fd = -1;
300 }
b.liu68a94c92025-05-24 12:53:41 +0800301 return GSW_HAL_SUCCESS;
302}
303
304/**
305* @brief Creat wakeup lock
306* @param [in]int32_t wakeup_in
307* @retval int
308*/
309int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)
310{
311 int ret;
312 int i;
313 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700314 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800315 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700316 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800317 mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");
318 lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));
319 if(lock_fd < 0)
320 {
321 LOGE("mbtk_wakelock_create FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700322 ret = GSW_HAL_NORMAL_FAIL;
323 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800324 }
325 mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");
326
327 ret = mbtk_wakelock_lock(lock_fd);
328 if(ret < 0)
329 {
330 LOGE("mbtk_wakelock_lock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700331 ret = GSW_HAL_NORMAL_FAIL;
332 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800333 }
334 for(i=0 ;i<LOCK_MAX_SIZE;i++)
335 {
336 if(lock_name[i].name == NULL)
337 break;
338 }
hong.liucd370792025-05-28 06:29:19 -0700339 if(i == LOCK_MAX_SIZE)
340 {
341 LOGE("mbtk_wakelock_lock not space FAIL.\n");
342 ret = GSW_HAL_NORMAL_FAIL;
343 goto end;
344 }
b.liu68a94c92025-05-24 12:53:41 +0800345 lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);
346 if (lock_name[i].name == NULL)
347 {
348 LOGE("mbtk_wakelock_lock remeber FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700349 ret = GSW_HAL_NORMAL_FAIL;
350 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800351 }
352 memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);
353 lock_name[i].fd = lock_fd;
hong.liucd370792025-05-28 06:29:19 -0700354 ret = GSW_HAL_SUCCESS;
355end:
hong.liucd370792025-05-28 06:29:19 -0700356 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800357}
358
359/**
360* @brief Module log disk drop, used when restarting or hibernating
361* @param [in]void
362* @retval void
363*/
364void gsw_modem_log_sync(void)
365{
366 FILE *fp;
367 char command[256];
368 char buffer[256];
369 int pid = -1;
370 const char *process_name = "mbtk_logd";
371
372 snprintf(command, sizeof(command), "pgrep %s", process_name);
373 fp = popen(command, "r");
374 if (fp == NULL)
375 {
376 perror("error comman");
377 return;
378 }
379
380 if (fgets(buffer, sizeof(buffer), fp) != NULL)
381 {
382 pid = atoi(buffer);
383 }
384 pclose(fp);
385
386 if (pid != -1)
387 {
388 if (kill(pid, SIGTERM) == -1)
389 {
390 perror("send SIGTERM signal failed");
391 return;
392 }
393 }
394 return;
hong.liud2417072025-06-27 07:10:37 -0700395}
rx.xiee12806a2025-07-16 06:17:08 -0700396
397/**
398* @brief get Modem reset reason
399* @param [in]int32_t * reset_reason
400* @retval void
401*/
402int32_t gsw_get_modem_reset_reason(int32_t *reset_reason)
403{
404 char buf[8] = {0};
405 int value = -1;
406 FILE *fp = popen(MBTK_REBOOT_REASON, "r");
407 if(NULL == fp)
408 {
409 return GSW_HAL_NORMAL_FAIL;
410 }
411 memset(buf,0,sizeof(buf));
412 if(fgets(buf, sizeof(buf), fp) == NULL)
413 {
414 pclose(fp);
415 perror("fgets failed:");
416 return GSW_HAL_NORMAL_FAIL;
417 }
418 pclose(fp);
419 value = atoi(buf);
420
421 if (value >= 0 && value <= 6)
422 {
423 *reset_reason = (int32_t)value;
424 return GSW_HAL_SUCCESS;
425 }
426 return GSW_HAL_NORMAL_FAIL;
427}
428
429
hong.liud2417072025-06-27 07:10:37 -0700430/**
431 * @brief enable autosleep
432 * @return int : 0 is success , other failed
433 */
434int gswAutoSleepEnable(void)
435{
436 return gsw_autosleep_enable();
437}
438
439/**
440 * @brief disenable autosleep
441 * @return int : 0 is success , other failed
442 */
443int gswAutoSleepDisable(void)
444{
445 return gsw_autosleep_disenable();
446}
447
448/**
449 * @brief modem relase wakeuplock
450 * @return void
451 */
452void gswPMStartSleep(void)
453{
454 gsw_pm_enter_sleep(GSW_WAKELOCK_NAME);
455}
456
457/**
458 * @brief modem add wakeuplock
459 * @return int : 0 is success , other failed
460 */
461int gswPMStopSleep(void)
462{
463 return gsw_pm_exit_sleep(GSW_WAKELOCK_NAME);
464}
465
466int gswPmSDKInit(gsw_pm_wakeup_handler gswPmCallBack)
467{
468 return gsw_pm_sdk_init(gswPmCallBack);
469}