128 lines
3.5 KiB
C
128 lines
3.5 KiB
C
/*
|
|
* Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#ifndef __MESON_KEYPAD_H
|
|
#define __MESON_KEYPAD_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "common.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "FreeRTOS.h"
|
|
#include <timers.h>
|
|
#include <task.h>
|
|
#include <gpio.h>
|
|
#include <saradc.h>
|
|
|
|
/* common macro */
|
|
#define TIMER_CYCLE_TIME 40
|
|
#define KEY_JITTER_COUNT 1
|
|
|
|
/* key event */
|
|
#define EVENT_SHORT (1 << 0)
|
|
#define EVENT_LONG (1 << 1)
|
|
|
|
/* adc keypad */
|
|
#define ADCKEY_ID_BASE 512
|
|
#define SAMPLE_DEVIATION 160
|
|
|
|
enum KeyType { GPIO_KEY = 0, ADC_KEY, KEY_TYPE_NUM };
|
|
|
|
enum GpioLevel { LOW = 0, HIGH };
|
|
|
|
enum KeyState {
|
|
UP = 0,
|
|
DOWN,
|
|
};
|
|
|
|
struct xReportEvent {
|
|
uint32_t ulCode;
|
|
uint32_t event;
|
|
TickType_t responseTime;
|
|
void *data;
|
|
};
|
|
|
|
typedef void (*CallBack_t)(struct xReportEvent arg);
|
|
|
|
struct xKeyInitInfo {
|
|
uint32_t ulKeyId;
|
|
uint32_t eventMask;
|
|
uint32_t repeatTimeMs;
|
|
uint32_t repeatDelayTimeMs;
|
|
uint32_t longDTTMs;
|
|
uint32_t doubleDTTMs;
|
|
uint32_t combLongDTTMs;
|
|
uint32_t combDTTMs;
|
|
CallBack_t CallBack;
|
|
void *data;
|
|
};
|
|
|
|
struct xGpioKeyInfo {
|
|
int ulInitLevel;
|
|
struct xKeyInitInfo keyInitInfo;
|
|
};
|
|
|
|
struct xAdcKeyInfo {
|
|
int32_t ulValue;
|
|
struct AdcInstanceConfig xAdcDecp;
|
|
struct xKeyInitInfo keyInitInfo;
|
|
};
|
|
|
|
#define KEY_INIT_INFO(_ulKeyId, _eventMask, _repeatTimeMs, _repeatDelayTimeMs, _longDTTMs, \
|
|
_doubleDTTMs, _combLongDTTMs, _combDTTMs, _CallBack, _data) \
|
|
{ \
|
|
.ulKeyId = _ulKeyId, .eventMask = _eventMask, .repeatTimeMs = _repeatTimeMs, \
|
|
.repeatDelayTimeMs = _repeatDelayTimeMs, .longDTTMs = _longDTTMs, \
|
|
.doubleDTTMs = _doubleDTTMs, .combLongDTTMs = _combLongDTTMs, \
|
|
.combDTTMs = _combDTTMs, .CallBack = _CallBack, .data = _data, \
|
|
}
|
|
|
|
#define GPIO_KEY_INFO(_ulKeyId, _ulInitLevel, _eventMask, _CallBack, _data) \
|
|
{ \
|
|
.ulInitLevel = _ulInitLevel, \
|
|
.keyInitInfo = \
|
|
KEY_INIT_INFO(_ulKeyId, _eventMask, 0, 0, 0, 0, 0, 0, _CallBack, _data), \
|
|
}
|
|
|
|
#define ADC_KEY_INFO(_ulKeyId, _ulValue, _adcChan, _eventMask, _CallBack, _data) \
|
|
{ \
|
|
.ulValue = _ulValue, .xAdcDecp = { _adcChan, NO_AVERAGING, 1 }, \
|
|
.keyInitInfo = \
|
|
KEY_INIT_INFO(_ulKeyId, _eventMask, 0, 0, 0, 0, 0, 0, _CallBack, _data), \
|
|
}
|
|
|
|
void vCreateGpioKey(struct xGpioKeyInfo *keyArr, uint16_t keyNum);
|
|
void vDestroyGpioKey(void);
|
|
void vGpioKeyEnable(void);
|
|
void vGpioKeyDisable(void);
|
|
int vGpioKeyIsEmpty(void);
|
|
void vGpioKeySetShortPressCycle(uint16_t cycle);
|
|
void vGpioKeySetLongPressCycle(uint16_t cycle);
|
|
|
|
void vCreateAdcKey(struct xAdcKeyInfo *keyArr, uint16_t keyNum);
|
|
void vDestroyAdcKey(void);
|
|
void vAdcKeyEnable(void);
|
|
void vAdcKeyDisable(void);
|
|
int vAdcKeyIsEmpty(void);
|
|
void vAdcKeySetShortPressCycle(uint16_t cycle);
|
|
void vAdcKeySetLongPressCycle(uint16_t cycle);
|
|
|
|
void vKeyPadCreate(void);
|
|
void vKeyPadInit(void);
|
|
void vKeyPadDeinit(void);
|
|
|
|
void vDynamicKeypadInit(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __MESON_KEYPAD_H */
|
|
|