summaryrefslogtreecommitdiff
path: root/tools/src/iodev.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/iodev.h')
-rw-r--r--tools/src/iodev.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/tools/src/iodev.h b/tools/src/iodev.h
new file mode 100644
index 0000000..24187c7
--- /dev/null
+++ b/tools/src/iodev.h
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef IODEV_H
+#define IODEV_H
+
+#include "types.h"
+#include "utils.h"
+
+#define USB_IODEV_COUNT 8
+
+typedef enum _iodev_id_t {
+ IODEV_UART,
+ IODEV_FB,
+ IODEV_USB_VUART,
+ IODEV_USB0,
+ IODEV_MAX = IODEV_USB0 + USB_IODEV_COUNT,
+} iodev_id_t;
+
+typedef enum _iodev_usage_t {
+ USAGE_CONSOLE = BIT(0),
+ USAGE_UARTPROXY = BIT(1),
+} iodev_usage_t;
+
+struct iodev_ops {
+ ssize_t (*can_read)(void *opaque);
+ bool (*can_write)(void *opaque);
+ ssize_t (*read)(void *opaque, void *buf, size_t length);
+ ssize_t (*write)(void *opaque, const void *buf, size_t length);
+ ssize_t (*queue)(void *opaque, const void *buf, size_t length);
+ void (*flush)(void *opaque);
+ void (*handle_events)(void *opaque);
+};
+
+struct iodev {
+ const struct iodev_ops *ops;
+
+ spinlock_t lock;
+ iodev_usage_t usage;
+ void *opaque;
+};
+
+void iodev_register_device(iodev_id_t id, struct iodev *dev);
+struct iodev *iodev_unregister_device(iodev_id_t id);
+
+ssize_t iodev_can_read(iodev_id_t id);
+bool iodev_can_write(iodev_id_t id);
+ssize_t iodev_read(iodev_id_t id, void *buf, size_t length);
+ssize_t iodev_write(iodev_id_t id, const void *buf, size_t length);
+ssize_t iodev_queue(iodev_id_t id, const void *buf, size_t length);
+void iodev_flush(iodev_id_t id);
+void iodev_handle_events(iodev_id_t id);
+void iodev_lock(iodev_id_t id);
+void iodev_unlock(iodev_id_t id);
+
+void iodev_console_write(const void *buf, size_t length);
+void iodev_console_kick(void);
+void iodev_console_flush(void);
+
+iodev_usage_t iodev_get_usage(iodev_id_t id);
+void iodev_set_usage(iodev_id_t id, iodev_usage_t usage);
+void *iodev_get_opaque(iodev_id_t id);
+
+#endif