io口模拟power按键

platform:rk3368

os:android6.0

 

需求:开机状态下,短按power按键,屏幕熄屏,长按就回弹出选择关机的弹框。

 

主板的开机power按键,是没有接到主控的,所以这个按键状态cpu是不知道的。

 

 

POWRE_KEY 是power按键的io口,其中DEC 这个io是有接到cpu的。
这样cpu主控就可以用DEC这个io口作为检测power按键的接口,dts中注册如下:
复制代码
&adc {
    status = "okay";

    key {
        compatible = "rockchip,key";
        io-channels = <&adc 1>;

        power-key {
            gpios = <&gpio1 GPIO_B4 GPIO_ACTIVE_LOW>;
            linux,code = <116>;
            label = "power";
            gpio-key,wakeup;
        };
    };
};
复制代码

驱动主要是监测该io口发生中断(被拉低为低电平)的时候,就上报power按键的键值,上层接收到键值后,就会弹出关机的选择框。

代码路径:drivers\input\keyboard\rk_keys.c

复制代码
if (button->type == TYPE_GPIO) {
            int irq;

            error =
                devm_gpio_request(dev, button->gpio,
                          button->desc ? : "keys");
            if (error < 0) {
                pr_err("gpio-keys: failed to request GPIO %d, error %d\n",
                       button->gpio, error);
                goto fail1;
            }

            error = gpio_direction_input(button->gpio);
            if (error < 0) {
                pr_err("gpio-keys: failed to configure input direction for GPIO %d, error %d\n",
                       button->gpio, error);
                gpio_free(button->gpio);
                goto fail1;
            }

            irq = gpio_to_irq(button->gpio);
            if (irq < 0) {
                error = irq;
                pr_err("gpio-keys: Unable to get irq number for GPIO %d, error %d\n",
                       button->gpio, error);
                gpio_free(button->gpio);
                goto fail1;
            }

            error = devm_request_irq(dev, irq, keys_isr,
                         button->active_low ?
                         IRQF_TRIGGER_FALLING :
                         IRQF_TRIGGER_RISING,
                         button->desc ?
                         button->desc : "keys",
                         button);
            if (error) {
                pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
                       irq, error);
                gpio_free(button->gpio);
                goto fail1;
            }
        }
复制代码
复制代码
static irqreturn_t keys_isr(int irq, void *dev_id)
{
    struct rk_keys_button *button = (struct rk_keys_button *)dev_id;
    struct rk_keys_drvdata *pdata = dev_get_drvdata(button->dev);
    struct input_dev *input = pdata->input;
       printk( "wen test keys_isr\n");
    BUG_ON(irq != gpio_to_irq(button->gpio));

    if (button->wakeup && pdata->in_suspend) {
        button->state = 1;
        key_dbg(pdata,
            "wakeup: %skey[%s]: report event[%d] state[%d]\n",
            (button->type == TYPE_ADC) ? "adc" : "gpio",
            button->desc, button->code, button->state);
        input_event(input, EV_KEY, button->code, button->state);
        input_sync(input);
    }
    if (button->wakeup)
        wake_lock_timeout(&pdata->wake_lock, WAKE_LOCK_JIFFIES);
    mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES);

    return IRQ_HANDLED;
}
复制代码

 

其中,DEC这个io是由单片机控制的,当检测到power按键按下时候,就拉低该io即可。

 

 

posted @   M-kobe  阅读(1)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示