feat: nearly complete POSIX.1-2008 compliant terminal interface implementation
[lunaix-os.git] / lunaix-os / includes / hal / serial.h
1 #ifndef __LUNAIX_SERIAL_H
2 #define __LUNAIX_SERIAL_H
3
4 #include <lunaix/device.h>
5 #include <lunaix/ds/llist.h>
6 #include <lunaix/ds/mutex.h>
7 #include <lunaix/ds/waitq.h>
8 #include <lunaix/ds/rbuffer.h>
9
10 #include <hal/term.h>
11
12 #define SERIAL_RW_RX 0x0
13 #define SERIAL_RW_TX 0x1
14 #define io_dir(flags) ((flags) & SERIAL_RW_TX)
15
16 #define RXTX_DONE 0x1
17 #define RXTX_WAIT 0x2
18
19 #define SERIAL_AGAIN 0x1
20 #define SERIAL_DONE 0x0
21
22 struct serial_dev;
23 typedef int (*rxtx_cb)(struct serial_dev*);
24
25 struct serial_dev
26 {
27     struct llist_header sdev_list;
28     struct device* dev;
29     struct waitq wq_rxdone;
30     struct waitq wq_txdone;
31     struct term* at_term;
32     void* backend;
33
34     struct rbuffer rxbuf;
35     int wr_len;
36
37     /**
38      * @brief Write buffer to TX. The return code indicate
39      * the transaction is either done in synced mode (TX_DONE) or will be
40      * done asynchronously (TX_WAIT).
41      *
42      */
43     int (*write)(struct serial_dev* sdev, u8_t*, size_t);
44     int (*exec_cmd)(struct serial_dev* sdev, u32_t, va_list);
45 };
46
47 /**
48  * @brief Create a serial device.
49  *
50  *
51  * @param if_ident a string that differentiate the underlying interface of
52  * serial ports
53  * @param with_tty whether a `/dev/tty*` will be automatically created and
54  * attach to it.
55  * @return struct serial_dev*
56  */
57 struct serial_dev*
58 serial_create(struct devclass* class, char* if_ident);
59
60 void
61 serial_readone(struct serial_dev* sdev, u8_t* val);
62
63 int
64 serial_readone_nowait(struct serial_dev* sdev, u8_t* val);
65
66 size_t
67 serial_readbuf(struct serial_dev* sdev, u8_t* buf, size_t len);
68
69 int
70 serial_readbuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len);
71
72 int
73 serial_writebuf(struct serial_dev* sdev, u8_t* buf, size_t len);
74
75 int
76 serial_writebuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len);
77
78 struct serial_dev*
79 serial_get_avilable();
80
81 int
82 serial_accept_one(struct serial_dev* sdev, u8_t val);
83
84 int
85 serial_accept_buffer(struct serial_dev* sdev, void* val, size_t len);
86
87 void
88 serial_end_recv(struct serial_dev* sdev);
89
90 void
91 serial_end_xmit(struct serial_dev* sdev, size_t len);
92
93 #endif /* __LUNAIX_SERIAL_H */