blob: 5f34facb0135790214e6b8c5d9f706599ec791a9 [file] [log] [blame]
Huqiang Qin0197d952023-12-06 14:02:48 +08001/*
2 * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7#ifndef __MESON_KEYPAD_H
8#define __MESON_KEYPAD_H
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14#include "common.h"
15#include <stdlib.h>
16#include <string.h>
17#include "FreeRTOS.h"
18#include <timers.h>
19#include <task.h>
20#include <gpio.h>
21#include <saradc.h>
22
23/* common macro */
Huqiang Qin65e0d0a2024-11-07 10:49:14 +080024#define TIMER_CYCLE_TIME 40
Huqiang Qin0197d952023-12-06 14:02:48 +080025#define KEY_JITTER_COUNT 1
26
27/* key event */
28#define EVENT_SHORT (1 << 0)
29#define EVENT_LONG (1 << 1)
30
31/* adc keypad */
32#define ADCKEY_ID_BASE 512
33#define SAMPLE_DEVIATION 160
34
35enum KeyType { GPIO_KEY = 0, ADC_KEY, KEY_TYPE_NUM };
36
37enum GpioLevel { LOW = 0, HIGH };
38
39enum KeyState {
40 UP = 0,
41 DOWN,
42};
43
44struct xReportEvent {
45 uint32_t ulCode;
46 uint32_t event;
47 TickType_t responseTime;
48 void *data;
49};
50
51typedef void (*CallBack_t)(struct xReportEvent arg);
52
53struct xKeyInitInfo {
54 uint32_t ulKeyId;
55 uint32_t eventMask;
56 uint32_t repeatTimeMs;
57 uint32_t repeatDelayTimeMs;
58 uint32_t longDTTMs;
59 uint32_t doubleDTTMs;
60 uint32_t combLongDTTMs;
61 uint32_t combDTTMs;
62 CallBack_t CallBack;
63 void *data;
64};
65
66struct xGpioKeyInfo {
67 int ulInitLevel;
68 struct xKeyInitInfo keyInitInfo;
69};
70
71struct xAdcKeyInfo {
72 int32_t ulValue;
73 struct AdcInstanceConfig xAdcDecp;
74 struct xKeyInitInfo keyInitInfo;
75};
76
77#define KEY_INIT_INFO(_ulKeyId, _eventMask, _repeatTimeMs, _repeatDelayTimeMs, _longDTTMs, \
78 _doubleDTTMs, _combLongDTTMs, _combDTTMs, _CallBack, _data) \
79 { \
80 .ulKeyId = _ulKeyId, .eventMask = _eventMask, .repeatTimeMs = _repeatTimeMs, \
81 .repeatDelayTimeMs = _repeatDelayTimeMs, .longDTTMs = _longDTTMs, \
82 .doubleDTTMs = _doubleDTTMs, .combLongDTTMs = _combLongDTTMs, \
83 .combDTTMs = _combDTTMs, .CallBack = _CallBack, .data = _data, \
84 }
85
86#define GPIO_KEY_INFO(_ulKeyId, _ulInitLevel, _eventMask, _CallBack, _data) \
87 { \
88 .ulInitLevel = _ulInitLevel, \
89 .keyInitInfo = \
90 KEY_INIT_INFO(_ulKeyId, _eventMask, 0, 0, 0, 0, 0, 0, _CallBack, _data), \
91 }
92
93#define ADC_KEY_INFO(_ulKeyId, _ulValue, _adcChan, _eventMask, _CallBack, _data) \
94 { \
95 .ulValue = _ulValue, .xAdcDecp = { _adcChan, NO_AVERAGING, 1 }, \
96 .keyInitInfo = \
97 KEY_INIT_INFO(_ulKeyId, _eventMask, 0, 0, 0, 0, 0, 0, _CallBack, _data), \
98 }
99
100void vCreateGpioKey(struct xGpioKeyInfo *keyArr, uint16_t keyNum);
101void vDestroyGpioKey(void);
102void vGpioKeyEnable(void);
103void vGpioKeyDisable(void);
104int vGpioKeyIsEmpty(void);
105
106void vCreateAdcKey(struct xAdcKeyInfo *keyArr, uint16_t keyNum);
107void vDestroyAdcKey(void);
108void vAdcKeyEnable(void);
109void vAdcKeyDisable(void);
110int vAdcKeyIsEmpty(void);
Huqiang Qin1e10e2b2023-11-23 15:45:12 +0800111void vAdcKeySetShortPressCycle(uint16_t cycle);
112void vAdcKeySetLongPressCycle(uint16_t cycle);
Huqiang Qin0197d952023-12-06 14:02:48 +0800113
114void vKeyPadCreate(void);
115void vKeyPadInit(void);
116void vKeyPadDeinit(void);
117
118void vDynamicKeypadInit(void);
119
120#ifdef __cplusplus
121}
122#endif
123
124#endif /* __MESON_KEYPAD_H */
125