1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-06-05     Chushicheng  the first version
9  */
10 
11 #include "drv_wdt.h"
12 #include <hardware/watchdog.h>
13 
14 #define DBG_TAG              "drv.wdt"
15 #define DBG_LVL               DBG_INFO
16 #include <rtdbg.h>
17 
18 static struct pico_wdt pico_wdt_obj;
19 
wdt_init(rt_watchdog_t * wdt)20 static rt_err_t wdt_init(rt_watchdog_t *wdt)
21 {
22     return RT_EOK;
23 }
24 
wdt_control(rt_watchdog_t * wdt,int cmd,void * arg)25 static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
26 {
27     static rt_uint32_t delay_ms;
28     switch (cmd)
29     {
30         /* feed the watchdog */
31     case RT_DEVICE_CTRL_WDT_KEEPALIVE:
32         watchdog_update();
33         break;
34         /* set watchdog timeout */
35     case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
36         delay_ms = *((rt_uint32_t*)arg) * 1000;
37         watchdog_reboot(0, RT_NULL, delay_ms);
38         break;
39     case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
40         (*((rt_uint32_t*)arg)) = watchdog_get_count();
41         break;
42     case RT_DEVICE_CTRL_WDT_START:
43         watchdog_enable(delay_ms, 1);
44         pico_wdt_obj.is_start = 1;
45         break;
46     default:
47         LOG_W("This command is not supported.");
48         return -RT_ERROR;
49     }
50     return RT_EOK;
51 }
52 
53 static const struct rt_watchdog_ops ops =
54 {
55     .init    = wdt_init,
56     .control = wdt_control,
57 };
58 
rt_hw_wdt_init(void)59 int rt_hw_wdt_init(void)
60 {
61     int result = RT_EOK;
62 
63     pico_wdt_obj.watchdog.ops = &ops;
64     /* register wdt device */
65     if (rt_hw_watchdog_register(&pico_wdt_obj.watchdog, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) == RT_EOK)
66     {
67         LOG_D("wdt init success");
68     }
69     else
70     {
71         LOG_E("wdt register failed");
72         result = -RT_ERROR;
73     }
74 
75     return result;
76 }
77 INIT_BOARD_EXPORT(rt_hw_wdt_init);
78