diff options
Diffstat (limited to 'src/device.c')
| -rw-r--r-- | src/device.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/device.c b/src/device.c index 9665788c77..4eafb4e3ba 100644 --- a/src/device.c +++ b/src/device.c @@ -13,6 +13,7 @@ * 2013-07-09 Grissiom add ref_count support * 2016-04-02 Bernard fix the open_flag initialization issue. * 2021-03-19 Meco Man remove rt_device_init_all() + * 2022-04-10 THEWON add flush for device */ #include <rtthread.h> @@ -28,6 +29,7 @@ #define device_close (dev->ops->close) #define device_read (dev->ops->read) #define device_write (dev->ops->write) +#define device_flush (dev->ops->flush) #define device_control (dev->ops->control) #else #define device_init (dev->init) @@ -35,6 +37,7 @@ #define device_close (dev->close) #define device_read (dev->read) #define device_write (dev->write) +#define device_flush (dev->flush) #define device_control (dev->control) #endif /* RT_USING_DEVICE_OPS */ @@ -290,7 +293,11 @@ rt_err_t rt_device_close(rt_device_t dev) /* set open flag */ if (result == RT_EOK || result == -RT_ENOSYS) + { dev->open_flag = RT_DEVICE_OFLAG_CLOSE; + dev->rx_indicate = RT_NULL; + dev->tx_complete = RT_NULL; + } return result; } @@ -383,6 +390,33 @@ rt_ssize_t rt_device_write(rt_device_t dev, RTM_EXPORT(rt_device_write); /** + * @brief This function will flush a device's buffers. + * + * @param dev is the pointer of device driver structure. + * + * @return the result, RT_EOK on successfully. + */ +rt_err_t rt_device_flush(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device); + + if (dev->ref_count == 0) + { + return -RT_ERROR; + } + + /* call device_write interface */ + if (device_flush != RT_NULL) + { + return device_flush(dev); + } + + return -RT_ENOSYS; +} +RTM_EXPORT(rt_device_flush); + +/** * @brief This function will perform a variety of control functions on devices. * * @param dev is the pointer of device driver structure. @@ -475,13 +509,13 @@ rt_err_t rt_device_bind_driver(rt_device_t device, rt_driver_t driver, void *nod } device->drv = driver; -#ifdef RT_USING_DEVICE_OPS +#ifdef RT_USING_DEVICE_OPS device->ops = driver->dev_ops; -#endif +#endif device->dtb_node = node; return RT_EOK; -} +} RTM_EXPORT(rt_device_bind_driver); /** |
