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