参考:https://blog.csdn.net/qq_28877125/article/details/123218751
参考:https://whycan.com/t_2691.html#p21548
概述
LRADC全称“低分辨率模拟数字转换器”,就是分辨率较低的ADC,可以通过电阻分压来识别按键,单引脚可以外接多个按键,节省引脚资源(普通ADC也可以做按键识别,但会浪费性能,也没有设计相关中断)
下图为荔枝派zero的原理图(全志v3s),6位分辨率(0~64)
AVCC电压为3V,当VOL+按下时,通过电阻分压,KEYADC0读取到的电压为3/106.8x6.8≈0.191V;当VOL-按下时,KEYADC0读取到的电压为3/115x15≈0.391V;以此类推,通过检测电压即可确定按下的按键
设备树修改
- 注意要在dts文件开头添加头文件(否则会报错找不到KEY_SELECT等定义)
修改sun8i-v3s-licheepi-zero.dts,添加配置lradc节点
#include <dt-bindings/input/input.h>
&lradc {
vref-supply = <®_vcc3v0>;
status = "okay";
button@200 {
label = "KEY_C"; // 丝印"+"
linux,code = <KEY_C>;
channel = <0>;
voltage = <200000>;
};
button@400 {
label = "KEY_V"; // 丝印"-"
linux,code = <KEY_V>;
channel = <0>;
voltage = <400000>;
};
button@600 {
label = "Select"; // 丝印SELECT
linux,code = <KEY_SELECT>;
channel = <0>;
voltage = <600000>;
};
button@800 {
label = "Enter"; // 丝印START
linux,code = <KEY_ENTER>;
channel = <0>;
voltage = <800000>;
};
};
上述lradc节点的定义在sun8i-v3s.dtsi,无需修改
lradc: lradc@1c22800 {
compatible = "allwinner,sun4i-a10-lradc-keys";
reg = <0x01c22800 0x400>;
interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
内核配置
默认已经勾选上,检查此项即可
- 通过在内核中查找"allwinner,sun4i-a10-lradc-keys"属性也可以确定使用的驱动文件,即drivers/input/keyboard/sun4i-lradc-keys.c,若感兴趣可以自行研究源码
基础测试
驱动会完成lradc的初始化,并在/dev/input/下注册输入设备,通过hexdump即可完成简单的测试
应用层使用
通过hexdump调试不太方便直观,可以写个简单的应用层app读取/dev/input/eventx并处理
或是直接使用evtest.c编译测试(https://elinux.org/images/9/93/Evtest.c),将源码下载到docker,调用交叉编译工具编译即可,将生成的evtest拷贝到开发板测试
/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc Evtest.c -o evtest
evtest测试
- 彩蛋:既然是输入设备,自然是可以作键盘用的,如果适配了屏幕,并添加为控制台输入,可以通过按键与控制台交互 😃