add mem-map for x86_64
[lunaix-os.git] / lunaix-os / hal / char / uart / 16550.h
index a6565752eca4e8bb3e2c251875e5c13e4c9ab4b2..5b4040b695a152fdcb001fad89930ff54103dd59 100644 (file)
@@ -17,7 +17,6 @@
 #define UART_rDLM 1
 
 #define UART_INTRX 0x1
-#define UART_DLAB (1 << 7)
 #define UART_LOOP (1 << 4)
 
 #define UART_rIE_ERBFI 1
 #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_rLC_DLAB (1 << 7)
+
 #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*
@@ -103,13 +116,13 @@ uart_baud_divisor(struct uart16550* uart, int div)
 {
     u32_t rlc = uart->read_reg(uart, UART_rLC);
 
-    uart->write_reg(uart, UART_rLC, UART_DLAB | rlc);
+    uart->write_reg(uart, UART_rLC, UART_rLC_DLAB | rlc);
     u8_t ls = (div & 0xff), ms = (div & 0xff00) >> 8;
 
     uart->write_reg(uart, UART_rLS, ls);
     uart->write_reg(uart, UART_rMS, ms);
 
-    uart->write_reg(uart, UART_rLC, rlc & ~UART_DLAB);
+    uart->write_reg(uart, UART_rLC, rlc & ~UART_rLC_DLAB);
 
     return 0;
 }
@@ -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