diff --git a/components/drivers/include/drivers/watchdog.h b/components/drivers/include/drivers/watchdog.h new file mode 100644 index 0000000000..15ae5a1f44 --- /dev/null +++ b/components/drivers/include/drivers/watchdog.h @@ -0,0 +1,56 @@ +/* + * File : watchdog.h + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012-2014, Shanghai Real-Thread Electronic Technology Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2012-09-12 heyuanjie87 first version. + */ + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#include + +#define RT_DEVICE_CTRL_WDT_GET_TIMEOUT (1) /* get timeout(in seconds) */ +#define RT_DEVICE_CTRL_WDT_SET_TIMEOUT (2) /* set timeout(in seconds) */ +#define RT_DEVICE_CTRL_WDT_GET_TIMELEFT (3) /* get the left time before reboot(in seconds) */ +#define RT_DEVICE_CTRL_WDT_KEEPALIVE (4) /* refresh watchdog */ +#define RT_DEVICE_CTRL_WDT_START (5) /* start watchdog */ +#define RT_DEVICE_CTRL_WDT_STOP (6) /* stop watchdog */ + +struct rt_watchdog_ops; +struct rt_watchdog_device +{ + struct rt_device parent; + struct rt_watchdog_ops *ops; +}; +typedef struct rt_watchdog_device rt_watchdog_t; + +struct rt_watchdog_ops +{ + rt_err_t (*init)(rt_watchdog_t *wdt); + rt_err_t (*control)(rt_watchdog_t *wdt, int cmd, void *arg); +}; + +rt_err_t rt_hw_watchdog_register(rt_watchdog_t *wdt, + const char *name, + rt_uint32_t flag, + void *data); + +#endif /* __WATCHDOG_H__ */ diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index 8ed9f34ca4..dac85eb716 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -320,5 +320,9 @@ void rt_data_queue_reset(struct rt_data_queue *queue); #include "drivers/sdio.h" #endif +#ifdef RT_USING_WDT +#include "drivers/watchdog.h" +#endif + #endif /* __RT_DEVICE_H__ */ diff --git a/components/drivers/watchdog/SConscript b/components/drivers/watchdog/SConscript new file mode 100644 index 0000000000..38934d3c41 --- /dev/null +++ b/components/drivers/watchdog/SConscript @@ -0,0 +1,8 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd + '/../include'] +group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_WDT'], CPPPATH = CPPPATH) + +Return('group') diff --git a/components/drivers/watchdog/watchdog.c b/components/drivers/watchdog/watchdog.c new file mode 100644 index 0000000000..c9620d319b --- /dev/null +++ b/components/drivers/watchdog/watchdog.c @@ -0,0 +1,108 @@ +/* + * File : watchdog.h + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2012-2014, Shanghai Real-Thread Electronic Technology Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2012-09-12 heyuanjie87 first version. + * 2014-03-04 Bernard code cleanup + */ + +#include + +/* RT-Thread Device Interface */ + +/* + * This function initializes serial + */ +static rt_err_t rt_watchdog_init(struct rt_device *dev) +{ + rt_watchdog_t *wtd; + + RT_ASSERT(dev != RT_NULL); + wtd = (rt_watchdog_t *)dev; + if (wtd->ops->init) + { + return (wtd->ops->init(wtd)); + } + + return (-RT_ENOSYS); +} + +static rt_err_t rt_watchdog_open(struct rt_device *dev, rt_uint16_t oflag) +{ + return (RT_EOK); +} + +static rt_err_t rt_watchdog_close(struct rt_device *dev) +{ + rt_watchdog_t *wtd; + + RT_ASSERT(dev != RT_NULL); + wtd = (rt_watchdog_t *)dev; + + if (wtd->ops->control(wtd, RT_DEVICE_CTRL_WDT_STOP, RT_NULL) != RT_EOK) + { + rt_kprintf(" This watchdog can not be stoped\n"); + + return (-RT_ERROR); + } + + return (RT_EOK); +} + +static rt_err_t rt_watchdog_control(struct rt_device *dev, + rt_uint8_t cmd, + void *args) +{ + rt_watchdog_t *wtd; + + RT_ASSERT(dev != RT_NULL); + wtd = (rt_watchdog_t *)dev; + + return (wtd->ops->control(wtd, cmd, args)); +} + +/** + * This function register a watchdog device + */ +rt_err_t rt_hw_watchdog_register(struct rt_watchdog_device *wtd, + const char *name, + rt_uint32_t flag, + void *data) +{ + struct rt_device *device; + RT_ASSERT(wtd != RT_NULL); + + device = &(wtd->parent); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + + device->init = rt_watchdog_init; + device->open = rt_watchdog_open; + device->close = rt_watchdog_close; + device->read = RT_NULL; + device->write = RT_NULL; + device->control = rt_watchdog_control; + device->user_data = data; + + /* register a character device */ + return rt_device_register(device, name, flag); +}