1 /*
2  * Copyright (c) 2006-2024, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2024-09-04     Alex         First version for MCXC444
9  */
10 
11 #include <rtthread.h>
12 #include "drv_wdt.h"
13 
14 #include "fsl_cop.h"
15 #include "fsl_clock.h"
16 
17 
18 struct mcx_cop
19 {
20     rt_watchdog_t watchdog;
21     SIM_Type *cop_base;
22 };
23 
24 static struct mcx_cop cop_dev;
25 
cop_init(rt_watchdog_t * wdt)26 static rt_err_t cop_init(rt_watchdog_t *wdt)
27 {
28     cop_config_t config;
29 
30     COP_GetDefaultConfig(&config);
31 
32     config.timeoutMode = kCOP_ShortTimeoutMode;
33     config.clockSource = kCOP_LpoClock;
34     config.timeoutCycles = kCOP_2Power10CyclesOr2Power18Cycles;
35     config.enableStop = true;
36     config.enableDebug = true;
37 
38 
39     COP_Init(cop_dev.cop_base, &config);
40 
41     return RT_EOK;
42 }
43 
cop_control(rt_watchdog_t * wdt,int cmd,void * arg)44 static rt_err_t cop_control(rt_watchdog_t *wdt, int cmd, void *arg)
45 {
46     switch (cmd)
47     {
48         case RT_DEVICE_CTRL_WDT_START:
49         {
50             return RT_EOK;
51         }
52         case RT_DEVICE_CTRL_WDT_STOP:
53         {
54             COP_Disable(cop_dev.cop_base);
55             return RT_EOK;
56         }
57         case RT_DEVICE_CTRL_WDT_KEEPALIVE:
58         {
59             COP_Refresh(cop_dev.cop_base);
60             return RT_EOK;
61         }
62         case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
63             return -RT_ERROR;
64 
65         default:
66             return -RT_ERROR;
67     }
68 }
69 
70 static struct rt_watchdog_ops cop_ops =
71 {
72     cop_init,
73     cop_control,
74 };
75 
rt_hw_cop_init(void)76 int rt_hw_cop_init(void)
77 {
78     cop_dev.cop_base = SIM;
79 
80     cop_dev.watchdog.ops = &cop_ops;
81 
82     if (rt_hw_watchdog_register(&cop_dev.watchdog, "cop", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
83     {
84         rt_kprintf("cop register failed\n");
85         return -RT_ERROR;
86     }
87 
88     return RT_EOK;
89 }
90 
91 INIT_BOARD_EXPORT(rt_hw_cop_init);
92 
93