1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_ewm.h"
10 
11 /*******************************************************************************
12  * Code
13  ******************************************************************************/
14 
EWM_Init(EWM_Type * base,const ewm_config_t * config)15 void EWM_Init(EWM_Type *base, const ewm_config_t *config)
16 {
17     assert(config);
18 
19     uint32_t value = 0U;
20 
21 #if !((defined(FSL_FEATURE_SOC_PCC_COUNT) && FSL_FEATURE_SOC_PCC_COUNT) && \
22     (defined(FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE) && FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE))
23 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
24     CLOCK_EnableClock(kCLOCK_Ewm0);
25 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
26 #endif
27     value = EWM_CTRL_EWMEN(config->enableEwm) | EWM_CTRL_ASSIN(config->setInputAssertLogic) |
28             EWM_CTRL_INEN(config->enableEwmInput) | EWM_CTRL_INTEN(config->enableInterrupt);
29 #if defined(FSL_FEATURE_EWM_HAS_PRESCALER) && FSL_FEATURE_EWM_HAS_PRESCALER
30     base->CLKPRESCALER = config->prescaler;
31 #endif /* FSL_FEATURE_EWM_HAS_PRESCALER */
32 
33 #if defined(FSL_FEATURE_EWM_HAS_CLOCK_SELECT) && FSL_FEATURE_EWM_HAS_CLOCK_SELECT
34     base->CLKCTRL = config->clockSource;
35 #endif /* FSL_FEATURE_EWM_HAS_CLOCK_SELECT*/
36 
37     base->CMPL = config->compareLowValue;
38     base->CMPH = config->compareHighValue;
39     base->CTRL = value;
40 }
41 
EWM_Deinit(EWM_Type * base)42 void EWM_Deinit(EWM_Type *base)
43 {
44     EWM_DisableInterrupts(base, kEWM_InterruptEnable);
45 #if !((defined(FSL_FEATURE_SOC_PCC_COUNT) && FSL_FEATURE_SOC_PCC_COUNT) && \
46     (defined(FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE) && FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE))
47 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
48     CLOCK_DisableClock(kCLOCK_Ewm0);
49 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
50 #endif /* FSL_FEATURE_PCC_SUPPORT_EWM_CLOCK_REMOVE */
51 }
52 
EWM_GetDefaultConfig(ewm_config_t * config)53 void EWM_GetDefaultConfig(ewm_config_t *config)
54 {
55     assert(config);
56 
57     config->enableEwm = true;
58     config->enableEwmInput = false;
59     config->setInputAssertLogic = false;
60     config->enableInterrupt = false;
61 #if defined(FSL_FEATURE_EWM_HAS_CLOCK_SELECT) && FSL_FEATURE_EWM_HAS_CLOCK_SELECT
62     config->clockSource = kEWM_LpoClockSource0;
63 #endif /* FSL_FEATURE_EWM_HAS_CLOCK_SELECT*/
64 #if defined(FSL_FEATURE_EWM_HAS_PRESCALER) && FSL_FEATURE_EWM_HAS_PRESCALER
65     config->prescaler = 0U;
66 #endif /* FSL_FEATURE_EWM_HAS_PRESCALER */
67     config->compareLowValue = 0U;
68     config->compareHighValue = 0xFEU;
69 }
70 
EWM_Refresh(EWM_Type * base)71 void EWM_Refresh(EWM_Type *base)
72 {
73     uint32_t primaskValue = 0U;
74 
75     /* Disable the global interrupt to protect refresh sequence */
76     primaskValue = DisableGlobalIRQ();
77     base->SERV = (uint8_t)0xB4U;
78     base->SERV = (uint8_t)0x2CU;
79     EnableGlobalIRQ(primaskValue);
80 }
81