xref: /nrf52832-nimble/rt-thread/components/drivers/watchdog/watchdog.c (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2012-09-12     heyuanjie87  first version.
9  * 2014-03-04     Bernard      code cleanup
10  */
11 
12 #include <drivers/watchdog.h>
13 
14 /* RT-Thread Device Interface */
15 
16 /*
17  * This function initializes serial
18  */
rt_watchdog_init(struct rt_device * dev)19 static rt_err_t rt_watchdog_init(struct rt_device *dev)
20 {
21     rt_watchdog_t *wtd;
22 
23     RT_ASSERT(dev != RT_NULL);
24     wtd = (rt_watchdog_t *)dev;
25     if (wtd->ops->init)
26     {
27         return (wtd->ops->init(wtd));
28     }
29 
30     return (-RT_ENOSYS);
31 }
32 
rt_watchdog_open(struct rt_device * dev,rt_uint16_t oflag)33 static rt_err_t rt_watchdog_open(struct rt_device *dev, rt_uint16_t oflag)
34 {
35     return (RT_EOK);
36 }
37 
rt_watchdog_close(struct rt_device * dev)38 static rt_err_t rt_watchdog_close(struct rt_device *dev)
39 {
40     rt_watchdog_t *wtd;
41 
42     RT_ASSERT(dev != RT_NULL);
43     wtd = (rt_watchdog_t *)dev;
44 
45     if (wtd->ops->control(wtd, RT_DEVICE_CTRL_WDT_STOP, RT_NULL) != RT_EOK)
46     {
47         rt_kprintf(" This watchdog can not be stoped\n");
48 
49         return (-RT_ERROR);
50     }
51 
52     return (RT_EOK);
53 }
54 
rt_watchdog_control(struct rt_device * dev,int cmd,void * args)55 static rt_err_t rt_watchdog_control(struct rt_device *dev,
56                                     int              cmd,
57                                     void             *args)
58 {
59     rt_watchdog_t *wtd;
60 
61     RT_ASSERT(dev != RT_NULL);
62     wtd = (rt_watchdog_t *)dev;
63 
64     return (wtd->ops->control(wtd, cmd, args));
65 }
66 
67 #ifdef RT_USING_DEVICE_OPS
68 const static struct rt_device_ops wdt_ops =
69 {
70     rt_watchdog_init,
71     rt_watchdog_open,
72     rt_watchdog_close,
73     RT_NULL,
74     RT_NULL,
75     rt_watchdog_control,
76 };
77 #endif
78 
79 /**
80  * This function register a watchdog device
81  */
rt_hw_watchdog_register(struct rt_watchdog_device * wtd,const char * name,rt_uint32_t flag,void * data)82 rt_err_t rt_hw_watchdog_register(struct rt_watchdog_device *wtd,
83                                  const char                *name,
84                                  rt_uint32_t                flag,
85                                  void                      *data)
86 {
87     struct rt_device *device;
88     RT_ASSERT(wtd != RT_NULL);
89 
90     device = &(wtd->parent);
91 
92     device->type        = RT_Device_Class_Miscellaneous;
93     device->rx_indicate = RT_NULL;
94     device->tx_complete = RT_NULL;
95 
96 #ifdef RT_USING_DEVICE_OPS
97     device->ops         = &wdt_ops;
98 #else
99     device->init        = rt_watchdog_init;
100     device->open        = rt_watchdog_open;
101     device->close       = rt_watchdog_close;
102     device->read        = RT_NULL;
103     device->write       = RT_NULL;
104     device->control     = rt_watchdog_control;
105 #endif
106     device->user_data   = data;
107 
108     /* register a character device */
109     return rt_device_register(device, name, flag);
110 }
111