电源按钮

内核支持 rv1106-evb.config

CONFIG_KEYBOARD_GPIO=y

4个按钮用的是ADC功能来判断按下状态的

4个按钮通过串联分压连接到ADC接口,按下就分压。

ADC接口:GPIO4_C0_Z

引脚序号复用备注说明
23SARADC_IN0/GPIO4_C0_zADC判断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