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