blob: 6ae159ef812d1ef4b10f4fcccccd515c18644874 [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
r.xiao72f92372024-10-28 04:00:43 -070011static mbtk_lock_name_s mbtk_lock_name[LOCK_MAX_SIZE]={0};
r.xiao27072552024-10-24 01:02:48 -070012
liuyang34770f82024-11-14 17:26:24 +080013#define EPOLL_SIZE_HINT 128
14int mEpollFd = -1;
15mbtk_info_callback_func g_sleep_timer_cb;
16int g_sleep_timer_fd = 0;
17
r.xiao27072552024-10-24 01:02:48 -070018
19int mbtk_autosuspend_enable(char enable)
20{
21 if((enable == 1) || enable == '1')
22 {
23 if(!access("/sys/power/autosleep", W_OK))
24 {
b.liu9e8584b2024-11-06 19:21:28 +080025 mbtk_system("echo mem > /sys/power/autosleep");
r.xiao27072552024-10-24 01:02:48 -070026 autosleep_enable = TRUE;
27 return 0;
28 }
29 else
30 {
31 LOGE("/sys/power/autosleep can not write.");
32 return -1;
33 }
34 }
35 else if((enable == 0) || enable == '0')
36 {
37 if(!access("/sys/power/autosleep", W_OK))
38 {
b.liu9e8584b2024-11-06 19:21:28 +080039 mbtk_system("echo off > /sys/power/autosleep");
r.xiao27072552024-10-24 01:02:48 -070040 autosleep_enable = FALSE;
41 return 0;
42 }
43 else
44 {
45 LOGE("/sys/power/autosleep can not write.");
46 return -1;
47 }
48 }
49 else
50 {
51 LOGE("qser_autosuspend_enablecan enable err.");
52 return -1;
53 }
54
55 return 0;
56}
57
58int mbtk_wakelock_create(const char* name , size_t len)
59{
60 int len_t;
61
62 len_t = strlen(name);
63
64 if((name != NULL) && (len < 33) && (len_t < 33))
65 {
66 int i;
67 for(i=1 ;i<LOCK_MAX_SIZE;i++)
68 {
69 if(strcmp(mbtk_lock_name[i].name, name) == 0)
70 {
71 LOGE("Repeated names.");
72 return -1;
73 }
74 }
75
76 for(i=1 ;i<LOCK_MAX_SIZE;i++)
77 {
78 if(mbtk_lock_name[i].fd == 0)
79 break;
80 }
b.liu9e8584b2024-11-06 19:21:28 +080081
r.xiao27072552024-10-24 01:02:48 -070082 if (i >= LOCK_MAX_SIZE)
83 {
84 LOGE("Fd is full.");
85 return -1;
86 }
87
88 memcpy(mbtk_lock_name[i].name, name, strlen(name)+1);
89 mbtk_lock_name[i].fd = i;
90 return mbtk_lock_name[i].fd -1;//Starting from scratch
91 }
92 else
93 return -1;
94
95 return -1;
96}
97
98int mbtk_wakelock_lock(int fd)
99{
100 int i;
101 for(i=1;i<LOCK_MAX_SIZE;i++)
102 {
103 if(mbtk_lock_name[i].fd -1 == fd)
104 break;
105 }
106 if(i == LOCK_MAX_SIZE)
107 {
108 LOGE("LOCK_MAX_SIZE is full\n");
109 return -1;
110 }
111
112 if(!access("/sys/power/wake_lock", W_OK))
113 {
114 char cmd[128]={0};
115 sprintf(cmd, "echo %s > /sys/power/wake_lock", mbtk_lock_name[i].name);
b.liu9e8584b2024-11-06 19:21:28 +0800116 mbtk_system(cmd);
r.xiao27072552024-10-24 01:02:48 -0700117 return 0;
118 }
119 else
120 {
121 LOGE("/sys/power/wake_lock can not write.");
122 return -1;
123 }
124
125 return 0;
126}
127
128int mbtk_wakelock_unlock(int fd)
129{
130 int i;
131 for(i=1;i<LOCK_MAX_SIZE;i++)
132 {
133 if(mbtk_lock_name[i].fd -1 == fd)
134 break;
135 }
136 if(i == LOCK_MAX_SIZE)
137 {
138 LOGE("LOCK_MAX_SIZE is full\n");
139 return -1;
140 }
141
142 if(!access("/sys/power/wake_unlock", W_OK))
143 {
144 char cmd[128]={0};
145 sprintf(cmd, "echo %s > /sys/power/wake_unlock", mbtk_lock_name[i].name);
b.liu9e8584b2024-11-06 19:21:28 +0800146 mbtk_system(cmd);
r.xiao27072552024-10-24 01:02:48 -0700147 return 0;
148 }
149 else
150 {
151 LOGE("/sys/power/wake_unlock can not write.");
152 return -1;
153 }
154
155 return 0;
156}
157
158int mbtk_wakelock_destroy(int fd)
159{
160 int i;
161 for(i=1;i<LOCK_MAX_SIZE;i++)
162 {
163 if(mbtk_lock_name[i].fd -1 == fd)
164 break;
165 }
166
167 if(i == LOCK_MAX_SIZE)
168 {
169 LOGE("LOCK_MAX_SIZE is full\n");
170 return -1;
171 }
172 else
173 {
174 mbtk_lock_name[i].fd = 0;
175 memset(mbtk_lock_name[i].name, 0, 64);
176 return 0;
177 }
178
179 return 0;
180}
181
liuyang34770f82024-11-14 17:26:24 +0800182static void* suspend_timer_thread_run(void* arg)
183{
184 struct epoll_event eventItems[EPOLL_SIZE_HINT];
185 int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_SIZE_HINT, -1);
186
187 int timerFd = -1;
188 int eventIndex = 0;
189 uint64_t readCounter;
190
191 if (eventCount < 0) {
192 LOGE("Poll failed with an unexpected error: %s\n", strerror(errno));
193 return (void*)-1;
194 }
195
196 for (; eventIndex < eventCount; ++eventIndex) {
197 timerFd = eventItems[eventIndex].data.fd;
198
199 int retRead = read(timerFd, &readCounter, sizeof(uint64_t));
200 if (retRead < 0) {
201 LOGE("read %d failed...\n", timerFd);
202
203 continue;
204 } else {
205
206 g_sleep_timer_cb(NULL, 0);
207 mbtk_autosuspend_enable(0);
208 g_sleep_timer_fd = 0;
209 LOGI("suspend_timer_success\n");
210 }
211 }
212
213 return 0;
214}
215
216
217
218static int suspend_timer_timer_init(void)
219{
220 pthread_attr_t thread_attr;
221 pthread_t net_led_thread_id;
222 pthread_attr_init(&thread_attr);
223 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
224 {
225 LOGE("[suspend] pthread_attr_setdetachstate() fail.");
226 return -1;
227 }
228
229 if(pthread_create(&net_led_thread_id, &thread_attr, suspend_timer_thread_run, NULL))
230 {
231 LOGE("[suspend] pthread_create() fail.");
232 return -1;
233 }
234
235 pthread_attr_destroy(&thread_attr);
236 return 0;
237}
238
239
240int mbtk_suspend_timer_set(int time, mbtk_info_callback_func cb)
241{
242 if(0 < g_sleep_timer_fd)
243 {
244 LOGE("suspend timer has been init");
245 return -1;
246 }
247 mEpollFd = epoll_create(EPOLL_SIZE_HINT);
248
249 g_sleep_timer_fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
250 if (g_sleep_timer_fd < 0) {
251 LOGE("Could not create timer fd: %s\n", strerror(errno));
252 return 0;
253 }
254
255 struct itimerspec timerSet;
256 timerSet.it_interval.tv_sec = 0;
257 timerSet.it_interval.tv_nsec = 0;
258 timerSet.it_value.tv_sec = time;
259 timerSet.it_value.tv_nsec = 0;
260 if (timerfd_settime(g_sleep_timer_fd, 0, &timerSet, NULL) != 0) {
261 LOGE("timerfd_settime failed: %s\n", strerror(errno));
262 close(g_sleep_timer_fd);
263 return 0;
264 }
265
266 struct epoll_event eventItem;
267 memset(&eventItem, 0, sizeof(eventItem));
268 eventItem.events = EPOLLIN | EPOLLET;
269 eventItem.data.fd = g_sleep_timer_fd;
270 int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, g_sleep_timer_fd, &eventItem);
271 if (result != 0) {
272 LOGE("Could not add timer fd(%d) to epoll instance: %s\n", g_sleep_timer_fd, strerror(errno));
273 }
274
275 mbtk_autosuspend_enable(1);
276 g_sleep_timer_cb = cb;
277 suspend_timer_timer_init();
278
279
280 return 0;
281}
282
283
r.xiao27072552024-10-24 01:02:48 -0700284
285