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