gsensor在sleep过程中不能正常关闭的bug解决 | 卓派观点

卓派观点

 
sensor在启动sleep后, 不能正常关闭的bug分析和解决

今天jwisp测试代码发现, 机器sleep后, sensor并没有关闭, 而是继续不断的轮询取得硬件数据, 并上报上来. 这样会造成机器在sleep过程中, 仍然在使用电量.

为了解决这个问题, 我们来简单分析分析HAL层的代码.

通过实验, jwisp发现, sleep和唤醒的两个动作, 对应其调用的是各个sensor自己的enable方法()

我们看一下代码:

int GravitySensor::enable(int32_t, int en) {
    int flags = en ? 1 : 0;
    if (flags != mEnabled) {
        int fd;
        strcpy(&input_sysfs_path[input_sysfs_path_len], "enable");
        fd = open(input_sysfs_path, O_RDWR);
        if (fd >= 0) {
            char buf[2];
            int err;
            buf[1] = 0;
            if (flags) {
                buf[0] = '1';
                mEnabledTime = getTimestamp() + IGNORE_EVENT_TIME;
            } else {
                buf[0] = '0';
            }
            err = write(fd, buf, sizeof(buf));
            close(fd);
            mEnabled = flags;
            setInitialState();
            return 0;
        }
        return -1;
    }
    return 0;
}

按下电源键, 机器进入睡眠, 则传入的en为0, mEnabled为当前sensor开启状态, 此时为1

若按下电源键唤醒机器, 则en = 1, mEnabled = 0

将enable字符串copy到input_sysfs_path字符串后, 此时在后面操作的打开和关闭的就是enable节点了

然后fd打开, 用buf往fd路径下的节点中写值, 若打开则写1, 若关闭则写0.

然后将mEnabled的状态值设为flags给定的状态值.

最后返回0

由于是从三星的sensor代码移植过来的构建成的HAL. 所以具体的情况还是有点不一样的. 经过修改后, 终于可用正常在jwisp的测试机上正常work了

下面附上修改后的代码:

int GravitySensor::enable(int32_t, int en) {
    int flags = en ? 1 : 0;
    if (flags != mEnabled) {
        if (flags) {
         data_fd = open(input_sysfs_path, O_RDWR);
   mEnabledTime = getTimestamp() + IGNORE_EVENT_TIME;
        } else {
            close(data_fd);
        }
        mEnabled = flags;
    }
    return 0;
}

其中data_fd为基类打开和关闭轮询操作的句柄

版权所有,转载请注明出处。
转载自 <a href="http://www.jwisp.com/?p=111" title="gsensor在sleep过程中不能正常关闭的bug解决" rel="bookmark">gsensor在sleep过程中不能正常关闭的bug解决 | 卓派</a>

我简单说几句


随机推荐

最新评论

固定链接

随机链接