【RISC-V 全志-V821 PERF2B开发板评测试用试用体验】-06 - 按键测试
本帖最后由 xiaoshen-372360 于 2025-9-12 16:46 编辑按键测试实际上是有点区别的,我们从电路的硬件上也是有区别的,因为按键是用的ADC的,通过ADC的不同采样范围进行不同的电压进行判断,在同一个ADC采样的范围,确定是一个按键值。通过这个理论我们就可以进行键值的判断。
GPADC是12bit分辨率,10位采集精度的模数转换模块,具体精度和通道数可以参考芯**册,模拟输入范围0~1.8V,最高采样率1MHz,并且支持数据比较,自校验功能,同时工作于可配置以下工作模式:
1:Single mode: 在指定的通道完成一次转换并将数据放在对应数据寄存器中;:
2:Single-cycle mode: 在指定的通道完成一个周期转换并将数据放在响应数据寄存器中(注:该模式在R528中没有);
3:Continuous mode: 在指定的通道持续转换并将数据放在响应数据寄存器中;:
4:Burst mode: 边采样边转换并将数据放入32字节的FIFO,支持中断控制。
按照按键电路,我们可以知道集合起来的电源分压进行的,按照定时巡检的方式进行来判断的。部分GPADC接口也开始慢慢用于KEY模块按键的读取,一般包括 VOL+、VOL-、HOME、MENU、ENTER 等等,GPADC0用于KEY的电路如上图。AVCC-AP为1.8V的供电,不同的按键按下,GPADC0口的电压不同,CPU通过对这个电压的采样来确定具体是那一个按键按下。如上图, VOL+、VOL-、MENU、ENTER、HOME/UBOOT 对应的电压分别为 0.21V、0.41V、0.59V、0.75V、0.88V。对于 V821,Channel4 固定为 VBAT-RTC 的 ADC,用于读取当前接到 VBAT-RTC 上电源的电压,用于计算当前电池剩余电量。使用这个功能需要配置 CH4 为 ADC 功能。其电压计算方式为:
V BAT =CH4_GPADC_DATA×4
在 GPADC 模块触发中断后,驱动程序会开始采集数据。采集到的数据经过处理并转换为相应的键值,随后通过input子系统上传至 /dev/input/event 节点。应用程序可以通过访问该节点来获取相关数据。
设备树配置
在 SoC 级的 dtsi 文件中,提取了内存基地址、中断控制、时钟等共性信息,这些配置适用于该类芯片的所有平台。SoC级的 dtsi 文件路径为:bsp/configs/linux-5.4-ansc/sun300iw1p1.dtsi,以下为 gpadc0 的配置示例:
gpadc0: gpadc0@42009000 {
compatible = "allwinner,sunxi-gpadc-v104";
reg = <0x0 0x42009000 0x0 0x400>;
interrupts-extended = <&plic0 58 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_GPA>, <&ccu CLK_GPADC0_24M>;
clock-names = "bus", "hosc";
resets = <&ccu RST_BUS_GPADC>;
reset-names = "bus";
vref-supply = <&pmu_soc_ldo1>;
status = "disabled";
};在板级配置的 board.dts 中,配置每个 GPADC 通道的配置项,属性,功能,模式。具体配置可以使用 GPADC 配置向导生成设备树。
GPADC 配置向导
步骤 1: 选择 GPADC 控制器
选择需要配置的 GPADC 控制器,请参照手册(大部分芯片仅有一个控制器,这个是选择 GPADC 控制器不是通道):
GPADC 示例配置
&gpadc0 {
channel_num = <5>;
channel_select = <0x3>;
channel_data_select = <0x3>;
channel_compare_select = <0x3>;
channel_cld_select = <0x3>;
channel_chd_select = <0x3>;
channel0_compare_lowdata = <1700000>;
channel0_compare_higdata = <1200000>;
channel1_compare_lowdata = <460000>;
channel1_compare_higdata = <1200000>;
deferred-device;
status = "okay";
keyadc0 {
key_cnt = <5>;
key0_vol = <210>;
key0_val = <KEY_VOLUMEUP>;
key1_vol = <410>;
key1_val = <KEY_VOLUMEDOWN>;
key2_vol = <590>;
key2_val = <KEY_MENU>;
key3_vol = <750>;
key3_val = <KEY_OK>;
key4_vol = <880>;
key4_val = <KEY_HOME>;
};
};
配置功能:
通道 0:
模式: 按键 上限: 1699999 uV, 下限: 1200000 uV
按键 0 - 键值: 110, 电压: 280 mV
按键 1 - 键值: 111, 电压: 480 mV
通道 1:
模式: 按键
按键 0 - 键值: 112, 电压: 270 mV
按键 1 - 键值: 113, 电压: 340 mV
通道 4:
模式: ADC
&gpadc0 {
channel_num = <5>;
channel_select = <0x13>;
channel_data_select = <0x10>;
channel_compare_select = <0x2>;
channel_cld_select = <0x2>;
channel_chd_select = <0x2>;
channel1_compare_lowdata = <1200000>;
channel1_compare_higdata = <1699999>;
status = "okay";
keyadc0 {
key_cnt = <2>;
key0_vol = <280>;
key0_val = <110>;
key1_vol = <480>;
key1_val = <111>;
};
keyadc1 {
key_cnt = <2>;
key0_vol = <270>;
key0_val = <112>;
key1_vol = <340>;
key1_val = <113>;
};
};工作模式配置
GPADC支持不同工作模式的配置,支持模式如下:
单次模式:GPADC 在这种模式下只进行一次采样,然后停止。
单周期模式:GPADC 在每个采样周期内进行一次采样。
连续模式:GPADC 连续的进行采样。
突发模式:GPADC 在短时间内快速进行多次采样,然后停止。
默认GPADC采用连续模式。
<blockquote style="text-align: left; ">&pio {
过程比较复杂,具体的可以参考SDK的文件
<blockquote style="text-align: left; ">#include <stdio.h>
好了,今天的分享就到这里。
页:
[1]