1 /***************************************************************************//**
2 * \file cy_tcpwm_counter.c
3 * \version 1.70
4 *
5 * \brief
6 *  The source file of the tcpwm driver.
7 *
8 ********************************************************************************
9 * \copyright
10 * Copyright 2016-2021 Cypress Semiconductor Corporation
11 * SPDX-License-Identifier: Apache-2.0
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License");
14 * you may not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 *     http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS,
21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *******************************************************************************/
25 
26 #include "cy_tcpwm_counter.h"
27 
28 #ifdef CY_IP_MXTCPWM
29 
30 #if defined(__cplusplus)
31 extern "C" {
32 #endif
33 
34 
35 /*******************************************************************************
36 * Function Name: Cy_TCPWM_Counter_Init
37 ****************************************************************************//**
38 *
39 * Initializes the counter in the TCPWM block for the Counter operation.
40 *
41 * \param base
42 * The pointer to a TCPWM instance.
43 *
44 * \param cntNum
45 * The Counter instance number in the selected TCPWM.
46 *
47 * \param config
48 * The pointer to configuration structure. See \ref cy_stc_tcpwm_counter_config_t.
49 *
50 * \return error / status code. See \ref cy_en_tcpwm_status_t.
51 *
52 * \funcusage
53 * \snippet tcpwm/counter/snippet/main.c snippet_Cy_TCPWM_V1_Counter_Init
54 * \snippet tcpwm/counter/snippet/main.c snippet_Cy_TCPWM_V2_Counter_Init
55 *
56 *******************************************************************************/
Cy_TCPWM_Counter_Init(TCPWM_Type * base,uint32_t cntNum,cy_stc_tcpwm_counter_config_t const * config)57 cy_en_tcpwm_status_t Cy_TCPWM_Counter_Init(TCPWM_Type *base, uint32_t cntNum,
58                                            cy_stc_tcpwm_counter_config_t const *config)
59 {
60     cy_en_tcpwm_status_t status = CY_TCPWM_BAD_PARAM;
61 
62     if ((NULL != base) && (NULL != config))
63     {
64 #if (CY_IP_MXTCPWM_VERSION == 1U)
65 
66             TCPWM_CNT_CTRL(base, cntNum) = (_VAL2FLD(TCPWM_CNT_CTRL_GENERIC, config->clockPrescaler) |
67                                           _VAL2FLD(TCPWM_CNT_CTRL_ONE_SHOT, config->runMode) |
68                                           _VAL2FLD(TCPWM_CNT_CTRL_UP_DOWN_MODE, config->countDirection) |
69                                           _VAL2FLD(TCPWM_CNT_CTRL_MODE, config->compareOrCapture) |
70                                           (config->enableCompareSwap ? TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk : 0UL));
71 
72             if (CY_TCPWM_COUNTER_COUNT_UP == config->countDirection)
73             {
74                 TCPWM_CNT_COUNTER(base, cntNum) = CY_TCPWM_CNT_UP_INIT_VAL;
75             }
76             else if (CY_TCPWM_COUNTER_COUNT_DOWN == config->countDirection)
77             {
78                 TCPWM_CNT_COUNTER(base, cntNum) = config->period;
79             }
80             else
81             {
82                 TCPWM_CNT_COUNTER(base, cntNum) = CY_TCPWM_CNT_UP_DOWN_INIT_VAL;
83             }
84 
85             if (CY_TCPWM_COUNTER_MODE_COMPARE == config->compareOrCapture)
86             {
87                 TCPWM_CNT_CC(base, cntNum) = config->compare0;
88                 TCPWM_CNT_CC_BUFF(base, cntNum) = config->compare1;
89             }
90 
91             TCPWM_CNT_PERIOD(base, cntNum) = config->period;
92 
93             if (CY_TCPWM_INPUT_CREATOR != config->countInput)
94             {
95                 TCPWM_CNT_TR_CTRL0(base, cntNum) = (_VAL2FLD(TCPWM_CNT_TR_CTRL0_CAPTURE_SEL, config->captureInput) |
96                                                   _VAL2FLD(TCPWM_CNT_TR_CTRL0_RELOAD_SEL, config->reloadInput) |
97                                                   _VAL2FLD(TCPWM_CNT_TR_CTRL0_START_SEL, config->startInput) |
98                                                   _VAL2FLD(TCPWM_CNT_TR_CTRL0_STOP_SEL, config->stopInput) |
99                                                   _VAL2FLD(TCPWM_CNT_TR_CTRL0_COUNT_SEL, config->countInput));
100             }
101 
102             TCPWM_CNT_TR_CTRL1(base, cntNum) = (_VAL2FLD(TCPWM_CNT_TR_CTRL1_CAPTURE_EDGE, config->captureInputMode) |
103                                               _VAL2FLD(TCPWM_CNT_TR_CTRL1_RELOAD_EDGE, config->reloadInputMode) |
104                                               _VAL2FLD(TCPWM_CNT_TR_CTRL1_START_EDGE, config->startInputMode) |
105                                               _VAL2FLD(TCPWM_CNT_TR_CTRL1_STOP_EDGE, config->stopInputMode) |
106                                               _VAL2FLD(TCPWM_CNT_TR_CTRL1_COUNT_EDGE, config->countInputMode));
107 
108             TCPWM_CNT_INTR_MASK(base, cntNum) = config->interruptSources;
109 
110             status = CY_TCPWM_SUCCESS;
111 #else
112             uint32_t grp = TCPWM_GRP_CNT_GET_GRP(cntNum);
113             bool enabled_bit = _FLD2BOOL(TCPWM_GRP_CNT_V2_CTRL_ENABLED, TCPWM_GRP_CNT_CTRL(base, grp, cntNum));
114 #if defined (CY_IP_MXS40TCPWM)
115             TCPWM_GRP_CNT_PS(base, grp, cntNum) = (_VAL2FLD(TCPWM_GRP_CNT_PS_PS_DIV, config->clockPrescaler));
116 #else
117             TCPWM_GRP_CNT_DT(base, grp, cntNum) = _VAL2FLD(TCPWM_GRP_CNT_V2_DT_DT_LINE_OUT_L, config->clockPrescaler);
118 #endif
119             TCPWM_GRP_CNT_CTRL(base, grp, cntNum) =
120                                           (_VAL2FLD(TCPWM_GRP_CNT_V2_CTRL_ONE_SHOT, config->runMode) |
121                                           _VAL2FLD(TCPWM_GRP_CNT_V2_CTRL_UP_DOWN_MODE, config->countDirection) |
122                                           _VAL2FLD(TCPWM_GRP_CNT_V2_CTRL_MODE, config->compareOrCapture) |
123                                           (config->enableCompareSwap ? TCPWM_GRP_CNT_V2_CTRL_AUTO_RELOAD_CC0_Msk : 0UL) |
124 #if defined (CY_IP_MXS40TCPWM)
125                                           _VAL2FLD(TCPWM_GRP_CNT_V3_CTRL_SWAP_ENABLED, config->buffer_swap_enable) |
126                                           _VAL2FLD(TCPWM_GRP_CNT_V2_CTRL_QUAD_ENCODING_MODE, config->direction_mode) |
127 #endif
128                                           (enabled_bit ? TCPWM_GRP_CNT_V2_CTRL_ENABLED_Msk : 0UL));
129 
130             if (CY_TCPWM_COUNTER_COUNT_UP == config->countDirection)
131             {
132                 TCPWM_GRP_CNT_COUNTER(base, grp, cntNum) = CY_TCPWM_CNT_UP_INIT_VAL;
133             }
134             else if (CY_TCPWM_COUNTER_COUNT_DOWN == config->countDirection)
135             {
136                 TCPWM_GRP_CNT_COUNTER(base, grp, cntNum) = config->period;
137             }
138             else
139             {
140                 TCPWM_GRP_CNT_COUNTER(base, grp, cntNum) = CY_TCPWM_CNT_UP_DOWN_INIT_VAL;
141             }
142 
143             if (CY_TCPWM_COUNTER_MODE_COMPARE == config->compareOrCapture)
144             {
145                 TCPWM_GRP_CNT_CC0(base, grp, cntNum) = config->compare0;
146                 TCPWM_GRP_CNT_CC0_BUFF(base, grp, cntNum) = config->compare1;
147 
148                 if(TCPWM_GRP_CC1(base, grp))
149                 {
150                     TCPWM_GRP_CNT_CC1(base, grp, cntNum) = config->compare2;
151                     TCPWM_GRP_CNT_CC1_BUFF(base, grp, cntNum) = config->compare3;
152 
153                     TCPWM_GRP_CNT_CTRL(base, grp, cntNum) |=
154                                     (config->enableCompare1Swap ? TCPWM_GRP_CNT_V2_CTRL_AUTO_RELOAD_CC1_Msk : 0UL);
155 
156                 }
157             }
158 
159             TCPWM_GRP_CNT_PERIOD(base, grp, cntNum) = config->period;
160 
161             if (CY_TCPWM_INPUT_CREATOR != config->countInput)
162             {
163 #if !defined (CY_IP_MXS40TCPWM)
164                 TCPWM_GRP_CNT_TR_IN_SEL0(base, grp, cntNum) =
165                                                   (_VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_SEL0_CAPTURE0_SEL, config->captureInput) |
166                                                   _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_SEL0_RELOAD_SEL, config->reloadInput) |
167                                                   _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_SEL0_STOP_SEL, config->stopInput) |
168                                                   _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_SEL0_COUNT_SEL, config->countInput));
169 
170                 TCPWM_GRP_CNT_TR_IN_SEL1(base, grp, cntNum) = _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_SEL1_START_SEL, config->startInput);
171 #else
172                 Cy_TCPWM_InputTriggerSetupWithGF(base, cntNum, CY_TCPWM_INPUT_TR_START, config->startInputMode, config->startInput, config->gf_depth);
173                 Cy_TCPWM_InputTriggerSetupWithGF(base, cntNum, CY_TCPWM_INPUT_TR_RELOAD_OR_INDEX, config->reloadInputMode, config->reloadInput, config->gf_depth);
174                 Cy_TCPWM_InputTriggerSetupWithGF(base, cntNum, CY_TCPWM_INPUT_TR_STOP_OR_KILL, config->stopInputMode, config->stopInput, config->gf_depth);
175                 Cy_TCPWM_InputTriggerSetupWithGF(base, cntNum, CY_TCPWM_INPUT_TR_COUNT, config->countInputMode, config->countInput, config->gf_depth);
176                 Cy_TCPWM_InputTriggerSetupWithGF(base, cntNum, CY_TCPWM_INPUT_TR_CAPTURE0, config->captureInputMode, config->captureInput, config->gf_depth);
177 #endif
178             }
179 
180             TCPWM_GRP_CNT_TR_IN_EDGE_SEL(base, grp, cntNum) =
181                                               (_VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_EDGE_SEL_CAPTURE0_EDGE, config->captureInputMode) |
182                                               _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_EDGE_SEL_RELOAD_EDGE, config->reloadInputMode) |
183                                               _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_EDGE_SEL_START_EDGE, config->startInputMode) |
184                                               _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_EDGE_SEL_STOP_EDGE, config->stopInputMode) |
185                                               _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_EDGE_SEL_COUNT_EDGE, config->countInputMode));
186 
187             if(TCPWM_GRP_CC1(base, grp))
188             {
189 #if !defined (CY_IP_MXS40TCPWM)
190                 TCPWM_GRP_CNT_TR_IN_SEL1(base, grp, cntNum) |= _VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_SEL1_CAPTURE1_SEL, config->capture1Input);
191                 TCPWM_GRP_CNT_TR_IN_EDGE_SEL(base, grp, cntNum) |=
192                                     (_VAL2FLD(TCPWM_GRP_CNT_V2_TR_IN_EDGE_SEL_CAPTURE1_EDGE, config->capture1InputMode));
193 #else
194                 Cy_TCPWM_InputTriggerSetupWithGF(base, cntNum, CY_TCPWM_INPUT_TR_CAPTURE1, config->capture1InputMode, config->capture1Input, config->gf_depth);
195 #endif
196             }
197 
198             TCPWM_GRP_CNT_TR_OUT_SEL(base, grp, cntNum) =
199                     (_VAL2FLD(TCPWM_GRP_CNT_V2_TR_OUT_SEL_OUT0, config->trigger0Event) |
200                      _VAL2FLD(TCPWM_GRP_CNT_V2_TR_OUT_SEL_OUT1, config->trigger1Event));
201 
202             TCPWM_GRP_CNT_INTR_MASK(base, grp, cntNum) = config->interruptSources;
203 
204             status = CY_TCPWM_SUCCESS;
205 #endif
206     }
207 
208     return(status);
209 }
210 
211 
212 /*******************************************************************************
213 * Function Name: Cy_TCPWM_Counter_DeInit
214 ****************************************************************************//**
215 *
216 * De-initializes the counter in the TCPWM block, returns register values to
217 * default.
218 *
219 * \param base
220 * The pointer to a TCPWM instance.
221 *
222 * \param cntNum
223 * The Counter instance number in the selected TCPWM.
224 *
225 * \param config
226 * The pointer to configuration structure. See \ref cy_stc_tcpwm_counter_config_t.
227 *
228 * \funcusage
229 * \snippet tcpwm/counter/snippet/main.c snippet_Cy_TCPWM_Counter_DeInit
230 *
231 *******************************************************************************/
Cy_TCPWM_Counter_DeInit(TCPWM_Type * base,uint32_t cntNum,cy_stc_tcpwm_counter_config_t const * config)232 void Cy_TCPWM_Counter_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_counter_config_t const *config)
233 {
234 #if (CY_IP_MXTCPWM_VERSION == 1U)
235 
236         TCPWM_CNT_CTRL(base, cntNum) = CY_TCPWM_CNT_CTRL_DEFAULT;
237         TCPWM_CNT_COUNTER(base, cntNum) = CY_TCPWM_CNT_COUNTER_DEFAULT;
238         TCPWM_CNT_CC(base, cntNum) = CY_TCPWM_CNT_CC_DEFAULT;
239         TCPWM_CNT_CC_BUFF(base, cntNum) = CY_TCPWM_CNT_CC_BUFF_DEFAULT;
240         TCPWM_CNT_PERIOD(base, cntNum) = CY_TCPWM_CNT_PERIOD_DEFAULT;
241         TCPWM_CNT_PERIOD_BUFF(base, cntNum) = CY_TCPWM_CNT_PERIOD_BUFF_DEFAULT;
242         TCPWM_CNT_TR_CTRL1(base, cntNum) = CY_TCPWM_CNT_TR_CTRL1_DEFAULT;
243         TCPWM_CNT_TR_CTRL2(base, cntNum) = CY_TCPWM_CNT_TR_CTRL2_DEFAULT;
244         TCPWM_CNT_INTR(base, cntNum) = CY_TCPWM_CNT_INTR_DEFAULT;
245         TCPWM_CNT_INTR_SET(base, cntNum) = CY_TCPWM_CNT_INTR_SET_DEFAULT;
246         TCPWM_CNT_INTR_MASK(base, cntNum) = CY_TCPWM_CNT_INTR_MASK_DEFAULT;
247 
248         if (CY_TCPWM_INPUT_CREATOR != config->countInput)
249         {
250             TCPWM_CNT_TR_CTRL0(base, cntNum) = CY_TCPWM_CNT_TR_CTRL0_DEFAULT;
251         }
252 #else
253         (void)config;
254         uint32_t grp = TCPWM_GRP_CNT_GET_GRP(cntNum);
255         bool enabled_bit = _FLD2BOOL(TCPWM_GRP_CNT_V2_CTRL_ENABLED, TCPWM_GRP_CNT_CTRL(base, grp, cntNum));
256 
257         TCPWM_GRP_CNT_CTRL(base, grp, cntNum) = (CY_TCPWM_GRP_CNT_CTRL_DEFAULT | (enabled_bit ? TCPWM_GRP_CNT_V2_CTRL_ENABLED_Msk : 0UL));
258         TCPWM_GRP_CNT_DT(base, grp, cntNum) = CY_TCPWM_GRP_CNT_DT_DEFAULT;
259         TCPWM_GRP_CNT_COUNTER(base, grp, cntNum) = CY_TCPWM_GRP_CNT_COUNTER_DEFAULT;
260         TCPWM_GRP_CNT_TR_PWM_CTRL(base, grp, cntNum) = CY_TCPWM_GRP_CNT_TR_PWM_CTRL_DEFAULT;
261         TCPWM_GRP_CNT_CC0(base, grp, cntNum) = CY_TCPWM_GRP_CNT_CC0_DEFAULT;
262         TCPWM_GRP_CNT_CC0_BUFF(base, grp, cntNum) = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT;
263         TCPWM_GRP_CNT_CC1(base, grp, cntNum) = CY_TCPWM_GRP_CNT_CC1_DEFAULT;
264         TCPWM_GRP_CNT_CC1_BUFF(base, grp, cntNum) = CY_TCPWM_GRP_CNT_CC1_BUFF_DEFAULT;
265         TCPWM_GRP_CNT_PERIOD(base, grp, cntNum) = CY_TCPWM_GRP_CNT_PERIOD_DEFAULT;
266         TCPWM_GRP_CNT_PERIOD_BUFF(base, grp, cntNum) = CY_TCPWM_GRP_CNT_PERIOD_BUFF_DEFAULT;
267         TCPWM_GRP_CNT_TR_IN_SEL0(base, grp, cntNum) = CY_TCPWM_GRP_CNT_TR_IN_SEL0_DEFAULT;
268         TCPWM_GRP_CNT_TR_IN_SEL1(base, grp, cntNum) = CY_TCPWM_GRP_CNT_TR_IN_SEL1_DEFAULT;
269         TCPWM_GRP_CNT_TR_IN_EDGE_SEL(base, grp, cntNum) = CY_TCPWM_GRP_CNT_TR_IN_EDGE_SEL_DEFAULT;
270         TCPWM_GRP_CNT_INTR_MASK(base, grp, cntNum) = CY_TCPWM_GRP_CNT_INTR_MASK_DEFAULT;
271 #endif
272 }
273 
274 #if defined(__cplusplus)
275 }
276 #endif
277 
278 #endif /* CY_IP_MXTCPWM */
279 
280 /* [] END OF FILE */
281