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