blob: 435f43cc3ef455d67865e12147b591307b1646d9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
/**************************************************************************//**
* @file kpi.c
* @brief KPI driver source file
*
* SPDX-License-Identifier: Apache-2.0
* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "NuMicro.h"
/** @addtogroup Standard_Driver Standard Driver
@{
*/
/** @addtogroup KPI_Driver KPI Driver
@{
*/
/** @addtogroup KPI_EXPORTED_FUNCTIONS KPI Exported Functions
@{
*/
/// @cond HIDDEN_SYMBOLS
#define KPICONF_VALUE 0x00288059
/// @endcond HIDDEN_SYMBOLS
/**
* @brief Open KPI function.
*
* @return TRUE: Success \n
* FALSE: KPI function already open
*
*/
void KPI_Open(KPI_T *kpi, uint32_t u32Row, uint32_t u32Col)
{
uint32_t u32Reg;
kpi->KPICONF = 0x0;
kpi->KPI3KCONF = 0x0;
kpi->KPIRSTC = 0x0;
if (u32Row < 2)
u32Row = 1;
else if (u32Row > 6)
u32Row = 6;
else
u32Row = u32Row - 1;
if (u32Col < 2)
u32Col = 1;
else if (u32Col > 8)
u32Col = 8;
else
u32Col = u32Col - 1;
u32Reg = (KPICONF_VALUE | (u32Row << 28) | (u32Col << 24));
kpi->KPICONF = u32Reg;
}
/**
* @brief Close KPI function.
*
* @return Successful: Success \n
* kpiNotOpen: KPI function not open
*/
void KPI_Close(KPI_T *kpi)
{
kpi->KPICONF &= ~KPI_KPICONF_ENKP_Msk;
}
/**
* @brief Config KPI scan key timing.
*
* @param[in] u32PreScale: Row Scan Cycle Pre-scale Value. The divided number is from 1 to 256
* @param[in] u32Debounce: De-bounce Sampling Cycle. The value is from 3 to 13
* @param[in] u32ScanDelay: Setting delay cycle when row change:
* \ref KPI_ROW_SCAN_DELAY4CLK
* \ref KPI_ROW_SCAN_DELAY8CLK
* \ref KPI_ROW_SCAN_DELAY16CLK
* \ref KPI_ROW_SCAN_DELAY32CLK
*
* @return None
*
*/
void KPI_ConfigKeyScanTiming(KPI_T *kpi, uint32_t u32PreScale, uint32_t u32Debounce, uint32_t u32ScanDelay)
{
if (u32Debounce < 3) u32Debounce = 3;
if (u32Debounce > 13) u32Debounce = 13;
kpi->KPICONF &= ~(KPI_KPICONF_PRESCALE_Msk | KPI_KPICONF_DBCLKSEL_Msk | KPI_KPICONF_SCANROWD_Msk);
kpi->KPICONF |= (u32PreScale << KPI_KPICONF_PRESCALE_Pos) | (u32Debounce << KPI_KPICONF_DBCLKSEL_Pos) |
(u32ScanDelay << KPI_KPICONF_SCANROWD_Pos);
}
/**
* @brief Read KPI Release key Status.
*
* @param[in] u32Key1: \ref KPI_KEY00 ~ \ref KPI_KEY58
* @param[in] u32Key2: \ref KPI_KEY00 ~ \ref KPI_KEY58
* @param[in] u32Key3: \ref KPI_KEY00 ~ \ref KPI_KEY58
* @param[in] u32RSTC: Reset Period Count. The value is from 0 ~ 255.
*
* @return None
*/
void KPI_Set3KeyReset(KPI_T *kpi, uint32_t u32Key1, uint32_t u32Key2, uint32_t u32Key3, uint32_t u32RstCnt)
{
kpi->KPI3KCONF &= ~(KPI_KPI3KCONF_K30C_Msk | KPI_KPI3KCONF_K30R_Msk |
KPI_KPI3KCONF_K31C_Msk | KPI_KPI3KCONF_K31R_Msk |
KPI_KPI3KCONF_K32C_Msk | KPI_KPI3KCONF_K32R_Msk);
// Set Key
kpi->KPI3KCONF |= ((u32Key1 / 8) << 3) | (u32Key1 % 8);
kpi->KPI3KCONF |= ((((u32Key1 / 8) << 3) | (u32Key1 % 8)) << 8);
kpi->KPI3KCONF |= ((((u32Key1 / 8) << 3) | (u32Key1 % 16)) << 8);
// Set Reset Period Count
kpi->KPIRSTC = u32RstCnt;
// Enable 3Key Reset
kpi->KPI3KCONF |= KPI_KPI3KCONF_EN3KYRST_Msk;
}
/*@}*/ /* end of group KPI_EXPORTED_FUNCTIONS */
/*@}*/ /* end of group KPI_Driver */
/*@}*/ /* end of group Standard_Driver */
|