blob: edb0e80313c6ab00e016fe08d27a45930c81d078 [file] [log] [blame]
liuyang34770f82024-11-14 17:26:24 +08001#include <pthread.h>
2#include <sys/epoll.h>
3#include <sys/timerfd.h>
4
5
6
r.xiao27072552024-10-24 01:02:48 -07007#include "mbtk_sleep.h"
8#include "mbtk_log.h"
b.liu9e8584b2024-11-06 19:21:28 +08009#include "mbtk_utils.h"
r.xiao27072552024-10-24 01:02:48 -070010
b.liuacb8b4a2024-11-19 15:50:11 +080011static bool autosleep_enable = FALSE;
12
r.xiao72f92372024-10-28 04:00:43 -070013static mbtk_lock_name_s mbtk_lock_name[LOCK_MAX_SIZE]={0};
r.xiao27072552024-10-24 01:02:48 -070014
b.liuacb8b4a2024-11-19 15:50:11 +080015#define EPOLL_SIZE_HINT 128
liuyang34770f82024-11-14 17:26:24 +080016int mEpollFd = -1;
17mbtk_info_callback_func g_sleep_timer_cb;
18int g_sleep_timer_fd = 0;
19
r.xiao27072552024-10-24 01:02:48 -070020
21int mbtk_autosuspend_enable(char enable)
22{
23 if((enable == 1) || enable == '1')
24 {
25 if(!access("/sys/power/autosleep", W_OK))
26 {
b.liu9e8584b2024-11-06 19:21:28 +080027 mbtk_system("echo mem > /sys/power/autosleep");
r.xiao27072552024-10-24 01:02:48 -070028 autosleep_enable = TRUE;
29 return 0;
30 }
31 else
32 {
33 LOGE("/sys/power/autosleep can not write.");
34 return -1;
35 }
36 }
37 else if((enable == 0) || enable == '0')
38 {
39 if(!access("/sys/power/autosleep", W_OK))
40 {
b.liu9e8584b2024-11-06 19:21:28 +080041 mbtk_system("echo off > /sys/power/autosleep");
r.xiao27072552024-10-24 01:02:48 -070042 autosleep_enable = FALSE;
43 return 0;
44 }
45 else
46 {
47 LOGE("/sys/power/autosleep can not write.");
48 return -1;
49 }
50 }
51 else
52 {
53 LOGE("qser_autosuspend_enablecan enable err.");
54 return -1;
55 }
56
57 return 0;
58}
59
60int mbtk_wakelock_create(const char* name , size_t len)
61{
62 int len_t;
63
64 len_t = strlen(name);
65
66 if((name != NULL) && (len < 33) && (len_t < 33))
67 {
68 int i;
69 for(i=1 ;i<LOCK_MAX_SIZE;i++)
70 {
71 if(strcmp(mbtk_lock_name[i].name, name) == 0)
72 {
73 LOGE("Repeated names.");
74 return -1;
75 }
76 }
77
78 for(i=1 ;i<LOCK_MAX_SIZE;i++)
79 {
80 if(mbtk_lock_name[i].fd == 0)
81 break;
82 }
b.liu9e8584b2024-11-06 19:21:28 +080083
r.xiao27072552024-10-24 01:02:48 -070084 if (i >= LOCK_MAX_SIZE)
85 {
86 LOGE("Fd is full.");
87 return -1;
88 }
89
90 memcpy(mbtk_lock_name[i].name, name, strlen(name)+1);
91 mbtk_lock_name[i].fd = i;
92 return mbtk_lock_name[i].fd -1;//Starting from scratch
93 }
94 else
95 return -1;
96
97 return -1;
98}
99
100int mbtk_wakelock_lock(int fd)
101{
102 int i;
103 for(i=1;i<LOCK_MAX_SIZE;i++)
104 {
105 if(mbtk_lock_name[i].fd -1 == fd)
106 break;
107 }
108 if(i == LOCK_MAX_SIZE)
109 {
110 LOGE("LOCK_MAX_SIZE is full\n");
111 return -1;
112 }
113
114 if(!access("/sys/power/wake_lock", W_OK))
115 {
116 char cmd[128]={0};
117 sprintf(cmd, "echo %s > /sys/power/wake_lock", mbtk_lock_name[i].name);
b.liu9e8584b2024-11-06 19:21:28 +0800118 mbtk_system(cmd);
r.xiao27072552024-10-24 01:02:48 -0700119 return 0;
120 }
121 else
122 {
123 LOGE("/sys/power/wake_lock can not write.");
124 return -1;
125 }
126
127 return 0;
128}
129
130int mbtk_wakelock_unlock(int fd)
131{
132 int i;
133 for(i=1;i<LOCK_MAX_SIZE;i++)
134 {
135 if(mbtk_lock_name[i].fd -1 == fd)
136 break;
137 }
138 if(i == LOCK_MAX_SIZE)
139 {
140 LOGE("LOCK_MAX_SIZE is full\n");
141 return -1;
142 }
143
144 if(!access("/sys/power/wake_unlock", W_OK))
145 {
146 char cmd[128]={0};
147 sprintf(cmd, "echo %s > /sys/power/wake_unlock", mbtk_lock_name[i].name);
b.liu9e8584b2024-11-06 19:21:28 +0800148 mbtk_system(cmd);
r.xiao27072552024-10-24 01:02:48 -0700149 return 0;
150 }
151 else
152 {
153 LOGE("/sys/power/wake_unlock can not write.");
154 return -1;
155 }
156
157 return 0;
158}
159
160int mbtk_wakelock_destroy(int fd)
161{
162 int i;
163 for(i=1;i<LOCK_MAX_SIZE;i++)
164 {
165 if(mbtk_lock_name[i].fd -1 == fd)
166 break;
167 }
168
169 if(i == LOCK_MAX_SIZE)
170 {
171 LOGE("LOCK_MAX_SIZE is full\n");
172 return -1;
173 }
174 else
175 {
176 mbtk_lock_name[i].fd = 0;
177 memset(mbtk_lock_name[i].name, 0, 64);
178 return 0;
179 }
180
181 return 0;
182}
183
liuyang34770f82024-11-14 17:26:24 +0800184static void* suspend_timer_thread_run(void* arg)
185{
186 struct epoll_event eventItems[EPOLL_SIZE_HINT];
187 int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_SIZE_HINT, -1);
b.liuacb8b4a2024-11-19 15:50:11 +0800188
liuyang34770f82024-11-14 17:26:24 +0800189 int timerFd = -1;
190 int eventIndex = 0;
191 uint64_t readCounter;
b.liuacb8b4a2024-11-19 15:50:11 +0800192
liuyang34770f82024-11-14 17:26:24 +0800193 if (eventCount < 0) {
194 LOGE("Poll failed with an unexpected error: %s\n", strerror(errno));
195 return (void*)-1;
196 }
b.liuacb8b4a2024-11-19 15:50:11 +0800197
liuyang34770f82024-11-14 17:26:24 +0800198 for (; eventIndex < eventCount; ++eventIndex) {
199 timerFd = eventItems[eventIndex].data.fd;
b.liuacb8b4a2024-11-19 15:50:11 +0800200
liuyang34770f82024-11-14 17:26:24 +0800201 int retRead = read(timerFd, &readCounter, sizeof(uint64_t));
202 if (retRead < 0) {
203 LOGE("read %d failed...\n", timerFd);
b.liuacb8b4a2024-11-19 15:50:11 +0800204
liuyang34770f82024-11-14 17:26:24 +0800205 continue;
206 } else {
207
208 g_sleep_timer_cb(NULL, 0);
209 mbtk_autosuspend_enable(0);
210 g_sleep_timer_fd = 0;
211 LOGI("suspend_timer_success\n");
212 }
213 }
b.liuacb8b4a2024-11-19 15:50:11 +0800214
liuyang34770f82024-11-14 17:26:24 +0800215 return 0;
216}
217
218
219
220static int suspend_timer_timer_init(void)
221{
222 pthread_attr_t thread_attr;
223 pthread_t net_led_thread_id;
224 pthread_attr_init(&thread_attr);
225 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
226 {
227 LOGE("[suspend] pthread_attr_setdetachstate() fail.");
228 return -1;
229 }
230
231 if(pthread_create(&net_led_thread_id, &thread_attr, suspend_timer_thread_run, NULL))
232 {
233 LOGE("[suspend] pthread_create() fail.");
234 return -1;
235 }
236
237 pthread_attr_destroy(&thread_attr);
238 return 0;
239}
240
241
242int mbtk_suspend_timer_set(int time, mbtk_info_callback_func cb)
243{
244 if(0 < g_sleep_timer_fd)
245 {
246 LOGE("suspend timer has been init");
247 return -1;
248 }
249 mEpollFd = epoll_create(EPOLL_SIZE_HINT);
b.liuacb8b4a2024-11-19 15:50:11 +0800250
liuyang34770f82024-11-14 17:26:24 +0800251 g_sleep_timer_fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
252 if (g_sleep_timer_fd < 0) {
253 LOGE("Could not create timer fd: %s\n", strerror(errno));
254 return 0;
255 }
b.liuacb8b4a2024-11-19 15:50:11 +0800256
liuyang34770f82024-11-14 17:26:24 +0800257 struct itimerspec timerSet;
258 timerSet.it_interval.tv_sec = 0;
259 timerSet.it_interval.tv_nsec = 0;
260 timerSet.it_value.tv_sec = time;
261 timerSet.it_value.tv_nsec = 0;
262 if (timerfd_settime(g_sleep_timer_fd, 0, &timerSet, NULL) != 0) {
263 LOGE("timerfd_settime failed: %s\n", strerror(errno));
264 close(g_sleep_timer_fd);
265 return 0;
266 }
b.liuacb8b4a2024-11-19 15:50:11 +0800267
liuyang34770f82024-11-14 17:26:24 +0800268 struct epoll_event eventItem;
269 memset(&eventItem, 0, sizeof(eventItem));
270 eventItem.events = EPOLLIN | EPOLLET;
271 eventItem.data.fd = g_sleep_timer_fd;
272 int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, g_sleep_timer_fd, &eventItem);
273 if (result != 0) {
274 LOGE("Could not add timer fd(%d) to epoll instance: %s\n", g_sleep_timer_fd, strerror(errno));
275 }
276
277 mbtk_autosuspend_enable(1);
278 g_sleep_timer_cb = cb;
279 suspend_timer_timer_init();
280
281
282 return 0;
283}
284
285
r.xiao27072552024-10-24 01:02:48 -0700286
287