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