111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * COPYRIGHT (C) 2011-2023, Real-Thread Information Technology Ltd
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 *
 | 
						|
 * Change Logs:
 | 
						|
 * Date           Author       Notes
 | 
						|
 * 2012-09-12     heyuanjie87  first version.
 | 
						|
 * 2014-03-04     Bernard      code cleanup
 | 
						|
 */
 | 
						|
 | 
						|
#include <drivers/watchdog.h>
 | 
						|
 | 
						|
/* RT-Thread Device Interface */
 | 
						|
 | 
						|
/*
 | 
						|
 * This function initializes watchdog
 | 
						|
 */
 | 
						|
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,
 | 
						|
                                    int              cmd,
 | 
						|
                                    void             *args)
 | 
						|
{
 | 
						|
    rt_watchdog_t *wtd;
 | 
						|
 | 
						|
    RT_ASSERT(dev != RT_NULL);
 | 
						|
    wtd = (rt_watchdog_t *)dev;
 | 
						|
 | 
						|
    return (wtd->ops->control(wtd, cmd, args));
 | 
						|
}
 | 
						|
 | 
						|
#ifdef RT_USING_DEVICE_OPS
 | 
						|
const static struct rt_device_ops wdt_ops =
 | 
						|
{
 | 
						|
    rt_watchdog_init,
 | 
						|
    rt_watchdog_open,
 | 
						|
    rt_watchdog_close,
 | 
						|
    RT_NULL,
 | 
						|
    RT_NULL,
 | 
						|
    rt_watchdog_control,
 | 
						|
};
 | 
						|
#endif
 | 
						|
 | 
						|
/**
 | 
						|
 * 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_WDT;
 | 
						|
    device->rx_indicate = RT_NULL;
 | 
						|
    device->tx_complete = RT_NULL;
 | 
						|
 | 
						|
#ifdef RT_USING_DEVICE_OPS
 | 
						|
    device->ops         = &wdt_ops;
 | 
						|
#else
 | 
						|
    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;
 | 
						|
#endif
 | 
						|
    device->user_data   = data;
 | 
						|
 | 
						|
    /* register a character device */
 | 
						|
    return rt_device_register(device, name, flag);
 | 
						|
}
 |