blob: 2b1ef316166b3f1d39425f7fa668d25dc9b59b17 [file] [log] [blame]
b.liu4e243dc2023-11-27 11:20:00 +08001#include "lynq-qser-autosuspend.h"
r.xiaoec113d12024-01-12 02:13:28 -08002
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
b.liu4e243dc2023-11-27 11:20:00 +080010#include "mbtk_type.h"
r.xiaoec113d12024-01-12 02:13:28 -080011#include "mbtk_log.h"
12#include "mbtk_info_api.h"
13
14/*
15该模块是系统睡眠,锁存在的时候系统无法休眠
16验证是否在睡眠状态,则需要测试功耗
17电源管理原则,只要有一个wakelock锁存在,系统就不会进入Suspend状态
18所以名字可以随便取,表示需要这样的一个锁,所以系统就不会进行睡眠
19*/
20#define MTBK_POWERIND "/system/etc/powerind" //1806
21//#define MTBK_POWERIND "/etc/powerind" //1803
22
23static bool call_Off = FALSE;
24static bool nw_off = FALSE;
25static bool sms_off = FALSE;
26static bool data_off = FALSE;
27
28
29static int powerrind_get()
30{
31 char buffer[50];
32 int ret = 0;
33
34 int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
35 if (fd != -1)
36 {
37 read(fd, buffer, strlen(buffer)+1);
38 close(fd);
39 }
40
41 ret = atoi(buffer);
42
43 return ret;
44}
45
46
47
48typedef struct
49{
50 int fd;
51 char name[128];
52} lock_name;
53
54lock_name lynq_lock_name[512]={0};
55static bool autosleep_enable = FALSE;
56
57static mbtk_info_handle_t* whitelist_info_handle = NULL;
58
59
b.liu5fa9e772023-11-23 18:00:55 +080060
61int qser_autosuspend_enable(char enable)
62{
r.xiaoec113d12024-01-12 02:13:28 -080063 //UNUSED(enable);
64
65 if(enable == 1)
66 {
67 if(!access("/sys/power/autosleep", W_OK))
68 {
69 system("echo mem > /sys/power/autosleep");
70 autosleep_enable = TRUE;
71 return 0;
72 }
73 else
74 {
75 LOGE("/sys/power/autosleep can not write.");
76 return -1;
77 }
78 }
79 else
80 {
81 if(!access("/sys/power/autosleep", W_OK))
82 {
83 system("echo off > /sys/power/autosleep");
84 autosleep_enable = FALSE;
85 return 0;
86 }
87 else
88 {
89 LOGE("/sys/power/autosleep can not write.");
90 return -1;
91 }
92 }
b.liu5fa9e772023-11-23 18:00:55 +080093
94 return 0;
95}
96
97int qser_wakelock_create(const char* name , size_t len)
98{
r.xiaoec113d12024-01-12 02:13:28 -080099 //UNUSED(name);
100 //UNUSED(len);
101
102 if(!autosleep_enable) {
103 LOGE("Autosleep not enable.");
104 return -1;
105 }
106
107 if(name != NULL && len < 127)
108 {
109 int i;
110 for(i=0;i<512;i++)
111 {
112 if(lynq_lock_name[i].fd == 0)
113 break;
114 }
115 memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
116 lynq_lock_name[i].fd = i;
117 return lynq_lock_name[i].fd;
118 }
119 else
120 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800121
122 return 0;
123}
124
125int qser_wakelock_lock(int fd)
126{
r.xiaoec113d12024-01-12 02:13:28 -0800127 //UNUSED(fd);
128
129 if(!autosleep_enable) {
130 LOGE("Autosleep not enable.");
131 return -1;
132 }
133
134 int i;
135 for(i=0;i<512;i++)
136 {
137 if(lynq_lock_name[i].fd == fd)
138 break;
139 }
140 if(i == 512)
141 return -1;
142
143 if(!access("/sys/power/wake_lock", W_OK))
144 {
145 char cmd[128]={0};
146 sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
147 system(cmd);
148 return 0;
149 }
150 else
151 {
152 printf("/sys/power/wake_lock can not write.");
153 return -1;
154 }
b.liu5fa9e772023-11-23 18:00:55 +0800155
156 return 0;
157}
158
159int qser_wakelock_unlock(int fd)
160{
r.xiaoec113d12024-01-12 02:13:28 -0800161 //UNUSED(fd);
162
163 if(!autosleep_enable) {
164 LOGE("Autosleep not enable.");
165 return -1;
166 }
167
168 int i;
169 for(i=0;i<512;i++)
170 {
171 if(lynq_lock_name[i].fd == fd)
172 break;
173 }
174 if(i == 512)
175 return -1;
176
177 if(!access("/sys/power/wake_unlock", W_OK))
178 {
179 char cmd[128]={0};
180 sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
181 system(cmd);
182 return 0;
183 }
184 else
185 {
186 printf("/sys/power/wake_unlock can not write.");
187 return -1;
188 }
b.liu5fa9e772023-11-23 18:00:55 +0800189
190 return 0;
191}
192
193int qser_wakelock_destroy(int fd)
194{
r.xiaoec113d12024-01-12 02:13:28 -0800195 //UNUSED(fd);
196
197 if(!autosleep_enable) {
198 LOGE("Autosleep not enable.");
199 return -1;
200 }
201
202 int i;
203 for(i=0;i<512;i++)
204 {
205 if(lynq_lock_name[i].fd == fd)
206 break;
207 }
208 if(i == 512)
209 return -1;
210 else
211 {
212 lynq_lock_name[i].fd = 0;
213 memset(lynq_lock_name[i].name, 0, 128);
214 return 0;
215 }
b.liu5fa9e772023-11-23 18:00:55 +0800216
217 return 0;
218}
219
220
r.xiaoec113d12024-01-12 02:13:28 -0800221int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
222{
223 UNUSED(qser_lpm_handler);
224 UNUSED(qser_lpm_cfg);
225
226 //pthread_mutex_init();
227
228
229
230 return 0;
231}
232
233int qser_lpm_deinit(void)
234{
235
236 return 0;
237}
238
239/*
240例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
241其中PS DATA目前暂时不支持,只是保留了这个标志位;
242AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
2430 means resume all.
244目标文件"/system/etc/powerind"
245如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
246
247
248白名单的状态由四位数字组成,第一位代表是否屏蔽电话唤醒,第二
249位代表是否屏蔽网络注册状态唤醒,第三位代表是否屏蔽数据业务唤
250醒,第四位代表是否屏蔽短信唤醒。其中 1 代表屏蔽,其他不会屏
251蔽。
252第一位:1:打开电话唤醒,其他:屏蔽电话唤醒
253第二位:1:打开网络注册状态唤醒,其他:屏蔽网络注册状态唤醒
254第三位:1:打开数据业务唤醒,其他:屏蔽数据业务唤醒
255第四位:1:打开短信唤醒,其他屏蔽短信唤醒
256当四位都不为 1 时(比如默认的状态:0000),则代表白名单为空,
257所有唤醒都不会屏蔽。
258
259从左往右判断
260
261*/
262
263int qser_whitelist_set(char* whitelish)
264{
265 //UNUSED(whitelish);
266 uint32 on = 0;
267 int call_t, nw_t, data_t, sms_t, tmp;
268
269 int len = strlen(whitelish);
270
271 if (len != 4)
272 {
273 printf("whitelish num error.\n");
274 }
275
276 tmp = atoi(whitelish);
277
278 call_t = tmp/1000;
279 nw_t = tmp%1000/100;
280 data_t = tmp%1000%100/10;
281 sms_t = tmp%1000%100%10;
282
283 if (call_t == 1)
284 call_Off = TRUE;
285 else
286 call_Off = FALSE;
287
288 if (nw_t == 1)
289 nw_off = TRUE;
290 else
291 nw_off = FALSE;
292
293 if (data_t == 1)
294 data_off = TRUE;
295 else
296 data_off = FALSE;
297
298 if (sms_t == 1)
299 sms_off = TRUE;
300 else
301 sms_off = FALSE;
302
303 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
304 {
305 on = 2;//0000的情况,所有上报源都不屏蔽,SIM的上报会一直被包含在内
306 }
307 else
308 {
309 if (call_Off == TRUE)
310 call_t = 8;
311 else
312 call_t = 0;
313
314 if (nw_off == TRUE)
315 nw_t = 1;
316 else
317 nw_t = 0;
318
319 if (data_off == TRUE)
320 data_t = 16;
321 else
322 data_t = 0;
323
324 if (sms_off == TRUE)
325 sms_t = 4;
326 else
327 sms_t = 0;
328
329 on = 31 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
330 }
331
332 if(whitelist_info_handle == NULL)
333 {
334 whitelist_info_handle = mbtk_info_handle_get();
335 if(whitelist_info_handle)
336 {
337 printf("creat whitelist_info_handle is success\n");
338 }
339 else
340 {
341 printf("creat whitelist_info_handle is fail\n");
342 return -1;
343 }
344 }
345
346 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
347 if(err)
348 {
349 printf("Error : %d\n", err);
350 return -1;
351 }
352 else
353 {
354 printf("wakeup set success.\n");
355 }
356
357
358 return 0;
359}
360
361
362int qser_whitelist_get(char* whitelish)
363{
364 //UNUSED(whitelish);
365 char *list = NULL;
366 int call_t, nw_t, data_t, sms_t;
367
368 if (call_Off == TRUE)
369 call_t = 1;
370 else
371 call_t = 0;
372
373 if (nw_off == TRUE)
374 nw_t = 1;
375 else
376 nw_t = 0;
377
378 if (data_off == TRUE)
379 data_t = 1;
380 else
381 data_t = 0;
382
383 if (sms_off == TRUE)
384 sms_t = 1;
385 else
386 sms_t = 0;
387
388 sprintf(list,"%d%d%d%d\n",call_t, nw_t, data_t, sms_t);
389 printf(">>>whitelist: %s\n",list);
390 whitelish = list;
391
392 if(whitelist_info_handle != NULL)
393 {
394 mbtk_info_handle_free(&whitelist_info_handle);
395 printf("deinit whitelist_info_handle is succuess\n");
396 }
397
398 return 0;
399}
400
b.liu5fa9e772023-11-23 18:00:55 +0800401