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即可。
分类:
IO
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!