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