GPIO、ADC、矩阵键盘与电源键

GPIO、ADC、矩阵键盘与电源键

1. GPIO keys

gpio_keys.c 支持 GPIO/IRQ键和仅 IRQ键:

1
2
3
4
5
IRQ
-> optional debounce timer/work
-> read GPIO
-> input_event(type, code, state)
-> input_sync()

DT属性包括 linux,codelabeldebounce-intervalwakeup-sourcelinux,input-type

2. Debounce

硬件 controller支持 debounce时优先使用;否则 timer/work延迟确认。过短产生抖动,过长增加按键延迟。IRQ thread、timer与work必须在 remove同步取消。

3. ADC keys

RK3588公共 DTS大量使用:

1
2
3
4
5
6
7
8
9
10
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 1>;
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
key {
linux,code = <KEY_VOLUMEUP>;
press-threshold-microvolt = <17000>;
};
};

driver轮询 IIO processed voltage,在各按键标称电压中选择差值最小者;若当前值更接近 keyup-threshold,则判定为释放。该实现没有单独的容差属性,并报告上次 release/本次 press。

4. ADC设计

电阻 ladder受:

  • resistor tolerance;
  • Vref;
  • ADC噪声;
  • 按键并联;
  • 温漂;
  • source impedance。

标称电压应留足间隔;本驱动没有多次采样和显式滞回,抗噪能力主要取决于电阻梯、ADC和相邻电压中点。poll-interval=100ms意味着最坏检测延迟约一个周期,过短点击还可能完全漏采。

5. Matrix keyboard

行列扫描:

1
2
drive row -> sample columns -> matrix scan code
-> keymap -> KEY_*

matrix-keymap.c 解析 linux,keymap。需要处理 ghosting、diode方向、row/col数量、debounce和wakeup。

6. RK806/RK805 power key

RK3588常用 RK806 PMIC。MFD rk806-core.c 创建名为 rk805-pwrkey 的 child platform device,由:

1
2
drivers/input/misc/rk805-pwrkey.c
CONFIG_INPUT_RK805_PWRKEY

处理 fall/rise IRQ并报告 KEY_POWER。名称沿用 RK805,不表示板上 PMIC 是 RK805。

7. Wakeup

GPIO key可配置 IRQ wake和按下/释放触发动作。PMIC pwrkey IRQ由 MFD irq domain提供。系统 suspend时必须同时满足:

  • device may wakeup;
  • irq wake enabled;
  • pin/PMIC供电保持;
  • userspace接收 wake后事件。

8. 长按

Linux input通常只报告 press/release/repeat。PMIC硬件强制关机、bootloader长按和 userspace shutdown是不同层,不应混淆。

文章互动

阅读 --

留言

0 条留言

正在加载留言…