本帖最后由 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>
复制代码
好了,今天的分享就到这里。
|