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