158 lines
3.7 KiB
C
158 lines
3.7 KiB
C
|
#include "key_driver.h"
|
|||
|
#include "adkey.h"
|
|||
|
#include "gpio.h"
|
|||
|
#include "system/event.h"
|
|||
|
#include "app_config.h"
|
|||
|
|
|||
|
|
|||
|
#if TCFG_ADKEY_ENABLE
|
|||
|
|
|||
|
static const struct adkey_platform_data *__this = NULL;
|
|||
|
|
|||
|
u8 ad_get_key_value(void);
|
|||
|
//按键驱动扫描参数列表
|
|||
|
struct key_driver_para adkey_scan_para = {
|
|||
|
.scan_time = 10, //按键扫描频率, 单位: ms
|
|||
|
.last_key = NO_KEY, //上一次get_value按键值, 初始化为NO_KEY;
|
|||
|
.filter_time = 2, //按键消抖延时;
|
|||
|
.long_time = 75, //按键判定长按数量
|
|||
|
.hold_time = (75 + 15), //按键判定HOLD数量
|
|||
|
.click_delay_time = 20, //按键被抬起后等待连击延时数量
|
|||
|
.key_type = KEY_DRIVER_TYPE_AD,
|
|||
|
.get_value = ad_get_key_value,
|
|||
|
};
|
|||
|
u8 ad_get_key_value(void)
|
|||
|
{
|
|||
|
u8 i;
|
|||
|
u16 ad_data;
|
|||
|
|
|||
|
if (!__this->enable) {
|
|||
|
return NO_KEY;
|
|||
|
}
|
|||
|
|
|||
|
/* ad_data = adc_get_voltage(__this->ad_channel); */
|
|||
|
ad_data = adc_get_value(__this->ad_channel);
|
|||
|
/* printf("ad_value = %d \n", ad_data); */
|
|||
|
for (i = 0; i < ADKEY_MAX_NUM; i++) {
|
|||
|
if ((ad_data <= __this->ad_value[i]) && (__this->ad_value[i] < 0x3ffL)) {
|
|||
|
return __this->key_value[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return NO_KEY;
|
|||
|
}
|
|||
|
|
|||
|
int adkey_init(const struct adkey_platform_data *adkey_data)
|
|||
|
{
|
|||
|
__this = adkey_data;
|
|||
|
if (!__this) {
|
|||
|
return -EINVAL;
|
|||
|
}
|
|||
|
|
|||
|
if (!__this->enable) {
|
|||
|
return KEY_NOT_SUPPORT;
|
|||
|
}
|
|||
|
adc_add_sample_ch(__this->ad_channel); //注意:初始化AD_KEY之前,先初始化ADC
|
|||
|
#if (TCFG_ADKEY_LED_IO_REUSE || TCFG_ADKEY_IR_IO_REUSE || TCFG_ADKEY_LED_SPI_IO_REUSE)
|
|||
|
#else
|
|||
|
gpio_set_die(__this->adkey_pin, 0);
|
|||
|
gpio_set_direction(__this->adkey_pin, 1);
|
|||
|
gpio_set_pull_down(__this->adkey_pin, 0);
|
|||
|
if (__this->extern_up_en) {
|
|||
|
gpio_set_pull_up(__this->adkey_pin, 0);
|
|||
|
} else {
|
|||
|
gpio_set_pull_up(__this->adkey_pin, 1);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
#if (TCFG_ADKEY_LED_IO_REUSE || TCFG_ADKEY_IR_IO_REUSE || TCFG_ADKEY_LED_SPI_IO_REUSE)
|
|||
|
|
|||
|
#if TCFG_ADKEY_IR_IO_REUSE
|
|||
|
static u8 ir_io_sus = 0;
|
|||
|
extern u8 ir_io_suspend(void);
|
|||
|
extern u8 ir_io_resume(void);
|
|||
|
#endif
|
|||
|
#if TCFG_ADKEY_LED_IO_REUSE
|
|||
|
static u8 led_io_sus = 0;
|
|||
|
extern u8 led_io_suspend(void);
|
|||
|
extern u8 led_io_resume(void);
|
|||
|
#endif
|
|||
|
#if TCFG_ADKEY_LED_SPI_IO_REUSE
|
|||
|
static u8 led_spi_sus = 0;
|
|||
|
extern u8 led_spi_suspend(void);
|
|||
|
extern u8 led_spi_resume(void);
|
|||
|
#endif
|
|||
|
u8 adc_io_reuse_enter(u32 ch)
|
|||
|
{
|
|||
|
if (ch == __this->ad_channel) {
|
|||
|
#if TCFG_ADKEY_IR_IO_REUSE
|
|||
|
if (ir_io_suspend()) {
|
|||
|
return 1;
|
|||
|
} else {
|
|||
|
ir_io_sus = 1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
#if TCFG_ADKEY_LED_IO_REUSE
|
|||
|
if (led_io_suspend()) {
|
|||
|
return 1;
|
|||
|
} else {
|
|||
|
led_io_sus = 1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
#if TCFG_ADKEY_LED_SPI_IO_REUSE
|
|||
|
if (led_spi_suspend()) {
|
|||
|
return 1;
|
|||
|
} else {
|
|||
|
led_spi_sus = 1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
gpio_set_die(__this->adkey_pin, 0);
|
|||
|
gpio_set_direction(__this->adkey_pin, 1);
|
|||
|
gpio_set_pull_down(__this->adkey_pin, 0);
|
|||
|
if (__this->extern_up_en) {
|
|||
|
gpio_set_pull_up(__this->adkey_pin, 0);
|
|||
|
} else {
|
|||
|
gpio_set_pull_up(__this->adkey_pin, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
u8 adc_io_reuse_exit(u32 ch)
|
|||
|
{
|
|||
|
if (ch == __this->ad_channel) {
|
|||
|
#if TCFG_ADKEY_IR_IO_REUSE
|
|||
|
if (ir_io_sus) {
|
|||
|
ir_io_sus = 0;
|
|||
|
ir_io_resume();
|
|||
|
}
|
|||
|
#endif
|
|||
|
#if TCFG_ADKEY_LED_IO_REUSE
|
|||
|
if (led_io_sus) {
|
|||
|
led_io_sus = 0;
|
|||
|
led_io_resume();
|
|||
|
}
|
|||
|
#endif
|
|||
|
#if TCFG_ADKEY_LED_SPI_IO_REUSE
|
|||
|
if (led_spi_sus) {
|
|||
|
led_spi_sus = 0;
|
|||
|
led_spi_resume();
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif /* #if TCFG_ADKEY_ENABLE */
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|