summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2020-07-23 06:27:20 -0400
committerFrans Kaashoek <[email protected]>2020-08-10 11:19:10 -0400
commit2ae9c8e2722282d9a619c1745d845fb5d862c518 (patch)
treeaaaf787f3eeb9c3f9c98600fc3edeb00dd719650
parent0f50e9527c68168c8114a38b211a8744e3bd2473 (diff)
downloadxv6-labs-2ae9c8e2722282d9a619c1745d845fb5d862c518.tar.gz
xv6-labs-2ae9c8e2722282d9a619c1745d845fb5d862c518.tar.bz2
xv6-labs-2ae9c8e2722282d9a619c1745d845fb5d862c518.zip
defines for UART register bits
-rw-r--r--kernel/uart.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/kernel/uart.c b/kernel/uart.c
index 32cb575..daf9f04 100644
--- a/kernel/uart.c
+++ b/kernel/uart.c
@@ -19,13 +19,21 @@
// some have different meanings for
// read vs write.
// see http://byterunner.com/16550.html
-#define RHR 0 // receive holding register (for input bytes)
-#define THR 0 // transmit holding register (for output bytes)
-#define IER 1 // interrupt enable register
-#define FCR 2 // FIFO control register
-#define ISR 2 // interrupt status register
-#define LCR 3 // line control register
-#define LSR 5 // line status register
+#define RHR 0 // receive holding register (for input bytes)
+#define THR 0 // transmit holding register (for output bytes)
+#define IER 1 // interrupt enable register
+#define IER_TX_ENABLE (1<<0)
+#define IER_RX_ENABLE (1<<1)
+#define FCR 2 // FIFO control register
+#define FCR_FIFO_ENABLE (1<<0)
+#define FCR_FIFO_CLEAR (3<<1) // clear the content of the two FIFOs
+#define ISR 2 // interrupt status register
+#define LCR 3 // line control register
+#define LCR_EIGHT_BITS (3<<0)
+#define LCR_BAUD_LATCH (1<<7) // special mode to set baud rate
+#define LSR 5 // line status register
+#define LSR_RX_READY (1<<0) // input is waiting to be read from RHR
+#define LSR_TX_IDLE (1<<5) // THR can accept another character to send
#define ReadReg(reg) (*(Reg(reg)))
#define WriteReg(reg, v) (*(Reg(reg)) = (v))
@@ -46,7 +54,7 @@ uartinit(void)
WriteReg(IER, 0x00);
// special mode to set baud rate.
- WriteReg(LCR, 0x80);
+ WriteReg(LCR, LCR_BAUD_LATCH);
// LSB for baud rate of 38.4K.
WriteReg(0, 0x03);
@@ -56,13 +64,13 @@ uartinit(void)
// leave set-baud mode,
// and set word length to 8 bits, no parity.
- WriteReg(LCR, 0x03);
+ WriteReg(LCR, LCR_EIGHT_BITS);
// reset and enable FIFOs.
- WriteReg(FCR, 0x07);
+ WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR);
// enable transmit and receive interrupts.
- WriteReg(IER, 0x02 | 0x01);
+ WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE);
initlock(&uart_tx_lock, "uart");
}
@@ -102,7 +110,7 @@ uartputc_sync(int c)
push_off();
// wait for Transmit Holding Empty to be set in LSR.
- while((ReadReg(LSR) & (1 << 5)) == 0)
+ while((ReadReg(LSR) & LSR_TX_IDLE) == 0)
;
WriteReg(THR, c);
@@ -122,7 +130,7 @@ uartstart()
return;
}
- if((ReadReg(LSR) & (1 << 5)) == 0){
+ if((ReadReg(LSR) & LSR_TX_IDLE) == 0){
// the UART transmit holding register is full,
// so we cannot give it another byte.
// it will interrupt when it's ready for a new byte.