1 /*
2 * Copyright (c) 2006-2025, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2021-08-20 Mr.Tiger first version
9 */
10
11 #include <rtthread.h>
12 #include <rtdevice.h>
13 #include <rthw.h>
14 #include <drv_common.h>
15 #include <drv_config.h>
16 #include <hal_data.h>
17
18 #ifdef RT_USING_WDT
19
20 //#define DRV_DEBUG
21 #define LOG_TAG "drv.wdt"
22 #include <rtdbg.h>
23
24 static struct rt_watchdog_device ra_wdt_dev;
25 static struct rt_watchdog_ops ops;
26
wdt_init(rt_watchdog_t * wdt)27 static rt_err_t wdt_init(rt_watchdog_t *wdt)
28 {
29 return RT_EOK;
30 }
31
wdt_control(rt_watchdog_t * wdt,int cmd,void * arg)32 static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
33 {
34 rt_err_t ret = -RT_ERROR;
35 struct st_wdt_timeout_values *wdt_value = {0};
36 switch (cmd)
37 {
38 /* feed the watchdog */
39 case RT_DEVICE_CTRL_WDT_KEEPALIVE:
40 if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS)
41 {
42 LOG_E("watch dog keepalive fail.");
43 ret = -RT_ERROR;
44 }
45 else
46 {
47 ret = RT_EOK;
48 }
49 break;
50 /* set watchdog timeout */
51 case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
52 /**< set*/
53 LOG_W("Use the FSP tool to modify the configuration parameters!");
54 ret = -RT_EINVAL;
55 break;
56 case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
57 wdt_value = (struct st_wdt_timeout_values *)arg;
58 if (R_WDT_TimeoutGet(&g_wdt_ctrl, wdt_value) != FSP_SUCCESS)
59 {
60 LOG_E("wdt get timeout failed.");
61 ret = -RT_ERROR;
62 }
63 else
64 {
65 ret = RT_EOK;
66 }
67 break;
68 case RT_DEVICE_CTRL_WDT_START:
69 if (R_WDT_Open(&g_wdt_ctrl, &g_wdt_cfg) == FSP_SUCCESS)
70 {
71 if (R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS)
72 {
73 LOG_E("wdt start failed.");
74 ret = -RT_ERROR;
75 }
76 else
77 {
78 ret = RT_EOK;
79 }
80 }
81 else
82 {
83 LOG_E("wdt start failed.");
84 ret = -RT_ERROR;
85 }
86 break;
87 default:
88 LOG_W("This command is not supported.");
89 ret = -RT_ERROR;
90 }
91 return ret;
92 }
93
rt_wdt_init(void)94 int rt_wdt_init(void)
95 {
96 ops.init = &wdt_init;
97 ops.control = &wdt_control;
98 ra_wdt_dev.ops = &ops;
99 /* register watchdog device */
100 if (rt_hw_watchdog_register(&ra_wdt_dev, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
101 {
102 LOG_E("wdt device register failed.");
103 return -RT_ERROR;
104 }
105 LOG_D("wdt device register success.");
106 return RT_EOK;
107 }
108 INIT_BOARD_EXPORT(rt_wdt_init);
109
110 #endif /* RT_USING_WDT */
111