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_wdog32.h"
10 
11 /*******************************************************************************
12  * Code
13  ******************************************************************************/
14 
WDOG32_ClearStatusFlags(WDOG_Type * base,uint32_t mask)15 void WDOG32_ClearStatusFlags(WDOG_Type *base, uint32_t mask)
16 {
17     if (mask & kWDOG32_InterruptFlag)
18     {
19         base->CS |= WDOG_CS_FLG_MASK;
20     }
21 }
22 
WDOG32_GetDefaultConfig(wdog32_config_t * config)23 void WDOG32_GetDefaultConfig(wdog32_config_t *config)
24 {
25     assert(config);
26 
27     config->enableWdog32 = true;
28     config->clockSource = kWDOG32_ClockSource1;
29     config->prescaler = kWDOG32_ClockPrescalerDivide1;
30     config->workMode.enableWait = true;
31     config->workMode.enableStop = false;
32     config->workMode.enableDebug = false;
33     config->testMode = kWDOG32_TestModeDisabled;
34     config->enableUpdate = true;
35     config->enableInterrupt = false;
36     config->enableWindowMode = false;
37     config->windowValue = 0U;
38     config->timeoutValue = 0xFFFFU;
39 }
40 
WDOG32_Init(WDOG_Type * base,const wdog32_config_t * config)41 void WDOG32_Init(WDOG_Type *base, const wdog32_config_t *config)
42 {
43     assert(config);
44 
45     uint32_t value = 0U;
46     uint32_t primaskValue = 0U;
47 
48     value = WDOG_CS_EN(config->enableWdog32) | WDOG_CS_CLK(config->clockSource) | WDOG_CS_INT(config->enableInterrupt) |
49             WDOG_CS_WIN(config->enableWindowMode) | WDOG_CS_UPDATE(config->enableUpdate) |
50             WDOG_CS_DBG(config->workMode.enableDebug) | WDOG_CS_STOP(config->workMode.enableStop) |
51             WDOG_CS_WAIT(config->workMode.enableWait) | WDOG_CS_PRES(config->prescaler) | WDOG_CS_CMD32EN(true) |
52             WDOG_CS_TST(config->testMode);
53 
54     /* Disable the global interrupts. Otherwise, an interrupt could effectively invalidate the unlock sequence
55      * and the WCT may expire. After the configuration finishes, re-enable the global interrupts. */
56     primaskValue = DisableGlobalIRQ();
57     WDOG32_Unlock(base);
58     base->WIN = config->windowValue;
59     base->TOVAL = config->timeoutValue;
60     base->CS = value;
61     EnableGlobalIRQ(primaskValue);
62 }
63 
WDOG32_Deinit(WDOG_Type * base)64 void WDOG32_Deinit(WDOG_Type *base)
65 {
66     uint32_t primaskValue = 0U;
67 
68     /* Disable the global interrupts */
69     primaskValue = DisableGlobalIRQ();
70     WDOG32_Unlock(base);
71     WDOG32_Disable(base);
72     EnableGlobalIRQ(primaskValue);
73 }
74