zoukankan      html  css  js  c++  java
  • 触摸屏唤醒实现【转】

    本文转载自:http://blog.csdn.net/zmnqazqaz/article/details/51956225

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

    需要做休眠唤醒必须需要了解一下内核的休眠唤醒机制,相应的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 ");
                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... ");
     
                    }
    }
     
     
    当然我们查询一下驱动的屏蔽掉使得触摸屏休眠和唤醒的函数,我们的触摸屏不能休眠,否则目的达不到。
    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 ", __func__);
            if (!enable_irq_wake(cd->irq))
                cd->irq_wake = 1;
        } else {
            dev_dbg(dev, "%s Device MAY NOT wakeup ", __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 ", __func__);
     
     
            if (cd->irq_wake) {
                disable_irq_wake(cd->irq);
                cd->irq_wake = 0;
            }
        } else {
            dev_dbg(dev, "%s Device MAY NOT wakeup ", __func__);
     
        }
     
    /*
        if (cd->irq_disabled) {
            enable_irq(cd->irq);
            cd->irq_disabled = 0;
        }
     
        */
     
    exit:
     
    //    cyttsp5_core_wake(cd);
     
        return 0;
    }
     
     
    接下去我们在配置一个键值文件即可,当然默认的键值文件包含116 POWER按键,我们就省略了
  • 相关阅读:
    Spring Data JPA 入门篇
    44444444444444444444444444444444dddddddddd66666666666666666666666666
    1111111111111
    第二个随笔啊
    我的第一个Node web程序
    centos 6 不能上网
    开通博客园
    【转载】【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结
    Ajax返回值之XML、json类型
    XHR详细讨论
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8206485.html
Copyright © 2011-2022 走看看