add_suspend_timer
Change-Id: I08ff7fba743466ef3460f2c2406d61e18723621f
diff --git a/mbtk/liblynq_lib/src/lynq_sleep.c b/mbtk/liblynq_lib/src/lynq_sleep.c
old mode 100755
new mode 100644
index a293fd5..0741ab5
--- a/mbtk/liblynq_lib/src/lynq_sleep.c
+++ b/mbtk/liblynq_lib/src/lynq_sleep.c
@@ -1,706 +1,813 @@
-#include "lynq-qser-autosuspend.h"
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stddef.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/epoll.h>
-#include <linux/input.h>
-
-#include "mbtk_type.h"
-#include "mbtk_log.h"
-#include "mbtk_info_api.h"
-#include "mbtk_power.h"
-
-/*
-This module is system sleep, the system cannot sleep when the lock exists
-To verify whether it is in sleep state, it is necessary to test the power consumption
-Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state
-So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep
-*/
-#if defined(MBTK_PLATFORM_KERNEL_5)
-#define MTBK_POWERIND "/system/etc/powerind" //1806
-#elif defined(MBTK_PLATFORM_KERNEL_3)
-#define MTBK_POWERIND "/etc/powerind" //1803
-#endif
-
-static bool call_Off = FALSE;
-static bool nw_off = FALSE;
-static bool sms_off = FALSE;
-static bool data_off = FALSE;
-
-static pthread_t lpm_t;
-static int edge_t = 0;
-static int epoll_fd_t = -1;
-static int fd_t = -1;
-static int socket_t[2];
-
-typedef struct{
- qser_lpm_wakeupin_data_t wakeupin;
- qser_lpm_wakeupout_data_t wakeupout;
- qser_lpm_Handler_t wakehandle;
-}lynq_wake_t;
-
-static lynq_wake_t lpm_init;
-
-
-typedef struct
+#include "lynq-qser-autosuspend.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/epoll.h>
+#include <linux/input.h>
+
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+#include "mbtk_info_api.h"
+#include "mbtk_power.h"
+
+/*
+This module is system sleep, the system cannot sleep when the lock exists
+To verify whether it is in sleep state, it is necessary to test the power consumption
+Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state
+So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep
+*/
+#if defined(MBTK_PLATFORM_KERNEL_5)
+#define MTBK_POWERIND "/system/etc/powerind" //1806
+#elif defined(MBTK_PLATFORM_KERNEL_3)
+#define MTBK_POWERIND "/etc/powerind" //1803
+#endif
+
+static bool call_Off = FALSE;
+static bool nw_off = FALSE;
+static bool sms_off = FALSE;
+static bool data_off = FALSE;
+
+static pthread_t lpm_t;
+static int edge_t = 0;
+static int epoll_fd_t = -1;
+static int fd_t = -1;
+static int socket_t[2];
+
+typedef struct{
+ qser_lpm_wakeupin_data_t wakeupin;
+ qser_lpm_wakeupout_data_t wakeupout;
+ qser_lpm_Handler_t wakehandle;
+}lynq_wake_t;
+
+static lynq_wake_t lpm_init;
+
+
+typedef struct
+{
+ int fd;
+ char name[64];
+} lock_name;
+
+#define LOCK_MAX_SIZE 129
+
+lock_name lynq_lock_name[LOCK_MAX_SIZE]={0};
+static bool autosleep_enable = FALSE;
+
+static mbtk_info_handle_t* whitelist_info_handle = NULL;
+
+
+#define EPOLL_SIZE_HINT 128
+int mEpollFd = -1;
+mbtk_info_callback_func g_sleep_timer_cb;
+
+
+
+static int powerrind_get()
+{
+ char buffer[4];
+ int ret = 0;
+
+ int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
+ if (fd != -1)
+ {
+ read(fd, buffer, strlen(buffer)+1);
+ close(fd);
+ }
+
+ ret = atoi(buffer);
+
+ return ret;
+}
+
+#if 1
+static int sleep_epoll_deregister(int epoll_fd,int fd )
+{
+ int ret;
+ do {
+ ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
+ } while (ret < 0 && errno == EINTR);
+ return ret;
+}
+
+static int sleep_epoll_register(int epoll_fd, int fd)
+{
+ struct epoll_event ev;
+ int ret, flags;
+
+ /* important: make the fd non-blocking */
+ flags = fcntl(fd, F_GETFL);
+ fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+
+ ev.events = EPOLLIN;
+ ev.data.fd = fd;
+ do {
+ ret = epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &ev );
+ } while (ret < 0 && errno == EINTR);
+
+ return ret;
+}
+#endif
+
+int qser_autosuspend_enable(char enable)
+{
+ //UNUSED(enable);
+
+ if((enable == 1) || enable == '1')
+ {
+ //if(!mbtk_system_sleep())
+ if(!access("/sys/power/autosleep", W_OK))
+ {
+ system("echo mem > /sys/power/autosleep");
+ autosleep_enable = TRUE;
+ return 0;
+ }
+ else
+ {
+ LOGE("/sys/power/autosleep can not write.");
+ return -1;
+ }
+ }
+ else if((enable == 0) || enable == '0')
+ {
+ if(!access("/sys/power/autosleep", W_OK))
+ {
+ system("echo off > /sys/power/autosleep");
+ autosleep_enable = FALSE;
+ return 0;
+ }
+ else
+ {
+ LOGE("/sys/power/autosleep can not write.");
+ return -1;
+ }
+ }
+ else
+ {
+ LOGE("qser_autosuspend_enablecan enable err.");
+ return -1;
+ }
+
+ return 0;
+}
+
+int qser_wakelock_create(const char* name , size_t len)
+{
+ //UNUSED(name);
+ //UNUSED(len);
+ int len_t;
+/*
+ if(!autosleep_enable) {
+ LOGE("Autosleep not enable.");
+ return -1;
+ }
+*/
+ len_t = strlen(name);
+
+ if((name != NULL) && (len < 33) && (len_t < 33))
+ {
+ int i;
+ //name
+ for(i=1 ;i<LOCK_MAX_SIZE;i++)
+ {
+ if(strcmp(lynq_lock_name[i].name, name) == 0)
+ {
+ LOGE("Repeated names.");
+ return -1;
+ }
+ }
+
+ for(i=1 ;i<LOCK_MAX_SIZE;i++)
+ {
+ if(lynq_lock_name[i].fd == 0)
+ break;
+ }
+
+ if (i >= LOCK_MAX_SIZE)
+ {
+ LOGE("Fd is full.");
+ return -1;
+ }
+
+ memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
+ lynq_lock_name[i].fd = i;
+ return lynq_lock_name[i].fd -1;//Starting from scratch
+ }
+ else
+ return -1;
+
+ return -1;
+}
+
+int qser_wakelock_lock(int fd)
+{
+ //UNUSED(fd);
+/*
+ if(!autosleep_enable) {
+ LOGE("Autosleep not enable.");
+ return -1;
+ }
+*/
+ int i;
+ for(i=1;i<LOCK_MAX_SIZE;i++)
+ {
+ if(lynq_lock_name[i].fd -1 == fd)
+ break;
+ }
+ if(i == LOCK_MAX_SIZE)
+ {
+ LOGE("LOCK_MAX_SIZE is full\n");
+ return -1;
+ }
+
+ if(!access("/sys/power/wake_lock", W_OK))
+ {
+ char cmd[128]={0};
+ sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
+ system(cmd);
+ return 0;
+ }
+ else
+ {
+ LOGE("/sys/power/wake_lock can not write.");
+ return -1;
+ }
+
+ return 0;
+}
+
+int qser_wakelock_unlock(int fd)
+{
+ //UNUSED(fd);
+/*
+ if(!autosleep_enable) {
+ LOGE("Autosleep not enable.");
+ return -1;
+ }
+*/
+ int i;
+ for(i=1;i<LOCK_MAX_SIZE;i++)
+ {
+ if(lynq_lock_name[i].fd -1 == fd)
+ break;
+ }
+ if(i == LOCK_MAX_SIZE)
+ {
+ LOGE("LOCK_MAX_SIZE is full\n");
+ return -1;
+ }
+
+ if(!access("/sys/power/wake_unlock", W_OK))
+ {
+ char cmd[128]={0};
+ sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
+ system(cmd);
+ return 0;
+ }
+ else
+ {
+ LOGE("/sys/power/wake_unlock can not write.");
+ return -1;
+ }
+
+ return 0;
+}
+
+int qser_wakelock_destroy(int fd)
+{
+ //UNUSED(fd);
+/*
+ if(!autosleep_enable) {
+ LOGE("Autosleep not enable.");
+ return -1;
+ }
+*/
+ int i;
+ for(i=1;i<LOCK_MAX_SIZE;i++)
+ {
+ if(lynq_lock_name[i].fd -1 == fd)
+ break;
+ }
+
+ if(i == LOCK_MAX_SIZE)
+ {
+ LOGE("LOCK_MAX_SIZE is full\n");
+ return -1;
+ }
+ else
+ {
+ lynq_lock_name[i].fd = 0;
+ memset(lynq_lock_name[i].name, 0, 64);
+ return 0;
+ }
+
+ return 0;
+}
+
+void *threadFunction(void *arg)
+{
+ int pinValue;
+ int i;
+ char buf[8] = {0};
+ struct input_event ev_input = { 0 };
+ const int size = sizeof(struct input_event);
+
+ epoll_fd_t = epoll_create(2);
+/*
+ struct epoll_event event;
+ memset(&event, 0, sizeof(struct epoll_event));
+ event.events = EPOLLIN | EPOLLET;
+ event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
+
+ fd_t = event.data.fd;
+ if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
+ {
+ LOGE("Failed to add GPIO device file.");
+ return NULL;
+ }
+
+ memset(&event, 0, sizeof(struct epoll_event));
+ event.events = EPOLLIN | EPOLLET;
+ event.data.fd = socket_t[0];
+ LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
+
+ if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
+ {
+ LOGE("Failed to add GPIO device file.");
+ return NULL;
+ }
+*/
+
+#if defined(MBTK_SG_SUPPORT)
+ fd_t = open("/dev/input/event1", O_RDONLY);
+ LOGI("init pthread_event1");
+#else
+ fd_t = open("/dev/input/event2", O_RDONLY);
+ LOGI("init pthread_event2");
+#endif
+
+ sleep_epoll_register(epoll_fd_t, fd_t);
+ sleep_epoll_register(epoll_fd_t, socket_t[1]);
+
+ while (true)
+ {
+ struct epoll_event events[2];
+ struct epoll_event ev;
+ int cmd = 0;
+
+ int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
+
+ for (i = 0; i < numEvents; ++i)
+ {
+ if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
+ {
+ LOGE("Error on GPIO device.");
+ return NULL;
+ }
+ else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
+ {
+ //handleInterrupt(events[i].data.fd);
+ if (events[i].data.fd == socket_t[1])
+ {
+ memset(buf, 0, sizeof(buf));
+ read(socket_t[1], buf, sizeof(buf));
+ if (1 == atoi(buf))
+ {
+ if(close(fd_t) == 0)
+ LOGI("close(fd_t)ing");
+
+ sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
+ sleep_epoll_deregister(epoll_fd_t, fd_t);
+ /*
+ memset(&ev, 0, sizeof(struct epoll_event));
+ ev.events = EPOLLIN | EPOLLET;
+ ev.data.fd = socket_t[1];
+ epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
+
+ memset(&ev, 0, sizeof(struct epoll_event));
+ ev.events = EPOLLIN | EPOLLET;
+ ev.data.fd = fd_t;
+ epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
+ */
+ LOGI("do pthread_exit");
+ return NULL;
+ }
+ }
+ else if (events[i].data.fd == fd_t)
+ {
+ LOGI("go pthread_event");
+ memset(&ev_input, 0x00, size);
+ read(fd_t, &ev_input, size);
+ LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
+#if defined(MBTK_SG_SUPPORT)
+ if (ev_input.code == 2)
+ {
+ LOGI(">>>>ev_input.value = [%d]",ev_input.value);
+ pinValue = (int)ev_input.value;
+ edge_t = pinValue;
+ lpm_init.wakehandle(edge_t);
+ }
+#else
+ if (ev_input.type == 4 && ev_input.code == 3)
+ {
+ LOGI(">>>>ev_input.value = [%d]",ev_input.value);
+ pinValue = (int)ev_input.value;
+ edge_t = pinValue;
+ lpm_init.wakehandle(edge_t);
+ }
+#endif
+
+ }
+ else
+ {
+ LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
+{
+ //UNUSED(qser_lpm_handler);
+ //UNUSED(qser_lpm_cfg);
+ if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
+ {
+ LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
+
+ /*close the control socket pair && Retry again.*/
+ if(socket_t[0] > 0)
+ {
+ close(socket_t[0] );
+ socket_t[0] = -1;
+ }
+
+ if(socket_t[1] > 0)
+ {
+ close(socket_t[1] );
+ socket_t[1] = -1;
+ }
+ return -1;
+ }
+ lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
+ LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
+ lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
+ LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
+ edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
+ lpm_init.wakehandle = qser_lpm_handler;
+
+ pthread_attr_t thread_attr;
+ pthread_attr_init(&thread_attr);
+
+ if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+ {
+ LOGE("pthread_attr_setdetachstate() fail");
+ return -1;
+ }
+
+ if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
+ //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
+ {
+ LOGE("qser_lpm_init can't create thread");
+ return -1;
+ }
+
+ pthread_attr_destroy(&thread_attr);
+
+ //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
+ //qser_lpm_handler(edge_t);
+
+ return 0;
+}
+
+int qser_lpm_deinit(void)
+{
+ char buf[4]={0};
+
+ if (fd_t == -1)
+ return 0;
+
+ if (fd_t != -1)
+ {
+ //char cmd = 1;
+ strcpy(buf, "1");
+ void* dummy = NULL;
+ write( socket_t[0], buf, sizeof(buf) );
+ //pthread_join(lpm_t, &dummy);
+
+ sleep(1);
+ // close the control socket pair
+ if(socket_t[0] > 0)
+ {
+ close(socket_t[0] );
+ socket_t[0] = -1;
+ }
+ if(socket_t[1] > 0)
+ {
+ close(socket_t[1] );
+ socket_t[1] = -1;
+ }
+
+ //重置还原
+ fd_t = -1;
+
+ }
+
+ return 0;
+}
+
+/*
+例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
+其中PS DATA目前暂时不支持,只是保留了这个标志位;
+AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
+0 means resume all.
+目标文件"/system/etc/powerind"
+如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
+
+*/
+
+int qser_whitelist_set(char* whitelish)
+{
+ //UNUSED(whitelish);
+ uint32 on = 0;
+ int call_t, nw_t, data_t, sms_t, tmp;
+
+ int len = strlen(whitelish);
+
+ if (len != 4)
+ {
+ LOGE("whitelish num error num=[%d]",len);
+ return -1;
+ }
+
+ tmp = atoi(whitelish);
+
+ call_t = tmp/1000;
+ nw_t = tmp%1000/100;
+ data_t = tmp%1000%100/10;
+ sms_t = tmp%1000%100%10;
+
+ if (call_t == 1)
+ call_Off = TRUE;
+ else
+ call_Off = FALSE;
+
+ if (nw_t == 1)
+ nw_off = TRUE;
+ else
+ nw_off = FALSE;
+
+ if (data_t == 1)
+ data_off = TRUE;
+ else
+ data_off = FALSE;
+
+ if (sms_t == 1)
+ sms_off = TRUE;
+ else
+ sms_off = FALSE;
+
+ if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
+ {
+ on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
+ }
+ else
+ {
+ if (call_Off == TRUE)
+ call_t = 8;
+ else
+ call_t = 0;
+
+ if (nw_off == TRUE)
+ nw_t = 1;
+ else
+ nw_t = 0;
+
+ if (data_off == TRUE)
+ data_t = 16;
+ else
+ data_t = 0;
+
+ if (sms_off == TRUE)
+ sms_t = 4;
+ else
+ sms_t = 0;
+
+ on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
+ }
+
+ if(whitelist_info_handle == NULL)
+ {
+ whitelist_info_handle = mbtk_info_handle_get();
+ if(whitelist_info_handle)
+ {
+ LOGI("creat whitelist_info_handle is success");
+ }
+ else
+ {
+ LOGE("creat whitelist_info_handle is fail");
+ return -1;
+ }
+ }
+
+ int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
+ if(err)
+ {
+ LOGE("whitelist_info_handle Error : %d", err);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int qser_whitelist_get(char* whitelish)
+{
+ //UNUSED(whitelish);
+ char list[10]={0};
+ int call_t, nw_t, data_t, sms_t;
+ int get_tmp;
+
+ get_tmp = powerrind_get();
+ //LOGI(">>>get_tmp: %d",get_tmp);
+
+ //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
+ switch(get_tmp)
+ {
+ case 0:
+ sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
+ break;
+ case 8:
+ sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
+ break;
+ case 1:
+ sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
+ break;
+ case 16:
+ sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
+ break;
+ case 4:
+ sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
+ break;
+
+ case 9:
+ sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
+ break;
+ case 24:
+ sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
+ break;
+ case 12:
+ sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
+ break;
+ case 17:
+ sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
+ break;
+ case 5:
+ sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
+ break;
+ case 20:
+ sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
+ break;
+
+ case 25:
+ sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
+ break;
+ case 13:
+ sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
+ break;
+ case 28:
+ sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
+ break;
+ case 21:
+ sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
+ break;
+
+ case 29:
+ sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
+ break;
+
+ default :
+ LOGE("qser_whitelist_get is error");
+ break;
+ }
+
+ //LOGI(">>>get list: %s",list);
+ strncpy(whitelish, list, strlen(list));
+
+ if(whitelist_info_handle != NULL)
+ {
+ mbtk_info_handle_free(&whitelist_info_handle);
+ LOGI("deinit whitelist_info_handle is succuess");
+ }
+
+ return 0;
+}
+
+static void* suspend_timer_thread_run(void* arg)
{
- int fd;
- char name[64];
-} lock_name;
-
-#define LOCK_MAX_SIZE 129
-
-lock_name lynq_lock_name[LOCK_MAX_SIZE]={0};
-static bool autosleep_enable = FALSE;
-
-static mbtk_info_handle_t* whitelist_info_handle = NULL;
-
-static int powerrind_get()
-{
- char buffer[4];
- int ret = 0;
-
- int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
- if (fd != -1)
- {
- read(fd, buffer, strlen(buffer)+1);
- close(fd);
+ struct epoll_event eventItems[EPOLL_SIZE_HINT];
+ int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_SIZE_HINT, -1);
+
+ int timerFd = -1;
+ int eventIndex = 0;
+ uint64_t readCounter;
+
+ if (eventCount < 0) {
+ LOGE("Poll failed with an unexpected error: %s\n", strerror(errno));
+ return -1;
}
-
- ret = atoi(buffer);
-
- return ret;
-}
-
-#if 1
-static int sleep_epoll_deregister(int epoll_fd,int fd )
-{
- int ret;
- do {
- ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
- } while (ret < 0 && errno == EINTR);
- return ret;
-}
-
-static int sleep_epoll_register(int epoll_fd, int fd)
-{
- struct epoll_event ev;
- int ret, flags;
-
- /* important: make the fd non-blocking */
- flags = fcntl(fd, F_GETFL);
- fcntl(fd, F_SETFL, flags | O_NONBLOCK);
-
- ev.events = EPOLLIN;
- ev.data.fd = fd;
- do {
- ret = epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &ev );
- } while (ret < 0 && errno == EINTR);
+
+ for (; eventIndex < eventCount; ++eventIndex) {
+ timerFd = eventItems[eventIndex].data.fd;
+
+ int retRead = read(timerFd, &readCounter, sizeof(uint64_t));
+ if (retRead < 0) {
+ LOGE("read %d failed...\n", timerFd);
+
+ continue;
+ } else {
+
+ g_sleep_timer_cb(NULL, 0);
+ qser_autosuspend_enable(0);
+ LOGI("suspend_timer_success\n");
+ }
+ }
- return ret;
-}
-#endif
-
-int qser_autosuspend_enable(char enable)
-{
- //UNUSED(enable);
-
- if((enable == 1) || enable == '1')
- {
- //if(!mbtk_system_sleep())
- if(!access("/sys/power/autosleep", W_OK))
- {
- system("echo mem > /sys/power/autosleep");
- autosleep_enable = TRUE;
- return 0;
- }
- else
- {
- LOGE("/sys/power/autosleep can not write.");
- return -1;
- }
- }
- else if((enable == 0) || enable == '0')
- {
- if(!access("/sys/power/autosleep", W_OK))
- {
- system("echo off > /sys/power/autosleep");
- autosleep_enable = FALSE;
- return 0;
- }
- else
- {
- LOGE("/sys/power/autosleep can not write.");
- return -1;
- }
- }
- else
- {
- LOGE("qser_autosuspend_enablecan enable err.");
- return -1;
- }
-
return 0;
-}
-
-int qser_wakelock_create(const char* name , size_t len)
-{
- //UNUSED(name);
- //UNUSED(len);
- int len_t;
-/*
- if(!autosleep_enable) {
- LOGE("Autosleep not enable.");
- return -1;
- }
-*/
- len_t = strlen(name);
-
- if((name != NULL) && (len < 33) && (len_t < 33))
- {
- int i;
- //name
- for(i=1 ;i<LOCK_MAX_SIZE;i++)
- {
- if(strcmp(lynq_lock_name[i].name, name) == 0)
- {
- LOGE("Repeated names.");
- return -1;
- }
- }
-
- for(i=1 ;i<LOCK_MAX_SIZE;i++)
- {
- if(lynq_lock_name[i].fd == 0)
- break;
- }
-
- if (i >= LOCK_MAX_SIZE)
- {
- LOGE("Fd is full.");
- return -1;
- }
-
- memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
- lynq_lock_name[i].fd = i;
- return lynq_lock_name[i].fd -1;//Starting from scratch
- }
- else
- return -1;
-
- return -1;
-}
-
-int qser_wakelock_lock(int fd)
-{
- //UNUSED(fd);
-/*
- if(!autosleep_enable) {
- LOGE("Autosleep not enable.");
- return -1;
- }
-*/
- int i;
- for(i=1;i<LOCK_MAX_SIZE;i++)
- {
- if(lynq_lock_name[i].fd -1 == fd)
- break;
- }
- if(i == LOCK_MAX_SIZE)
- {
- LOGE("LOCK_MAX_SIZE is full\n");
- return -1;
- }
-
- if(!access("/sys/power/wake_lock", W_OK))
- {
- char cmd[128]={0};
- sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
- system(cmd);
+}
+
+
+
+int suspend_timer_timer_init(void)
+{
+ int ret = -1;
+
+
+ pthread_attr_t thread_attr;
+ pthread_t net_led_thread_id;
+ pthread_t status_led_thread_id;
+ pthread_attr_init(&thread_attr);
+ if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+ {
+ LOGE("[suspend] pthread_attr_setdetachstate() fail.");
+ return -1;
+ }
+
+ if(pthread_create(&net_led_thread_id, &thread_attr, suspend_timer_thread_run, NULL))
+ {
+ LOGE("[suspend] pthread_create() fail.");
+ return -1;
+ }
+
+ pthread_attr_destroy(&thread_attr);
+ return 0;
+}
+
+
+int qser_suspend_timer_set(int time, mbtk_info_callback_func cb)
+{
+ mEpollFd = epoll_create(EPOLL_SIZE_HINT);
+
+ int fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
+ if (fd < 0) {
+ LOGE("Could not create timer fd: %s\n", strerror(errno));
return 0;
}
- else
- {
- LOGE("/sys/power/wake_lock can not write.");
- return -1;
- }
-
- return 0;
-}
-
-int qser_wakelock_unlock(int fd)
-{
- //UNUSED(fd);
-/*
- if(!autosleep_enable) {
- LOGE("Autosleep not enable.");
- return -1;
- }
-*/
- int i;
- for(i=1;i<LOCK_MAX_SIZE;i++)
- {
- if(lynq_lock_name[i].fd -1 == fd)
- break;
- }
- if(i == LOCK_MAX_SIZE)
- {
- LOGE("LOCK_MAX_SIZE is full\n");
- return -1;
- }
-
- if(!access("/sys/power/wake_unlock", W_OK))
- {
- char cmd[128]={0};
- sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
- system(cmd);
+
+ struct itimerspec timerSet;
+ timerSet.it_interval.tv_sec = 0;
+ timerSet.it_interval.tv_nsec = 0;
+ timerSet.it_value.tv_sec = time;
+ timerSet.it_value.tv_nsec = 0;
+ if (timerfd_settime(fd, 0, &timerSet, NULL) != 0) {
+ LOGE("timerfd_settime failed: %s\n", strerror(errno));
+ close(fd);
return 0;
}
- else
- {
- LOGE("/sys/power/wake_unlock can not write.");
- return -1;
+
+ struct epoll_event eventItem;
+ memset(&eventItem, 0, sizeof(eventItem));
+ eventItem.events = EPOLLIN | EPOLLET;
+ eventItem.data.fd = fd;
+ int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
+ if (result != 0) {
+ LOGE("Could not add timer fd(%d) to epoll instance: %s\n", fd, strerror(errno));
}
-
- return 0;
-}
-
-int qser_wakelock_destroy(int fd)
-{
- //UNUSED(fd);
-/*
- if(!autosleep_enable) {
- LOGE("Autosleep not enable.");
- return -1;
- }
-*/
- int i;
- for(i=1;i<LOCK_MAX_SIZE;i++)
- {
- if(lynq_lock_name[i].fd -1 == fd)
- break;
- }
-
- if(i == LOCK_MAX_SIZE)
- {
- LOGE("LOCK_MAX_SIZE is full\n");
- return -1;
- }
- else
- {
- lynq_lock_name[i].fd = 0;
- memset(lynq_lock_name[i].name, 0, 64);
- return 0;
- }
-
- return 0;
-}
-
-void *threadFunction(void *arg)
-{
- int pinValue;
- int i;
- char buf[8] = {0};
- struct input_event ev_input = { 0 };
- const int size = sizeof(struct input_event);
-
- epoll_fd_t = epoll_create(2);
-/*
- struct epoll_event event;
- memset(&event, 0, sizeof(struct epoll_event));
- event.events = EPOLLIN | EPOLLET;
- event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
-
- fd_t = event.data.fd;
- if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
- {
- LOGE("Failed to add GPIO device file.");
- return NULL;
- }
-
- memset(&event, 0, sizeof(struct epoll_event));
- event.events = EPOLLIN | EPOLLET;
- event.data.fd = socket_t[0];
- LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
-
- if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
- {
- LOGE("Failed to add GPIO device file.");
- return NULL;
- }
-*/
-
-#if defined(MBTK_SG_SUPPORT)
- fd_t = open("/dev/input/event1", O_RDONLY);
- LOGI("init pthread_event1");
-#else
- fd_t = open("/dev/input/event2", O_RDONLY);
- LOGI("init pthread_event2");
-#endif
-
- sleep_epoll_register(epoll_fd_t, fd_t);
- sleep_epoll_register(epoll_fd_t, socket_t[1]);
-
- while (true)
- {
- struct epoll_event events[2];
- struct epoll_event ev;
- int cmd = 0;
-
- int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
-
- for (i = 0; i < numEvents; ++i)
- {
- if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
- {
- LOGE("Error on GPIO device.");
- return NULL;
- }
- else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
- {
- //handleInterrupt(events[i].data.fd);
- if (events[i].data.fd == socket_t[1])
- {
- memset(buf, 0, sizeof(buf));
- read(socket_t[1], buf, sizeof(buf));
- if (1 == atoi(buf))
- {
- if(close(fd_t) == 0)
- LOGI("close(fd_t)ing");
-
- sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
- sleep_epoll_deregister(epoll_fd_t, fd_t);
- /*
- memset(&ev, 0, sizeof(struct epoll_event));
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = socket_t[1];
- epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
-
- memset(&ev, 0, sizeof(struct epoll_event));
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = fd_t;
- epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
- */
- LOGI("do pthread_exit");
- return NULL;
- }
- }
- else if (events[i].data.fd == fd_t)
- {
- LOGI("go pthread_event");
- memset(&ev_input, 0x00, size);
- read(fd_t, &ev_input, size);
- LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
-#if defined(MBTK_SG_SUPPORT)
- if (ev_input.code == 2)
- {
- LOGI(">>>>ev_input.value = [%d]",ev_input.value);
- pinValue = (int)ev_input.value;
- edge_t = pinValue;
- lpm_init.wakehandle(edge_t);
- }
-#else
- if (ev_input.type == 4 && ev_input.code == 3)
- {
- LOGI(">>>>ev_input.value = [%d]",ev_input.value);
- pinValue = (int)ev_input.value;
- edge_t = pinValue;
- lpm_init.wakehandle(edge_t);
- }
-#endif
-
- }
- else
- {
- LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
- }
- }
- }
- }
- return NULL;
-}
-
-int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
-{
- //UNUSED(qser_lpm_handler);
- //UNUSED(qser_lpm_cfg);
- if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 )
- {
- LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
-
- /*close the control socket pair && Retry again.*/
- if(socket_t[0] > 0)
- {
- close(socket_t[0] );
- socket_t[0] = -1;
- }
-
- if(socket_t[1] > 0)
- {
- close(socket_t[1] );
- socket_t[1] = -1;
- }
- return -1;
- }
- lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
- LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
- lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
- LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
- edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
- lpm_init.wakehandle = qser_lpm_handler;
-
- pthread_attr_t thread_attr;
- pthread_attr_init(&thread_attr);
-
- if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
- {
- LOGE("pthread_attr_setdetachstate() fail");
- return -1;
- }
-
- if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
- //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
- {
- LOGE("qser_lpm_init can't create thread");
- return -1;
- }
-
- pthread_attr_destroy(&thread_attr);
-
- //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
- //qser_lpm_handler(edge_t);
-
- return 0;
-}
-
-int qser_lpm_deinit(void)
-{
- char buf[4]={0};
-
- if (fd_t == -1)
- return 0;
-
- if (fd_t != -1)
- {
- //char cmd = 1;
- strcpy(buf, "1");
- void* dummy = NULL;
- write( socket_t[0], buf, sizeof(buf) );
- //pthread_join(lpm_t, &dummy);
-
- sleep(1);
- // close the control socket pair
- if(socket_t[0] > 0)
- {
- close(socket_t[0] );
- socket_t[0] = -1;
- }
- if(socket_t[1] > 0)
- {
- close(socket_t[1] );
- socket_t[1] = -1;
- }
-
- //重置还原
- fd_t = -1;
-
- }
-
- return 0;
-}
-
-/*
-例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
-其中PS DATA目前暂时不支持,只是保留了这个标志位;
-AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
-0 means resume all.
-目标文件"/system/etc/powerind"
-如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
-
-*/
-
-int qser_whitelist_set(char* whitelish)
-{
- //UNUSED(whitelish);
- uint32 on = 0;
- int call_t, nw_t, data_t, sms_t, tmp;
-
- int len = strlen(whitelish);
-
- if (len != 4)
- {
- LOGE("whitelish num error num=[%d]",len);
- return -1;
- }
-
- tmp = atoi(whitelish);
-
- call_t = tmp/1000;
- nw_t = tmp%1000/100;
- data_t = tmp%1000%100/10;
- sms_t = tmp%1000%100%10;
-
- if (call_t == 1)
- call_Off = TRUE;
- else
- call_Off = FALSE;
-
- if (nw_t == 1)
- nw_off = TRUE;
- else
- nw_off = FALSE;
-
- if (data_t == 1)
- data_off = TRUE;
- else
- data_off = FALSE;
-
- if (sms_t == 1)
- sms_off = TRUE;
- else
- sms_off = FALSE;
-
- if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
- {
- on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
- }
- else
- {
- if (call_Off == TRUE)
- call_t = 8;
- else
- call_t = 0;
-
- if (nw_off == TRUE)
- nw_t = 1;
- else
- nw_t = 0;
-
- if (data_off == TRUE)
- data_t = 16;
- else
- data_t = 0;
-
- if (sms_off == TRUE)
- sms_t = 4;
- else
- sms_t = 0;
-
- on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
- }
-
- if(whitelist_info_handle == NULL)
- {
- whitelist_info_handle = mbtk_info_handle_get();
- if(whitelist_info_handle)
- {
- LOGI("creat whitelist_info_handle is success");
- }
- else
- {
- LOGE("creat whitelist_info_handle is fail");
- return -1;
- }
- }
-
- int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
- if(err)
- {
- LOGE("whitelist_info_handle Error : %d", err);
- return -1;
- }
-
- return 0;
-}
-
-
-int qser_whitelist_get(char* whitelish)
-{
- //UNUSED(whitelish);
- char list[10]={0};
- int call_t, nw_t, data_t, sms_t;
- int get_tmp;
-
- get_tmp = powerrind_get();
- //LOGI(">>>get_tmp: %d",get_tmp);
-
- //call 8 nw 1 data 16 sms 4 SIM的上报会一直被包含在内
- switch(get_tmp)
- {
- case 0:
- sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
- break;
- case 8:
- sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
- break;
- case 1:
- sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
- break;
- case 16:
- sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
- break;
- case 4:
- sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
- break;
-
- case 9:
- sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
- break;
- case 24:
- sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
- break;
- case 12:
- sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
- break;
- case 17:
- sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
- break;
- case 5:
- sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
- break;
- case 20:
- sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
- break;
-
- case 25:
- sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
- break;
- case 13:
- sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
- break;
- case 28:
- sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
- break;
- case 21:
- sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
- break;
-
- case 29:
- sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
- break;
-
- default :
- LOGE("qser_whitelist_get is error");
- break;
- }
-
- //LOGI(">>>get list: %s",list);
- strncpy(whitelish, list, strlen(list));
-
- if(whitelist_info_handle != NULL)
- {
- mbtk_info_handle_free(&whitelist_info_handle);
- LOGI("deinit whitelist_info_handle is succuess");
- }
-
- return 0;
-}
-
+
+ qser_autosuspend_enable(1);
+ g_sleep_timer_cb = cb;
+ suspend_timer_timer_init();
+
+
+ return 0;
+}
+
+