blob: 21b6cff043733acf01bf2145044bcb9f3cfd7c17 [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"
lichengzhang7715b2f2025-07-19 10:18:21 +080018#include "gsw_log_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080019
l.yang6a42e4d2025-05-28 01:04:20 -070020#define GSW_PM "[HAL][GSW_PM]"
hong.liud2417072025-06-27 07:10:37 -070021#define GSW_WAKELOCK_NAME "gsw_app_wakelock"
b.liu68a94c92025-05-24 12:53:41 +080022
b.liu68a94c92025-05-24 12:53:41 +080023#define LOCK_MAX_SIZE 129
xf.li6ab80a02025-08-04 02:28:32 -070024#define SDK_READY_CMD "uci get lynq_uci.sdk_ready"
rx.xiee12806a2025-07-16 06:17:08 -070025#define MBTK_REBOOT_REASON "uci get persist.mbtk.reboot_reason"
hong.liufa3dc0a2025-06-30 17:30:59 +080026#define CHECK_SYSTEM(cmd) do { \
27 int _ret = system(cmd); \
28 if (_ret == -1) perror("system error"); \
29} while(0)
rx.xiee12806a2025-07-16 06:17:08 -070030
hong.liucd370792025-05-28 06:29:19 -070031typedef void (*GSW_PM_WAKEUPCALLBACK)(int32_t wakeup_in);
b.liu68a94c92025-05-24 12:53:41 +080032typedef void (*mbtk_lpm_handler_t)(int32_t wakeup_in);
lichengzhang7715b2f2025-07-19 10:18:21 +080033//typedef void (*mbtk_log)(int level, const char *format,...);
b.liu68a94c92025-05-24 12:53:41 +080034
35int (*mbtk_autosuspend_enable)(char);
36int (*mbtk_wakelock_create)(const char* name , size_t);
37int (*mbtk_wakelock_lock)(int);
38int (*mbtk_wakelock_unlock)(int);
39int (*mbtk_wakelock_destroy)(int);
40int (*mbtk_lpm_init)(mbtk_lpm_handler_t );
rx.xiee12806a2025-07-16 06:17:08 -070041
b.liu68a94c92025-05-24 12:53:41 +080042int lock_fd = -1;
lichengzhang8e641c72025-07-21 14:32:21 +080043pthread_mutex_t pm_lock;
b.liu68a94c92025-05-24 12:53:41 +080044typedef struct
45{
46 int fd;
47 char *name;
48} mbtk_lock_name_s;
49static mbtk_lock_name_s lock_name[LOCK_MAX_SIZE]={0};
50
lichengzhang7715b2f2025-07-19 10:18:21 +080051//static mbtk_log fun_ptr_log = NULL;
lichengzhangea38e902025-06-14 11:53:03 +080052static void *dlHandle_sleep = NULL;
b.liu68a94c92025-05-24 12:53:41 +080053char *lynqLib_sleep = "/lib/libmbtk_lib.so";
54
hong.liufa3dc0a2025-06-30 17:30:59 +080055//0 success,1 timeout,the timeout is 60s
56static int wait_sdk_ready()
57{
58 char buffer[8] = {0};
59 int sdk_value = -1;
60 int timeout = 0;
61 const char *s_kmsg = "echo \"check_sdk_ready ready\" > /dev/kmsg";
62 const char *f_kmsg = "echo \"check_sdk_ready timeout\" > /dev/kmsg";
63 while(timeout < 500) // ~= 60s
64 {
65 timeout++;
66 FILE *fp = popen(SDK_READY_CMD, "r");
67 if(NULL == fp)
68 {
69 continue;
70 }
71 memset(buffer,0,sizeof(buffer));
72 if(fgets(buffer, sizeof(buffer), fp) == NULL)
73 {
74 pclose(fp);
75 perror("fgets failed:");
76 continue;
77 }
78 pclose(fp);
79 printf("gsw wait_sdk_ready:%s",buffer);
80 sdk_value = atoi(buffer);
81 if(sdk_value == 0) //sdk ready
82 {
83 CHECK_SYSTEM(s_kmsg);
84 return 0;
85 }
86 usleep(1000*100);//100ms
87 }
88 CHECK_SYSTEM(f_kmsg);
89 return 1;
90}
b.liu68a94c92025-05-24 12:53:41 +080091
92/**
93* @brief Enable autosleep
94* @param void
hong.liucd370792025-05-28 06:29:19 -070095* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +080096*/
97
98static int handle()
99{
lichengzhang7715b2f2025-07-19 10:18:21 +0800100 if(dlHandle_sleep == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800101 {
102 dlHandle_sleep = dlopen(lynqLib_sleep, RTLD_NOW);
lichengzhang7715b2f2025-07-19 10:18:21 +0800103 //fun_ptr_log = (mbtk_log)dlsym(dlHandle_sleep, "mbtk_log");
104 if(dlHandle_sleep == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800105 {
hong.liucd370792025-05-28 06:29:19 -0700106 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800107 }
108 }
109 return GSW_HAL_SUCCESS;
110}
111
112int32_t gsw_autosleep_enable(void)
113{
114 int ret;
115 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700116 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800117 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
118 ret = mbtk_autosuspend_enable(1);
119 if(ret < 0)
120 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800121 LOGE(GSW_PM,"mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700122 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800123 }
b.liu68a94c92025-05-24 12:53:41 +0800124 return GSW_HAL_SUCCESS;
125}
126
127/**
128* @brief Disable autosleep
129* @param void
hong.liucd370792025-05-28 06:29:19 -0700130* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800131*/
132int32_t gsw_autosleep_disenable(void)
133{
134 int ret;
135 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700136 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800137 mbtk_autosuspend_enable=(int(*)(char))dlsym(dlHandle_sleep, "mbtk_autosuspend_enable");
138 ret = mbtk_autosuspend_enable(0);
139 if(ret < 0)
140 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800141 LOGE(GSW_PM,"mbtk_autosuspend_enable FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700142 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800143 }
b.liu68a94c92025-05-24 12:53:41 +0800144 return GSW_HAL_SUCCESS;
145}
146
147/**
148* @brief Init power manager module
149* @param [in]GSW_PM_WAKEUPCALLBACKHandler wakeup_callback
hong.liucd370792025-05-28 06:29:19 -0700150* @retval GSW_HAL_SUCCESS\GSW_HAL_NORMAL_FAIL
b.liu68a94c92025-05-24 12:53:41 +0800151*/
152int32_t gsw_pm_sdk_init(GSW_PM_WAKEUPCALLBACK wakeup_callback)
153{
hong.liufa3dc0a2025-06-30 17:30:59 +0800154 int ret = 0;
155 ret = wait_sdk_ready(); //Continue to execute even if timed out
156 printf("wait_sdk_ready ret:%d\n",ret); //due to the LOG* can not use
b.liu68a94c92025-05-24 12:53:41 +0800157 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700158 return GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800159 if (pthread_mutex_init(&pm_lock, NULL) != 0)
160 {
161 LOGE(GSW_PM,"pthread_mutex_init pm_lock failed\n");
162 return GSW_HAL_NORMAL_FAIL;
163 }
b.liu68a94c92025-05-24 12:53:41 +0800164 mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");
165 ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);
166 if(ret < 0)
167 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800168 LOGE(GSW_PM,"mbtk_lpm_init FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700169 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800170 }
171 return GSW_HAL_SUCCESS;
172}
173
174/**
175* @brief Release wake lock, enter sleep
176* @param [in]int32_t wakeup_in
177* @retval int
178*/
179int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)
180{
181 int ret;
182 int i;
183 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700184 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800185 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700186 return GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800187 pthread_mutex_lock(&pm_lock);
b.liu68a94c92025-05-24 12:53:41 +0800188 for(i=0 ;i<LOCK_MAX_SIZE;i++)
189 {
190 if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)
191 {
192 lock_fd = lock_name[i].fd;
193 break;
194 }
195 }
196 if (i >= LOCK_MAX_SIZE)
197 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800198 LOGE(GSW_PM,"mbtk_wakelock_lock not create.\n");
lichengzhang8e641c72025-07-21 14:32:21 +0800199 ret = GSW_HAL_NORMAL_FAIL;
200 goto enter_sleep_end;
b.liu68a94c92025-05-24 12:53:41 +0800201 }
202
203 mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");
204 ret = mbtk_wakelock_unlock(lock_fd);
205 if(ret < 0)
206 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800207 LOGE(GSW_PM,"mbtk_wakelock_unlock FAIL.\n");
lichengzhang8e641c72025-07-21 14:32:21 +0800208 ret = GSW_HAL_NORMAL_FAIL;
209 goto enter_sleep_end;
b.liu68a94c92025-05-24 12:53:41 +0800210 }
b.liu68a94c92025-05-24 12:53:41 +0800211 mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");
212 ret = mbtk_wakelock_destroy(lock_fd);
213 if(ret < 0)
214 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800215 LOGE(GSW_PM,"mbtk_wakelock_destroy FAIL.\n");
lichengzhang8e641c72025-07-21 14:32:21 +0800216 ret = GSW_HAL_NORMAL_FAIL;
217 goto enter_sleep_end;
b.liu68a94c92025-05-24 12:53:41 +0800218 }
219 if (lock_name[i].name != NULL)
220 {
221 free(lock_name[i].name);
222 lock_name[i].name = NULL;
223 lock_name[i].fd = -1;
224 }
lichengzhang8e641c72025-07-21 14:32:21 +0800225 ret = GSW_HAL_SUCCESS;
226enter_sleep_end:
227 pthread_mutex_unlock(&pm_lock);
228 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800229}
230
231/**
232* @brief Creat wakeup lock
233* @param [in]int32_t wakeup_in
234* @retval int
235*/
236int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)
237{
238 int ret;
239 int i;
240 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700241 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800242 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700243 return GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800244 pthread_mutex_lock(&pm_lock);
b.liu68a94c92025-05-24 12:53:41 +0800245 mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");
246 lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));
247 if(lock_fd < 0)
248 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800249 LOGE(GSW_PM,"mbtk_wakelock_create FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700250 ret = GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800251 goto exit_sleep_end;
b.liu68a94c92025-05-24 12:53:41 +0800252 }
253 mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");
254
255 ret = mbtk_wakelock_lock(lock_fd);
256 if(ret < 0)
257 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800258 LOGE(GSW_PM,"mbtk_wakelock_lock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700259 ret = GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800260 goto exit_sleep_end;
b.liu68a94c92025-05-24 12:53:41 +0800261 }
262 for(i=0 ;i<LOCK_MAX_SIZE;i++)
263 {
264 if(lock_name[i].name == NULL)
265 break;
266 }
hong.liucd370792025-05-28 06:29:19 -0700267 if(i == LOCK_MAX_SIZE)
268 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800269 LOGE(GSW_PM,"mbtk_wakelock_lock not space FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700270 ret = GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800271 goto exit_sleep_end;
hong.liucd370792025-05-28 06:29:19 -0700272 }
b.liu68a94c92025-05-24 12:53:41 +0800273 lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);
274 if (lock_name[i].name == NULL)
275 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800276 LOGE(GSW_PM,"mbtk_wakelock_lock remeber FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700277 ret = GSW_HAL_NORMAL_FAIL;
lichengzhang8e641c72025-07-21 14:32:21 +0800278 goto exit_sleep_end;
b.liu68a94c92025-05-24 12:53:41 +0800279 }
280 memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);
281 lock_name[i].fd = lock_fd;
hong.liucd370792025-05-28 06:29:19 -0700282 ret = GSW_HAL_SUCCESS;
lichengzhang8e641c72025-07-21 14:32:21 +0800283exit_sleep_end:
284 pthread_mutex_unlock(&pm_lock);
hong.liucd370792025-05-28 06:29:19 -0700285 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800286}
287
288/**
289* @brief Module log disk drop, used when restarting or hibernating
290* @param [in]void
291* @retval void
292*/
293void gsw_modem_log_sync(void)
294{
295 FILE *fp;
296 char command[256];
297 char buffer[256];
298 int pid = -1;
299 const char *process_name = "mbtk_logd";
300
301 snprintf(command, sizeof(command), "pgrep %s", process_name);
302 fp = popen(command, "r");
303 if (fp == NULL)
304 {
305 perror("error comman");
306 return;
307 }
308
309 if (fgets(buffer, sizeof(buffer), fp) != NULL)
310 {
311 pid = atoi(buffer);
312 }
313 pclose(fp);
314
315 if (pid != -1)
316 {
317 if (kill(pid, SIGTERM) == -1)
318 {
319 perror("send SIGTERM signal failed");
320 return;
321 }
322 }
323 return;
hong.liud2417072025-06-27 07:10:37 -0700324}
rx.xiee12806a2025-07-16 06:17:08 -0700325
326/**
327* @brief get Modem reset reason
328* @param [in]int32_t * reset_reason
329* @retval void
330*/
331int32_t gsw_get_modem_reset_reason(int32_t *reset_reason)
332{
333 char buf[8] = {0};
334 int value = -1;
335 FILE *fp = popen(MBTK_REBOOT_REASON, "r");
336 if(NULL == fp)
337 {
338 return GSW_HAL_NORMAL_FAIL;
339 }
340 memset(buf,0,sizeof(buf));
341 if(fgets(buf, sizeof(buf), fp) == NULL)
342 {
343 pclose(fp);
344 perror("fgets failed:");
345 return GSW_HAL_NORMAL_FAIL;
346 }
347 pclose(fp);
348 value = atoi(buf);
349
350 if (value >= 0 && value <= 6)
351 {
352 *reset_reason = (int32_t)value;
353 return GSW_HAL_SUCCESS;
354 }
355 return GSW_HAL_NORMAL_FAIL;
356}
357
358
hong.liud2417072025-06-27 07:10:37 -0700359/**
360 * @brief enable autosleep
361 * @return int : 0 is success , other failed
362 */
363int gswAutoSleepEnable(void)
364{
365 return gsw_autosleep_enable();
366}
367
368/**
369 * @brief disenable autosleep
370 * @return int : 0 is success , other failed
371 */
372int gswAutoSleepDisable(void)
373{
374 return gsw_autosleep_disenable();
375}
376
377/**
378 * @brief modem relase wakeuplock
379 * @return void
380 */
381void gswPMStartSleep(void)
382{
383 gsw_pm_enter_sleep(GSW_WAKELOCK_NAME);
384}
385
386/**
387 * @brief modem add wakeuplock
388 * @return int : 0 is success , other failed
389 */
390int gswPMStopSleep(void)
391{
392 return gsw_pm_exit_sleep(GSW_WAKELOCK_NAME);
393}
394
395int gswPmSDKInit(gsw_pm_wakeup_handler gswPmCallBack)
396{
397 return gsw_pm_sdk_init(gswPmCallBack);
398}