gsensor在sleep过程中不能正常关闭的bug解决

在测试中发现设备在休眠后,传感器未能正确关闭,持续获取硬件数据消耗电量。通过分析HAL层代码,发现在睡眠和唤醒过程中,传感器的enable方法被调用。经过对三星传感器代码的移植和修改,成功解决了该问题,使得传感器在休眠时能正常关闭,且在测试机上运行正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为基类打开和关闭轮询操作的句柄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值