rk3568 Android 添加物理按键
rk3568 Android11/12 添加按键
瑞芯微推出多款高性能的ARM处理器,其按键注册方式可以通过设备树(Device Tree)来实现。设备树是一种描述硬件设备的数据结构,可以在Linux内核启动时加载并解析,从而实现对硬件设备的管理和控制。以rk3288 rk3399 rk3568 rk3588等常规芯片为例,其均支持GPIO中断按键、ADC串联按键和PMIC附带按键。
提示:按键。
文章目录
- rk3568 Android11/12 添加按键
- 圈重点 看想学
- 1. 注册GPIO按键
-
- 1.1 在设备树中定义按键所在的GPIO引脚
- 1.2 设备树中定义按键设备节点
- 1.3 内核中注册按键设备节点
- 2. 注册ADC按键
-
- 2.1 内核设备树添加按键
- 3. 注册外挂芯片按键
-
- 3.1 内核设备树添加按键
- 总结
圈重点 看想学
- 注册GPIO按键
- 注册ADC按键
- 注册外挂芯片按键
1. 注册GPIO按键
感兴趣小伙伴可查看驱动源码:kernel/drivers/input/keyboard/gpio_keys.c
,这里不做赘述。
1.1 在设备树中定义按键所在的GPIO引脚
例如,定义一个名为“camera”的按键,其所在的GPIO引脚为GPIO1_C2,可以在设备树中添加以下代码:
&gpio_keys {pinctrl-names = "default";pinctrl-0 = <&pwrbtn &cambtn>;camera {debounce-interval = <100>;gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;label = "GPIO Key Camera";linux,code = <KEY_CAMERA>;wakeup-source;};
}&pinctrl {buttons {cambtn: cambtn {rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_up>;};};
};
pinctrl-names 表示GPIO pinctrl-#(编号)对应状态。
pinctrl-0 表示pinctrl-names第一个属性对应GPIO的阻态引用,GPIO1_C2需要外部上拉,则在引用中增加 cambtn的GPIO阻态。
“debounce-interval”表示按键去抖动的时间间隔,单位为毫秒。
“gpios”表示该按键所在的GPIO引脚编号和极性,其中第一个数字表示GPIO组号,第二个数字表示GPIO引脚号,第三个数字表示极性,0表示高电平有效,1表示低电平有效。
“label”表示按键的名称。
“linux,code”表示按键对应的Linux键值。
“status”表示该设备节点的状态,okay表示可用,未设定为disabled怎认为可用。
1.2 设备树中定义按键设备节点
以GPIO的电源盘为例。定义一个名为“power”的按键,其所在的GPIO引脚为GPIO0_A2,外部没有上拉电阻,须增加内部上拉。可以在设备树中添加以下代码:
/ {gpio_keys: gpio-keys {compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;autorepeat;pinctrl-names = "default";pinctrl-0 = <&pwrbtn>;power {debounce-interval = <100>;gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;label = "GPIO Key Power";linux,code = <KEY_POWER>;wakeup-source;};};
};&pinctrl {buttons {pwrbtn: pwrbtn {rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>;};};
};
“compatible”表示按键设备节点的兼容性,即该节点与哪些驱动程序兼容。
“#address-cells”和“#size-cells”表示设备树中地址和大小的单元数(可不配置该属性)。
“status”表示该设备节点的状态,okay表示可用,未设定为disabled怎认为可用。
“label”表示按键的名称。
“linux,code”表示按键对应的Linux键值。
“gpios”表示按键所在的GPIO引脚。
“debounce-interval”表示按键去抖动的时间间隔,单位为毫秒。
1.3 内核中注册按键设备节点
以rk3568为例,可以在内核启动时通过以下命令来注册按键设备节点:
echo rk3568-keys > /sys/bus/platform/devices/rk3568-keys/modalias
2. 注册ADC按键
RK3568支持多种外设,包括ADC(模数转换器)和按键输入。ADC-Keys是RK3568的一种特殊功能,它可以将模拟信号转换为数字信号,并将数字信号映射到按键输入。ADC串联按键的原理是将多个按键连接到单个ADC输入引脚上,并使用电阻网络将它们连接起来。ADC会将每个按键的电压值采样并量化为数字值,以确定按键的状态。对源码感兴趣小伙伴可查看:kernel/drivers/input/keyboard/adc-keys.c
,这里不做赘述。
2.1 内核设备树添加按键
- 配置ADC模块:RK3568的ADC模块可以通过寄存器配置来设置采样率、分辨率和输入通道等参数。
- 配置GPIO模块:ADC-Keys需要将ADC模块的输出连接到GPIO模块的输入,因此需要配置GPIO模块的输入模式和上拉电阻。
- 配置按键映射表:ADC-Keys需要将ADC模块的输出映射到按键输入,因此需要配置按键映射表,将ADC输出的数字值映射到按键输入。
/ {adc_keys: adc-keys {compatible = "adc-keys";io-channels = <&saradc 0>;io-channel-names = "buttons";keyup-threshold-microvolt = <1800000>;poll-interval = <100>;vol-up-key {label = "volume up";linux,code = <KEY_VOLUMEUP>;press-threshold-microvolt = <1750>;};vol-down-key {label = "volume down";linux,code = <KEY_VOLUMEDOWN>;press-threshold-microvolt = <297500>;};menu-key {label = "menu";linux,code = <KEY_MENU>;press-threshold-microvolt = <980000>;};back-key {label = "back";linux,code = <KEY_BACK>;press-threshold-microvolt = <1305500>;};};
};//开启adc模块
&saradc {status = "okay";vref-supply = <&vcca_1v8>;
};
“compatible”表示按键设备节点的兼容性,即该节点与哪些驱动程序兼容。
“io-channels”表示申请adc通道编号。
“status”表示该设备节点的状态,okay表示可用,未设定为disabled怎认为可用。
“io-channel-names”表示adc通道的名称。
"keyup-threshold-microvolt"表示唤醒阈值电压
“poll-interval”表示adc按键的循环时间。
3. 注册外挂芯片按键
rk3568 配套PMIC自带电源键,可直接开启PMIC供电并并启动ARM芯片。该电源键可强制关闭PMIC供电,从而复位异常宕机的芯片。
3.1 内核设备树添加按键
&i2c0 {status = "okay"......rk809: pmic@20 {pwrkey {status = "okay";};......};
};
#Tips
- GPIO 按键要注册时,需要去掉复用。
- ADC按键自身原理,会出现按键竞争关系,但不影响使用。
总结
活学活用,做个合格的搬运工。