/* * $Id: cons_ns16550.c,v 1.1 2008/07/17 18:10:36 nbrk Exp $ */ /* * ns16550 USARTs to be used by bootldr. */ #include #include #define IO_BASE 0x7c000000 #define USART0_BASE (IO_BASE + 0x3f8) #define USART1_BASE (IO_BASE + 0x2f8) #define UART_DR 0 /* TX/RX data register */ #define UART_LSR 5 /* line status register */ #define LST_DR 0x01 /* receiver data ready */ #define LSR_TEMT 0x40 /* transmitter empty */ void bootuart_putc(int uartno, int c); int bootuart_getc(int uartno); void bootcons_putc(int uartno, int c) { uint32_t dev; dev = uartno == 1 ? USART1_BASE : USART0_BASE; /* poll TEMT */ while ((*(volatile uint32_t *)(dev + UART_LSR * 4)) & LSR_TEMT != 1) ; /* write tx fifo */ *(volatile uint32_t *)(dev + UART_DR * 4) = (c & 0x7f); } int bootcons_getc(int uartno) { uint32_t dev; dev = uartno == 1 ? USART1_BASE : USART0_BASE; /* poll DR */ while ((*(volatile uint32_t *)(dev + UART_LSR) & LSR_TEMT != 1)) ; return (*(volatile uint32_t *)(dev + UART_DR) & 0x7f); } int bootcons_init(void) { /* XXX */ return(0); }