1 #ifndef __LUNAIX_16550_H
2 #define __LUNAIX_16550_H
4 #include <hal/serial.h>
6 #include <lunaix/types.h>
20 #define UART_INTRX 0x1
21 #define UART_LOOP (1 << 4)
23 #define UART_rIE_ERBFI 1
24 #define UART_rIE_ETBEI (1 << 1)
25 #define UART_rIE_ELSI (1 << 2)
26 #define UART_rIE_EDSSI (1 << 3)
28 #define UART_rLC_STOPB (1 << 2)
29 #define UART_rLC_PAREN (1 << 3)
30 #define UART_rLC_PAREVN (1 << 4)
31 #define UART_rLC_SETBRK (1 << 6)
32 #define UART_rLC_DLAB (1 << 7)
34 #define UART_rLS_THRE (1 << 5)
36 #define UART_rLS_BI (1 << 4)
38 #define UART_rII_FIFOEN (0b11 << 6)
39 #define UART_rII_ID 0b1111
42 #define UART_rFC_DMA1 (1 << 3)
43 #define UART_rFC_XMIT_RESET (1 << 2)
44 #define UART_rFC_RCVR_RESET (1 << 1)
46 #define UART_rMC_DTR 1
47 #define UART_rMC_RTS (1 << 1)
48 #define UART_rMC_IEN (1 << 3)
50 #define UART_FIFO1 0b00
51 #define UART_FIFO4 0b01
52 #define UART_FIFO8 0b10
53 #define UART_FIFO14 0b11
55 #define UART_NO_INTR 0b0001
56 #define UART_LINE_UDPDATE 0b0110
57 #define UART_DATA_OK 0b0100
58 #define UART_CHR_TIMEOUT 0b1100
59 #define UART_SENT_ALL 0b0010
60 #define UART_MODEM_UPDATE 0b0000
62 #define UART_LCR_RESET \
70 struct llist_header local_ports;
71 struct serial_dev* sdev;
73 unsigned int base_clk;
84 u32_t (*read_reg)(struct uart16550* uart, ptr_t regoff);
85 void (*write_reg)(struct uart16550* uart, ptr_t regoff, u32_t val);
88 #define UART16550(sdev) ((struct uart16550*)(sdev)->backend)
91 uart_setup(struct uart16550* uart)
93 uart->write_reg(uart, UART_rMC, uart->cntl_save.rmc);
94 uart->write_reg(uart, UART_rIE, uart->cntl_save.rie);
98 uart_clrie(struct uart16550* uart)
100 uart->cntl_save.rie = uart->read_reg(uart, UART_rIE);
101 uart->write_reg(uart, UART_rIE, 0);
105 uart_setie(struct uart16550* uart)
107 uart->write_reg(uart, UART_rIE, uart->cntl_save.rie);
111 uart_setlc(struct uart16550* uart)
113 uart->write_reg(uart, UART_rLC, uart->cntl_save.rlc);
117 uart_alloc(ptr_t base_addr);
120 uart_free(struct uart16550*);
123 uart_baud_divisor(struct uart16550* uart, unsigned int div)
125 u32_t rlc = uart->read_reg(uart, UART_rLC);
127 uart->write_reg(uart, UART_rLC, UART_rLC_DLAB | rlc);
128 u8_t ls = (div & 0x00ff), ms = (div & 0xff00) >> 8;
130 uart->write_reg(uart, UART_rLS, ls);
131 uart->write_reg(uart, UART_rMS, ms);
133 uart->write_reg(uart, UART_rLC, rlc & ~UART_rLC_DLAB);
139 uart_testport(struct uart16550* uart, char test_code)
141 u32_t rmc = uart->cntl_save.rmc;
142 uart->write_reg(uart, UART_rMC, rmc | UART_LOOP);
144 uart->write_reg(uart, UART_rRxTX, test_code);
146 u32_t result = (char)uart->read_reg(uart, UART_rRxTX) == test_code;
147 uart->write_reg(uart, UART_rMC, rmc & ~UART_LOOP);
153 uart_pending_data(struct uart16550* uart)
155 return uart->read_reg(uart, UART_rLS) & UART_rLS_DR;
159 uart_can_transmit(struct uart16550* uart)
161 return uart->read_reg(uart, UART_rLS) & UART_rLS_THRE;
165 * @brief End of receiving
171 uart_eorcv(struct uart16550* uart)
173 return uart->read_reg(uart, UART_rLS) & UART_rLS_BI;
177 uart_enable_fifo(struct uart16550* uart, int trig_lvl)
179 uart->cntl_save.rfc =
180 UART_rFC_EN | ((trig_lvl & 0b11) << 6) | UART_rFC_DMA1;
181 uart->write_reg(uart, UART_rFC, uart->cntl_save.rfc);
183 return uart->read_reg(uart, UART_rII) & UART_rII_FIFOEN;
187 uart_clear_rxfifo(struct uart16550* uart)
189 uart->write_reg(uart, UART_rFC, uart->cntl_save.rfc | UART_rFC_RCVR_RESET);
193 uart_clear_txfifo(struct uart16550* uart)
195 uart->write_reg(uart, UART_rFC, uart->cntl_save.rfc | UART_rFC_XMIT_RESET);
199 uart_clear_fifo(struct uart16550* uart)
201 u32_t rfc = uart->cntl_save.rfc | UART_rFC_XMIT_RESET | UART_rFC_RCVR_RESET;
202 uart->write_reg(uart, UART_rFC, rfc);
206 uart_intr_identify(struct uart16550* uart)
208 u32_t rii = uart->read_reg(uart, UART_rII);
209 return (rii & UART_rII_ID);
213 uart_read_byte(struct uart16550* uart)
215 return (u8_t)uart->read_reg(uart, UART_rRxTX);
219 uart_write_byte(struct uart16550* uart, u8_t val)
221 uart->write_reg(uart, UART_rRxTX, val);
225 uart_general_exec_cmd(struct serial_dev* sdev, u32_t req, va_list args);
228 uart_general_tx(struct serial_dev* sdev, u8_t* data, size_t len);
231 uart_handle_irq_overlap(irq_t irq, struct llist_header* ports);
234 uart_handle_irq(irq_t irq, struct uart16550 *uart);
236 static inline struct serial_dev*
237 uart_create_serial(struct uart16550* uart, struct devclass* class,
238 struct llist_header* ports, char* if_ident)
240 llist_append(ports, &uart->local_ports);
242 struct serial_dev* sdev = serial_create(class, if_ident);
243 sdev->backend = uart;
244 sdev->write = uart_general_tx;
245 sdev->exec_cmd = uart_general_exec_cmd;
256 uart16x50_pmio_create(ptr_t base);
259 uart16x50_mmio_create(ptr_t base, ptr_t size);
261 #endif /* __LUNAIX_16550_H */