refactor: make pci device driver loading passive, pci bus scanner will not load them...
[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/fifo.h>
6 #include <lunaix/ds/llist.h>
7 #include <lunaix/ds/mutex.h>
8 #include <lunaix/ds/waitq.h>
9
10 #define SERIAL_RW_RX 0x0
11 #define SERIAL_RW_TX 0x1
12 #define io_dir(flags) ((flags) & SERIAL_RW_TX)
13
14 #define RXTX_DONE 0x1
15 #define RXTX_WAIT 0x2
16
17 #define SERIAL_AGAIN 0x1
18 #define SERIAL_DONE 0x0
19
20 struct serial_dev;
21 typedef int (*rxtx_cb)(struct serial_dev*);
22
23 struct serial_dev
24 {
25     struct llist_header sdev_list;
26     struct device* dev;
27     struct waitq wq_rxdone;
28     struct waitq wq_txdone;
29     void* backend;
30
31     struct fifo_buf rxbuf;
32     int wr_len;
33
34     /**
35      * @brief Write buffer to TX. The return code indicate
36      * the transaction is either done in synced mode (TX_DONE) or will be
37      * done asynchronously (TX_WAIT).
38      *
39      */
40     int (*write)(struct serial_dev* sdev, u8_t*, size_t);
41     int (*exec_cmd)(struct serial_dev* sdev, u32_t, va_list);
42 };
43
44 struct serial_dev*
45 serial_create(struct devclass* class);
46
47 void
48 serial_readone(struct serial_dev* sdev, u8_t* val);
49
50 int
51 serial_readone_nowait(struct serial_dev* sdev, u8_t* val);
52
53 size_t
54 serial_readbuf(struct serial_dev* sdev, u8_t* buf, size_t len);
55
56 int
57 serial_readbuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len);
58
59 int
60 serial_writebuf(struct serial_dev* sdev, u8_t* buf, size_t len);
61
62 int
63 serial_writebuf_nowait(struct serial_dev* sdev, u8_t* buf, size_t len);
64
65 struct serial_dev*
66 serial_get_avilable();
67
68 int
69 serial_accept_one(struct serial_dev* sdev, u8_t val);
70
71 int
72 serial_accept_buffer(struct serial_dev* sdev, void* val, size_t len);
73
74 void
75 serial_end_recv(struct serial_dev* sdev);
76
77 void
78 serial_end_xmit(struct serial_dev* sdev, size_t len);
79
80 #endif /* __LUNAIX_SERIAL_H */