blob: 572a5617271664a78f506cea715d4482f1db6a3f [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>
r.xiao7000d212024-01-31 23:45:27 -080011#include <stdlib.h>
12#include <errno.h>
13#include <sys/epoll.h>
14#include <linux/input.h>
r.xiaoec113d12024-01-12 02:13:28 -080015
b.liu4e243dc2023-11-27 11:20:00 +080016#include "mbtk_type.h"
r.xiaoec113d12024-01-12 02:13:28 -080017#include "mbtk_log.h"
18#include "mbtk_info_api.h"
wangyouqiangc42b85d2024-04-24 17:05:06 +080019#include "mbtk_power.h"
r.xiaoec113d12024-01-12 02:13:28 -080020
21/*
r.xiaod3256ae2024-02-28 23:20:55 -080022This 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
r.xiaoec113d12024-01-12 02:13:28 -080026*/
r.xiaod3256ae2024-02-28 23:20:55 -080027#if defined(MBTK_PLATFORM_ASR1806)
r.xiaoec113d12024-01-12 02:13:28 -080028#define MTBK_POWERIND "/system/etc/powerind" //1806
r.xiaod3256ae2024-02-28 23:20:55 -080029#else if defined(MBTK_PLATFORM_ASR1803)
30#define MTBK_POWERIND "/etc/powerind" //1803
31#endif
r.xiaoec113d12024-01-12 02:13:28 -080032
33static bool call_Off = FALSE;
34static bool nw_off = FALSE;
35static bool sms_off = FALSE;
36static bool data_off = FALSE;
37
r.xiao7000d212024-01-31 23:45:27 -080038static pthread_t lpm_t;
r.xiaocfd7c682024-01-22 03:59:46 -080039static int edge_t = 0;
r.xiao7000d212024-01-31 23:45:27 -080040static int epoll_fd_t = -1;
41static int fd_t = -1;
42static int socket_t[2];
r.xiaocfd7c682024-01-22 03:59:46 -080043
44typedef struct{
45 qser_lpm_wakeupin_data_t wakeupin;
46 qser_lpm_wakeupout_data_t wakeupout;
r.xiao7000d212024-01-31 23:45:27 -080047 qser_lpm_Handler_t wakehandle;
r.xiaocfd7c682024-01-22 03:59:46 -080048}lynq_wake_t;
49
50static lynq_wake_t lpm_init;
51
r.xiaoec113d12024-01-12 02:13:28 -080052
r.xiao7000d212024-01-31 23:45:27 -080053typedef 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
r.xiaoec113d12024-01-12 02:13:28 -080066static int powerrind_get()
67{
r.xiao7000d212024-01-31 23:45:27 -080068 char buffer[4];
r.xiaoec113d12024-01-12 02:13:28 -080069 int ret = 0;
70
71 int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
72 if (fd != -1)
73 {
74 read(fd, buffer, strlen(buffer)+1);
75 close(fd);
76 }
77
78 ret = atoi(buffer);
79
80 return ret;
81}
82
r.xiao7000d212024-01-31 23:45:27 -080083#if 1
84static int sleep_epoll_deregister(int epoll_fd,int fd )
r.xiaoec113d12024-01-12 02:13:28 -080085{
r.xiao7000d212024-01-31 23:45:27 -080086 int ret;
87 do {
88 ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
89 } while (ret < 0 && errno == EINTR);
90 return ret;
91}
r.xiaoec113d12024-01-12 02:13:28 -080092
r.xiao7000d212024-01-31 23:45:27 -080093static int sleep_epoll_register(int epoll_fd, int fd)
94{
95 struct epoll_event ev;
96 int ret, flags;
r.xiaoec113d12024-01-12 02:13:28 -080097
r.xiao7000d212024-01-31 23:45:27 -080098 /* important: make the fd non-blocking */
99 flags = fcntl(fd, F_GETFL);
100 fcntl(fd, F_SETFL, flags | O_NONBLOCK);
r.xiaoec113d12024-01-12 02:13:28 -0800101
r.xiao7000d212024-01-31 23:45:27 -0800102 ev.events = EPOLLIN;
103 ev.data.fd = fd;
104 do {
105 ret = epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &ev );
106 } while (ret < 0 && errno == EINTR);
107
108 return ret;
109}
110#endif
r.xiaoec113d12024-01-12 02:13:28 -0800111
b.liu5fa9e772023-11-23 18:00:55 +0800112int qser_autosuspend_enable(char enable)
113{
r.xiaoec113d12024-01-12 02:13:28 -0800114 //UNUSED(enable);
115
r.xiaod3256ae2024-02-28 23:20:55 -0800116 if((enable == 1) || enable == '1')
r.xiaoec113d12024-01-12 02:13:28 -0800117 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800118 if(!mbtk_system_sleep())
r.xiaoec113d12024-01-12 02:13:28 -0800119 {
120 system("echo mem > /sys/power/autosleep");
121 autosleep_enable = TRUE;
122 return 0;
123 }
124 else
125 {
126 LOGE("/sys/power/autosleep can not write.");
127 return -1;
128 }
129 }
r.xiaod3256ae2024-02-28 23:20:55 -0800130 else if((enable == 0) || enable == '0')
r.xiaoec113d12024-01-12 02:13:28 -0800131 {
132 if(!access("/sys/power/autosleep", W_OK))
133 {
134 system("echo off > /sys/power/autosleep");
135 autosleep_enable = FALSE;
136 return 0;
137 }
138 else
139 {
140 LOGE("/sys/power/autosleep can not write.");
141 return -1;
142 }
143 }
r.xiaod3256ae2024-02-28 23:20:55 -0800144 else
145 {
146 LOGE("qser_autosuspend_enablecan enable err.");
147 return -1;
148 }
b.liu5fa9e772023-11-23 18:00:55 +0800149
150 return 0;
151}
152
153int qser_wakelock_create(const char* name , size_t len)
154{
r.xiaoec113d12024-01-12 02:13:28 -0800155 //UNUSED(name);
156 //UNUSED(len);
r.xiaod3256ae2024-02-28 23:20:55 -0800157 int len_t;
r.xiaoec113d12024-01-12 02:13:28 -0800158
159 if(!autosleep_enable) {
160 LOGE("Autosleep not enable.");
161 return -1;
162 }
163
r.xiaod3256ae2024-02-28 23:20:55 -0800164 len_t = strlen(name);
165
166 if((name != NULL) && (len < 33) && (len_t < 33))
r.xiaoec113d12024-01-12 02:13:28 -0800167 {
168 int i;
r.xiaod3256ae2024-02-28 23:20:55 -0800169 //name
170 for(i=1 ;i<LOCK_MAX_SIZE;i++)
171 {
172 if(strcmp(lynq_lock_name[i].name, name) == 0)
173 {
174 LOGE("Repeated names.");
175 return -1;
176 }
177 }
178
r.xiao7000d212024-01-31 23:45:27 -0800179 for(i=1 ;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800180 {
181 if(lynq_lock_name[i].fd == 0)
182 break;
183 }
r.xiao7000d212024-01-31 23:45:27 -0800184
185 if (i >= LOCK_MAX_SIZE)
186 {
r.xiaob9cf0e62024-02-02 04:11:48 -0800187 LOGE("Fd is full.");
r.xiao7000d212024-01-31 23:45:27 -0800188 return -1;
189 }
190
r.xiaoec113d12024-01-12 02:13:28 -0800191 memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
192 lynq_lock_name[i].fd = i;
r.xiaod3256ae2024-02-28 23:20:55 -0800193 return lynq_lock_name[i].fd -1;//Starting from scratch
r.xiaoec113d12024-01-12 02:13:28 -0800194 }
195 else
196 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800197
r.xiaod3256ae2024-02-28 23:20:55 -0800198 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800199}
200
201int qser_wakelock_lock(int fd)
202{
r.xiaoec113d12024-01-12 02:13:28 -0800203 //UNUSED(fd);
204
205 if(!autosleep_enable) {
206 LOGE("Autosleep not enable.");
207 return -1;
208 }
209
210 int i;
r.xiao7000d212024-01-31 23:45:27 -0800211 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800212 {
r.xiaod3256ae2024-02-28 23:20:55 -0800213 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800214 break;
215 }
r.xiao7000d212024-01-31 23:45:27 -0800216 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800217 {
218 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800219 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800220 }
r.xiaoec113d12024-01-12 02:13:28 -0800221
222 if(!access("/sys/power/wake_lock", W_OK))
223 {
224 char cmd[128]={0};
225 sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
226 system(cmd);
227 return 0;
228 }
229 else
230 {
r.xiao7000d212024-01-31 23:45:27 -0800231 LOGE("/sys/power/wake_lock can not write.");
r.xiaoec113d12024-01-12 02:13:28 -0800232 return -1;
233 }
b.liu5fa9e772023-11-23 18:00:55 +0800234
235 return 0;
236}
237
238int qser_wakelock_unlock(int fd)
239{
r.xiaoec113d12024-01-12 02:13:28 -0800240 //UNUSED(fd);
241
242 if(!autosleep_enable) {
243 LOGE("Autosleep not enable.");
244 return -1;
245 }
246
247 int i;
r.xiao7000d212024-01-31 23:45:27 -0800248 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800249 {
r.xiaod3256ae2024-02-28 23:20:55 -0800250 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800251 break;
252 }
r.xiao7000d212024-01-31 23:45:27 -0800253 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800254 {
255 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800256 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800257 }
r.xiaoec113d12024-01-12 02:13:28 -0800258
259 if(!access("/sys/power/wake_unlock", W_OK))
260 {
261 char cmd[128]={0};
262 sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
263 system(cmd);
264 return 0;
265 }
266 else
267 {
r.xiao7000d212024-01-31 23:45:27 -0800268 LOGE("/sys/power/wake_unlock can not write.");
r.xiaoec113d12024-01-12 02:13:28 -0800269 return -1;
270 }
b.liu5fa9e772023-11-23 18:00:55 +0800271
272 return 0;
273}
274
275int qser_wakelock_destroy(int fd)
276{
r.xiaoec113d12024-01-12 02:13:28 -0800277 //UNUSED(fd);
278
279 if(!autosleep_enable) {
280 LOGE("Autosleep not enable.");
281 return -1;
282 }
283
284 int i;
r.xiao7000d212024-01-31 23:45:27 -0800285 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800286 {
r.xiaod3256ae2024-02-28 23:20:55 -0800287 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800288 break;
289 }
r.xiaod3256ae2024-02-28 23:20:55 -0800290
r.xiao7000d212024-01-31 23:45:27 -0800291 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800292 {
293 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800294 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800295 }
r.xiaoec113d12024-01-12 02:13:28 -0800296 else
297 {
298 lynq_lock_name[i].fd = 0;
r.xiaod3256ae2024-02-28 23:20:55 -0800299 memset(lynq_lock_name[i].name, 0, 64);
r.xiaoec113d12024-01-12 02:13:28 -0800300 return 0;
301 }
b.liu5fa9e772023-11-23 18:00:55 +0800302
303 return 0;
304}
305
r.xiaocfd7c682024-01-22 03:59:46 -0800306void *threadFunction(void *arg)
307{
308 int pinValue;
r.xiaoce21a042024-02-03 19:35:19 -0800309 int i;
r.xiao7000d212024-01-31 23:45:27 -0800310 char buf[8] = {0};
311 struct input_event ev_input = { 0 };
312 const int size = sizeof(struct input_event);
r.xiaocfd7c682024-01-22 03:59:46 -0800313
r.xiao7000d212024-01-31 23:45:27 -0800314 epoll_fd_t = epoll_create(2);
315/*
316 struct epoll_event event;
317 memset(&event, 0, sizeof(struct epoll_event));
318 event.events = EPOLLIN | EPOLLET;
319 event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
320
321 fd_t = event.data.fd;
322 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
323 {
324 LOGE("Failed to add GPIO device file.");
325 return NULL;
326 }
327
328 memset(&event, 0, sizeof(struct epoll_event));
329 event.events = EPOLLIN | EPOLLET;
330 event.data.fd = socket_t[0];
331 LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
332
333 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
334 {
335 LOGE("Failed to add GPIO device file.");
336 return NULL;
337 }
338*/
339 fd_t = open("/dev/input/event0", O_RDONLY);
340
341 sleep_epoll_register(epoll_fd_t, fd_t);
342 sleep_epoll_register(epoll_fd_t, socket_t[1]);
343
344 while (true)
345 {
346 struct epoll_event events[2];
347 struct epoll_event ev;
348 int cmd = 0;
349
350 int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
351
r.xiaoce21a042024-02-03 19:35:19 -0800352 for (i = 0; i < numEvents; ++i)
r.xiao7000d212024-01-31 23:45:27 -0800353 {
354 if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
355 {
356 LOGE("Error on GPIO device.");
357 return NULL;
358 }
359 else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
360 {
361 //handleInterrupt(events[i].data.fd);
362 if (events[i].data.fd == socket_t[1])
363 {
364 memset(buf, 0, sizeof(buf));
365 read(socket_t[1], buf, sizeof(buf));
366 if (1 == atoi(buf))
367 {
368 if(close(fd_t) == 0)
369 LOGI("close(fd_t)ing");
370
371 sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
372 sleep_epoll_deregister(epoll_fd_t, fd_t);
373 /*
374 memset(&ev, 0, sizeof(struct epoll_event));
375 ev.events = EPOLLIN | EPOLLET;
376 ev.data.fd = socket_t[1];
377 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
378
379 memset(&ev, 0, sizeof(struct epoll_event));
380 ev.events = EPOLLIN | EPOLLET;
381 ev.data.fd = fd_t;
382 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
383 */
384 LOGI("do pthread_exit");
385 return NULL;
386 }
387 }
388 else if (events[i].data.fd == fd_t)
389 {
390 memset(&ev_input, 0x00, size);
391 read(fd_t, &ev_input, size);
392 LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
393 if (ev_input.code == 2)
394 {
395 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
396 pinValue = (int)ev_input.value;
397 edge_t = pinValue;
398 lpm_init.wakehandle(edge_t);
399 }
400 }
401 else
402 {
403 LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
404 }
405 }
406 }
407 }
r.xiaocfd7c682024-01-22 03:59:46 -0800408 return NULL;
409}
b.liu5fa9e772023-11-23 18:00:55 +0800410
r.xiaoec113d12024-01-12 02:13:28 -0800411int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
412{
r.xiaocfd7c682024-01-22 03:59:46 -0800413 //UNUSED(qser_lpm_handler);
414 //UNUSED(qser_lpm_cfg);
r.xiao7000d212024-01-31 23:45:27 -0800415 if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
416 {
417 LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
r.xiaoec113d12024-01-12 02:13:28 -0800418
r.xiao7000d212024-01-31 23:45:27 -0800419 /*close the control socket pair && Retry again.*/
420 if(socket_t[0] > 0)
421 {
422 close(socket_t[0] );
423 socket_t[0] = -1;
424 }
425
426 if(socket_t[1] > 0)
427 {
428 close(socket_t[1] );
429 socket_t[1] = -1;
430 }
431 return -1;
432 }
r.xiaocfd7c682024-01-22 03:59:46 -0800433 lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
r.xiao7000d212024-01-31 23:45:27 -0800434 LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
r.xiaocfd7c682024-01-22 03:59:46 -0800435 lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
r.xiao7000d212024-01-31 23:45:27 -0800436 LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
r.xiaocfd7c682024-01-22 03:59:46 -0800437 edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
r.xiao7000d212024-01-31 23:45:27 -0800438 lpm_init.wakehandle = qser_lpm_handler;
r.xiaoec113d12024-01-12 02:13:28 -0800439
r.xiao7000d212024-01-31 23:45:27 -0800440 pthread_attr_t thread_attr;
441 pthread_attr_init(&thread_attr);
442
r.xiaocfd7c682024-01-22 03:59:46 -0800443 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
444 {
r.xiao7000d212024-01-31 23:45:27 -0800445 LOGE("pthread_attr_setdetachstate() fail");
r.xiaocfd7c682024-01-22 03:59:46 -0800446 return -1;
447 }
r.xiao7000d212024-01-31 23:45:27 -0800448
449 if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
450 //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
r.xiaocfd7c682024-01-22 03:59:46 -0800451 {
r.xiao7000d212024-01-31 23:45:27 -0800452 LOGE("qser_lpm_init can't create thread");
r.xiaocfd7c682024-01-22 03:59:46 -0800453 return -1;
454 }
r.xiaoec113d12024-01-12 02:13:28 -0800455
r.xiao7000d212024-01-31 23:45:27 -0800456 pthread_attr_destroy(&thread_attr);
r.xiaocfd7c682024-01-22 03:59:46 -0800457
r.xiao7000d212024-01-31 23:45:27 -0800458 //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
459 //qser_lpm_handler(edge_t);
r.xiaoec113d12024-01-12 02:13:28 -0800460
461 return 0;
462}
463
464int qser_lpm_deinit(void)
465{
r.xiao7000d212024-01-31 23:45:27 -0800466 char buf[4]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800467
r.xiao7000d212024-01-31 23:45:27 -0800468 if (fd_t == -1)
469 return 0;
r.xiaocfd7c682024-01-22 03:59:46 -0800470
r.xiao7000d212024-01-31 23:45:27 -0800471 if (fd_t != -1)
r.xiaocfd7c682024-01-22 03:59:46 -0800472 {
r.xiao7000d212024-01-31 23:45:27 -0800473 //char cmd = 1;
474 strcpy(buf, "1");
475 void* dummy = NULL;
476 write( socket_t[0], buf, sizeof(buf) );
477 //pthread_join(lpm_t, &dummy);
478
479 sleep(1);
480 // close the control socket pair
481 if(socket_t[0] > 0)
482 {
483 close(socket_t[0] );
484 socket_t[0] = -1;
485 }
486 if(socket_t[1] > 0)
487 {
488 close(socket_t[1] );
489 socket_t[1] = -1;
490 }
491
492 //重置还原
493 fd_t = -1;
494
r.xiaocfd7c682024-01-22 03:59:46 -0800495 }
496
r.xiaoec113d12024-01-12 02:13:28 -0800497 return 0;
498}
499
500/*
501例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
502其中PS DATA目前暂时不支持,只是保留了这个标志位;
503AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
5040 means resume all.
505目标文件"/system/etc/powerind"
506如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
507
r.xiaoec113d12024-01-12 02:13:28 -0800508*/
509
510int qser_whitelist_set(char* whitelish)
511{
512 //UNUSED(whitelish);
513 uint32 on = 0;
514 int call_t, nw_t, data_t, sms_t, tmp;
515
516 int len = strlen(whitelish);
517
518 if (len != 4)
519 {
r.xiao7000d212024-01-31 23:45:27 -0800520 LOGE("whitelish num error num=[%d]",len);
r.xiaocfd7c682024-01-22 03:59:46 -0800521 return -1;
r.xiaoec113d12024-01-12 02:13:28 -0800522 }
523
524 tmp = atoi(whitelish);
525
526 call_t = tmp/1000;
527 nw_t = tmp%1000/100;
528 data_t = tmp%1000%100/10;
529 sms_t = tmp%1000%100%10;
530
531 if (call_t == 1)
532 call_Off = TRUE;
533 else
534 call_Off = FALSE;
535
536 if (nw_t == 1)
537 nw_off = TRUE;
538 else
539 nw_off = FALSE;
540
541 if (data_t == 1)
542 data_off = TRUE;
543 else
544 data_off = FALSE;
545
546 if (sms_t == 1)
547 sms_off = TRUE;
548 else
549 sms_off = FALSE;
550
551 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
552 {
r.xiao7000d212024-01-31 23:45:27 -0800553 on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800554 }
555 else
556 {
557 if (call_Off == TRUE)
558 call_t = 8;
559 else
560 call_t = 0;
561
562 if (nw_off == TRUE)
563 nw_t = 1;
564 else
565 nw_t = 0;
566
567 if (data_off == TRUE)
568 data_t = 16;
569 else
570 data_t = 0;
571
572 if (sms_off == TRUE)
573 sms_t = 4;
574 else
575 sms_t = 0;
576
r.xiao7000d212024-01-31 23:45:27 -0800577 on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800578 }
579
580 if(whitelist_info_handle == NULL)
581 {
582 whitelist_info_handle = mbtk_info_handle_get();
583 if(whitelist_info_handle)
584 {
r.xiao7000d212024-01-31 23:45:27 -0800585 LOGI("creat whitelist_info_handle is success");
r.xiaoec113d12024-01-12 02:13:28 -0800586 }
587 else
588 {
r.xiao7000d212024-01-31 23:45:27 -0800589 LOGE("creat whitelist_info_handle is fail");
r.xiaoec113d12024-01-12 02:13:28 -0800590 return -1;
591 }
592 }
593
594 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
595 if(err)
596 {
r.xiao7000d212024-01-31 23:45:27 -0800597 LOGE("whitelist_info_handle Error : %d", err);
r.xiaoec113d12024-01-12 02:13:28 -0800598 return -1;
599 }
r.xiaoec113d12024-01-12 02:13:28 -0800600
601 return 0;
602}
603
604
605int qser_whitelist_get(char* whitelish)
606{
607 //UNUSED(whitelish);
r.xiaocfd7c682024-01-22 03:59:46 -0800608 char list[10]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800609 int call_t, nw_t, data_t, sms_t;
r.xiao7000d212024-01-31 23:45:27 -0800610 int get_tmp;
r.xiaoec113d12024-01-12 02:13:28 -0800611
r.xiao7000d212024-01-31 23:45:27 -0800612 get_tmp = powerrind_get();
613 //LOGI(">>>get_tmp: %d",get_tmp);
r.xiaoec113d12024-01-12 02:13:28 -0800614
r.xiao7000d212024-01-31 23:45:27 -0800615 //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
616 switch(get_tmp)
617 {
618 case 0:
619 sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
620 break;
621 case 8:
622 sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
623 break;
624 case 1:
625 sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
626 break;
627 case 16:
628 sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
629 break;
630 case 4:
631 sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
632 break;
633
634 case 9:
635 sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
636 break;
637 case 24:
638 sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
639 break;
640 case 12:
641 sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
642 break;
643 case 17:
644 sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
645 break;
646 case 5:
647 sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
648 break;
649 case 20:
650 sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
651 break;
652
653 case 25:
654 sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
655 break;
656 case 13:
657 sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
658 break;
659 case 28:
660 sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
661 break;
662 case 21:
663 sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
664 break;
665
666 case 29:
667 sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
668 break;
669
670 default :
671 LOGE("qser_whitelist_get is error");
672 break;
673 }
674
675 //LOGI(">>>get list: %s",list);
r.xiaocfd7c682024-01-22 03:59:46 -0800676 strncpy(whitelish, list, strlen(list));
r.xiaoec113d12024-01-12 02:13:28 -0800677
678 if(whitelist_info_handle != NULL)
679 {
680 mbtk_info_handle_free(&whitelist_info_handle);
r.xiao7000d212024-01-31 23:45:27 -0800681 LOGI("deinit whitelist_info_handle is succuess");
r.xiaoec113d12024-01-12 02:13:28 -0800682 }
683
684 return 0;
685}
686