1 /*
2 * Copyright 2021 MindMotion Microelectronics Co., Ltd.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "hal_comp.h"
9
COMP_Init(COMP_Type * COMPx,uint32_t channel,COMP_Init_Type * init)10 void COMP_Init(COMP_Type * COMPx, uint32_t channel, COMP_Init_Type * init)
11 {
12 if ( channel < COMP_CHANNEL_NUM )
13 {
14 COMPx->CSR[channel] = COMP_CSR_OFLT(init->OutFilter)
15 | COMP_CSR_HYST(init->Hysteresis)
16 | COMP_CSR_POL(init->OutInvert)
17 | COMP_CSR_OUTSEL(init->OutMux)
18 | COMP_CSR_INPSEL(init->PosInMux)
19 | COMP_CSR_INMSEL(init->InvInMux)
20 | COMP_CSR_MODE(init->Speed)
21 ;
22 }
23 }
24
COMP_Enable(COMP_Type * COMPx,uint32_t channel,bool enable)25 void COMP_Enable(COMP_Type * COMPx, uint32_t channel, bool enable)
26 {
27 if ( channel < COMP_CHANNEL_NUM )
28 {
29 if ( true == enable )
30 {
31 COMPx->CSR[channel] |= COMP_CSR_EN_MASK;
32 }
33 else
34 {
35 COMPx->CSR[channel] &= ~COMP_CSR_EN_MASK;
36 }
37 }
38 }
39
COMP_Lock(COMP_Type * COMPx,uint32_t channel)40 void COMP_Lock(COMP_Type * COMPx, uint32_t channel)
41 {
42 if ( channel < COMP_CHANNEL_NUM )
43 {
44 COMPx->CSR[channel] |= COMP_CSR_LOCK_MASK;
45 }
46 }
47
COMP_GetOutputStatus(COMP_Type * COMPx,uint32_t channel)48 bool COMP_GetOutputStatus(COMP_Type * COMPx, uint32_t channel)
49 {
50 if ( channel < COMP_CHANNEL_NUM )
51 {
52 if ( 0u != ( COMP_CSR_OUT_MASK & COMPx->CSR[channel] ) )
53 {
54 return true;
55 }
56 else
57 {
58 return false; /* normal input voltage lower than inverting input. */
59 }
60 }
61 else
62 {
63 return false;
64 }
65 }
66
COMP_EnableExtVrefConf(COMP_Type * COMPx,COMP_ExtVrefConf_Type * conf)67 void COMP_EnableExtVrefConf(COMP_Type * COMPx, COMP_ExtVrefConf_Type * conf)
68 {
69 if ( NULL == conf ) /* disable the ext vref. */
70 {
71 COMPx->CRV &= ~COMP_CRV_CRVEN_MASK;
72 }
73 else /* init & enable ext vref. */
74 {
75 COMPx->CRV = COMP_CRV_CRVSRC (conf->VrefSource)
76 | COMP_CRV_CRVSEL (conf->Volt)
77 | COMP_CRV_CRVEN_MASK
78 ;
79 }
80 }
81
COMP_EnableRoundRobinConf(COMP_Type * COMPx,uint32_t channel,COMP_RoundRobinConf_Type * conf)82 void COMP_EnableRoundRobinConf(COMP_Type * COMPx, uint32_t channel, COMP_RoundRobinConf_Type * conf)
83 {
84 if ( channel < COMP_CHANNEL_NUM )
85 {
86 if ( NULL == conf )
87 {
88 COMPx->POLL[channel] &= ~COMP_POLL_POLLEN_MASK;
89 }
90 else
91 {
92 COMPx->POLL[channel] = COMP_POLL_PERIOD(conf->Period)
93 | COMP_POLL_FIXN(conf->InvInFix)
94 | COMP_POLL_POLLCH(conf->ChnGroup)
95 | COMP_POLL_POLLEN_MASK;
96 ;
97 }
98 }
99 }
100
COMP_GetRoundRobinOutStatus(COMP_Type * COMPx,uint32_t channel,COMP_InMux_Type pos_in)101 bool COMP_GetRoundRobinOutStatus(COMP_Type * COMPx, uint32_t channel, COMP_InMux_Type pos_in)
102 {
103 if ( channel < COMP_CHANNEL_NUM )
104 {
105 uint32_t flag = COMP_POLL_POUT(1 << ( (uint32_t)pos_in - 1 ) );
106 if ( 0 != (COMPx->POLL[channel] & flag ) )
107 {
108 return true;
109 }
110 else
111 {
112 return false;
113 }
114 }
115 else
116 {
117 return false;
118 }
119 }
120
121 /* EOF. */
122