summaryrefslogtreecommitdiff
path: root/tools/src/iodev.h
blob: 24187c715f9255c20cf8ce34fd373f0acce32491 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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