blob: a293fd54ce3594b7dfe8421ecd4f9d8be9b1f6d8 [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 {
r.xiaocd75dcf2024-06-12 20:41:33 -0700118 //if(!mbtk_system_sleep())
119 if(!access("/sys/power/autosleep", W_OK))
r.xiaoec113d12024-01-12 02:13:28 -0800120 {
121 system("echo mem > /sys/power/autosleep");
122 autosleep_enable = TRUE;
123 return 0;
124 }
125 else
126 {
127 LOGE("/sys/power/autosleep can not write.");
128 return -1;
129 }
130 }
r.xiaod3256ae2024-02-28 23:20:55 -0800131 else if((enable == 0) || enable == '0')
r.xiaoec113d12024-01-12 02:13:28 -0800132 {
133 if(!access("/sys/power/autosleep", W_OK))
134 {
135 system("echo off > /sys/power/autosleep");
136 autosleep_enable = FALSE;
137 return 0;
138 }
139 else
140 {
141 LOGE("/sys/power/autosleep can not write.");
142 return -1;
143 }
144 }
r.xiaod3256ae2024-02-28 23:20:55 -0800145 else
146 {
147 LOGE("qser_autosuspend_enablecan enable err.");
148 return -1;
149 }
b.liu5fa9e772023-11-23 18:00:55 +0800150
151 return 0;
152}
153
154int qser_wakelock_create(const char* name , size_t len)
155{
r.xiaoec113d12024-01-12 02:13:28 -0800156 //UNUSED(name);
157 //UNUSED(len);
r.xiaod3256ae2024-02-28 23:20:55 -0800158 int len_t;
r.xiaocd75dcf2024-06-12 20:41:33 -0700159/*
r.xiaoec113d12024-01-12 02:13:28 -0800160 if(!autosleep_enable) {
161 LOGE("Autosleep not enable.");
162 return -1;
163 }
r.xiaocd75dcf2024-06-12 20:41:33 -0700164*/
r.xiaod3256ae2024-02-28 23:20:55 -0800165 len_t = strlen(name);
166
167 if((name != NULL) && (len < 33) && (len_t < 33))
r.xiaoec113d12024-01-12 02:13:28 -0800168 {
169 int i;
r.xiaod3256ae2024-02-28 23:20:55 -0800170 //name
171 for(i=1 ;i<LOCK_MAX_SIZE;i++)
172 {
173 if(strcmp(lynq_lock_name[i].name, name) == 0)
174 {
175 LOGE("Repeated names.");
176 return -1;
177 }
178 }
179
r.xiao7000d212024-01-31 23:45:27 -0800180 for(i=1 ;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800181 {
182 if(lynq_lock_name[i].fd == 0)
183 break;
184 }
r.xiao7000d212024-01-31 23:45:27 -0800185
186 if (i >= LOCK_MAX_SIZE)
187 {
r.xiaob9cf0e62024-02-02 04:11:48 -0800188 LOGE("Fd is full.");
r.xiao7000d212024-01-31 23:45:27 -0800189 return -1;
190 }
191
r.xiaoec113d12024-01-12 02:13:28 -0800192 memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
193 lynq_lock_name[i].fd = i;
r.xiaod3256ae2024-02-28 23:20:55 -0800194 return lynq_lock_name[i].fd -1;//Starting from scratch
r.xiaoec113d12024-01-12 02:13:28 -0800195 }
196 else
197 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800198
r.xiaod3256ae2024-02-28 23:20:55 -0800199 return -1;
b.liu5fa9e772023-11-23 18:00:55 +0800200}
201
202int qser_wakelock_lock(int fd)
203{
r.xiaoec113d12024-01-12 02:13:28 -0800204 //UNUSED(fd);
r.xiaocd75dcf2024-06-12 20:41:33 -0700205/*
r.xiaoec113d12024-01-12 02:13:28 -0800206 if(!autosleep_enable) {
207 LOGE("Autosleep not enable.");
208 return -1;
209 }
r.xiaocd75dcf2024-06-12 20:41:33 -0700210*/
r.xiaoec113d12024-01-12 02:13:28 -0800211 int i;
r.xiao7000d212024-01-31 23:45:27 -0800212 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800213 {
r.xiaod3256ae2024-02-28 23:20:55 -0800214 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800215 break;
216 }
r.xiao7000d212024-01-31 23:45:27 -0800217 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800218 {
219 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800220 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800221 }
r.xiaoec113d12024-01-12 02:13:28 -0800222
223 if(!access("/sys/power/wake_lock", W_OK))
224 {
225 char cmd[128]={0};
226 sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
227 system(cmd);
228 return 0;
229 }
230 else
231 {
r.xiao7000d212024-01-31 23:45:27 -0800232 LOGE("/sys/power/wake_lock can not write.");
r.xiaoec113d12024-01-12 02:13:28 -0800233 return -1;
234 }
b.liu5fa9e772023-11-23 18:00:55 +0800235
236 return 0;
237}
238
239int qser_wakelock_unlock(int fd)
240{
r.xiaoec113d12024-01-12 02:13:28 -0800241 //UNUSED(fd);
r.xiaocd75dcf2024-06-12 20:41:33 -0700242/*
r.xiaoec113d12024-01-12 02:13:28 -0800243 if(!autosleep_enable) {
244 LOGE("Autosleep not enable.");
245 return -1;
246 }
r.xiaocd75dcf2024-06-12 20:41:33 -0700247*/
r.xiaoec113d12024-01-12 02:13:28 -0800248 int i;
r.xiao7000d212024-01-31 23:45:27 -0800249 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800250 {
r.xiaod3256ae2024-02-28 23:20:55 -0800251 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800252 break;
253 }
r.xiao7000d212024-01-31 23:45:27 -0800254 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800255 {
256 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800257 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800258 }
r.xiaoec113d12024-01-12 02:13:28 -0800259
260 if(!access("/sys/power/wake_unlock", W_OK))
261 {
262 char cmd[128]={0};
263 sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
264 system(cmd);
265 return 0;
266 }
267 else
268 {
r.xiao7000d212024-01-31 23:45:27 -0800269 LOGE("/sys/power/wake_unlock can not write.");
r.xiaoec113d12024-01-12 02:13:28 -0800270 return -1;
271 }
b.liu5fa9e772023-11-23 18:00:55 +0800272
273 return 0;
274}
275
276int qser_wakelock_destroy(int fd)
277{
r.xiaoec113d12024-01-12 02:13:28 -0800278 //UNUSED(fd);
r.xiaocd75dcf2024-06-12 20:41:33 -0700279/*
r.xiaoec113d12024-01-12 02:13:28 -0800280 if(!autosleep_enable) {
281 LOGE("Autosleep not enable.");
282 return -1;
283 }
r.xiaocd75dcf2024-06-12 20:41:33 -0700284*/
r.xiaoec113d12024-01-12 02:13:28 -0800285 int i;
r.xiao7000d212024-01-31 23:45:27 -0800286 for(i=1;i<LOCK_MAX_SIZE;i++)
r.xiaoec113d12024-01-12 02:13:28 -0800287 {
r.xiaod3256ae2024-02-28 23:20:55 -0800288 if(lynq_lock_name[i].fd -1 == fd)
r.xiaoec113d12024-01-12 02:13:28 -0800289 break;
290 }
r.xiaod3256ae2024-02-28 23:20:55 -0800291
r.xiao7000d212024-01-31 23:45:27 -0800292 if(i == LOCK_MAX_SIZE)
r.xiaod3256ae2024-02-28 23:20:55 -0800293 {
294 LOGE("LOCK_MAX_SIZE is full\n");
r.xiaoec113d12024-01-12 02:13:28 -0800295 return -1;
r.xiaod3256ae2024-02-28 23:20:55 -0800296 }
r.xiaoec113d12024-01-12 02:13:28 -0800297 else
298 {
299 lynq_lock_name[i].fd = 0;
r.xiaod3256ae2024-02-28 23:20:55 -0800300 memset(lynq_lock_name[i].name, 0, 64);
r.xiaoec113d12024-01-12 02:13:28 -0800301 return 0;
302 }
b.liu5fa9e772023-11-23 18:00:55 +0800303
304 return 0;
305}
306
r.xiaocfd7c682024-01-22 03:59:46 -0800307void *threadFunction(void *arg)
308{
309 int pinValue;
r.xiaoce21a042024-02-03 19:35:19 -0800310 int i;
r.xiao7000d212024-01-31 23:45:27 -0800311 char buf[8] = {0};
312 struct input_event ev_input = { 0 };
313 const int size = sizeof(struct input_event);
r.xiaocfd7c682024-01-22 03:59:46 -0800314
r.xiao7000d212024-01-31 23:45:27 -0800315 epoll_fd_t = epoll_create(2);
316/*
317 struct epoll_event event;
318 memset(&event, 0, sizeof(struct epoll_event));
319 event.events = EPOLLIN | EPOLLET;
320 event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
321
322 fd_t = event.data.fd;
323 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
324 {
325 LOGE("Failed to add GPIO device file.");
326 return NULL;
327 }
328
329 memset(&event, 0, sizeof(struct epoll_event));
330 event.events = EPOLLIN | EPOLLET;
331 event.data.fd = socket_t[0];
332 LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
333
334 if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
335 {
336 LOGE("Failed to add GPIO device file.");
337 return NULL;
338 }
339*/
r.xiao69675c92024-05-31 03:07:00 -0700340
341#if defined(MBTK_SG_SUPPORT)
342 fd_t = open("/dev/input/event1", O_RDONLY);
r.xiao37ed49c2024-08-07 20:11:06 -0700343 LOGI("init pthread_event1");
r.xiao69675c92024-05-31 03:07:00 -0700344#else
r.xiao37ed49c2024-08-07 20:11:06 -0700345 fd_t = open("/dev/input/event2", O_RDONLY);
346 LOGI("init pthread_event2");
r.xiao69675c92024-05-31 03:07:00 -0700347#endif
r.xiao7000d212024-01-31 23:45:27 -0800348
349 sleep_epoll_register(epoll_fd_t, fd_t);
350 sleep_epoll_register(epoll_fd_t, socket_t[1]);
351
352 while (true)
353 {
354 struct epoll_event events[2];
355 struct epoll_event ev;
356 int cmd = 0;
357
358 int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
359
r.xiaoce21a042024-02-03 19:35:19 -0800360 for (i = 0; i < numEvents; ++i)
r.xiao7000d212024-01-31 23:45:27 -0800361 {
362 if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
363 {
364 LOGE("Error on GPIO device.");
365 return NULL;
366 }
367 else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
368 {
369 //handleInterrupt(events[i].data.fd);
370 if (events[i].data.fd == socket_t[1])
371 {
372 memset(buf, 0, sizeof(buf));
373 read(socket_t[1], buf, sizeof(buf));
374 if (1 == atoi(buf))
375 {
376 if(close(fd_t) == 0)
377 LOGI("close(fd_t)ing");
378
379 sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
380 sleep_epoll_deregister(epoll_fd_t, fd_t);
381 /*
382 memset(&ev, 0, sizeof(struct epoll_event));
383 ev.events = EPOLLIN | EPOLLET;
384 ev.data.fd = socket_t[1];
385 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
386
387 memset(&ev, 0, sizeof(struct epoll_event));
388 ev.events = EPOLLIN | EPOLLET;
389 ev.data.fd = fd_t;
390 epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
391 */
392 LOGI("do pthread_exit");
393 return NULL;
394 }
395 }
396 else if (events[i].data.fd == fd_t)
397 {
r.xiao69675c92024-05-31 03:07:00 -0700398 LOGI("go pthread_event");
r.xiao7000d212024-01-31 23:45:27 -0800399 memset(&ev_input, 0x00, size);
400 read(fd_t, &ev_input, size);
401 LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
r.xiao37ed49c2024-08-07 20:11:06 -0700402#if defined(MBTK_SG_SUPPORT)
403 if (ev_input.code == 2)
404 {
405 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
406 pinValue = (int)ev_input.value;
407 edge_t = pinValue;
408 lpm_init.wakehandle(edge_t);
409 }
410#else
411 if (ev_input.type == 4 && ev_input.code == 3)
412 {
413 LOGI(">>>>ev_input.value = [%d]",ev_input.value);
414 pinValue = (int)ev_input.value;
415 edge_t = pinValue;
416 lpm_init.wakehandle(edge_t);
417 }
418#endif
419
r.xiao7000d212024-01-31 23:45:27 -0800420 }
421 else
422 {
423 LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
424 }
425 }
426 }
427 }
r.xiaocfd7c682024-01-22 03:59:46 -0800428 return NULL;
429}
b.liu5fa9e772023-11-23 18:00:55 +0800430
r.xiaoec113d12024-01-12 02:13:28 -0800431int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
432{
r.xiaocfd7c682024-01-22 03:59:46 -0800433 //UNUSED(qser_lpm_handler);
434 //UNUSED(qser_lpm_cfg);
r.xiao7000d212024-01-31 23:45:27 -0800435 if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
436 {
437 LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
r.xiaoec113d12024-01-12 02:13:28 -0800438
r.xiao7000d212024-01-31 23:45:27 -0800439 /*close the control socket pair && Retry again.*/
440 if(socket_t[0] > 0)
441 {
442 close(socket_t[0] );
443 socket_t[0] = -1;
444 }
445
446 if(socket_t[1] > 0)
447 {
448 close(socket_t[1] );
449 socket_t[1] = -1;
450 }
451 return -1;
452 }
r.xiaocfd7c682024-01-22 03:59:46 -0800453 lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
r.xiao7000d212024-01-31 23:45:27 -0800454 LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
r.xiaocfd7c682024-01-22 03:59:46 -0800455 lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
r.xiao7000d212024-01-31 23:45:27 -0800456 LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
r.xiaocfd7c682024-01-22 03:59:46 -0800457 edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
r.xiao7000d212024-01-31 23:45:27 -0800458 lpm_init.wakehandle = qser_lpm_handler;
r.xiaoec113d12024-01-12 02:13:28 -0800459
r.xiao7000d212024-01-31 23:45:27 -0800460 pthread_attr_t thread_attr;
461 pthread_attr_init(&thread_attr);
462
r.xiaocfd7c682024-01-22 03:59:46 -0800463 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
464 {
r.xiao7000d212024-01-31 23:45:27 -0800465 LOGE("pthread_attr_setdetachstate() fail");
r.xiaocfd7c682024-01-22 03:59:46 -0800466 return -1;
467 }
r.xiao7000d212024-01-31 23:45:27 -0800468
469 if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
470 //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
r.xiaocfd7c682024-01-22 03:59:46 -0800471 {
r.xiao7000d212024-01-31 23:45:27 -0800472 LOGE("qser_lpm_init can't create thread");
r.xiaocfd7c682024-01-22 03:59:46 -0800473 return -1;
474 }
r.xiaoec113d12024-01-12 02:13:28 -0800475
r.xiao7000d212024-01-31 23:45:27 -0800476 pthread_attr_destroy(&thread_attr);
r.xiaocfd7c682024-01-22 03:59:46 -0800477
r.xiao7000d212024-01-31 23:45:27 -0800478 //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
479 //qser_lpm_handler(edge_t);
r.xiaoec113d12024-01-12 02:13:28 -0800480
481 return 0;
482}
483
484int qser_lpm_deinit(void)
485{
r.xiao7000d212024-01-31 23:45:27 -0800486 char buf[4]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800487
r.xiao7000d212024-01-31 23:45:27 -0800488 if (fd_t == -1)
489 return 0;
r.xiaocfd7c682024-01-22 03:59:46 -0800490
r.xiao7000d212024-01-31 23:45:27 -0800491 if (fd_t != -1)
r.xiaocfd7c682024-01-22 03:59:46 -0800492 {
r.xiao7000d212024-01-31 23:45:27 -0800493 //char cmd = 1;
494 strcpy(buf, "1");
495 void* dummy = NULL;
496 write( socket_t[0], buf, sizeof(buf) );
497 //pthread_join(lpm_t, &dummy);
498
499 sleep(1);
500 // close the control socket pair
501 if(socket_t[0] > 0)
502 {
503 close(socket_t[0] );
504 socket_t[0] = -1;
505 }
506 if(socket_t[1] > 0)
507 {
508 close(socket_t[1] );
509 socket_t[1] = -1;
510 }
511
512 //重置还原
513 fd_t = -1;
514
r.xiaocfd7c682024-01-22 03:59:46 -0800515 }
516
r.xiaoec113d12024-01-12 02:13:28 -0800517 return 0;
518}
519
520/*
521例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
522其中PS DATA目前暂时不支持,只是保留了这个标志位;
523AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
5240 means resume all.
525目标文件"/system/etc/powerind"
526如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
527
r.xiaoec113d12024-01-12 02:13:28 -0800528*/
529
530int qser_whitelist_set(char* whitelish)
531{
532 //UNUSED(whitelish);
533 uint32 on = 0;
534 int call_t, nw_t, data_t, sms_t, tmp;
535
536 int len = strlen(whitelish);
537
538 if (len != 4)
539 {
r.xiao7000d212024-01-31 23:45:27 -0800540 LOGE("whitelish num error num=[%d]",len);
r.xiaocfd7c682024-01-22 03:59:46 -0800541 return -1;
r.xiaoec113d12024-01-12 02:13:28 -0800542 }
543
544 tmp = atoi(whitelish);
545
546 call_t = tmp/1000;
547 nw_t = tmp%1000/100;
548 data_t = tmp%1000%100/10;
549 sms_t = tmp%1000%100%10;
550
551 if (call_t == 1)
552 call_Off = TRUE;
553 else
554 call_Off = FALSE;
555
556 if (nw_t == 1)
557 nw_off = TRUE;
558 else
559 nw_off = FALSE;
560
561 if (data_t == 1)
562 data_off = TRUE;
563 else
564 data_off = FALSE;
565
566 if (sms_t == 1)
567 sms_off = TRUE;
568 else
569 sms_off = FALSE;
570
571 if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
572 {
r.xiao7000d212024-01-31 23:45:27 -0800573 on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800574 }
575 else
576 {
577 if (call_Off == TRUE)
578 call_t = 8;
579 else
580 call_t = 0;
581
582 if (nw_off == TRUE)
583 nw_t = 1;
584 else
585 nw_t = 0;
586
587 if (data_off == TRUE)
588 data_t = 16;
589 else
590 data_t = 0;
591
592 if (sms_off == TRUE)
593 sms_t = 4;
594 else
595 sms_t = 0;
596
r.xiao7000d212024-01-31 23:45:27 -0800597 on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
r.xiaoec113d12024-01-12 02:13:28 -0800598 }
599
600 if(whitelist_info_handle == NULL)
601 {
602 whitelist_info_handle = mbtk_info_handle_get();
603 if(whitelist_info_handle)
604 {
r.xiao7000d212024-01-31 23:45:27 -0800605 LOGI("creat whitelist_info_handle is success");
r.xiaoec113d12024-01-12 02:13:28 -0800606 }
607 else
608 {
r.xiao7000d212024-01-31 23:45:27 -0800609 LOGE("creat whitelist_info_handle is fail");
r.xiaoec113d12024-01-12 02:13:28 -0800610 return -1;
611 }
612 }
613
614 int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
615 if(err)
616 {
r.xiao7000d212024-01-31 23:45:27 -0800617 LOGE("whitelist_info_handle Error : %d", err);
r.xiaoec113d12024-01-12 02:13:28 -0800618 return -1;
619 }
r.xiaoec113d12024-01-12 02:13:28 -0800620
621 return 0;
622}
623
624
625int qser_whitelist_get(char* whitelish)
626{
627 //UNUSED(whitelish);
r.xiaocfd7c682024-01-22 03:59:46 -0800628 char list[10]={0};
r.xiaoec113d12024-01-12 02:13:28 -0800629 int call_t, nw_t, data_t, sms_t;
r.xiao7000d212024-01-31 23:45:27 -0800630 int get_tmp;
r.xiaoec113d12024-01-12 02:13:28 -0800631
r.xiao7000d212024-01-31 23:45:27 -0800632 get_tmp = powerrind_get();
633 //LOGI(">>>get_tmp: %d",get_tmp);
r.xiaoec113d12024-01-12 02:13:28 -0800634
r.xiao7000d212024-01-31 23:45:27 -0800635 //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
636 switch(get_tmp)
637 {
638 case 0:
639 sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
640 break;
641 case 8:
642 sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
643 break;
644 case 1:
645 sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
646 break;
647 case 16:
648 sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
649 break;
650 case 4:
651 sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
652 break;
653
654 case 9:
655 sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
656 break;
657 case 24:
658 sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
659 break;
660 case 12:
661 sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
662 break;
663 case 17:
664 sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
665 break;
666 case 5:
667 sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
668 break;
669 case 20:
670 sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
671 break;
672
673 case 25:
674 sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
675 break;
676 case 13:
677 sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
678 break;
679 case 28:
680 sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
681 break;
682 case 21:
683 sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
684 break;
685
686 case 29:
687 sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
688 break;
689
690 default :
691 LOGE("qser_whitelist_get is error");
692 break;
693 }
694
695 //LOGI(">>>get list: %s",list);
r.xiaocfd7c682024-01-22 03:59:46 -0800696 strncpy(whitelish, list, strlen(list));
r.xiaoec113d12024-01-12 02:13:28 -0800697
698 if(whitelist_info_handle != NULL)
699 {
700 mbtk_info_handle_free(&whitelist_info_handle);
r.xiao7000d212024-01-31 23:45:27 -0800701 LOGI("deinit whitelist_info_handle is succuess");
r.xiaoec113d12024-01-12 02:13:28 -0800702 }
703
704 return 0;
705}
706