FreeRTOS平台上使用的按键为ADC-KEY,采用的ADC模块为GPADC。
按键功能驱动的实现是通过ADC分压,使每个按键检测的电压值不同,从而实现区分不同的按键。按下或者弹起中断之后,通过中断触发,主动检测当前电压识别出对应的按键。最后再通过input子系统将获取按键的键值并上报给应用层。
GPADC-Key配置方法
按键结构体定义key_config的成员:
struct sunxikbd_config{
unsigned int measure; // 电压阈值
char *name; // 功能名
unsigned int key_num; // 按键数量
unsigned int scankeycodes[KEY_MAX_CNT]; // 按键的键值
unsigned int key_vol[KEY_MAX_CNT]; // 按键的电压值
};
不同平台的配置可能不同,以r128为例,下面是r128的成员config:
static struct sunxikbd_config key_config = {
.measure = 2500,
.name = "gpadc-key",
.key_num = 5,
.key_vol = {164,415,646,900,1157},
.scankeycodes = {115,114,139,164,116}
};
当前按键驱动的配置都是以hardcode的方式写入驱动代码中,也就是说按键的数量,不同按键对应的电压值,不同按键对应的KeyCode等等配置如果要修改的话,需要对源码进行修改。
如上述按键结构体的定义,以下两配置按照默认配置即可。
- measure:GPADC最大能够识别的电压值,需要根据UserMaual来设置。默认为2.5V。
- name:注册的按键驱动名称,会注册到input子系统中。
可以自定义的配置为:key_num,key_vol,scankeycodes。
- key_num: 按照实际硬件设计来设置。
- key_vol: 按照硬件,实际每个按键分压的情况来设置。
- scankeycodes:每个按键对应的KeyCode,方便应用通过input获得按下的按键时,能够识别是哪个按键按下了。
key_vol的配置方法,可以参考下图的GPADC-KEY的硬件设置。
在图中,VCC输入的电压为3.3V,通过分压关系,第一个按键的电压为0.21V,因此key_vol可以设置为210,以此类推。
驱动初始化方法
默认系统启动时,不会加载GPADC驱动以及按键驱动。
如果需要加载GPADC-Key驱动,需要调用以下函数:
int sunxi_gpadc_key_init(void);
调用 sunxi_gpadc_key_init()
该函数即可完成GPADC驱动以及按键驱动的加载了,即可开始使用按键驱动。
应用调用方法
接下来继续介绍一下,应用中该如何获取按键按下的事件。
在FreeRTOS系统中,也移植了 Linux 的 input 子系统。GPADC-Key 中也是调用了 input 的接口,进行注册 input 设置,上报事件等动作。
在调用 sunxi_gpadc_key_init()
时,通过 input_set_capability()
去设置了事件的属性;通过 sunxi_input_register_device()
注册了 input 设备;在按键按下触发中断时,也是通过 input_report_key()
和 input_sync()
上报 input
事件。
因此,在应用层想要获取input事件,可以直接通过input接口去获取,使用示例可如下例程:
int input_func(void)
{
int fd = -1;
struct sunxi_input_event event;
sunxi_gpadc_key_init(); // 驱动初始化
fd = sunxi_input_open(DEVICE_NAME);
if (fd < 0)
return -1;
while (1) {
sunxi_input_readb(fd, &event, sizeof(struct sunxi_input_event));
if (event.type != EV_KEY)
continue;
if (event.value == 0) {
printf("key upn");
continue;
}
printf("key press: KeyCode:%dn", event.code);
}
return 0;
}
-
adc
+关注
关注
99文章
6538浏览量
546018 -
FreeRTOS
+关注
关注
12文章
484浏览量
62453 -
ADC按键设计
+关注
关注
0文章
3浏览量
1693 -
R128
+关注
关注
0文章
41浏览量
133
发布评论请先 登录
相关推荐
【瑞萨RA2L1入门学习】02、DAC电压输出及ADC电压采集实验
ADC128S022配置为其他路数据的时候,数据不能正常读出,为什么?
adc128s102 VA=5v VD=3.3v可以吗?
如何提高ADC128S052输出能力?
ADC128S022的驱动架构参考 ti-adc128s052.c,要如何做移位生成12bit结果呢?
求助,关于ADC128S102的采样速率问题求解
ADC128S102WGRQV想知道输入阻抗具体有多大?
adc128s052设备树配置,基准电压不能被内核识别是怎么回事?
求助,关于adc3101 I2S采集问题求解
ADC128S052、ADC128S052-Q1模数转换器数据表
![<b class='flag-5'>ADC128S</b>052、<b class='flag-5'>ADC128S</b>052-Q1模数转换器数据表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ADC128S102-SEP耐辐射8通道、50-kSPS至1-MSPS、12位ADC数据表
![<b class='flag-5'>ADC128S</b>102-SEP耐辐射8通道、50-kSPS至1-MSPS、12位<b class='flag-5'>ADC</b>数据表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论