]> granicus.if.org Git - esp-idf/commitdiff
vfs: implement fsync for UART VFS
authorIvan Grokhotkov <ivan@espressif.com>
Thu, 25 Oct 2018 04:54:53 +0000 (12:54 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Mon, 19 Nov 2018 04:36:31 +0000 (12:36 +0800)
components/vfs/vfs_uart.c

index 7a1fb591432eb944937060996eb888c0f3cc32c1..594002d78fa07902298f1b849959cfb76e3bc1fe 100644 (file)
@@ -26,6 +26,7 @@
 #include "driver/uart.h"
 #include "sdkconfig.h"
 #include "driver/uart_select.h"
+#include "rom/uart.h"
 
 // TODO: make the number of UARTs chip dependent
 #define UART_NUM 3
@@ -304,6 +305,15 @@ static int uart_access(const char *path, int amode)
     return ret;
 }
 
+static int uart_fsync(int fd)
+{
+    assert(fd >= 0 && fd < 3);
+    _lock_acquire_recursive(&s_uart_write_locks[fd]);
+    uart_tx_wait_idle((uint8_t) fd);
+    _lock_release_recursive(&s_uart_write_locks[fd]);
+    return 0;
+}
+
 static void select_notif_callback(uart_port_t uart_num, uart_select_notif_t uart_select_notif, BaseType_t *task_woken)
 {
     switch (uart_select_notif) {
@@ -883,6 +893,7 @@ void esp_vfs_dev_uart_register()
         .close = &uart_close,
         .read = &uart_read,
         .fcntl = &uart_fcntl,
+        .fsync = &uart_fsync,
         .access = &uart_access,
         .start_select = &uart_start_select,
         .end_select = &uart_end_select,