blob: b7592bd57db3cb50ea26bd0f3b708284ea2721f2 [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>
r.xiaocfd7c682024-01-22 03:59:46 -08009#include <pthread.h>
10#include <string.h>
11
r.xiaoec113d12024-01-12 02:13:28 -080012
b.liu4e243dc2023-11-27 11:20:00 +080013#include "mbtk_type.h"
r.xiaoec113d12024-01-12 02:13:28 -080014#include "mbtk_log.h"
15#include "mbtk_info_api.h"
16
17/*
18该模块是系统睡眠,锁存在的时候系统无法休眠
19验证是否在睡眠状态,则需要测试功耗
20电源管理原则,只要有一个wakelock锁存在,系统就不会进入Suspend状态
21所以名字可以随便取,表示需要这样的一个锁,所以系统就不会进行睡眠
22*/
23#define MTBK_POWERIND "/system/etc/powerind" //1806
24//#define MTBK_POWERIND "/etc/powerind" //1803
25
26static bool call_Off = FALSE;
27static bool nw_off = FALSE;
28static bool sms_off = FALSE;
29static bool data_off = FALSE;
30
r.xiaocfd7c682024-01-22 03:59:46 -080031pthread_t lpm_t;
32static int edge_t = 0;
33
34typedef struct{
35 qser_lpm_wakeupin_data_t wakeupin;
36 qser_lpm_wakeupout_data_t wakeupout;
37}lynq_wake_t;
38
39static lynq_wake_t lpm_init;
40
r.xiaoec113d12024-01-12 02:13:28 -080041
42static int powerrind_get()
43{
44 char buffer[50];
45 int ret = 0;
46
47 int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
48 if (fd != -1)
49 {
50 read(fd, buffer, strlen(buffer)+1);
51 close(fd);
52 }
53
54 ret = atoi(buffer);
55
56 return ret;
57}
58
59
60
61typedef struct
62{
63 int fd;
64 char name[128];
65} lock_name;
66
67lock_name lynq_lock_name[512]={0};
68static bool autosleep_enable = FALSE;
69
70static mbtk_info_handle_t* whitelist_info_handle = NULL;
71
72
b.liu5fa9e772023-11-23 18:00:55 +080073int qser_autosuspend_enable(char enable)
74{
r.xiaoec113d12024-01-12 02:13:28 -080075 //UNUSED(enable);
76
77 if(enable == 1)
78 {
79 if(!access("/sys/power/autosleep", W_OK))
80 {
81 system("echo mem > /sys/power/autosleep");
82 autosleep_enable = TRUE;
83 return 0;
84 }
85 else
86 {
87 LOGE("/sys/power/autosleep can not write.");
88 return -1;
89 }
90 }
91 else
92 {
93 if(!access("/sys/power/autosleep", W_OK))
94 {
95 system("echo off > /sys/power/autosleep");
96 autosleep_enable = FALSE;
97 return 0;
98 }
99 else
100 {
101 LOGE("/sys/power/autosleep can not write.");
102 return -1;
103 }
104 }
b.liu5fa9e772023-11-23 18:00:55 +0800105
106 return 0;
107}
108
109int qser_wakelock_create(const char* name , size_t len)
110{
r.xiaoec113d12024-01-12 02:13:28 -0800111 //UNUSED(name);
112 //UNUSED(len);
113
114 if(!autosleep_enable) {
115 LOGE("Autosleep not enable.");
116 return -1;
117 }
118
119 if(name != NULL && len < 127)
120 {
121 int i;
122 for(i=0;i<512;i++)
123 {
124 if(lynq_lock_name[i].fd == 0)
125 break;
126 }
127 memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
128 lynq_lock_name[i].fd = i;
129 return lynq_lock_name[i].fd;
130 }
131 else
132 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800133
134 return 0;
135}
136
137int qser_wakelock_lock(int fd)
138{
r.xiaoec113d12024-01-12 02:13:28 -0800139 //UNUSED(fd);
140
141 if(!autosleep_enable) {
142 LOGE("Autosleep not enable.");
143 return -1;
144 }
145
146 int i;
147 for(i=0;i<512;i++)
148 {
149 if(lynq_lock_name[i].fd == fd)
150 break;
151 }
152 if(i == 512)
153 return -1;
154
155 if(!access("/sys/power/wake_lock", W_OK))
156 {
157 char cmd[128]={0};
158 sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
159 system(cmd);
160 return 0;
161 }
162 else
163 {
164 printf("/sys/power/wake_lock can not write.");
165 return -1;
166 }
b.liu5fa9e772023-11-23 18:00:55 +0800167
168 return 0;
169}
170
171int qser_wakelock_unlock(int fd)
172{
r.xiaoec113d12024-01-12 02:13:28 -0800173 //UNUSED(fd);
174
175 if(!autosleep_enable) {
176 LOGE("Autosleep not enable.");
177 return -1;
178 }
179
180 int i;
181 for(i=0;i<512;i++)
182 {
183 if(lynq_lock_name[i].fd == fd)
184 break;
185 }
186 if(i == 512)
187 return -1;
188
189 if(!access("/sys/power/wake_unlock", W_OK))
190 {
191 char cmd[128]={0};
192 sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
193 system(cmd);
194 return 0;
195 }
196 else
197 {
198 printf("/sys/power/wake_unlock can not write.");
199 return -1;
200 }
b.liu5fa9e772023-11-23 18:00:55 +0800201
202 return 0;
203}
204
205int qser_wakelock_destroy(int fd)
206{
r.xiaoec113d12024-01-12 02:13:28 -0800207 //UNUSED(fd);
208
209 if(!autosleep_enable) {
210 LOGE("Autosleep not enable.");
211 return -1;
212 }
213
214 int i;
215 for(i=0;i<512;i++)
216 {
217 if(lynq_lock_name[i].fd == fd)
218 break;
219 }
220 if(i == 512)
221 return -1;
222 else
223 {
224 lynq_lock_name[i].fd = 0;
225 memset(lynq_lock_name[i].name, 0, 128);
226 return 0;
227 }
b.liu5fa9e772023-11-23 18:00:55 +0800228
229 return 0;
230}
231
r.xiaocfd7c682024-01-22 03:59:46 -0800232void *threadFunction(void *arg)
233{
234 int pinValue;
235
236
237 edge_t = pinValue;
238 return NULL;
239}
b.liu5fa9e772023-11-23 18:00:55 +0800240
r.xiaoec113d12024-01-12 02:13:28 -0800241int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
242{
r.xiaocfd7c682024-01-22 03:59:46 -0800243 //UNUSED(qser_lpm_handler);
244 //UNUSED(qser_lpm_cfg);
r.xiaoec113d12024-01-12 02:13:28 -0800245
r.xiaocfd7c682024-01-22 03:59:46 -0800246 lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
247 printf(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
248 lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
249 printf(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
250 edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
r.xiaoec113d12024-01-12 02:13:28 -0800251
r.xiaocfd7c682024-01-22 03:59:46 -0800252 //pthread_attr_t thread_attr;
253 //pthread_attr_init(&thread_attr);
254 /*
255 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
256 {
257 printf("pthread_attr_setdetachstate() fail\n");
258 return -1;
259 }
260 */
261 //if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
262 if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
263 {
264 printf("qser_lpm_init can't create thread\n");
265 return -1;
266 }
r.xiaoec113d12024-01-12 02:13:28 -0800267
r.xiaocfd7c682024-01-22 03:59:46 -0800268 //pthread_attr_destroy(&thread_attr);
269
270 if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
271 qser_lpm_handler(edge_t);
r.xiaoec113d12024-01-12 02:13:28 -0800272
273 return 0;
274}
275
276int qser_lpm_deinit(void)
277{
278
r.xiaocfd7c682024-01-22 03:59:46 -0800279 if(pthread_cancel(lpm_t) != 0)
280 {
281 printf("qser_lpm_deinit pthread_cancel err\n");
282 return -1;
283 }
284
285 if(pthread_join(lpm_t,NULL) != 0)
286 {
287 printf("qser_lpm_deinit pthread_join err\n");
288 return -1;
289 }
290
r.xiaoec113d12024-01-12 02:13:28 -0800291 return 0;
292}
293
294/*
295例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
296其中PS DATA目前暂时不支持,只是保留了这个标志位;
297AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
2980 means resume all.
299目标文件"/system/etc/powerind"
300如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
301
302
303白名单的状态由四位数字组成,第一位代表是否屏蔽电话唤醒,第二
304位代表是否屏蔽网络注册状态唤醒,第三位代表是否屏蔽数据业务唤
305醒,第四位代表是否屏蔽短信唤醒。其中 1 代表屏蔽,其他不会屏
306蔽。
307第一位:1:打开电话唤醒,其他:屏蔽电话唤醒
308第二位:1:打开网络注册状态唤醒,其他:屏蔽网络注册状态唤醒
309第三位:1:打开数据业务唤醒,其他:屏蔽数据业务唤醒
310第四位:1:打开短信唤醒,其他屏蔽短信唤醒
311当四位都不为 1 时(比如默认的状态:0000),则代表白名单为空,
312所有唤醒都不会屏蔽。
313
314从左往右判断
315
316*/
317
318int qser_whitelist_set(char* whitelish)
319{
320 //UNUSED(whitelish);
321 uint32 on = 0;
322 int call_t, nw_t, data_t, sms_t, tmp;
323
324 int len = strlen(whitelish);
325
326 if (len != 4)
327 {
r.xiaocfd7c682024-01-22 03:59:46 -0800328 printf("whitelish num error num=[%d]\n",len);
329 return -1;
r.xiaoec113d12024-01-12 02:13:28 -0800330 }
331
332 tmp = atoi(whitelish);
333
334 call_t = tmp/1000;
335 nw_t = tmp%1000/100;
336 data_t = tmp%1000%100/10;
337 sms_t = tmp%1000%100%10;
338
339 if (call_t == 1)
340 call_Off = TRUE;
341 else
342 call_Off = FALSE;
343
344 if (nw_t == 1)
345 nw_off = TRUE;
346 else
347 nw_off = FALSE;
348
349 if (data_t == 1)
350 data_off = TRUE;
351 else
352 data_off = FALSE;
353
354 if (sms_t == 1)
355 sms_off = TRUE;
356 else
357 sms_off = FALSE;
358
359 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
360 {
361 on = 2;//0000的情况,所有上报源都不屏蔽,SIM的上报会一直被包含在内
362 }
363 else
364 {
365 if (call_Off == TRUE)
366 call_t = 8;
367 else
368 call_t = 0;
369
370 if (nw_off == TRUE)
371 nw_t = 1;
372 else
373 nw_t = 0;
374
375 if (data_off == TRUE)
376 data_t = 16;
377 else
378 data_t = 0;
379
380 if (sms_off == TRUE)
381 sms_t = 4;
382 else
383 sms_t = 0;
384
385 on = 31 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
386 }
387
388 if(whitelist_info_handle == NULL)
389 {
390 whitelist_info_handle = mbtk_info_handle_get();
391 if(whitelist_info_handle)
392 {
393 printf("creat whitelist_info_handle is success\n");
394 }
395 else
396 {
397 printf("creat whitelist_info_handle is fail\n");
398 return -1;
399 }
400 }
401
402 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
403 if(err)
404 {
405 printf("Error : %d\n", err);
406 return -1;
407 }
408 else
409 {
410 printf("wakeup set success.\n");
411 }
412
413
414 return 0;
415}
416
417
418int qser_whitelist_get(char* whitelish)
419{
420 //UNUSED(whitelish);
r.xiaocfd7c682024-01-22 03:59:46 -0800421 char list[10]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800422 int call_t, nw_t, data_t, sms_t;
423
424 if (call_Off == TRUE)
425 call_t = 1;
426 else
427 call_t = 0;
428
429 if (nw_off == TRUE)
430 nw_t = 1;
431 else
432 nw_t = 0;
433
434 if (data_off == TRUE)
435 data_t = 1;
436 else
437 data_t = 0;
438
439 if (sms_off == TRUE)
440 sms_t = 1;
441 else
442 sms_t = 0;
443
r.xiaocfd7c682024-01-22 03:59:46 -0800444 sprintf(list, "%d%d%d%d", call_t, nw_t, data_t, sms_t);
445 //printf(">>>whitelist: %s\n",list);
446 strncpy(whitelish, list, strlen(list));
r.xiaoec113d12024-01-12 02:13:28 -0800447
448 if(whitelist_info_handle != NULL)
449 {
450 mbtk_info_handle_free(&whitelist_info_handle);
451 printf("deinit whitelist_info_handle is succuess\n");
452 }
453
454 return 0;
455}
456
b.liu5fa9e772023-11-23 18:00:55 +0800457