X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/8fce4520de1f257819b16f9253fa28dcdae743f4..aa67abb537f22db097db632d98212fa951bfeef0:/lunaix-os/hal/char/uart/16550.h diff --git a/lunaix-os/hal/char/uart/16550.h b/lunaix-os/hal/char/uart/16550.h index a656575..ccee415 100644 --- a/lunaix-os/hal/char/uart/16550.h +++ b/lunaix-os/hal/char/uart/16550.h @@ -25,14 +25,20 @@ #define UART_rIE_ELSI (1 << 2) #define UART_rIE_EDSSI (1 << 3) +#define UART_rLC_STOPB (1 << 2) +#define UART_rLC_PAREN (1 << 3) +#define UART_rLC_PAREVN (1 << 4) +#define UART_rLC_SETBRK (1 << 6) + #define UART_rLS_THRE (1 << 5) #define UART_rLS_DR 1 #define UART_rLS_BI (1 << 4) #define UART_rII_FIFOEN (0b11 << 6) -#define UART_rII_ID 0b1110 +#define UART_rII_ID 0b1111 #define UART_rFC_EN 1 +#define UART_rFC_DMA1 (1 << 3) #define UART_rFC_XMIT_RESET (1 << 2) #define UART_rFC_RCVR_RESET (1 << 1) @@ -64,6 +70,7 @@ struct uart16550 u8_t rie; u8_t rfc; u8_t rmc; + u8_t rlc; } cntl_save; u32_t (*read_reg)(struct uart16550* uart, ptr_t regoff); @@ -80,16 +87,22 @@ uart_setup(struct uart16550* uart) } static inline void -uart_setie(struct uart16550* uart) +uart_clrie(struct uart16550* uart) { uart->cntl_save.rie = uart->read_reg(uart, UART_rIE); uart->write_reg(uart, UART_rIE, 0); } static inline void -uart_clrie(struct uart16550* uart) +uart_setie(struct uart16550* uart) +{ + uart->write_reg(uart, UART_rIE, uart->cntl_save.rie); +} + +static inline void +uart_setlc(struct uart16550* uart) { - uart->write_reg(uart, UART_rIE, uart->cntl_save.rie | 1); + uart->write_reg(uart, UART_rLC, uart->cntl_save.rlc); } struct uart16550* @@ -155,7 +168,8 @@ uart_eorcv(struct uart16550* uart) static inline int uart_enable_fifo(struct uart16550* uart, int trig_lvl) { - uart->cntl_save.rfc = UART_rFC_EN | (trig_lvl & 0b11); + uart->cntl_save.rfc = + UART_rFC_EN | ((trig_lvl & 0b11) << 6) | UART_rFC_DMA1; uart->write_reg(uart, UART_rFC, uart->cntl_save.rfc); return uart->read_reg(uart, UART_rII) & UART_rII_FIFOEN; @@ -184,7 +198,7 @@ static inline int uart_intr_identify(struct uart16550* uart) { u32_t rii = uart->read_reg(uart, UART_rII); - return (!!(rii & UART_rII_FIFOEN) << 3) | ((rii & UART_rII_ID) >> 1); + return (rii & UART_rII_ID); } static inline u8_t