GPIO、ADC、矩阵键盘与电源键
1. GPIO keys
gpio_keys.c 支持 GPIO/IRQ键和仅 IRQ键:
1 | IRQ |
DT属性包括 linux,code、label、debounce-interval、wakeup-source、linux,input-type。
2. Debounce
硬件 controller支持 debounce时优先使用;否则 timer/work延迟确认。过短产生抖动,过长增加按键延迟。IRQ thread、timer与work必须在 remove同步取消。
3. ADC keys
RK3588公共 DTS大量使用:
1 | adc-keys { |
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 | drive row -> sample columns -> matrix scan code |
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 | drivers/input/misc/rk805-pwrkey.c |
处理 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是不同层,不应混淆。