diff options
Diffstat (limited to 'bsps/arm/beagle/console/console-config.c')
-rw-r--r-- | bsps/arm/beagle/console/console-config.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/bsps/arm/beagle/console/console-config.c b/bsps/arm/beagle/console/console-config.c new file mode 100644 index 0000000000..78af5f6a93 --- /dev/null +++ b/bsps/arm/beagle/console/console-config.c @@ -0,0 +1,152 @@ +/** + * @file + * + * @ingroup arm_beagle + * + * @brief Console configuration. + */ + +/* + * Copyright (c) 2012 Claas Ziemke. All rights reserved. + * + * Claas Ziemke + * Kernerstrasse 11 + * 70182 Stuttgart + * Germany + * <claas.ziemke@gmx.net> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + * + * Modified by Ben Gras <beng@shrike-systems.com> to make + * interrupt-driven uart i/o work for beagleboards; beaglebone support added. + */ + +#include <libchip/serial.h> +#include <libchip/ns16550.h> + +#include <rtems/bspIo.h> + +#include <bsp.h> +#include <bsp/irq.h> +#include <bsp/uart-output-char.h> + +#define CONSOLE_UART_THR (*(volatile unsigned int *)BSP_CONSOLE_UART_BASE) +#define CONSOLE_UART_RHR (*(volatile unsigned int *)BSP_CONSOLE_UART_BASE) +#define CONSOLE_UART_LSR (*(volatile unsigned int *)(BSP_CONSOLE_UART_BASE+0x14)) +#define CONSOLE_SYSC (*(volatile uint32_t *) (BSP_CONSOLE_UART_BASE + 0x54)) +#define CONSOLE_SYSS (*(volatile uint32_t *) (BSP_CONSOLE_UART_BASE + 0x58)) + +#define TX_FIFO_E (1<<5) +#define RX_FIFO_E (1<<0) + +static uint8_t beagle_uart_get_register(uintptr_t addr, uint8_t i) +{ + uint8_t v; + volatile uint32_t *reg_r = (volatile uint32_t *) addr + i; + + if(reg_r == (uint32_t*) BSP_CONSOLE_UART_BASE /* reading RHR */ ) { + /* check there should be anything in the RHR before accessing it */ + if(!(CONSOLE_UART_LSR & 0x01)) { + return 0; + } + } + + v = (uint8_t) *reg_r; + + return v; +} + +static void beagle_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val) +{ + volatile uint32_t *reg = (volatile uint32_t *) addr; + + reg [i] = val; +} + +console_tbl Console_Configuration_Ports [] = { + { + .sDeviceName = "/dev/ttyS0", + .deviceType = SERIAL_NS16550, +#if CONSOLE_POLLED /* option to facilitate running the tests */ + .pDeviceFns = &ns16550_fns_polled, +#else + .pDeviceFns = &ns16550_fns, +#endif + .ulMargin = 16, + .ulHysteresis = 8, + .pDeviceParams = (void *) CONSOLE_BAUD, + .ulCtrlPort1 = BSP_CONSOLE_UART_BASE, + .ulDataPort = BSP_CONSOLE_UART_BASE, + .ulIntVector = BSP_CONSOLE_UART_IRQ, + .getRegister = beagle_uart_get_register, + .setRegister = beagle_uart_set_register, + .ulClock = UART_CLOCK, /* 48MHz base clock */ + }, +}; + +unsigned long Console_Configuration_Count = 1; + +static int init_needed = 1; // don't rely on bss being 0 + +static void beagle_console_init(void) +{ + if(init_needed) { + const uint32_t div = UART_CLOCK / 16 / CONSOLE_BAUD; + CONSOLE_SYSC = 2; + while ((CONSOLE_SYSS & 1) == 0) + ; + if ((CONSOLE_LSR & (CONSOLE_LSR_THRE | CONSOLE_LSR_TEMT)) == CONSOLE_LSR_THRE) { + CONSOLE_LCR = 0x83; + CONSOLE_DLL = div; + CONSOLE_DLM = (div >> 8) & 0xff; + CONSOLE_LCR = 0x03; + CONSOLE_ACR = 0x00; + } + + while ((CONSOLE_LSR & CONSOLE_LSR_TEMT) == 0) + ; + + CONSOLE_LCR = 0x80 | 0x03; + CONSOLE_DLL = 0x00; + CONSOLE_DLM = 0x00; + CONSOLE_LCR = 0x03; + CONSOLE_MCR = 0x03; + CONSOLE_FCR = 0x07; + CONSOLE_LCR = 0x83; + CONSOLE_DLL = div; + CONSOLE_DLM = (div >> 8) & 0xff; + CONSOLE_LCR = 0x03; + CONSOLE_ACR = 0x00; + init_needed = 0; + } +} + +#define CONSOLE_THR8 (*(volatile uint8_t *) (BSP_CONSOLE_UART_BASE + 0x00)) + +static void uart_write_polled( char c ) +{ + if(init_needed) beagle_console_init(); + + while( ( CONSOLE_LSR & TX_FIFO_E ) == 0 ) + ; + CONSOLE_THR8 = c; +} + +static void _BSP_put_char( char c ) { + uart_write_polled( c ); +} + +static int _BSP_get_char(void) +{ + if ((CONSOLE_LSR & CONSOLE_LSR_RDR) != 0) { + return CONSOLE_RBR; + } else { + return -1; + } +} + +BSP_output_char_function_type BSP_output_char = _BSP_put_char; + +BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char; |