blob: 0741ab5ad1499de672b6ca36a6b9ea7a717552de [file] [log] [blame]
liuyang9d62ff72024-09-24 16:49:49 +08001#include "lynq-qser-autosuspend.h"
2
3#include <stdio.h>
4#include <unistd.h>
5#include <stddef.h>
6#include <sys/types.h>
7#include <sys/stat.h>
8#include <fcntl.h>
9#include <pthread.h>
10#include <string.h>
11#include <stdlib.h>
12#include <errno.h>
13#include <sys/epoll.h>
14#include <linux/input.h>
15
16#include "mbtk_type.h"
17#include "mbtk_log.h"
18#include "mbtk_info_api.h"
19#include "mbtk_power.h"
20
21/*
22This module is system sleep, the system cannot sleep when the lock exists
23To verify whether it is in sleep state, it is necessary to test the power consumption
24Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state
25So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep
26*/
27#if defined(MBTK_PLATFORM_KERNEL_5)
28#define MTBK_POWERIND "/system/etc/powerind" //1806
29#elif defined(MBTK_PLATFORM_KERNEL_3)
30#define MTBK_POWERIND "/etc/powerind" //1803
31#endif
32
33static bool call_Off = FALSE;
34static bool nw_off = FALSE;
35static bool sms_off = FALSE;
36static bool data_off = FALSE;
37
38static pthread_t lpm_t;
39static int edge_t = 0;
40static int epoll_fd_t = -1;
41static int fd_t = -1;
42static int socket_t[2];
43
44typedef struct{
45 qser_lpm_wakeupin_data_t wakeupin;
46 qser_lpm_wakeupout_data_t wakeupout;
47 qser_lpm_Handler_t wakehandle;
48}lynq_wake_t;
49
50static lynq_wake_t lpm_init;
51
52
53typedef struct
54{
55 int fd;
56 char name[64];
57} lock_name;
58
59#define LOCK_MAX_SIZE 129
60
61lock_name lynq_lock_name[LOCK_MAX_SIZE]={0};
62static bool autosleep_enable = FALSE;
63
64static mbtk_info_handle_t* whitelist_info_handle = NULL;
65
66
67#define EPOLL_SIZE_HINT 128
68int mEpollFd = -1;
69mbtk_info_callback_func g_sleep_timer_cb;
70
71
72
73static int powerrind_get()
74{
75 char buffer[4];
76 int ret = 0;
77
78 int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
79 if (fd != -1)
80 {
81 read(fd, buffer, strlen(buffer)+1);
82 close(fd);
83 }
84
85 ret = atoi(buffer);
86
87 return ret;
88}
89
90#if 1
91static int sleep_epoll_deregister(int epoll_fd,int fd )
92{
93 int ret;
94 do {
95 ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
96 } while (ret < 0 && errno == EINTR);
97 return ret;
98}
99
100static int sleep_epoll_register(int epoll_fd, int fd)
101{
102 struct epoll_event ev;
103 int ret, flags;
104
105 /* important: make the fd non-blocking */
106 flags = fcntl(fd, F_GETFL);
107 fcntl(fd, F_SETFL, flags | O_NONBLOCK);
108
109 ev.events = EPOLLIN;
110 ev.data.fd = fd;
111 do {
112 ret = epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &ev );
113 } while (ret < 0 && errno == EINTR);
114
115 return ret;
116}
117#endif
118
119int qser_autosuspend_enable(char enable)
120{
121 //UNUSED(enable);
122
123 if((enable == 1) || enable == '1')
124 {
125 //if(!mbtk_system_sleep())
126 if(!access("/sys/power/autosleep", W_OK))
127 {
128 system("echo mem > /sys/power/autosleep");
129 autosleep_enable = TRUE;
130 return 0;
131 }
132 else
133 {
134 LOGE("/sys/power/autosleep can not write.");
135 return -1;
136 }
137 }
138 else if((enable == 0) || enable == '0')
139 {
140 if(!access("/sys/power/autosleep", W_OK))
141 {
142 system("echo off > /sys/power/autosleep");
143 autosleep_enable = FALSE;
144 return 0;
145 }
146 else
147 {
148 LOGE("/sys/power/autosleep can not write.");
149 return -1;
150 }
151 }
152 else
153 {
154 LOGE("qser_autosuspend_enablecan enable err.");
155 return -1;
156 }
157
158 return 0;
159}
160
161int qser_wakelock_create(const char* name , size_t len)
162{
163 //UNUSED(name);
164 //UNUSED(len);
165 int len_t;
166/*
167 if(!autosleep_enable) {
168 LOGE("Autosleep not enable.");
169 return -1;
170 }
171*/
172 len_t = strlen(name);
173
174 if((name != NULL) && (len < 33) && (len_t < 33))
175 {
176 int i;
177 //name
178 for(i=1 ;i<LOCK_MAX_SIZE;i++)
179 {
180 if(strcmp(lynq_lock_name[i].name, name) == 0)
181 {
182 LOGE("Repeated names.");
183 return -1;
184 }
185 }
186
187 for(i=1 ;i<LOCK_MAX_SIZE;i++)
188 {
189 if(lynq_lock_name[i].fd == 0)
190 break;
191 }
192
193 if (i >= LOCK_MAX_SIZE)
194 {
195 LOGE("Fd is full.");
196 return -1;
197 }
198
199 memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
200 lynq_lock_name[i].fd = i;
201 return lynq_lock_name[i].fd -1;//Starting from scratch
202 }
203 else
204 return -1;
205
206 return -1;
207}
208
209int qser_wakelock_lock(int fd)
210{
211 //UNUSED(fd);
212/*
213 if(!autosleep_enable) {
214 LOGE("Autosleep not enable.");
215 return -1;
216 }
217*/
218 int i;
219 for(i=1;i<LOCK_MAX_SIZE;i++)
220 {
221 if(lynq_lock_name[i].fd -1 == fd)
222 break;
223 }
224 if(i == LOCK_MAX_SIZE)
225 {
226 LOGE("LOCK_MAX_SIZE is full\n");
227 return -1;
228 }
229
230 if(!access("/sys/power/wake_lock", W_OK))
231 {
232 char cmd[128]={0};
233 sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
234 system(cmd);
235 return 0;
236 }
237 else
238 {
239 LOGE("/sys/power/wake_lock can not write.");
240 return -1;
241 }
242
243 return 0;
244}
245
246int qser_wakelock_unlock(int fd)
247{
248 //UNUSED(fd);
249/*
250 if(!autosleep_enable) {
251 LOGE("Autosleep not enable.");
252 return -1;
253 }
254*/
255 int i;
256 for(i=1;i<LOCK_MAX_SIZE;i++)
257 {
258 if(lynq_lock_name[i].fd -1 == fd)
259 break;
260 }
261 if(i == LOCK_MAX_SIZE)
262 {
263 LOGE("LOCK_MAX_SIZE is full\n");
264 return -1;
265 }
266
267 if(!access("/sys/power/wake_unlock", W_OK))
268 {
269 char cmd[128]={0};
270 sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
271 system(cmd);
272 return 0;
273 }
274 else
275 {
276 LOGE("/sys/power/wake_unlock can not write.");
277 return -1;
278 }
279
280 return 0;
281}
282
283int qser_wakelock_destroy(int fd)
284{
285 //UNUSED(fd);
286/*
287 if(!autosleep_enable) {
288 LOGE("Autosleep not enable.");
289 return -1;
290 }
291*/
292 int i;
293 for(i=1;i<LOCK_MAX_SIZE;i++)
294 {
295 if(lynq_lock_name[i].fd -1 == fd)
296 break;
297 }
298
299 if(i == LOCK_MAX_SIZE)
300 {
301 LOGE("LOCK_MAX_SIZE is full\n");
302 return -1;
303 }
304 else
305 {
306 lynq_lock_name[i].fd = 0;
307 memset(lynq_lock_name[i].name, 0, 64);
308 return 0;
309 }
310
311 return 0;
312}
313
314void *threadFunction(void *arg)
315{
316 int pinValue;
317 int i;
318 char buf[8] = {0};
319 struct input_event ev_input = { 0 };
320 const int size = sizeof(struct input_event);
321
322 epoll_fd_t = epoll_create(2);
323/*
324 struct epoll_event event;
325 memset(&event, 0, sizeof(struct epoll_event));
326 event.events = EPOLLIN | EPOLLET;
327 event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
328
329 fd_t = event.data.fd;
330 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
331 {
332 LOGE("Failed to add GPIO device file.");
333 return NULL;
334 }
335
336 memset(&event, 0, sizeof(struct epoll_event));
337 event.events = EPOLLIN | EPOLLET;
338 event.data.fd = socket_t[0];
339 LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
340
341 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
342 {
343 LOGE("Failed to add GPIO device file.");
344 return NULL;
345 }
346*/
347
348#if defined(MBTK_SG_SUPPORT)
349 fd_t = open("/dev/input/event1", O_RDONLY);
350 LOGI("init pthread_event1");
351#else
352 fd_t = open("/dev/input/event2", O_RDONLY);
353 LOGI("init pthread_event2");
354#endif
355
356 sleep_epoll_register(epoll_fd_t, fd_t);
357 sleep_epoll_register(epoll_fd_t, socket_t[1]);
358
359 while (true)
360 {
361 struct epoll_event events[2];
362 struct epoll_event ev;
363 int cmd = 0;
364
365 int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
366
367 for (i = 0; i < numEvents; ++i)
368 {
369 if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
370 {
371 LOGE("Error on GPIO device.");
372 return NULL;
373 }
374 else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
375 {
376 //handleInterrupt(events[i].data.fd);
377 if (events[i].data.fd == socket_t[1])
378 {
379 memset(buf, 0, sizeof(buf));
380 read(socket_t[1], buf, sizeof(buf));
381 if (1 == atoi(buf))
382 {
383 if(close(fd_t) == 0)
384 LOGI("close(fd_t)ing");
385
386 sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
387 sleep_epoll_deregister(epoll_fd_t, fd_t);
388 /*
389 memset(&ev, 0, sizeof(struct epoll_event));
390 ev.events = EPOLLIN | EPOLLET;
391 ev.data.fd = socket_t[1];
392 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
393
394 memset(&ev, 0, sizeof(struct epoll_event));
395 ev.events = EPOLLIN | EPOLLET;
396 ev.data.fd = fd_t;
397 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
398 */
399 LOGI("do pthread_exit");
400 return NULL;
401 }
402 }
403 else if (events[i].data.fd == fd_t)
404 {
405 LOGI("go pthread_event");
406 memset(&ev_input, 0x00, size);
407 read(fd_t, &ev_input, size);
408 LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
409#if defined(MBTK_SG_SUPPORT)
410 if (ev_input.code == 2)
411 {
412 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
413 pinValue = (int)ev_input.value;
414 edge_t = pinValue;
415 lpm_init.wakehandle(edge_t);
416 }
417#else
418 if (ev_input.type == 4 && ev_input.code == 3)
419 {
420 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
421 pinValue = (int)ev_input.value;
422 edge_t = pinValue;
423 lpm_init.wakehandle(edge_t);
424 }
425#endif
426
427 }
428 else
429 {
430 LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
431 }
432 }
433 }
434 }
435 return NULL;
436}
437
438int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
439{
440 //UNUSED(qser_lpm_handler);
441 //UNUSED(qser_lpm_cfg);
442 if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
443 {
444 LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
445
446 /*close the control socket pair && Retry again.*/
447 if(socket_t[0] > 0)
448 {
449 close(socket_t[0] );
450 socket_t[0] = -1;
451 }
452
453 if(socket_t[1] > 0)
454 {
455 close(socket_t[1] );
456 socket_t[1] = -1;
457 }
458 return -1;
459 }
460 lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
461 LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
462 lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
463 LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
464 edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
465 lpm_init.wakehandle = qser_lpm_handler;
466
467 pthread_attr_t thread_attr;
468 pthread_attr_init(&thread_attr);
469
470 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
471 {
472 LOGE("pthread_attr_setdetachstate() fail");
473 return -1;
474 }
475
476 if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
477 //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
478 {
479 LOGE("qser_lpm_init can't create thread");
480 return -1;
481 }
482
483 pthread_attr_destroy(&thread_attr);
484
485 //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
486 //qser_lpm_handler(edge_t);
487
488 return 0;
489}
490
491int qser_lpm_deinit(void)
492{
493 char buf[4]={0};
494
495 if (fd_t == -1)
496 return 0;
497
498 if (fd_t != -1)
499 {
500 //char cmd = 1;
501 strcpy(buf, "1");
502 void* dummy = NULL;
503 write( socket_t[0], buf, sizeof(buf) );
504 //pthread_join(lpm_t, &dummy);
505
506 sleep(1);
507 // close the control socket pair
508 if(socket_t[0] > 0)
509 {
510 close(socket_t[0] );
511 socket_t[0] = -1;
512 }
513 if(socket_t[1] > 0)
514 {
515 close(socket_t[1] );
516 socket_t[1] = -1;
517 }
518
519 //重置还原
520 fd_t = -1;
521
522 }
523
524 return 0;
525}
526
527/*
528例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
529其中PS DATA目前暂时不支持,只是保留了这个标志位;
530AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
5310 means resume all.
532目标文件"/system/etc/powerind"
533如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
534
535*/
536
537int qser_whitelist_set(char* whitelish)
538{
539 //UNUSED(whitelish);
540 uint32 on = 0;
541 int call_t, nw_t, data_t, sms_t, tmp;
542
543 int len = strlen(whitelish);
544
545 if (len != 4)
546 {
547 LOGE("whitelish num error num=[%d]",len);
548 return -1;
549 }
550
551 tmp = atoi(whitelish);
552
553 call_t = tmp/1000;
554 nw_t = tmp%1000/100;
555 data_t = tmp%1000%100/10;
556 sms_t = tmp%1000%100%10;
557
558 if (call_t == 1)
559 call_Off = TRUE;
560 else
561 call_Off = FALSE;
562
563 if (nw_t == 1)
564 nw_off = TRUE;
565 else
566 nw_off = FALSE;
567
568 if (data_t == 1)
569 data_off = TRUE;
570 else
571 data_off = FALSE;
572
573 if (sms_t == 1)
574 sms_off = TRUE;
575 else
576 sms_off = FALSE;
577
578 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
579 {
580 on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
581 }
582 else
583 {
584 if (call_Off == TRUE)
585 call_t = 8;
586 else
587 call_t = 0;
588
589 if (nw_off == TRUE)
590 nw_t = 1;
591 else
592 nw_t = 0;
593
594 if (data_off == TRUE)
595 data_t = 16;
596 else
597 data_t = 0;
598
599 if (sms_off == TRUE)
600 sms_t = 4;
601 else
602 sms_t = 0;
603
604 on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
605 }
606
607 if(whitelist_info_handle == NULL)
608 {
609 whitelist_info_handle = mbtk_info_handle_get();
610 if(whitelist_info_handle)
611 {
612 LOGI("creat whitelist_info_handle is success");
613 }
614 else
615 {
616 LOGE("creat whitelist_info_handle is fail");
617 return -1;
618 }
619 }
620
621 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
622 if(err)
623 {
624 LOGE("whitelist_info_handle Error : %d", err);
625 return -1;
626 }
627
628 return 0;
629}
630
631
632int qser_whitelist_get(char* whitelish)
633{
634 //UNUSED(whitelish);
635 char list[10]={0};
636 int call_t, nw_t, data_t, sms_t;
637 int get_tmp;
638
639 get_tmp = powerrind_get();
640 //LOGI(">>>get_tmp: %d",get_tmp);
641
642 //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
643 switch(get_tmp)
644 {
645 case 0:
646 sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
647 break;
648 case 8:
649 sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
650 break;
651 case 1:
652 sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
653 break;
654 case 16:
655 sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
656 break;
657 case 4:
658 sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
659 break;
660
661 case 9:
662 sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
663 break;
664 case 24:
665 sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
666 break;
667 case 12:
668 sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
669 break;
670 case 17:
671 sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
672 break;
673 case 5:
674 sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
675 break;
676 case 20:
677 sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
678 break;
679
680 case 25:
681 sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
682 break;
683 case 13:
684 sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
685 break;
686 case 28:
687 sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
688 break;
689 case 21:
690 sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
691 break;
692
693 case 29:
694 sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
695 break;
696
697 default :
698 LOGE("qser_whitelist_get is error");
699 break;
700 }
701
702 //LOGI(">>>get list: %s",list);
703 strncpy(whitelish, list, strlen(list));
704
705 if(whitelist_info_handle != NULL)
706 {
707 mbtk_info_handle_free(&whitelist_info_handle);
708 LOGI("deinit whitelist_info_handle is succuess");
709 }
710
711 return 0;
712}
713
714static void* suspend_timer_thread_run(void* arg)
r.xiao7000d212024-01-31 23:45:27 -0800715{
liuyang9d62ff72024-09-24 16:49:49 +0800716 struct epoll_event eventItems[EPOLL_SIZE_HINT];
717 int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_SIZE_HINT, -1);
718
719 int timerFd = -1;
720 int eventIndex = 0;
721 uint64_t readCounter;
722
723 if (eventCount < 0) {
724 LOGE("Poll failed with an unexpected error: %s\n", strerror(errno));
725 return -1;
r.xiaoec113d12024-01-12 02:13:28 -0800726 }
liuyang9d62ff72024-09-24 16:49:49 +0800727
728 for (; eventIndex < eventCount; ++eventIndex) {
729 timerFd = eventItems[eventIndex].data.fd;
730
731 int retRead = read(timerFd, &readCounter, sizeof(uint64_t));
732 if (retRead < 0) {
733 LOGE("read %d failed...\n", timerFd);
734
735 continue;
736 } else {
737
738 g_sleep_timer_cb(NULL, 0);
739 qser_autosuspend_enable(0);
740 LOGI("suspend_timer_success\n");
741 }
742 }
r.xiao7000d212024-01-31 23:45:27 -0800743
b.liu5fa9e772023-11-23 18:00:55 +0800744 return 0;
liuyang9d62ff72024-09-24 16:49:49 +0800745}
746
747
748
749int suspend_timer_timer_init(void)
750{
751 int ret = -1;
752
753
754 pthread_attr_t thread_attr;
755 pthread_t net_led_thread_id;
756 pthread_t status_led_thread_id;
757 pthread_attr_init(&thread_attr);
758 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
759 {
760 LOGE("[suspend] pthread_attr_setdetachstate() fail.");
761 return -1;
762 }
763
764 if(pthread_create(&net_led_thread_id, &thread_attr, suspend_timer_thread_run, NULL))
765 {
766 LOGE("[suspend] pthread_create() fail.");
767 return -1;
768 }
769
770 pthread_attr_destroy(&thread_attr);
771 return 0;
772}
773
774
775int qser_suspend_timer_set(int time, mbtk_info_callback_func cb)
776{
777 mEpollFd = epoll_create(EPOLL_SIZE_HINT);
778
779 int fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
780 if (fd < 0) {
781 LOGE("Could not create timer fd: %s\n", strerror(errno));
r.xiaoec113d12024-01-12 02:13:28 -0800782 return 0;
783 }
liuyang9d62ff72024-09-24 16:49:49 +0800784
785 struct itimerspec timerSet;
786 timerSet.it_interval.tv_sec = 0;
787 timerSet.it_interval.tv_nsec = 0;
788 timerSet.it_value.tv_sec = time;
789 timerSet.it_value.tv_nsec = 0;
790 if (timerfd_settime(fd, 0, &timerSet, NULL) != 0) {
791 LOGE("timerfd_settime failed: %s\n", strerror(errno));
792 close(fd);
r.xiaoec113d12024-01-12 02:13:28 -0800793 return 0;
794 }
liuyang9d62ff72024-09-24 16:49:49 +0800795
796 struct epoll_event eventItem;
797 memset(&eventItem, 0, sizeof(eventItem));
798 eventItem.events = EPOLLIN | EPOLLET;
799 eventItem.data.fd = fd;
800 int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
801 if (result != 0) {
802 LOGE("Could not add timer fd(%d) to epoll instance: %s\n", fd, strerror(errno));
r.xiaoec113d12024-01-12 02:13:28 -0800803 }
liuyang9d62ff72024-09-24 16:49:49 +0800804
805 qser_autosuspend_enable(1);
806 g_sleep_timer_cb = cb;
807 suspend_timer_timer_init();
808
809
810 return 0;
811}
812
813