电源按钮
内核支持 rv1106-evb.config
CONFIG_KEYBOARD_GPIO=y
4个按钮用的是ADC功能来判断按下状态的
4个按钮通过串联分压连接到ADC接口,按下就分压。
ADC接口:GPIO4_C0_Z
| 引脚序号 | 复用 | 备注说明 |
|---|---|---|
| 23 | SARADC_IN0/GPIO4_C0_z | ADC判断4个按钮按下状态 |
设备树
只测试ADC接口
#include <dt-bindings/input/input.h>
/ {
/* 覆盖掉 rv1106-evb.dtsi 继承来的 2 键 adc-keys */
/delete-node/ adc-keys;
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <450000>;
}
};
&saradc {
status = "okay";
vref-supply = <&vcc_1v8>;
};
测试ADC接口
# 确认 IIO 设备
ls /sys/bus/iio/devices/
# → iio:device0
# 读取原始值(比如不按、分别按 4 个键,各记一次)
cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw
# → 输出 0~4096 的整数
# 换算电压(微伏)
# microvolt = raw / 4096 * 1800000
# 例如 raw=2048 → 2048/4096*1800000 = 900000 uV
设备树完善
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* 4 个按键 — 串联分压接入 SARADC_IN0 (GPIO4_C0_Z)
*
* 引脚#23: SARADC_IN0
* 分压参考电压 1.8V
*
* 实测原始值(raw): 最大1024
* no press = 1020 (keyup)
* KEY_UP = 10 (0%)
* KEY_DOWN = 236 (25%)
* KEY_LEFT = 505 (50%)
* KEY_? = 701 (75%)
*
*/
#include <dt-bindings/input/input.h>
/ {
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&soc_gpio_bell>;
bell-key {
label = "SOC_GPIO_BELL"; //power-key 开机按钮
linux,code = <KEY_POWER>;
gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
debounce-interval = <10>;
wakeup-source;
};
};
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>; //1.8v
//烧录功能!不要改rk官方的
key_volumeup-key {
label = "key_volumeup";
linux,code = <KEY_VOLUMEUP>;
press-threshold-microvolt = <0>;
};
key_volumedown-key {
label = "key_volumedown";
linux,code = <KEY_VOLUMEDOWN>;
press-threshold-microvolt = <400781>;
};
key-left {
label = "KEY_LEFT";
linux,code = <KEY_LEFT>;
press-threshold-microvolt = <900000>;
};
key-camera {
label = "KEY_CAMERA";
linux,code = <KEY_CAMERA>;
press-threshold-microvolt = <1350000>;
};
};
restart-poweroff {
compatible = "restart-poweroff";
};
};
&saradc {
status = "okay";
vref-supply = <&vcc_1v8>;
};
&pinctrl {
bell {
soc_gpio_bell: soc-gpio-bell {
rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
测试
# hexdump -e '16/1 "%02x " "\n"' /dev/input/event0
d4 a8 ef 5f 77 b1 09 00 01 00 72 00 01 00 00 00
d4 a8 ef 5f 77 b1 09 00 00 00 00 00 00 00 00 00
d4 a8 ef 5f e4 5a 0d 00 01 00 72 00 00 00 00 00
d4 a8 ef 5f e4 5a 0d 00 00 00 00 00 00 00 00 00
d6 a8 ef 5f a4 fa 02 00 01 00 73 00 01 00 00 00
d6 a8 ef 5f a4 fa 02 00 00 00 00 00 00 00 00 00
d6 a8 ef 5f 54 22 0c 00 01 00 73 00 00 00 00 00
d6 a8 ef 5f 54 22 0c 00 00 00 00 00 00 00 00 00