回答

收藏

[评测分享] 【RISC-V 全志-V821 PERF2B开发板评测试用试用体验】-06 - 按键测试

#板卡评测 #板卡评测 372 人阅读 | 0 人回复 | 2025-09-12

本帖最后由 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 的配置示例:

  1. gpadc0: gpadc0@42009000 {
  2.         compatible = "allwinner,sunxi-gpadc-v104";
  3.         reg = <0x0 0x42009000 0x0 0x400>;
  4.         interrupts-extended = <&plic0 58 IRQ_TYPE_LEVEL_HIGH>;
  5.         clocks = <&ccu CLK_GPA>, <&ccu CLK_GPADC0_24M>;
  6.         clock-names = "bus", "hosc";
  7.         resets = <&ccu RST_BUS_GPADC>;
  8.         reset-names = "bus";
  9.         vref-supply = <&pmu_soc_ldo1>;
  10.         status = "disabled";
  11. };
复制代码
在板级配置的 board.dts 中,配置每个 GPADC 通道的配置项,属性,功能,模式。具体配置可以使用 GPADC 配置向导生成设备树。


GPADC 配置向导
步骤 1: 选择 GPADC 控制器
选择需要配置的 GPADC 控制器,请参照手册(大部分芯片仅有一个控制器,这个是选择 GPADC 控制器不是通道):
GPADC 示例配置

  1. &gpadc0 {
  2.         channel_num = <5>;
  3.         channel_select = <0x3>;
  4.         channel_data_select = <0x3>;
  5.         channel_compare_select = <0x3>;
  6.         channel_cld_select = <0x3>;
  7.         channel_chd_select = <0x3>;
  8.         channel0_compare_lowdata = <1700000>;
  9.         channel0_compare_higdata = <1200000>;
  10.         channel1_compare_lowdata = <460000>;
  11.         channel1_compare_higdata = <1200000>;
  12.         deferred-device;
  13.         status = "okay";
  14.         keyadc0 {
  15.                 key_cnt = <5>;
  16.                 key0_vol = <210>;
  17.                 key0_val = <KEY_VOLUMEUP>;
  18.                 key1_vol = <410>;
  19.                 key1_val = <KEY_VOLUMEDOWN>;
  20.                 key2_vol = <590>;
  21.                 key2_val = <KEY_MENU>;
  22.                 key3_vol = <750>;
  23.                 key3_val = <KEY_OK>;
  24.                 key4_vol = <880>;
  25.                 key4_val = <KEY_HOME>;
  26.         };
  27. };
复制代码




配置功能:
通道 0:
模式: 按键 上限: 1699999 uV, 下限: 1200000 uV
按键 0 - 键值: 110, 电压: 280 mV
按键 1 - 键值: 111, 电压: 480 mV
通道 1:

模式: 按键
按键 0 - 键值: 112, 电压: 270 mV
按键 1 - 键值: 113, 电压: 340 mV
通道 4:

模式: ADC

  1. &gpadc0 {
  2.         channel_num = <5>;
  3.         channel_select = <0x13>;
  4.         channel_data_select = <0x10>;
  5.         channel_compare_select = <0x2>;
  6.         channel_cld_select = <0x2>;
  7.         channel_chd_select = <0x2>;
  8.         channel1_compare_lowdata = <1200000>;
  9.         channel1_compare_higdata = <1699999>;
  10.         status = "okay";
  11.         keyadc0 {
  12.                 key_cnt = <2>;
  13.                 key0_vol = <280>;
  14.                 key0_val = <110>;
  15.                 key1_vol = <480>;
  16.                 key1_val = <111>;
  17.         };
  18.         keyadc1 {
  19.                 key_cnt = <2>;
  20.                 key0_vol = <270>;
  21.                 key0_val = <112>;
  22.                 key1_vol = <340>;
  23.                 key1_val = <113>;
  24.         };
  25. };
复制代码
  1. 工作模式配置
  2. GPADC支持不同工作模式的配置,支持模式如下:

  3. 单次模式:GPADC 在这种模式下只进行一次采样,然后停止。
  4. 单周期模式:GPADC 在每个采样周期内进行一次采样。
  5. 连续模式:GPADC 连续的进行采样。
  6. 突发模式:GPADC 在短时间内快速进行多次采样,然后停止。
  7. 默认GPADC采用连续模式。
复制代码


  1. <blockquote style="text-align: left; ">&pio {
复制代码




过程比较复杂,具体的可以参考SDK的文件

  1. <blockquote style="text-align: left; ">#include <stdio.h>
复制代码


好了,今天的分享就到这里。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条