blob: ee28780255defd6fcc471871c5b5888e923906a6 [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
hong.liufa3dc0a2025-06-30 17:30:59 +080024#define SDK_READY_CMD "uci get persist.mbtk.sdk__state"
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;
43
44typedef 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;
b.liu68a94c92025-05-24 12:53:41 +0800159 mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");
160 ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);
161 if(ret < 0)
162 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800163 LOGE(GSW_PM,"mbtk_lpm_init FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700164 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800165 }
166 return GSW_HAL_SUCCESS;
167}
168
169/**
170* @brief Release wake lock, enter sleep
171* @param [in]int32_t wakeup_in
172* @retval int
173*/
174int32_t gsw_pm_enter_sleep(const char *gsw_wakelock_name)
175{
176 int ret;
177 int i;
178 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700179 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800180 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700181 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800182 for(i=0 ;i<LOCK_MAX_SIZE;i++)
183 {
184 if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)
185 {
186 lock_fd = lock_name[i].fd;
187 break;
188 }
189 }
190 if (i >= LOCK_MAX_SIZE)
191 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800192 LOGE(GSW_PM,"mbtk_wakelock_lock not create.\n");
hong.liucd370792025-05-28 06:29:19 -0700193 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800194 }
195
196 mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");
197 ret = mbtk_wakelock_unlock(lock_fd);
198 if(ret < 0)
199 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800200 LOGE(GSW_PM,"mbtk_wakelock_unlock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700201 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800202 }
203
204 mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");
205 ret = mbtk_wakelock_destroy(lock_fd);
206 if(ret < 0)
207 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800208 LOGE(GSW_PM,"mbtk_wakelock_destroy FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700209 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800210 }
211 if (lock_name[i].name != NULL)
212 {
213 free(lock_name[i].name);
214 lock_name[i].name = NULL;
215 lock_name[i].fd = -1;
216 }
b.liu68a94c92025-05-24 12:53:41 +0800217 return GSW_HAL_SUCCESS;
218}
219
220/**
221* @brief Creat wakeup lock
222* @param [in]int32_t wakeup_in
223* @retval int
224*/
225int32_t gsw_pm_exit_sleep(const char *gsw_wakelock_name)
226{
227 int ret;
228 int i;
229 if (handle())
hong.liucd370792025-05-28 06:29:19 -0700230 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800231 if (gsw_wakelock_name == NULL)
hong.liucd370792025-05-28 06:29:19 -0700232 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800233 mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");
234 lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));
235 if(lock_fd < 0)
236 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800237 LOGE(GSW_PM,"mbtk_wakelock_create FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700238 ret = GSW_HAL_NORMAL_FAIL;
239 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800240 }
241 mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");
242
243 ret = mbtk_wakelock_lock(lock_fd);
244 if(ret < 0)
245 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800246 LOGE(GSW_PM,"mbtk_wakelock_lock FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700247 ret = GSW_HAL_NORMAL_FAIL;
248 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800249 }
250 for(i=0 ;i<LOCK_MAX_SIZE;i++)
251 {
252 if(lock_name[i].name == NULL)
253 break;
254 }
hong.liucd370792025-05-28 06:29:19 -0700255 if(i == LOCK_MAX_SIZE)
256 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800257 LOGE(GSW_PM,"mbtk_wakelock_lock not space FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700258 ret = GSW_HAL_NORMAL_FAIL;
259 goto end;
260 }
b.liu68a94c92025-05-24 12:53:41 +0800261 lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);
262 if (lock_name[i].name == NULL)
263 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800264 LOGE(GSW_PM,"mbtk_wakelock_lock remeber FAIL.\n");
hong.liucd370792025-05-28 06:29:19 -0700265 ret = GSW_HAL_NORMAL_FAIL;
266 goto end;
b.liu68a94c92025-05-24 12:53:41 +0800267 }
268 memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);
269 lock_name[i].fd = lock_fd;
hong.liucd370792025-05-28 06:29:19 -0700270 ret = GSW_HAL_SUCCESS;
271end:
hong.liucd370792025-05-28 06:29:19 -0700272 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800273}
274
275/**
276* @brief Module log disk drop, used when restarting or hibernating
277* @param [in]void
278* @retval void
279*/
280void gsw_modem_log_sync(void)
281{
282 FILE *fp;
283 char command[256];
284 char buffer[256];
285 int pid = -1;
286 const char *process_name = "mbtk_logd";
287
288 snprintf(command, sizeof(command), "pgrep %s", process_name);
289 fp = popen(command, "r");
290 if (fp == NULL)
291 {
292 perror("error comman");
293 return;
294 }
295
296 if (fgets(buffer, sizeof(buffer), fp) != NULL)
297 {
298 pid = atoi(buffer);
299 }
300 pclose(fp);
301
302 if (pid != -1)
303 {
304 if (kill(pid, SIGTERM) == -1)
305 {
306 perror("send SIGTERM signal failed");
307 return;
308 }
309 }
310 return;
hong.liud2417072025-06-27 07:10:37 -0700311}
rx.xiee12806a2025-07-16 06:17:08 -0700312
313/**
314* @brief get Modem reset reason
315* @param [in]int32_t * reset_reason
316* @retval void
317*/
318int32_t gsw_get_modem_reset_reason(int32_t *reset_reason)
319{
320 char buf[8] = {0};
321 int value = -1;
322 FILE *fp = popen(MBTK_REBOOT_REASON, "r");
323 if(NULL == fp)
324 {
325 return GSW_HAL_NORMAL_FAIL;
326 }
327 memset(buf,0,sizeof(buf));
328 if(fgets(buf, sizeof(buf), fp) == NULL)
329 {
330 pclose(fp);
331 perror("fgets failed:");
332 return GSW_HAL_NORMAL_FAIL;
333 }
334 pclose(fp);
335 value = atoi(buf);
336
337 if (value >= 0 && value <= 6)
338 {
339 *reset_reason = (int32_t)value;
340 return GSW_HAL_SUCCESS;
341 }
342 return GSW_HAL_NORMAL_FAIL;
343}
344
345
hong.liud2417072025-06-27 07:10:37 -0700346/**
347 * @brief enable autosleep
348 * @return int : 0 is success , other failed
349 */
350int gswAutoSleepEnable(void)
351{
352 return gsw_autosleep_enable();
353}
354
355/**
356 * @brief disenable autosleep
357 * @return int : 0 is success , other failed
358 */
359int gswAutoSleepDisable(void)
360{
361 return gsw_autosleep_disenable();
362}
363
364/**
365 * @brief modem relase wakeuplock
366 * @return void
367 */
368void gswPMStartSleep(void)
369{
370 gsw_pm_enter_sleep(GSW_WAKELOCK_NAME);
371}
372
373/**
374 * @brief modem add wakeuplock
375 * @return int : 0 is success , other failed
376 */
377int gswPMStopSleep(void)
378{
379 return gsw_pm_exit_sleep(GSW_WAKELOCK_NAME);
380}
381
382int gswPmSDKInit(gsw_pm_wakeup_handler gswPmCallBack)
383{
384 return gsw_pm_sdk_init(gswPmCallBack);
385}