#ifndef _UART_H_
#define _UART_H_
#include <utils/types.h>
#define UART_A 0
#define UART_B 1
#define UART_C 2
#define UART_D 3
#define UART_E 4
#define BAUD_115200 115200
#define UART_TX_IDLE BIT(0)
#define UART_RX_RDYR BIT(1)
#define UART_TX_FIFO_FULL BIT(8)
#define UART_RX_FIFO_EMPTY BIT(9)
#define UART_INVERT_RXD BIT(0)
#define UART_INVERT_TXD BIT(1)
#define UART_INVERT_CTS BIT(2)
#define UART_INVERT_RTS BIT(3)
#define UART_IER_DLAB_IE_EORD BIT(5)
#define UART_LCR_WORD_LENGTH_8 0x3
#define UART_LCR_STOP BIT(2)
#define UART_LCR_DLAB BIT(7)
#define UART_LSR_RDR BIT(0)
#define UART_LSR_THRE BIT(5)
#define UART_LSR_TMTY BIT(6)
#define UART_LSR_FIFOE BIT(7)
#define UART_IIR_FCR_EN_FIFO BIT(0)
#define UART_IIR_FCR_RX_CLR BIT(1)
#define UART_IIR_FCR_TX_CLR BIT(2)
#define UART_IIR_NO_INT BIT(0)
#define UART_IIR_INT_MASK 0xF
#define UART_IIR_NOI 0
#define UART_IIR_MSI 1
#define UART_IIR_THRI 2
#define UART_IIR_RDI 3
#define UART_IIR_ERROR 4
#define UART_IIR_REDI 5
#define UART_IIR_RDTI 7
#define UART_MCR_DTR BIT(0)
#define UART_MCR_RTS BIT(1)
#define UART_MCR_CTS_EN BIT(5)
#define UART_MCR_RTS_EN BIT(6)
#define UART_FIFO_SIZE 36
typedef struct _uart_t
{
vu32 UART_THR_DLAB;
vu32 UART_IER_DLAB;
vu32 UART_IIR_FCR;
vu32 UART_LCR;
vu32 UART_MCR;
vu32 UART_LSR;
vu32 UART_MSR;
vu32 UART_SPR;
vu32 UART_IRDA_CSR;
vu32 UART_RX_FIFO_CFG;
vu32 UART_MIE;
vu32 UART_VENDOR_STATUS;
u8 _pad_30[0xC];
vu32 UART_ASR;
} uart_t;
typedef enum _uart_mode_t
{
UART_AO_TX_AO_RX = 0,
UART_AO_TX_MN_RX = UART_MCR_RTS,
UART_AO_TX_HW_RX = UART_MCR_RTS_EN,
} uart_mode_t;
void uart_init(u32 idx, u32 baud, u32 mode);
void uart_wait_xfer(u32 idx, u32 which);
void uart_send(u32 idx, const u8 *buf, u32 len);
u32 uart_recv(u32 idx, u8 *buf, u32 len);
void uart_invert(u32 idx, bool enable, u32 invert_mask);
void uart_set_mode(u32 idx, u32 mode);
u32 uart_get_IIR(u32 idx);
void uart_set_IIR(u32 idx);
void uart_empty_fifo(u32 idx, u32 which);
#ifdef DEBUG_UART_PORT
void uart_printf(const char *fmt, ...);
#endif
#endif