触摸屏唤醒实现

自助设备在没有人的情况下需要休眠,然而还得通过触摸屏唤醒设备。

需要做休眠唤醒必须需要了解一下内核的休眠唤醒机制,相应的android 上得再次加深一下大致流程。


触摸唤醒分两种情况:

第一种、CPU进入深度休眠
第二种、假休眠

第二种情况比较容易实现:

Android系统休眠的方式在android4.2.2之后就缘用了linux的wakeup source机制,我们可以写一个程序写阻止休眠即可。
那么触摸屏是在正常工作的,点击的时候我们可以上报一个power键值,就可以点亮屏幕了。
还有一种更简单的办法,就是配置一下触摸屏的配置文件 驱动名.idc
device.internal = 0 #配置为0

第一种情况:

cpu进入了深度休眠,这种情况下只能通过外部中断唤醒。
那么我们的办法就是讲触摸屏当成按键来用,从而唤醒CPU。

这里做法是改驱动,以cyttsp5这个屏的驱动为例。

1.将设备配置为可唤醒。
int cyttsp5_probe(const struct cyttsp5_bus_ops *ops, struct device *dev, u16 irq, size_t xfer_buf_size)    {

//注i册一个input设备,用来上报POWER按键
        wake_key_dev = input_allocate_device();
        wake_key_dev->name = "touch_key";
        wake_key_dev->evbit[0] = BIT(EV_KEY);
        set_bit(116,  wake_key_dev->keybit);
        input_register_device(wake_key_dev);
//当进入休眠后,允许设备唤醒机器
device_init_wakeup ( dev, 1 );

      
}
2.在中断里发送power键

static irqreturn_t cyttsp5_irq(int irq, void *handle)
{

    struct cyttsp5_core_data *cd = handle;
    if(cd->is_sleeped)
    {
        if(get_power_status()==1){
            printk("w^^^^ wake\n");
            wake_system();
            cd->is_sleeped=false;
        }else{
        }
    }else{
        cd->is_sleeped=false;//not


    }
//省略一万字
    return IRQ_HANDLED;
}



static void wake_system()
{
                if(wake_key_dev!=NULL)
               {
                input_event(wake_key_dev, EV_KEY, 116, 1);
                input_sync(wake_key_dev);
                input_event(wake_key_dev, EV_KEY, 116, 0);
                input_sync(wake_key_dev);
                printk("wake system...\n");

                }
}


当然我们查询一下驱动的屏蔽掉使得触摸屏休眠和唤醒的函数,我们的触摸屏不能休眠,否则目的达不到。
suspend
resume


对应的函数:

static int cyttsp5_core_suspend(struct device *dev)
{

    struct cyttsp5_core_data *cd = dev_get_drvdata(dev);
    cd->is_sleeped =true;

//    cyttsp5_core_sleep(cd);

    if (!(cd->cpdata->flags & CY_CORE_FLAG_WAKE_ON_GESTURE))
        return 0;
    //disable_irq(cd->irq);
    //cd->irq_disabled = 1;

    if (device_may_wakeup(dev)) {
        dev_vdbg(dev, "%s Device MAY wakeup\n", __func__);
        if (!enable_irq_wake(cd->irq))
            cd->irq_wake = 1;
    } else {
        dev_dbg(dev, "%s Device MAY NOT wakeup\n", __func__);
    }

    return 0;
}

static int cyttsp5_core_resume(struct device *dev)
{

    struct cyttsp5_core_data *cd = dev_get_drvdata(dev);
    cd->is_sleeped = false;

    if (!(cd->cpdata->flags & CY_CORE_FLAG_WAKE_ON_GESTURE))
        goto exit;
    if (device_may_wakeup(dev)) {
        dev_vdbg(dev, "%s Device MAY wakeup\n", __func__);


        if (cd->irq_wake) {
            disable_irq_wake(cd->irq);
            cd->irq_wake = 0;
        }
    } else {
        dev_dbg(dev, "%s Device MAY NOT wakeup\n", __func__);

    }

/*
    if (cd->irq_disabled) {
        enable_irq(cd->irq);
        cd->irq_disabled = 0;
    }

    */

exit:

//    cyttsp5_core_wake(cd);

    return 0;
}


接下去我们在配置一个键值文件即可,当然默认的键值文件包含116 POWER按键,我们就省略了

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android 11 中的触摸唤醒功能是通过 "Ambient Display" 实现的。当设备处于待机状态时,用户触摸屏幕时,Ambient Display 会将设备的屏幕亮起来,显示一些基本的信息,例如时间、日期、未读消息等。 具体实现源码如下: 1. 在 Android 11 中,Ambient Display 的代码位于 frameworks/base/packages/SystemUI/src/com/android/systemui/doze 中。其中,DozeService 和 DozeScreenState 实现了 Ambient Display 的核心逻辑。 2. DozeService 是一个 Service,它会在设备进入待机模式时启动。在启动时,它会注册一些监听器,以便在设备唤醒时触发相应的操作。 3. DozeScreenState 是一个接口,它定义了 Ambient Display 的状态和行为。具体实现位于 frameworks/base/packages/SystemUI/src/com/android/systemui/doze/state 中。其中,DozeScreenStateMachine 实现了 DozeScreenState 的状态机。 4. DozeScreenStateMachine 定义了 Ambient Display 的状态转换和事件处理逻辑。例如,当用户触摸屏幕时,它会触发 SCREEN_WAKE_UP事件,然后根据当前状态和事件类型执行相应的操作。 5. 在 frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeHardwareComposer.java 中,定义了如何显示 Ambient Display 的内容。具体来说,它会创建一个 SurfaceView,并将其添加到 WindowManager 中,然后在 SurfaceView 上绘制需要显示的内容。 总体来说,Android 11 的触摸唤醒功能是通过 Ambient Display 实现的。Ambient Display 的核心逻辑位于 DozeService 和 DozeScreenState 中,具体的状态转换和事件处理逻辑则由 DozeScreenStateMachine 完成。同时,DozeHardwareComposer 定义了如何显示 Ambient Display 的内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值