bdk: uart: refactor and add new functionality
- Allow to set CTS/RTS mode (only specific combos supported for now) - Support the above modes in receiving - Set 2 stop bits to decreases errors on high baudrates
This commit is contained in:
@@ -28,33 +28,33 @@
|
||||
|
||||
#define BAUD_115200 115200
|
||||
|
||||
#define UART_TX_IDLE 0x1
|
||||
#define UART_RX_IDLE 0x2
|
||||
#define UART_TX_IDLE BIT(0)
|
||||
#define UART_RX_RDYR BIT(1)
|
||||
|
||||
#define UART_TX_FIFO_FULL 0x100
|
||||
#define UART_RX_FIFO_EMPTY 0x200
|
||||
#define UART_TX_FIFO_FULL BIT(8)
|
||||
#define UART_RX_FIFO_EMPTY BIT(9)
|
||||
|
||||
#define UART_INVERT_RXD 0x01
|
||||
#define UART_INVERT_TXD 0x02
|
||||
#define UART_INVERT_CTS 0x04
|
||||
#define UART_INVERT_RTS 0x08
|
||||
#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 0x20
|
||||
#define UART_IER_DLAB_IE_EORD BIT(5)
|
||||
|
||||
#define UART_LCR_DLAB 0x80
|
||||
#define UART_LCR_STOP 0x4
|
||||
#define UART_LCR_WORD_LENGTH_8 0x3
|
||||
#define UART_LCR_STOP BIT(2)
|
||||
#define UART_LCR_DLAB BIT(7)
|
||||
|
||||
#define UART_LSR_RDR 0x1
|
||||
#define UART_LSR_THRE 0x20
|
||||
#define UART_LSR_TMTY 0x40
|
||||
#define UART_LSR_FIFOE 0x80
|
||||
#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_TX_CLR 0x4
|
||||
#define UART_IIR_FCR_RX_CLR 0x2
|
||||
#define UART_IIR_FCR_EN_FIFO 0x1
|
||||
#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_NO_INT BIT(0)
|
||||
#define UART_IIR_INT_MASK 0xF
|
||||
/* Custom returned interrupt results. Actual interrupts are -1 */
|
||||
#define UART_IIR_NOI 0 // No interrupt.
|
||||
@@ -65,8 +65,10 @@
|
||||
#define UART_IIR_REDI 5 // Receiver end of data interrupt.
|
||||
#define UART_IIR_RDTI 7 // Receiver data timeout interrupt.
|
||||
|
||||
#define UART_MCR_RTS 0x2
|
||||
#define UART_MCR_DTR 0x1
|
||||
#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)
|
||||
|
||||
typedef struct _uart_t
|
||||
{
|
||||
@@ -86,11 +88,24 @@ typedef struct _uart_t
|
||||
/* 0x3C */ vu32 UART_ASR;
|
||||
} uart_t;
|
||||
|
||||
void uart_init(u32 idx, u32 baud);
|
||||
void uart_wait_idle(u32 idx, u32 which);
|
||||
//! TODO: Commented out modes are not supported yet.
|
||||
typedef enum _uart_mode_t
|
||||
{
|
||||
UART_AO_TX_AO_RX = 0,
|
||||
//UART_MN_TX_AO_RX = UART_MCR_RTS | UART_MCR_DTR,
|
||||
UART_AO_TX_MN_RX = UART_MCR_RTS, // Up to 36 bytes read.
|
||||
//UART_MN_TX_AO_RX = UART_MCR_DTR,
|
||||
//UART_HW_TX_HW_RX = UART_MCR_RTS_EN | UART_MCR_CTS_EN,
|
||||
UART_AO_TX_HW_RX = UART_MCR_RTS_EN,
|
||||
//UART_HW_TX_AO_RX = UART_MCR_CTS_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);
|
||||
|
||||
Reference in New Issue
Block a user