blob: 84f6d754ddee33622f1b9fe4ba57e8839cd62195 [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*/
b.liub3b923a2024-06-06 15:15:49 +080027#if defined(MBTK_PLATFORM_KERNEL_5)
r.xiaoec113d12024-01-12 02:13:28 -080028#define MTBK_POWERIND "/system/etc/powerind" //1806
b.liub3b923a2024-06-06 15:15:49 +080029#elif defined(MBTK_PLATFORM_KERNEL_3)
r.xiaod3256ae2024-02-28 23:20:55 -080030#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*/
r.xiao69675c92024-05-31 03:07:00 -0700339
340#if defined(MBTK_SG_SUPPORT)
341 fd_t = open("/dev/input/event1", O_RDONLY);
342 LOGI("init sg pthread_event");
343#else
r.xiao7000d212024-01-31 23:45:27 -0800344 fd_t = open("/dev/input/event0", O_RDONLY);
r.xiao69675c92024-05-31 03:07:00 -0700345#endif
r.xiao7000d212024-01-31 23:45:27 -0800346
347 sleep_epoll_register(epoll_fd_t, fd_t);
348 sleep_epoll_register(epoll_fd_t, socket_t[1]);
349
350 while (true)
351 {
352 struct epoll_event events[2];
353 struct epoll_event ev;
354 int cmd = 0;
355
356 int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
357
r.xiaoce21a042024-02-03 19:35:19 -0800358 for (i = 0; i < numEvents; ++i)
r.xiao7000d212024-01-31 23:45:27 -0800359 {
360 if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
361 {
362 LOGE("Error on GPIO device.");
363 return NULL;
364 }
365 else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
366 {
367 //handleInterrupt(events[i].data.fd);
368 if (events[i].data.fd == socket_t[1])
369 {
370 memset(buf, 0, sizeof(buf));
371 read(socket_t[1], buf, sizeof(buf));
372 if (1 == atoi(buf))
373 {
374 if(close(fd_t) == 0)
375 LOGI("close(fd_t)ing");
376
377 sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
378 sleep_epoll_deregister(epoll_fd_t, fd_t);
379 /*
380 memset(&ev, 0, sizeof(struct epoll_event));
381 ev.events = EPOLLIN | EPOLLET;
382 ev.data.fd = socket_t[1];
383 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
384
385 memset(&ev, 0, sizeof(struct epoll_event));
386 ev.events = EPOLLIN | EPOLLET;
387 ev.data.fd = fd_t;
388 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
389 */
390 LOGI("do pthread_exit");
391 return NULL;
392 }
393 }
394 else if (events[i].data.fd == fd_t)
395 {
r.xiao69675c92024-05-31 03:07:00 -0700396 LOGI("go pthread_event");
r.xiao7000d212024-01-31 23:45:27 -0800397 memset(&ev_input, 0x00, size);
398 read(fd_t, &ev_input, size);
399 LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
400 if (ev_input.code == 2)
401 {
402 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
403 pinValue = (int)ev_input.value;
404 edge_t = pinValue;
405 lpm_init.wakehandle(edge_t);
406 }
407 }
408 else
409 {
410 LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
411 }
412 }
413 }
414 }
r.xiaocfd7c682024-01-22 03:59:46 -0800415 return NULL;
416}
b.liu5fa9e772023-11-23 18:00:55 +0800417
r.xiaoec113d12024-01-12 02:13:28 -0800418int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
419{
r.xiaocfd7c682024-01-22 03:59:46 -0800420 //UNUSED(qser_lpm_handler);
421 //UNUSED(qser_lpm_cfg);
r.xiao7000d212024-01-31 23:45:27 -0800422 if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
423 {
424 LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
r.xiaoec113d12024-01-12 02:13:28 -0800425
r.xiao7000d212024-01-31 23:45:27 -0800426 /*close the control socket pair && Retry again.*/
427 if(socket_t[0] > 0)
428 {
429 close(socket_t[0] );
430 socket_t[0] = -1;
431 }
432
433 if(socket_t[1] > 0)
434 {
435 close(socket_t[1] );
436 socket_t[1] = -1;
437 }
438 return -1;
439 }
r.xiaocfd7c682024-01-22 03:59:46 -0800440 lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
r.xiao7000d212024-01-31 23:45:27 -0800441 LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
r.xiaocfd7c682024-01-22 03:59:46 -0800442 lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
r.xiao7000d212024-01-31 23:45:27 -0800443 LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
r.xiaocfd7c682024-01-22 03:59:46 -0800444 edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
r.xiao7000d212024-01-31 23:45:27 -0800445 lpm_init.wakehandle = qser_lpm_handler;
r.xiaoec113d12024-01-12 02:13:28 -0800446
r.xiao7000d212024-01-31 23:45:27 -0800447 pthread_attr_t thread_attr;
448 pthread_attr_init(&thread_attr);
449
r.xiaocfd7c682024-01-22 03:59:46 -0800450 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
451 {
r.xiao7000d212024-01-31 23:45:27 -0800452 LOGE("pthread_attr_setdetachstate() fail");
r.xiaocfd7c682024-01-22 03:59:46 -0800453 return -1;
454 }
r.xiao7000d212024-01-31 23:45:27 -0800455
456 if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
457 //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
r.xiaocfd7c682024-01-22 03:59:46 -0800458 {
r.xiao7000d212024-01-31 23:45:27 -0800459 LOGE("qser_lpm_init can't create thread");
r.xiaocfd7c682024-01-22 03:59:46 -0800460 return -1;
461 }
r.xiaoec113d12024-01-12 02:13:28 -0800462
r.xiao7000d212024-01-31 23:45:27 -0800463 pthread_attr_destroy(&thread_attr);
r.xiaocfd7c682024-01-22 03:59:46 -0800464
r.xiao7000d212024-01-31 23:45:27 -0800465 //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
466 //qser_lpm_handler(edge_t);
r.xiaoec113d12024-01-12 02:13:28 -0800467
468 return 0;
469}
470
471int qser_lpm_deinit(void)
472{
r.xiao7000d212024-01-31 23:45:27 -0800473 char buf[4]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800474
r.xiao7000d212024-01-31 23:45:27 -0800475 if (fd_t == -1)
476 return 0;
r.xiaocfd7c682024-01-22 03:59:46 -0800477
r.xiao7000d212024-01-31 23:45:27 -0800478 if (fd_t != -1)
r.xiaocfd7c682024-01-22 03:59:46 -0800479 {
r.xiao7000d212024-01-31 23:45:27 -0800480 //char cmd = 1;
481 strcpy(buf, "1");
482 void* dummy = NULL;
483 write( socket_t[0], buf, sizeof(buf) );
484 //pthread_join(lpm_t, &dummy);
485
486 sleep(1);
487 // close the control socket pair
488 if(socket_t[0] > 0)
489 {
490 close(socket_t[0] );
491 socket_t[0] = -1;
492 }
493 if(socket_t[1] > 0)
494 {
495 close(socket_t[1] );
496 socket_t[1] = -1;
497 }
498
499 //重置还原
500 fd_t = -1;
501
r.xiaocfd7c682024-01-22 03:59:46 -0800502 }
503
r.xiaoec113d12024-01-12 02:13:28 -0800504 return 0;
505}
506
507/*
508例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
509其中PS DATA目前暂时不支持,只是保留了这个标志位;
510AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
5110 means resume all.
512目标文件"/system/etc/powerind"
513如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
514
r.xiaoec113d12024-01-12 02:13:28 -0800515*/
516
517int qser_whitelist_set(char* whitelish)
518{
519 //UNUSED(whitelish);
520 uint32 on = 0;
521 int call_t, nw_t, data_t, sms_t, tmp;
522
523 int len = strlen(whitelish);
524
525 if (len != 4)
526 {
r.xiao7000d212024-01-31 23:45:27 -0800527 LOGE("whitelish num error num=[%d]",len);
r.xiaocfd7c682024-01-22 03:59:46 -0800528 return -1;
r.xiaoec113d12024-01-12 02:13:28 -0800529 }
530
531 tmp = atoi(whitelish);
532
533 call_t = tmp/1000;
534 nw_t = tmp%1000/100;
535 data_t = tmp%1000%100/10;
536 sms_t = tmp%1000%100%10;
537
538 if (call_t == 1)
539 call_Off = TRUE;
540 else
541 call_Off = FALSE;
542
543 if (nw_t == 1)
544 nw_off = TRUE;
545 else
546 nw_off = FALSE;
547
548 if (data_t == 1)
549 data_off = TRUE;
550 else
551 data_off = FALSE;
552
553 if (sms_t == 1)
554 sms_off = TRUE;
555 else
556 sms_off = FALSE;
557
558 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
559 {
r.xiao7000d212024-01-31 23:45:27 -0800560 on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800561 }
562 else
563 {
564 if (call_Off == TRUE)
565 call_t = 8;
566 else
567 call_t = 0;
568
569 if (nw_off == TRUE)
570 nw_t = 1;
571 else
572 nw_t = 0;
573
574 if (data_off == TRUE)
575 data_t = 16;
576 else
577 data_t = 0;
578
579 if (sms_off == TRUE)
580 sms_t = 4;
581 else
582 sms_t = 0;
583
r.xiao7000d212024-01-31 23:45:27 -0800584 on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800585 }
586
587 if(whitelist_info_handle == NULL)
588 {
589 whitelist_info_handle = mbtk_info_handle_get();
590 if(whitelist_info_handle)
591 {
r.xiao7000d212024-01-31 23:45:27 -0800592 LOGI("creat whitelist_info_handle is success");
r.xiaoec113d12024-01-12 02:13:28 -0800593 }
594 else
595 {
r.xiao7000d212024-01-31 23:45:27 -0800596 LOGE("creat whitelist_info_handle is fail");
r.xiaoec113d12024-01-12 02:13:28 -0800597 return -1;
598 }
599 }
600
601 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
602 if(err)
603 {
r.xiao7000d212024-01-31 23:45:27 -0800604 LOGE("whitelist_info_handle Error : %d", err);
r.xiaoec113d12024-01-12 02:13:28 -0800605 return -1;
606 }
r.xiaoec113d12024-01-12 02:13:28 -0800607
608 return 0;
609}
610
611
612int qser_whitelist_get(char* whitelish)
613{
614 //UNUSED(whitelish);
r.xiaocfd7c682024-01-22 03:59:46 -0800615 char list[10]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800616 int call_t, nw_t, data_t, sms_t;
r.xiao7000d212024-01-31 23:45:27 -0800617 int get_tmp;
r.xiaoec113d12024-01-12 02:13:28 -0800618
r.xiao7000d212024-01-31 23:45:27 -0800619 get_tmp = powerrind_get();
620 //LOGI(">>>get_tmp: %d",get_tmp);
r.xiaoec113d12024-01-12 02:13:28 -0800621
r.xiao7000d212024-01-31 23:45:27 -0800622 //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
623 switch(get_tmp)
624 {
625 case 0:
626 sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
627 break;
628 case 8:
629 sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
630 break;
631 case 1:
632 sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
633 break;
634 case 16:
635 sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
636 break;
637 case 4:
638 sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
639 break;
640
641 case 9:
642 sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
643 break;
644 case 24:
645 sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
646 break;
647 case 12:
648 sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
649 break;
650 case 17:
651 sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
652 break;
653 case 5:
654 sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
655 break;
656 case 20:
657 sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
658 break;
659
660 case 25:
661 sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
662 break;
663 case 13:
664 sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
665 break;
666 case 28:
667 sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
668 break;
669 case 21:
670 sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
671 break;
672
673 case 29:
674 sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
675 break;
676
677 default :
678 LOGE("qser_whitelist_get is error");
679 break;
680 }
681
682 //LOGI(">>>get list: %s",list);
r.xiaocfd7c682024-01-22 03:59:46 -0800683 strncpy(whitelish, list, strlen(list));
r.xiaoec113d12024-01-12 02:13:28 -0800684
685 if(whitelist_info_handle != NULL)
686 {
687 mbtk_info_handle_free(&whitelist_info_handle);
r.xiao7000d212024-01-31 23:45:27 -0800688 LOGI("deinit whitelist_info_handle is succuess");
r.xiaoec113d12024-01-12 02:13:28 -0800689 }
690
691 return 0;
692}
693