summaryrefslogtreecommitdiff
path: root/src/device.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/device.c')
-rw-r--r--src/device.c40
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);
/**