1 /*
2 * Copyright (c) 2006-2022, Synwit Technology Co.,Ltd.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2021-07-01 lik first version
9 */
10
11 #include "drv_wdt.h"
12
13 #ifdef RT_USING_WDT
14 #ifdef BSP_USING_WDT
15 //#define DRV_DEBUG
16 #define LOG_TAG "drv.wdt"
17 #include <drv_log.h>
18
19 struct swm_wdt_cfg
20 {
21 const char *name;
22 WDT_TypeDef *WDTx;
23 };
24
25 struct swm_wdt_device
26 {
27 struct swm_wdt_cfg *wdt_cfg;
28 struct rt_watchdog_device wdt_device;
29 };
30
31 static struct swm_wdt_cfg swm_wdt_cfg =
32 {
33 .name = "wdt",
34 .WDTx = WDT,
35 };
36
37 static struct swm_wdt_device wdt_obj;
38
swm_wdt_configure(rt_watchdog_t * wdt_device)39 static rt_err_t swm_wdt_configure(rt_watchdog_t *wdt_device)
40 {
41 return RT_EOK;
42 }
43
swm_wdt_control(rt_watchdog_t * wdt_device,int cmd,void * arg)44 static rt_err_t swm_wdt_control(rt_watchdog_t *wdt_device, int cmd, void *arg)
45 {
46 struct swm_wdt_cfg *wdt_cfg;
47 RT_ASSERT(wdt_device != RT_NULL);
48 wdt_cfg = wdt_device->parent.user_data;
49
50 switch (cmd)
51 {
52 case RT_DEVICE_CTRL_WDT_KEEPALIVE:
53 WDT_Feed(wdt_cfg->WDTx);
54 break;
55 case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
56 WDT_Init(wdt_cfg->WDTx, 0, (1024 * (*(rt_uint32_t *)arg)));
57 break;
58 case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
59 *(rt_uint32_t *)arg = (wdt_cfg->WDTx->RSTVAL) / 1024;
60 break;
61 case RT_DEVICE_CTRL_WDT_GET_TIMELEFT:
62 // not support
63 break;
64 case RT_DEVICE_CTRL_WDT_START:
65 WDT_Start(wdt_cfg->WDTx);
66 break;
67 case RT_DEVICE_CTRL_WDT_STOP:
68 WDT_Stop(wdt_cfg->WDTx);
69 break;
70 default:
71 LOG_W("This command is not supported.");
72 return -RT_ERROR;
73 }
74
75 return RT_EOK;
76 }
77
78 static const struct rt_watchdog_ops swm_wdt_ops =
79 {
80 .init = swm_wdt_configure,
81 .control = swm_wdt_control};
82
swm_wdt_init(void)83 int swm_wdt_init(void)
84 {
85 int result = RT_EOK;
86
87 wdt_obj.wdt_cfg = &swm_wdt_cfg;
88 wdt_obj.wdt_device.ops = &swm_wdt_ops;
89
90 result = rt_hw_watchdog_register(&wdt_obj.wdt_device, wdt_obj.wdt_cfg->name, RT_DEVICE_FLAG_RDWR, wdt_obj.wdt_cfg);
91 if(result != RT_EOK)
92 {
93 LOG_E("wdt device register fail.");
94 }
95 else
96 {
97 LOG_D("wdt device register success.");
98 }
99 return result;
100 }
101 INIT_BOARD_EXPORT(swm_wdt_init);
102
103 #endif /* BSP_USING_WDT */
104 #endif /* RT_USING_WDT */
105