QDNix
Quick’n’dirty *NIX
uart.c
1 #include "arch.h"
2 
3 #define UART0_BASE_ADDR 0x01C28000
4 #define UART1_BASE_ADDR 0x01C28400
5 #define UART2_BASE_ADDR 0x01C28800
6 #define UART3_BASE_ADDR 0x01C28C00
7 #define R_UART_BASE_ADDR 0x01F02800
8 
9 #define UART0(x) (UART0_BASE_ADDR + x)
10 #define UART1(x) (UART1_BASE_ADDR + x)
11 #define UART2(x) (UART2_BASE_ADDR + x)
12 #define UART3(x) (UART3_BASE_ADDR + x)
13 #define R_UART(x) (R_UART_BASE_ADDR + x)
14 
15 #define UART_RECV_BUFF_REG 0x00
16 #define UART_TRANSMIT_HOLDING_REG 0x00
17 #define UART_DIV_LATCH_LOW_REG 0x00
18 #define UART_DIV_LATCH_HIGH_REG 0x04
19 #define UART_INT_ENABLE_REG 0x04
20 #define UART_INT_ID_REG 0x08
21 #define UART_FIFO_CONTROL_REG 0x08
22 #define UART_LINE_CONTROL_REG 0x0C
23 #define UART_MODEM_CONTROL_REG 0x10
24 #define UART_LINE_STATUS_REG 0x14
25 #define UART_MODEM_STATUS_REG 0x18
26 #define UART_SCRATCH_REG 0x1C
27 #define UART_STATUS_REG 0x7C
28 #define UART_TRANSMIT_FIFO_LEVEL 0x80
29 #define UART_RFL 0x84
30 #define UART_HALT_TX_REG 0xA4
31 
32 void
33 uart_init(void)
34 {
35 
36 }
37 
38 void
39 uart_putchar(uint8_t c)
40 {
41  while ((mmio_read32(UART0(UART_LINE_STATUS_REG)) & (1 << 5)) > 0)
42  {}
43  mmio_write32(UART0(UART_TRANSMIT_HOLDING_REG), c);
44 }