diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-04-19 06:28:01 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-04-20 13:08:32 +0200 |
commit | d7d66d7d4523b904c8ccc6aea3709dc0d5aa5bdc (patch) | |
tree | caa54b4229e86a68c84ab5961af34e087dce5302 /c/src/lib/libbsp/arm | |
parent | bsps/powerpc: Move shared btimer support (diff) | |
download | rtems-d7d66d7d4523b904c8ccc6aea3709dc0d5aa5bdc.tar.bz2 |
bsps: Move console drivers to bsps
This patch is a part of the BSP source reorganization.
Update #3285.
Diffstat (limited to 'c/src/lib/libbsp/arm')
62 files changed, 57 insertions, 13143 deletions
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am index 8fff55e7c8..63449347ad 100644 --- a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am +++ b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am @@ -106,9 +106,9 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += ../shared/arm-gic-irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios-init.c -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/altera-cyclone-v/console/console-config.c # Clock librtemsbsp_a_SOURCES += ../shared/arm-a9mpcore-clock-config.c diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/console/console-config.c b/c/src/lib/libbsp/arm/altera-cyclone-v/console/console-config.c deleted file mode 100644 index e4dfec9f62..0000000000 --- a/c/src/lib/libbsp/arm/altera-cyclone-v/console/console-config.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@embedded-brains.de> - * - * 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. - */ - -#include <libchip/ns16550.h> - -#include <rtems/bspIo.h> - -#include <bsp.h> -#include <bsp/irq.h> -#include <bsp/alt_clock_manager.h> -#include <bsp/console-termios.h> -#include <bsp/socal/alt_rstmgr.h> -#include <bsp/socal/socal.h> -#include <bsp/socal/alt_uart.h> -#include <bsp/socal/hps.h> - -#ifdef BSP_USE_UART_INTERRUPTS - #define DEVICE_FNS &ns16550_handler_interrupt -#else - #define DEVICE_FNS &ns16550_handler_polled -#endif - -static uint8_t altera_cyclone_v_uart_get_register(uintptr_t addr, uint8_t i) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - return (uint8_t) reg [i]; -} - -static void altera_cyclone_v_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - reg [i] = val; -} - -static bool altera_cyclone_v_uart_probe( - rtems_termios_device_context *base, - uint32_t uart_set_mask -) -{ - ns16550_context *ctx = (ns16550_context *) base; - bool ret = true; - uint32_t ucr; - ALT_STATUS_CODE sc; - void* location = (void *) ctx->port; - - /* The ALT_CLK_L4_SP is required for all SoCFPGA UARTs. - * Check that it's enabled. */ - if ( alt_clk_is_enabled(ALT_CLK_L4_SP) != ALT_E_TRUE ) { - ret = false; - } - - if ( ret ) { - sc = alt_clk_freq_get(ALT_CLK_L4_SP, &ctx->clock); - if ( sc != ALT_E_SUCCESS ) { - ret = false; - } - } - - if ( ret ) { - // Bring UART out of reset. - alt_clrbits_word(ALT_RSTMGR_PERMODRST_ADDR, uart_set_mask); - - // Verify the UCR (UART Component Version) - ucr = alt_read_word( ALT_UART_UCV_ADDR( location ) ); - if ( ucr != ALT_UART_UCV_UART_COMPONENT_VER_RESET ) { - ret = false; - } - } - - if ( ret ) { - // Write SRR::UR (Shadow Reset Register :: UART Reset) - alt_write_word( ALT_UART_SRR_ADDR( location ), ALT_UART_SRR_UR_SET_MSK ); - - // Read the MSR to work around case:119085. - (void)alt_read_word( ALT_UART_MSR_ADDR( location ) ); - - ret = ns16550_probe( base ); - } - - return ret; -} - -#ifdef CYCLONE_V_CONFIG_CONSOLE -static bool altera_cyclone_v_uart_probe_0(rtems_termios_device_context *base) -{ - return altera_cyclone_v_uart_probe(base, ALT_RSTMGR_PERMODRST_UART0_SET_MSK); -} - -static ns16550_context altera_cyclone_v_uart_context_0 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 0"), - .get_reg = altera_cyclone_v_uart_get_register, - .set_reg = altera_cyclone_v_uart_set_register, - .port = (uintptr_t) ALT_UART0_ADDR, - .irq = ALT_INT_INTERRUPT_UART0, - .initial_baud = CYCLONE_V_UART_BAUD -}; -#endif - -#ifdef CYCLONE_V_CONFIG_UART_1 -static bool altera_cyclone_v_uart_probe_1(rtems_termios_device_context *base) -{ - return altera_cyclone_v_uart_probe(base, ALT_RSTMGR_PERMODRST_UART1_SET_MSK); -} - -static ns16550_context altera_cyclone_v_uart_context_1 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 1"), - .get_reg = altera_cyclone_v_uart_get_register, - .set_reg = altera_cyclone_v_uart_set_register, - .port = (uintptr_t) ALT_UART1_ADDR, - .irq = ALT_INT_INTERRUPT_UART1, - .initial_baud = CYCLONE_V_UART_BAUD -}; -#endif - -const console_device console_device_table[] = { - #ifdef CYCLONE_V_CONFIG_CONSOLE - { - .device_file = "/dev/ttyS0", - .probe = altera_cyclone_v_uart_probe_0, - .handler = DEVICE_FNS, - .context = &altera_cyclone_v_uart_context_0.base - }, - #endif - #ifdef CYCLONE_V_CONFIG_UART_1 - { - .device_file = "/dev/ttyS1", - .probe = altera_cyclone_v_uart_probe_1, - .handler = DEVICE_FNS, - .context = &altera_cyclone_v_uart_context_1.base - }, - #endif -}; - -const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table); - -static void output_char(char c) -{ - rtems_termios_device_context *ctx = console_device_table[0].context; - - ns16550_polled_putchar( ctx, c ); -} - -BSP_output_char_function_type BSP_output_char = output_char; - -BSP_polling_getchar_function_type BSP_poll_char = NULL; diff --git a/c/src/lib/libbsp/arm/atsam/Makefile.am b/c/src/lib/libbsp/arm/atsam/Makefile.am index 4472869d5c..758b84b343 100644 --- a/c/src/lib/libbsp/arm/atsam/Makefile.am +++ b/c/src/lib/libbsp/arm/atsam/Makefile.am @@ -113,9 +113,9 @@ librtemsbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq.c librtemsbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq-dispatch.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console.c -librtemsbsp_a_SOURCES += console/debug-console.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/atsam/console/console.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/atsam/console/debug-console.c # Clock librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-armv7m.c diff --git a/c/src/lib/libbsp/arm/atsam/console/console.c b/c/src/lib/libbsp/arm/atsam/console/console.c deleted file mode 100644 index d51d2ace7d..0000000000 --- a/c/src/lib/libbsp/arm/atsam/console/console.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <bsp.h> -#include <bsp/irq.h> -#include <bsp/fatal.h> -#include <rtems/console.h> - -#include <rtems/termiostypes.h> - -#include <chip.h> - -#include <unistd.h> - -typedef struct { - rtems_termios_device_context base; - Usart *regs; - rtems_vector_number irq; - uint32_t id; - bool console; -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - bool transmitting; -#endif -} atsam_usart_context; - -static atsam_usart_context atsam_usart_instances[] = { - { - .regs = USART0, - .irq = USART0_IRQn, - .id = ID_USART0 - } -#ifdef USART1 - , { - .regs = USART1, - .irq = USART1_IRQn, - .id = ID_USART1 - } -#endif -#ifdef USART2 - , { - .regs = USART2, - .irq = USART2_IRQn, - .id = ID_USART2 - } -#endif -}; - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS -static void atsam_usart_interrupt(void *arg) -{ - rtems_termios_tty *tty = arg; - atsam_usart_context *ctx = rtems_termios_get_device_context(tty); - Usart *regs = ctx->regs; - uint32_t csr = regs->US_CSR; - - while ((csr & US_CSR_RXRDY) != 0) { - char c = (char) regs->US_RHR; - - rtems_termios_enqueue_raw_characters(tty, &c, 1); - - csr = regs->US_CSR; - } - - if (ctx->transmitting && (csr & US_CSR_TXEMPTY) != 0) { - rtems_termios_dequeue_characters(tty, 1); - } -} -#endif - -static bool atsam_usart_set_attributes( - rtems_termios_device_context *base, - const struct termios *term -) -{ - atsam_usart_context *ctx = (atsam_usart_context *) base; - Usart *regs = ctx->regs; - rtems_termios_baud_t baud; - uint32_t mr; - - baud = rtems_termios_baud_to_number(term->c_ospeed); - regs->US_BRGR = (BOARD_MCK / baud) / 16; - - if ((term->c_cflag & CREAD) != 0) { - regs->US_CR = US_CR_RXEN | US_CR_TXEN; - } else { - regs->US_CR = US_CR_TXEN; - } - - mr = US_MR_USART_MODE_NORMAL | US_MR_USCLKS_MCK; - - switch (term->c_cflag & CSIZE) { - case CS5: - mr |= US_MR_CHRL_5_BIT; - break; - case CS6: - mr |= US_MR_CHRL_6_BIT; - break; - case CS7: - mr |= US_MR_CHRL_7_BIT; - break; - default: - mr |= US_MR_CHRL_8_BIT; - break; - } - - if ((term->c_cflag & PARENB) != 0) { - if ((term->c_cflag & PARODD) != 0) { - mr |= US_MR_PAR_ODD; - } else { - mr |= US_MR_PAR_EVEN; - } - } else { - mr |= US_MR_PAR_NO; - } - - if ((term->c_cflag & CSTOPB) != 0) { - mr |= US_MR_NBSTOP_2_BIT; - } else { - mr |= US_MR_NBSTOP_1_BIT; - } - - regs->US_MR = mr; - - return true; -} - -static bool atsam_usart_first_open( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - atsam_usart_context *ctx = (atsam_usart_context *) base; - Usart *regs = ctx->regs; -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - rtems_status_code sc; -#endif - - regs->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RSTSTA; - regs->US_IDR = 0xffffffff; - - PMC_EnablePeripheral(ctx->id); - - rtems_termios_set_initial_baud(tty, ATSAM_CONSOLE_BAUD); - atsam_usart_set_attributes(base, term); - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - regs->US_IER = US_IDR_RXRDY; - sc = rtems_interrupt_handler_install( - ctx->irq, - "USART", - RTEMS_INTERRUPT_SHARED, - atsam_usart_interrupt, - tty - ); - if (sc != RTEMS_SUCCESSFUL) { - return false; - } -#endif - - return true; -} - -static void atsam_usart_last_close( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ - atsam_usart_context *ctx = (atsam_usart_context *) base; - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - rtems_interrupt_handler_remove(ctx->irq, atsam_usart_interrupt, tty); -#endif - - if (!ctx->console) { - PMC_DisablePeripheral(ctx->id); - } -} - -static void atsam_usart_write( - rtems_termios_device_context *base, - const char *buf, - size_t len -) -{ - atsam_usart_context *ctx = (atsam_usart_context *) base; - Usart *regs = ctx->regs; - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - if (len > 0) { - ctx->transmitting = true; - regs->US_THR = buf[0]; - regs->US_IER = US_IDR_TXEMPTY; - } else { - ctx->transmitting = false; - regs->US_IDR = US_IDR_TXEMPTY; - } -#else - size_t i; - - for (i = 0; i < len; ++i) { - while ((regs->US_CSR & US_CSR_TXEMPTY) == 0) { - /* Wait */ - } - - regs->US_THR = buf[i]; - } -#endif -} - -#ifndef ATSAM_CONSOLE_USE_INTERRUPTS -static int atsam_usart_read(rtems_termios_device_context *base) -{ - atsam_usart_context *ctx = (atsam_usart_context *) base; - Usart *regs = ctx->regs; - - if ((regs->US_CSR & US_CSR_RXRDY) != 0) { - return (char) regs->US_RHR; - } else { - return -1; - } -} -#endif - -static const rtems_termios_device_handler atsam_usart_handler = { - .first_open = atsam_usart_first_open, - .last_close = atsam_usart_last_close, - .write = atsam_usart_write, - .set_attributes = atsam_usart_set_attributes, -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - .mode = TERMIOS_IRQ_DRIVEN -#else - .poll_read = atsam_usart_read, - .mode = TERMIOS_POLLED -#endif -}; - -typedef struct { - rtems_termios_device_context base; - Uart *regs; - rtems_vector_number irq; - uint32_t id; - bool console; -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - bool transmitting; -#endif -} atsam_uart_context; - -static atsam_uart_context atsam_uart_instances[] = { - { - .regs = UART0, - .irq = UART0_IRQn, - .id = ID_UART0 - } -#ifdef UART1 - , { - .regs = UART1, - .irq = UART1_IRQn, - .id = ID_UART1 - } -#endif -#ifdef UART2 - , { - .regs = UART2, - .irq = UART2_IRQn, - .id = ID_UART2 - } -#endif -#ifdef UART3 - , { - .regs = UART3, - .irq = UART3_IRQn, - .id = ID_UART3 - } -#endif -#ifdef UART4 - , { - .regs = UART4, - .irq = UART4_IRQn, - .id = ID_UART4 - } -#endif -}; - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS -static void atsam_uart_interrupt(void *arg) -{ - rtems_termios_tty *tty = arg; - atsam_uart_context *ctx = rtems_termios_get_device_context(tty); - Uart *regs = ctx->regs; - uint32_t sr = regs->UART_SR; - - while ((sr & UART_SR_RXRDY) != 0) { - char c = (char) regs->UART_RHR; - - rtems_termios_enqueue_raw_characters(tty, &c, 1); - - sr = regs->UART_SR; - } - - if (ctx->transmitting && (sr & UART_SR_TXEMPTY) != 0) { - rtems_termios_dequeue_characters(tty, 1); - } -} -#endif - -static bool atsam_uart_set_attributes( - rtems_termios_device_context *base, - const struct termios *term -) -{ - atsam_uart_context *ctx = (atsam_uart_context *) base; - Uart *regs = ctx->regs; - rtems_termios_baud_t baud; - uint32_t mr; - - baud = rtems_termios_baud_to_number(term->c_ospeed); - regs->UART_BRGR = (BOARD_MCK / baud) / 16; - - if ((term->c_cflag & CREAD) != 0) { - regs->UART_CR = UART_CR_RXEN | UART_CR_TXEN; - } else { - regs->UART_CR = UART_CR_TXEN; - } - - mr = UART_MR_FILTER_DISABLED | UART_MR_BRSRCCK_PERIPH_CLK; - - if ((term->c_cflag & CSIZE) != CS8) { - return false; - } - - if ((term->c_cflag & PARENB) != 0) { - if ((term->c_cflag & PARODD) != 0) { - mr |= UART_MR_PAR_ODD; - } else { - mr |= UART_MR_PAR_EVEN; - } - } else { - mr |= UART_MR_PAR_NO; - } - - if ((term->c_cflag & CSTOPB) != 0) { - return false; - } - - regs->UART_MR = mr; - - return true; -} - -static bool atsam_uart_first_open( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - atsam_uart_context *ctx = (atsam_uart_context *) base; - Uart *regs = ctx->regs; -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - rtems_status_code sc; -#endif - - regs->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RSTSTA; - regs->UART_IDR = 0xffffffff; - - PMC_EnablePeripheral(ctx->id); - - rtems_termios_set_initial_baud(tty, ATSAM_CONSOLE_BAUD); - atsam_uart_set_attributes(base, term); - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - regs->UART_IER = UART_IDR_RXRDY; - sc = rtems_interrupt_handler_install( - ctx->irq, - "UART", - RTEMS_INTERRUPT_SHARED, - atsam_uart_interrupt, - tty - ); - if (sc != RTEMS_SUCCESSFUL) { - return false; - } -#endif - - return true; -} - -static void atsam_uart_last_close( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ - atsam_uart_context *ctx = (atsam_uart_context *) base; - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - rtems_interrupt_handler_remove(ctx->irq, atsam_uart_interrupt, tty); -#endif - - if (!ctx->console) { - PMC_DisablePeripheral(ctx->id); - } -} - -static void atsam_uart_write( - rtems_termios_device_context *base, - const char *buf, - size_t len -) -{ - atsam_uart_context *ctx = (atsam_uart_context *) base; - Uart *regs = ctx->regs; - -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - if (len > 0) { - ctx->transmitting = true; - regs->UART_THR = buf[0]; - regs->UART_IER = UART_IDR_TXEMPTY; - } else { - ctx->transmitting = false; - regs->UART_IDR = UART_IDR_TXEMPTY; - } -#else - size_t i; - - for (i = 0; i < len; ++i) { - while ((regs->UART_SR & UART_SR_TXEMPTY) == 0) { - /* Wait */ - } - - regs->UART_THR = buf[i]; - } -#endif -} - -#ifndef ATSAM_CONSOLE_USE_INTERRUPTS -static int atsam_uart_read(rtems_termios_device_context *base) -{ - atsam_uart_context *ctx = (atsam_uart_context *) base; - Uart *regs = ctx->regs; - - if ((regs->UART_SR & UART_SR_RXRDY) != 0) { - return (char) regs->UART_RHR; - } else { - return -1; - } -} -#endif - -static const rtems_termios_device_handler atsam_uart_handler = { - .first_open = atsam_uart_first_open, - .last_close = atsam_uart_last_close, - .write = atsam_uart_write, - .set_attributes = atsam_uart_set_attributes, -#ifdef ATSAM_CONSOLE_USE_INTERRUPTS - .mode = TERMIOS_IRQ_DRIVEN -#else - .poll_read = atsam_uart_read, - .mode = TERMIOS_POLLED -#endif -}; - -rtems_status_code console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - size_t i; - - rtems_termios_initialize(); - - for (i = 0; i < RTEMS_ARRAY_SIZE(atsam_usart_instances); ++i) { - char usart[] = "/dev/ttyUSARTX"; - - usart[sizeof(usart) - 2] = (char) ('0' + i); - rtems_termios_device_install( - &usart[0], - &atsam_usart_handler, - NULL, - &atsam_usart_instances[i].base - ); - -#if ATSAM_CONSOLE_DEVICE_TYPE == 0 - if (i == ATSAM_CONSOLE_DEVICE_INDEX) { - atsam_usart_instances[i].console = true; - link(&usart[0], CONSOLE_DEVICE_NAME); - } -#endif - } - - for (i = 0; i < RTEMS_ARRAY_SIZE(atsam_uart_instances); ++i) { - char uart[] = "/dev/ttyUARTX"; - - uart[sizeof(uart) - 2] = (char) ('0' + i); - rtems_termios_device_install( - &uart[0], - &atsam_uart_handler, - NULL, - &atsam_uart_instances[i].base - ); - -#if ATSAM_CONSOLE_DEVICE_TYPE == 1 - if (i == ATSAM_CONSOLE_DEVICE_INDEX) { - atsam_uart_instances[i].console = true; - link(&uart[0], CONSOLE_DEVICE_NAME); - } -#endif - } - - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/arm/atsam/console/debug-console.c b/c/src/lib/libbsp/arm/atsam/console/debug-console.c deleted file mode 100644 index a405fe9665..0000000000 --- a/c/src/lib/libbsp/arm/atsam/console/debug-console.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <rtems/bspIo.h> -#include <rtems/sysinit.h> - -#include <bsp/atsam-clock-config.h> -#include <chip.h> -#include <include/dbg_console.h> - -static void atsam_debug_console_out(char c) -{ - DBG_PutChar((uint8_t) c); -} - -static void atsam_debug_console_init(void) -{ - DBG_Configure(115200, BOARD_MCK); - BSP_output_char = atsam_debug_console_out; -} - -static void atsam_debug_console_early_init(char c) -{ - atsam_debug_console_init(); - atsam_debug_console_out(c); -} - -static int atsam_debug_console_in(void) -{ - return (int) DBG_GetChar(); -} - -BSP_output_char_function_type BSP_output_char = atsam_debug_console_early_init; - -BSP_polling_getchar_function_type BSP_poll_char = atsam_debug_console_in; - -RTEMS_SYSINIT_ITEM( - atsam_debug_console_init, - RTEMS_SYSINIT_BSP_START, - RTEMS_SYSINIT_ORDER_LAST -); diff --git a/c/src/lib/libbsp/arm/beagle/Makefile.am b/c/src/lib/libbsp/arm/beagle/Makefile.am index 079bc3d342..9e351295a3 100644 --- a/c/src/lib/libbsp/arm/beagle/Makefile.am +++ b/c/src/lib/libbsp/arm/beagle/Makefile.am @@ -65,7 +65,7 @@ librtemsbsp_a_SOURCES += irq.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/beagle/console/console-config.c # I2C librtemsbsp_a_SOURCES += i2c/bbb-i2c.c diff --git a/c/src/lib/libbsp/arm/beagle/console/console-config.c b/c/src/lib/libbsp/arm/beagle/console/console-config.c deleted file mode 100644 index 78af5f6a93..0000000000 --- a/c/src/lib/libbsp/arm/beagle/console/console-config.c +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @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; diff --git a/c/src/lib/libbsp/arm/csb336/Makefile.am b/c/src/lib/libbsp/arm/csb336/Makefile.am index 04deee4f90..45f9ce342e 100644 --- a/c/src/lib/libbsp/arm/csb336/Makefile.am +++ b/c/src/lib/libbsp/arm/csb336/Makefile.am @@ -30,7 +30,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/cpucounter/cpucounter librtemsbsp_a_SOURCES +=../../../../../../bsps/arm/csb336/clock/clockdrv.c librtemsbsp_a_SOURCES += timer/timer.c # console -librtemsbsp_a_SOURCES += console/uart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/csb336/console/uart.c # IRQ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c diff --git a/c/src/lib/libbsp/arm/csb336/console/uart.c b/c/src/lib/libbsp/arm/csb336/console/uart.c deleted file mode 100644 index 8d8a0c1ed0..0000000000 --- a/c/src/lib/libbsp/arm/csb336/console/uart.c +++ /dev/null @@ -1,476 +0,0 @@ -/* - * Console driver for MC9328XML UARTs. - * - * Written Jay Monkman <jtm@lopingdog.com> - * Copyright (c) 2005 by Loping Dog Embedded Systems - * - * 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 - */ -#include <bsp.h> -#include <rtems/libio.h> -#include <libchip/sersupp.h> -#include <rtems/error.h> -#include <rtems/bspIo.h> -#include <assert.h> -#include <termios.h> -#include <rtems/irq.h> -#include <bsp/irq.h> -#include <mc9328mxl.h> -#include <rtems/console.h> -#include <inttypes.h> - -/* Define this to use interrupt driver UART driver */ -#define USE_INTERRUPTS 1 - -/* How many serial ports? */ -#define NUM_DEVS 2 -#define poll_write(c) imx_uart_poll_write_char(0, c) -#define poll_read() imx_uart_poll_read_char(0) - -static int imx_uart_first_open(int, int, void *); -static int imx_uart_last_close(int, int, void *); -static int imx_uart_poll_read(int); -static int imx_uart_set_attrs(int, const struct termios *); -static void imx_uart_init(int minor); -static void imx_uart_set_baud(int, int); -static ssize_t imx_uart_poll_write(int, const char *, size_t); -static int imx_uart_poll_read_char(int minor); -static void imx_uart_poll_write_char(int minor, char c); -static void _BSP_output_char(char c); -static int _BSP_poll_char(void); - -#if USE_INTERRUPTS -static void imx_uart_tx_isr(void *); -static void imx_uart_rx_isr(void *); -static void imx_uart_isr_on(rtems_vector_number); -static void imx_uart_isr_off(rtems_vector_number); -static ssize_t imx_uart_intr_write(int, const char *, size_t); -static rtems_vector_number imx_uart_name_transmit(int minor); -static rtems_vector_number imx_uart_name_receive(int minor); -#endif - -/* TERMIOS callbacks */ -#if USE_INTERRUPTS -rtems_termios_callbacks imx_uart_cbacks = { - .firstOpen = imx_uart_first_open, - .lastClose = imx_uart_last_close, - .pollRead = NULL, - .write = imx_uart_intr_write, - .setAttributes = imx_uart_set_attrs, - .stopRemoteTx = NULL, - .startRemoteTx = NULL, - .outputUsesInterrupts = 1, -}; -#else -rtems_termios_callbacks imx_uart_cbacks = { - .firstOpen = imx_uart_first_open, - .lastClose = imx_uart_last_close, - .pollRead = imx_uart_poll_read, - .write = imx_uart_poll_write, - .setAttributes = imx_uart_set_attrs, - .stopRemoteTx = NULL, - .startRemoteTx = NULL, - .outputUsesInterrupts = 0, -}; -#endif - -typedef struct { - int minor; - mc9328mxl_uart_regs_t * regs; - volatile const char *buf; - volatile int len; - volatile int idx; - void *tty; -} imx_uart_data_t; - -static imx_uart_data_t imx_uart_data[NUM_DEVS]; - -rtems_device_driver console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code status; - int i; - - for (i = 0; i < NUM_DEVS; i++) { - imx_uart_init(i); - } - - rtems_termios_initialize(); - - /* /dev/console and /dev/tty0 are the same */ - status = rtems_io_register_name("/dev/console", major, 0); - if (status != RTEMS_SUCCESSFUL) { - rtems_panic("%s:%d Error registering /dev/console :: %d\n", - __FUNCTION__, __LINE__, status); - } - - status = rtems_io_register_name("/dev/tty0", major, 0); - if (status != RTEMS_SUCCESSFUL) { - rtems_panic("%s:%d Error registering /dev/tty0 :: %d\n", - __FUNCTION__, __LINE__, status); - } - - status = rtems_io_register_name("/dev/tty1", major, 1); - if (status != RTEMS_SUCCESSFUL) { - rtems_panic("%s:%d Error registering /dev/tty1 :: %d\n", - __FUNCTION__, __LINE__, status); - } - return RTEMS_SUCCESSFUL; -} - -rtems_device_driver console_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - rtems_status_code rc; - - if (minor > (NUM_DEVS - 1)) { - return RTEMS_INVALID_NUMBER; - } - - rc = rtems_termios_open(major, minor, arg, &imx_uart_cbacks); - - return rc; -} - -rtems_device_driver console_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_termios_close(arg); -} - -rtems_device_driver console_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_termios_read(arg); -} - -rtems_device_driver console_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_termios_write(arg); -} - -rtems_device_driver console_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_termios_ioctl(arg); -} - -static void imx_uart_init(int minor) -{ - imx_uart_data[minor].minor = minor; - imx_uart_data[minor].buf = NULL; - imx_uart_data[minor].len = 0; - imx_uart_data[minor].idx = 0; - - if (minor == 0) { - imx_uart_data[minor].regs = - (mc9328mxl_uart_regs_t *) MC9328MXL_UART1_BASE; - } else if (minor == 1) { - imx_uart_data[minor].regs = - (mc9328mxl_uart_regs_t *) MC9328MXL_UART2_BASE; - } else { - rtems_panic("%s:%d Unknown UART minor number %d\n", - __FUNCTION__, __LINE__, minor); - } - - imx_uart_data[minor].regs->cr1 = ( - MC9328MXL_UART_CR1_UARTCLKEN | - MC9328MXL_UART_CR1_UARTEN); - - imx_uart_data[minor].regs->cr2 = ( - MC9328MXL_UART_CR2_IRTS | - MC9328MXL_UART_CR2_WS | - MC9328MXL_UART_CR2_TXEN | - MC9328MXL_UART_CR2_RXEN | - MC9328MXL_UART_CR2_SRST); - - imx_uart_data[minor].regs->cr3 = 0; - - imx_uart_data[minor].regs->cr4 = 0; - - imx_uart_data[minor].regs->fcr = ( - MC9328MXL_UART_FCR_TXTL(32) | - MC9328MXL_UART_FCR_RFDIV_1 | - MC9328MXL_UART_FCR_RXTL(1)); - - imx_uart_set_baud(minor, 38400); - -} - -static int imx_uart_first_open(int major, int minor, void *arg) -{ - rtems_libio_open_close_args_t *args = arg; - rtems_status_code status = RTEMS_SUCCESSFUL; - - imx_uart_data[minor].tty = args->iop->data1; - -#if USE_INTERRUPTS - status = rtems_interrupt_handler_install( - imx_uart_name_transmit(minor), - "UART", - RTEMS_INTERRUPT_UNIQUE, - imx_uart_tx_isr, - &imx_uart_data[minor] - ); - assert(status == RTEMS_SUCCESSFUL); - imx_uart_isr_on(imx_uart_name_transmit(minor)); - - status = rtems_interrupt_handler_install( - imx_uart_name_receive(minor), - "UART", - RTEMS_INTERRUPT_UNIQUE, - imx_uart_rx_isr, - &imx_uart_data[minor] - ); - assert(status == RTEMS_SUCCESSFUL); - imx_uart_isr_on(imx_uart_name_receive(minor)); - - imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_RRDYEN; -#endif - - return 0; -} - -static int imx_uart_last_close(int major, int minor, void *arg) -{ -#if USE_INTERRUPTS - rtems_status_code status = RTEMS_SUCCESSFUL; - - imx_uart_isr_off(imx_uart_name_transmit(minor)); - status = rtems_interrupt_handler_remove( - imx_uart_name_transmit(minor), - imx_uart_tx_isr, - &imx_uart_data[minor] - ); - assert(status == RTEMS_SUCCESSFUL); - - imx_uart_isr_off(imx_uart_name_receive(minor)); - status = rtems_interrupt_handler_remove( - imx_uart_name_receive(minor), - imx_uart_rx_isr, - &imx_uart_data[minor] - ); - assert(status == RTEMS_SUCCESSFUL); -#endif - - return 0; -} - -static int imx_uart_poll_read(int minor) -{ - if (imx_uart_data[minor].regs->sr2 & MC9328MXL_UART_SR2_RDR) { - return imx_uart_data[minor].regs->rxd & 0xff; - } else { - return -1; - } -} - - -static ssize_t imx_uart_poll_write(int minor, const char *buf, size_t len) -{ - int i; - for (i = 0; i < len; i++) { - /* Wait for there to be room in the fifo */ - while (!(imx_uart_data[minor].regs->sr2 & MC9328MXL_UART_SR2_TXDC)) { - continue; - } - - imx_uart_data[minor].regs->txd = buf[i]; - } - return 1; - -} - -#if USE_INTERRUPTS -static ssize_t imx_uart_intr_write(int minor, const char *buf, size_t len) -{ - if (len > 0) { - imx_uart_data[minor].buf = buf; - imx_uart_data[minor].len = len; - imx_uart_data[minor].idx = 0; - - imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_TXMPTYEN; - } - - return 1; -} -#endif - - -/* This is for setting baud rate, bits, etc. */ -static int imx_uart_set_attrs(int minor, const struct termios *t) -{ - int baud; - - baud = rtems_termios_baud_to_number(t->c_ospeed); - imx_uart_set_baud(minor, baud); - - return 0; -} - -#if USE_INTERRUPTS -static void imx_uart_isr_on(rtems_vector_number name) -{ - MC9328MXL_AITC_INTENNUM = name; -} -static void imx_uart_isr_off(rtems_vector_number name) -{ - MC9328MXL_AITC_INTDISNUM = name; -} - -static void imx_uart_rx_isr(void * param) -{ - imx_uart_data_t *uart_data = param; - char buf[32]; - int i=0; - - while (uart_data->regs->sr2 & MC9328MXL_UART_SR2_RDR) { - buf[i] = uart_data->regs->rxd & 0xff; - i++; - } - - rtems_termios_enqueue_raw_characters(uart_data->tty, buf, i); -} - -static void imx_uart_tx_isr(void * param) -{ - imx_uart_data_t *uart_data = param; - int len; - int minor = uart_data->minor; - - - if (uart_data->idx < uart_data->len) { - while ( (uart_data->regs->sr1 & MC9328MXL_UART_SR1_TRDY) && - (uart_data->idx < uart_data->len)) { - uart_data->regs->txd = uart_data->buf[uart_data->idx]; - uart_data->idx++; - } - } else { - len = uart_data->len; - uart_data->len = 0; - imx_uart_data[minor].regs->cr1 &= ~MC9328MXL_UART_CR1_TXMPTYEN; - rtems_termios_dequeue_characters(uart_data->tty, len); - } -} - -static rtems_vector_number imx_uart_name_transmit(int minor) -{ - if (minor == 0) { - return BSP_INT_UART1_TX; - } else if (minor == 1) { - return BSP_INT_UART2_TX; - } - - assert(0); -} - -static rtems_vector_number imx_uart_name_receive(int minor) -{ - if (minor == 0) { - return BSP_INT_UART1_RX; - } else if (minor == 1) { - return BSP_INT_UART2_RX; - } - - assert(0); -} -#endif - -/* - * Set the UART's baud rate. The calculation is: - * (baud * 16) / ref_freq = num/demom - * - * ref_freq = perclk1 / RFDIV[2:0] - * BIR = num - 1 - * BMR = demom - 1 - * - * Setting 'num' to 16 yields this equation: - * demom = ref_freq / baud - */ -static void imx_uart_set_baud(int minor, int baud) -{ - unsigned int perclk1; - unsigned int denom; - unsigned int ref_freq = 0; - uint32_t fcr; - - perclk1 = get_perclk1_freq(); - fcr = imx_uart_data[minor].regs->fcr; - - switch(fcr & MC9328MXL_UART_FCR_RFDIV_MASK) { - case MC9328MXL_UART_FCR_RFDIV_1: ref_freq = perclk1/1; break; - case MC9328MXL_UART_FCR_RFDIV_2: ref_freq = perclk1/2; break; - case MC9328MXL_UART_FCR_RFDIV_3: ref_freq = perclk1/3; break; - case MC9328MXL_UART_FCR_RFDIV_4: ref_freq = perclk1/4; break; - case MC9328MXL_UART_FCR_RFDIV_5: ref_freq = perclk1/5; break; - case MC9328MXL_UART_FCR_RFDIV_6: ref_freq = perclk1/6; break; - case MC9328MXL_UART_FCR_RFDIV_7: ref_freq = perclk1/7; break; - default: - rtems_panic("%s:%d Unknown RFDIV: 0x%" PRIx32, - __FUNCTION__, __LINE__, - fcr & MC9328MXL_UART_FCR_RFDIV_MASK); - break; - } - - denom = ref_freq / baud; - - imx_uart_data[minor].regs->bir = 0xf; - imx_uart_data[minor].regs->bmr = denom; -} - - -/* - * Polled, non-blocking read from UART - */ -static int imx_uart_poll_read_char(int minor) -{ - return imx_uart_poll_read(minor); -} - -/* - * Polled, blocking write from UART - */ -static void imx_uart_poll_write_char(int minor, char c) -{ - imx_uart_poll_write(minor, &c, 1); -} - -/* - * Functions for printk() and friends. - */ -static void _BSP_output_char(char c) -{ - poll_write(c); -} - -BSP_output_char_function_type BSP_output_char = _BSP_output_char; - -static int _BSP_poll_char(void) -{ - return poll_read(); -} - -BSP_polling_getchar_function_type BSP_poll_char = _BSP_poll_char; - - diff --git a/c/src/lib/libbsp/arm/csb337/Makefile.am b/c/src/lib/libbsp/arm/csb337/Makefile.am index 23a87975bb..523f4a5523 100644 --- a/c/src/lib/libbsp/arm/csb337/Makefile.am +++ b/c/src/lib/libbsp/arm/csb337/Makefile.am @@ -43,15 +43,15 @@ librtemsbsp_a_SOURCES += timer/timer.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/uarts.c -librtemsbsp_a_SOURCES += console/dbgu.c -librtemsbsp_a_SOURCES += console/usart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/csb337/console/uarts.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/csb337/console/dbgu.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/csb337/console/usart.c # IRQ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c if ENABLE_LCD -librtemsbsp_a_SOURCES += console/sed1356.c -librtemsbsp_a_SOURCES += console/fbcons.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/csb337/console/sed1356.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/csb337/console/fbcons.c endif # umon if ENABLE_UMON diff --git a/c/src/lib/libbsp/arm/csb337/console/dbgu.c b/c/src/lib/libbsp/arm/csb337/console/dbgu.c deleted file mode 100644 index 1a16762e32..0000000000 --- a/c/src/lib/libbsp/arm/csb337/console/dbgu.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Console driver for AT91RM9200 DBGU port - * - * This driver uses the shared console driver in - * ...../libbsp/shared/console.c - * - * Copyright (c) 2003 by Cogent Computer Systems - * Written by Mike Kelly <mike@cogcomp.com> - * and Jay Monkman <jtm@lopingdog.com> - * - * 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. - */ -#include <bsp.h> -#include <rtems/libio.h> -#include <termios.h> - -#include <at91rm9200.h> -#include <at91rm9200_dbgu.h> -#include <at91rm9200_pmc.h> -#include <rtems/bspIo.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -volatile int dbg_dly; - -/* static function prototypes */ -static int dbgu_first_open(int major, int minor, void *arg); -static int dbgu_last_close(int major, int minor, void *arg); -static int dbgu_read(int minor); -static ssize_t dbgu_write(int minor, const char *buf, size_t len); -static void dbgu_init(int minor); -static void dbgu_write_polled(int minor, char c); -static int dbgu_set_attributes(int minor, const struct termios *t); - -/* Pointers to functions for handling the UART. */ -const console_fns dbgu_fns = -{ - libchip_serial_default_probe, - dbgu_first_open, - dbgu_last_close, - dbgu_read, - dbgu_write, - dbgu_init, - dbgu_write_polled, /* not used in this driver */ - dbgu_set_attributes, - FALSE /* TRUE if interrupt driven, FALSE if not. */ -}; -/*********************************************************************/ -/* Functions called via callbacks (i.e. the ones in uart_fns */ -/*********************************************************************/ - -/* - * This is called the first time each device is opened. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd enable interrupts here. - */ -static int dbgu_first_open(int major, int minor, void *arg) -{ - return 0; -} - - -/* - * This is called the last time each device is closed. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd disable interrupts here. - */ -static int dbgu_last_close(int major, int minor, void *arg) -{ - return 0; -} - - -/* - * Read one character from UART. - * - * return -1 if there's no data, otherwise return - * the character in lowest 8 bits of returned int. - */ -static int dbgu_read(int minor) -{ - char c; - console_tbl *console_entry; - at91rm9200_dbgu_regs_t *dbgu; - - console_entry = BSP_get_uart_from_minor(minor); - - if (console_entry == NULL) { - return -1; - } - - dbgu = (at91rm9200_dbgu_regs_t *)console_entry->ulCtrlPort1; - - if (!(dbgu->sr & DBGU_INT_RXRDY)) { - return -1; - } - - c = dbgu->rhr & 0xff; - - return c; -} - - -/* - * Write buffer to UART - * - * return 1 on success, -1 on error - */ -static ssize_t dbgu_write(int minor, const char *buf, size_t len) -{ - int i, x; - char c; - console_tbl *console_entry; - at91rm9200_dbgu_regs_t *dbgu; - - console_entry = BSP_get_uart_from_minor(minor); - - if (console_entry == NULL) { - return -1; - } - - dbgu = (at91rm9200_dbgu_regs_t *)console_entry->ulCtrlPort1; - - for (i = 0; i < len; i++) { - /* Wait for fifo to have room */ - while(1) { - if (dbgu->sr & DBGU_INT_TXRDY) { - break; - } - } - - c = (char) buf[i]; - dbgu->thr = c; - - /* the TXRDY flag does not seem to update right away (is this true?) */ - /* so we wait a bit before continuing */ - for (x = 0; x < 100; x++) { - dbg_dly++; /* using a global so this doesn't get optimized out */ - } - } - - return 1; -} - - -/* Set up the UART. */ -static void dbgu_init(int minor) -{ - console_tbl *console_entry; - at91rm9200_dbgu_regs_t *dbgu; - - console_entry = BSP_get_uart_from_minor(minor); - - if (console_entry == NULL) { - return; - } - - dbgu = (at91rm9200_dbgu_regs_t *)console_entry->ulCtrlPort1; - - /* Clear error bits, and reset */ - dbgu->cr = (DBGU_CR_RSTSTA | DBGU_CR_RSTTX | DBGU_CR_RSTRX); - - /* Clear pending interrupts */ - dbgu->idr = DBGU_INT_ALL; - dbgu->imr = 0; - - /* Set port to no parity, no loopback */ - dbgu->mr = DBGU_MR_PAR_NONE | DBGU_MR_CHMODE_NORM; - - /* Set the baud rate */ - dbgu->brgr = (at91rm9200_get_mck() / 16) / BSP_get_baud(); - - /* Enable the DBGU */ - dbgu->cr = (DBGU_CR_TXEN | DBGU_CR_RXEN); -} - -/* This is used for getchark support */ -static void dbgu_write_polled(int minor, char c) -{ - dbgu_write(minor, &c, 1); -} - -/* This is for setting baud rate, bits, etc. */ -static int dbgu_set_attributes(int minor, const struct termios *t) -{ - return 0; -} - -/***********************************************************************/ -/* - * The following functions are not used by TERMIOS, but other RTEMS - * functions use them instead. - */ -/***********************************************************************/ -/* - * Read from UART. This is used in the exit code, and can't - * rely on interrupts. - */ -static int dbgu_poll_read(int minor) -{ - return dbgu_read(minor); -} - - -/* - * Write a character to the console. This is used by printk() and - * maybe other low level functions. It should not use interrupts or any - * RTEMS system calls. It needs to be very simple - */ -static void _BSP_put_char( char c ) { - dbgu_write_polled(0, c); -} - -BSP_output_char_function_type BSP_output_char = _BSP_put_char; - -static int _BSP_poll_char(void) -{ - return dbgu_poll_read(0); -} - -BSP_polling_getchar_function_type BSP_poll_char = _BSP_poll_char; diff --git a/c/src/lib/libbsp/arm/csb337/console/fbcons.c b/c/src/lib/libbsp/arm/csb337/console/fbcons.c deleted file mode 100644 index 62e840938d..0000000000 --- a/c/src/lib/libbsp/arm/csb337/console/fbcons.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * LCD Console Output Driver for CSBx37 - */ - -/* - * COPYRIGHT (c) 1989-2014. - * On-Line Applications Research Corporation (OAR). - * - * Modified by Fernando Nicodemos <fgnicodemos@terra.com.br> - * from NCB - Sistemas Embarcados Ltda. (Brazil) - * - * 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. - */ - -#include <bsp.h> -#include <rtems/libio.h> -#include <termios.h> - -#include <rtems/bspIo.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> -#include "sed1356.h" - -/* static function prototypes */ -static int fbcons_first_open(int major, int minor, void *arg); -static int fbcons_last_close(int major, int minor, void *arg); -static int fbcons_read(int minor); -static ssize_t fbcons_write(int minor, const char *buf, size_t len); -static void fbcons_init(int minor); -static void fbcons_write_polled(int minor, char c); -static int fbcons_set_attributes(int minor, const struct termios *t); - -/* Pointers to functions for handling the UART. */ -const console_fns fbcons_fns = -{ - libchip_serial_default_probe, - fbcons_first_open, - fbcons_last_close, - fbcons_read, - fbcons_write, - fbcons_init, - fbcons_write_polled, /* not used in this driver */ - fbcons_set_attributes, - FALSE /* TRUE if interrupt driven, FALSE if not. */ -}; -/*********************************************************************/ -/* Functions called via callbacks (i.e. the ones in uart_fns */ -/*********************************************************************/ - -/* - * This is called the first time each device is opened. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd enable interrupts here. - */ -static int fbcons_first_open(int major, int minor, void *arg) -{ - /* printk( "Frame buffer -- first open\n" ); */ - return 0; -} - - -/* - * This is called the last time each device is closed. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd disable interrupts here. - */ -static int fbcons_last_close(int major, int minor, void *arg) -{ - /* printk( "Frame buffer -- last close\n" ); */ - return 0; -} - - -/* - * Read one character from UART. - * - * return -1 if there's no data, otherwise return - * the character in lowest 8 bits of returned int. - */ -static int fbcons_read(int minor) -{ - /* printk( "Frame buffer -- read\n" ); */ - return -1; -} - - -/* - * Write buffer to LCD - * - * return 1 on success, -1 on error - */ -static ssize_t fbcons_write(int minor, const char *buf, size_t len) -{ - int i; - - /* printk( "Frame buffer -- write\n" ); */ - for ( i=0 ; i<len ; i++ ) - sed_putchar( buf[i] ); - - return 1; -} - - -/* Set up the LCD controller. */ -static void fbcons_init(int minor) -{ - /* printk( "Initializing frame buffer\n" ); */ - sed_init(); -} - -/* This is used for putchark support */ -static void fbcons_write_polled(int minor, char c) -{ - /* printk( "frame buffer -- write polled\n" ); */ - sed_putchar( c ); -} - -/* This is for setting baud rate, bits, etc. */ -static int fbcons_set_attributes(int minor, const struct termios *t) -{ - /* printk( "frame buffer -- set attributes\n" ); */ - return 0; -} diff --git a/c/src/lib/libbsp/arm/csb337/console/sed1356.c b/c/src/lib/libbsp/arm/csb337/console/sed1356.c deleted file mode 100644 index f87a322a01..0000000000 --- a/c/src/lib/libbsp/arm/csb337/console/sed1356.c +++ /dev/null @@ -1,461 +0,0 @@ -/* - * SED1356 Support for KIT637_V6 (CSB637) - * - * Based upon code from MicroMonitor 1.17 from http://www.umonfw.com/ - * which includes this notice: - */ - -/* - ************************************************************************** - * General notice: - * This code is part of a boot-monitor package developed as a generic base - * platform for embedded system designs. As such, it is likely to be - * distributed to various projects beyond the control of the original - * author. Please notify the author of any enhancements made or bugs found - * so that all may benefit from the changes. In addition, notification back - * to the author will allow the new user to pick up changes that may have - * been made by other users after this version of the code was distributed. - * - * Note1: the majority of this code was edited with 4-space tabs. - * Note2: as more and more contributions are accepted, the term "author" - * is becoming a mis-representation of credit. - * - * Original author: Ed Sutter - * Email: esutter@alcatel-lucent.com - * Phone: 908-582-2351 - ************************************************************************** - * - * Ed Sutter has been informed that this code is being used in RTEMS. - * - * This code was reformatted by Joel Sherrill from OAR Corporation and - * Fernando Nicodemos <fgnicodemos@terra.com.br> from NCB - Sistemas - * Embarcados Ltda. (Brazil) to be more compliant with RTEMS coding - * standards and to eliminate C++ style comments. - */ - -#include <bsp.h> - -#include <stdlib.h> -#include <stdio.h> -#include "sed1356.h" -#include "font8x16.h" - -int mode900lq; -long PIXELS_PER_ROW; -long PIXELS_PER_COL; -long COLS_PER_SCREEN; -long ROWS_PER_SCREEN; -long SED_HOR_PULSE_WIDTH_LCD; -long SED_VER_PULSE_START_LCD; -long SED_HOR_PULSE_START_LCD; -long SED_HOR_NONDISP_LCD; -long SED_VER_NONDISP_LCD; -long SED_VER_PULSE_WIDTH_LCD; - -/* globals to keep track of foreground, background colors and x,y position */ -int sed_color_depth; /* 4, 8 or 16 */ -int sed_fg_color; /* 0 to 15, used as lookup into VGA color table */ -int sed_bg_color; /* 0 to 15, used as lookup into VGA color table */ -int sed_col; /* current column, 0 to COLS_PER_SCREEN - 1 */ -int sed_row; /* current row, 0 to (ROWS_PER_SCREEN * 2) - 1 */ -int sed_disp_mode_crt; /* CRT=1, LCD=0 */ -int sed135x_ok; -int sed135x_tst; -uint32_t sed_fb_offset; /* current offset into frame buffer for sed_putchar */ - -void sed_writechar(uint8_t c); -void sed_scroll(void); - -#define SED_REG_BASE 0x30000000 /* *CS2 */ -#define SED_MEM_BASE (SED_REG_BASE + 0x00200000) -#define SED_STEP 1 /* 16-bit port on 16-bit boundry */ - -#define SED_REG16(_x_) *(volatile uint16_t *)((uint32_t)SED_REG_BASE + (((uint32_t)_x_ * SED_STEP) ^ 0)) /* Control/Status Registers, 16-bit mode */ -#define RD_FB16(_reg_,_val_) ((_val_) = *((volatile uint16_t *)(((uint32_t)SED_MEM_BASE + ((uint32_t)(_reg_ * SED_STEP) ^ 0))))) -#define WR_FB16(_reg_,_val_) (*((volatile uint16_t *)(((uint32_t)SED_MEM_BASE + ((uint32_t)(_reg_ * SED_STEP) ^ 0)))) = (_val_)) - -#if 0 -#define SED1356_REG_LCD_HOR_DISP SED_REG16(0x32) -#define SED1356_REG_LCD_HOR_NONDISP_and_START SED_REG16(0x34) -#define SED1356_REG_LCD_HOR_PULSE SED_REG16(0x36) -#define SED1356_REG_LCD_VER_DISP_HT_LO_and_HI SED_REG16(0x38) -#define SED1356_REG_LCD_VER_NONDISP_and_START SED_REG16(0x3a) -#define SED1356_REG_LCD_VER_PULSE SED_REG16(0x3c) -#define SED1356_REG_LCD_DISP_MODE_and_MISC SED_REG16(0x40) -#define SED1356_REG_LCD_DISP_START_LO_and_MID SED_REG16(0x42) -#define SED1356_REG_LCD_DISP_START_HI SED_REG16(0x44) -#define SED1356_REG_LCD_ADD_OFFSET_LO_and_HI SED_REG16(0x46) -#define SED1356_REG_LCD_PIXEL_PAN SED_REG16(0x48) -#define SED1356_REG_LCD_FIFO_THRESH_LO_and_HI SED_REG16(0x4a) -#endif - - -#define H2SED(_x_) (_x_) - -#define FB_SIZE (640 * 480) -#define SED_ROW_SIZE(_depth_) ((PIXELS_PER_ROW * _depth_) / 8) -#define SED_FB_SIZE(_depth_) (((PIXELS_PER_COL * PIXELS_PER_ROW) * _depth_) / 8) - -#define FONT_WIDTH 8 -#define FONT_HEIGHT 16 - -#define SED_GET_ADD(_row_, _col_, _depth_) \ - (((((_row_ * PIXELS_PER_ROW) * FONT_HEIGHT) \ - + (_col_ * FONT_WIDTH)) \ - * _depth_) / 8) - - -#define SED_GET_PHYS_ADD(_reg_) \ - (volatile unsigned long)(SED_MEM_BASE + ((_reg_ * SED_STEP) ^ 0)) - - -#include "sed1356_16bit.h" - -/* #define SED_DBG */ -int sed135x_tst = 0; - -void sed_write_frame_buffer( - uint32_t i, - uint16_t wr16 -) -{ - WR_FB16(i, wr16); -} - -int sed_frame_buffer_size(void) -{ - return SED_FB_SIZE(sed_color_depth); -} - -void sed_clr_row(int char_row) -{ - unsigned long sed_mem_add; - int i; - uint16_t wr16; - - /* clear the desired row */ - sed_mem_add = SED_GET_ADD(char_row, 0, sed_color_depth); - -#ifdef SED_DBG - sed135x_tst = 1; - printf("SED Clear Row %d, FB Add 0x%08lx, CPU Add 0x%08lx.\n ", char_row, sed_mem_add, SED_GET_PHYS_ADD(sed_mem_add)); - sed135x_tst = 0; -#endif - - switch (sed_color_depth) - { - case 4: - wr16 = ((sed_bg_color << 12) | (sed_bg_color << 8) | (sed_bg_color << 4) | (sed_bg_color << 0)); -#ifdef SED_DBG - sed135x_tst = 1; - printf("SED Clear Row %d, FB Add 0x%08lx to 0x%08lx.\n ", char_row, sed_mem_add, sed_mem_add + ((PIXELS_PER_ROW * FONT_HEIGHT) / 2)); - sed135x_tst = 0; -#endif - for (i = 0; i < ((PIXELS_PER_ROW * FONT_HEIGHT) / 2); i += 2){ - WR_FB16(sed_mem_add, wr16); - sed_mem_add += 2; - } /* for font_row */ - break; - case 8: - wr16 = ((sed_bg_color << 8) | (sed_bg_color << 0)); - for (i = 0; i < (PIXELS_PER_ROW * FONT_HEIGHT); i += 2){ - WR_FB16(sed_mem_add, wr16); - sed_mem_add += 2; - } /* for font_row */ - break; - case 16: - wr16 = ((vga_lookup[sed_bg_color])); - for (i = 0; i < ((PIXELS_PER_ROW * FONT_HEIGHT) * 2); i += 2){ - WR_FB16(sed_mem_add, wr16); - sed_mem_add += 2; - } /* for font_row */ - break; - } /* switch sed_color_depth */ -} /* sed_clr_row */ - -void sed_init(void) -{ - mode900lq = 0; - PIXELS_PER_ROW = 640; - PIXELS_PER_COL = 480; - COLS_PER_SCREEN = 80; - ROWS_PER_SCREEN = 30; - SED_HOR_PULSE_WIDTH_LCD = 0x0b; - SED_HOR_NONDISP_LCD = 0x13; - SED_VER_PULSE_WIDTH_LCD = 0x01; - SED_VER_PULSE_START_LCD = 0x09; - SED_VER_NONDISP_LCD = 0x2c; - - sed_color_depth = 16; /* 16 => vga lookup */ - sed_fg_color = 14; /* Bright Yellow */ - sed_bg_color = 1; /* Blue */ - sed_disp_mode_crt = 0; /* default to LCD */ - sed_fb_offset = 0x00; - sed_row = 0; - sed_col = 0; - - sed135x_ok = 1; - sed135x_tst = 0; - sed_clearscreen(); -} - -/* - * sed_putchar() - * - * This routine parses the character and calls sed_writechar if it is a - * printable character - */ -void sed_putchar(char c) -{ - - if ((sed135x_ok == 0) || (sed135x_tst == 1)) return; - - /* First parse the character to see if it printable or an - * acceptable control character. - */ - switch (c) { - case '\r': - sed_col = 0; - return; - case '\n': - sed_col = 0; - sed_scroll(); - return; - case '\b': - sed_col--; - if (sed_col < 0) { - sed_row--; - if (sed_row < 0) - sed_row = 0; - sed_col = COLS_PER_SCREEN - 1; - } - c = 0; /* erase the character */ - sed_writechar(c); - break; - default: - if (((uint8_t)c < FIRST_CHAR) || ((uint8_t)c > LAST_CHAR)) - return; /* drop anything we can't print */ - c -= FIRST_CHAR; /* get aligned to the first printable character */ - sed_writechar(c); - /* advance to next column */ - sed_col++; - if (sed_col == COLS_PER_SCREEN) { - sed_col = 0; - sed_scroll(); - } - break; - } - -} /* sed_putchar() */ - -/* - * sed_writechar() - * - * This routine writes the character to the screen at the current cursor - * location. - */ -void sed_writechar(uint8_t c) -{ - uint32_t sed_mem_add; - int font_row, font_col; - uint8_t font_data8; - uint16_t wr16; - - /* Convert the current row,col and color depth values - * into an address - */ - sed_mem_add = SED_GET_ADD(sed_row, sed_col, sed_color_depth); - -#ifdef SED_DBG - sed135x_tst = 1; - printf("SED writechar at row %d, col %d, FB Add 0x%08lx, CPU Add 0x%08lx.\n ", sed_row, sed_col, sed_mem_add, SED_GET_PHYS_ADD(sed_mem_add)); - sed135x_tst = 0; -#endif - - if (FONT_WIDTH == 8) { - switch (sed_color_depth) { - case 4: - /* Now render the font by painting one font row at a time */ - for (font_row = 0; font_row < FONT_HEIGHT; font_row++) { - /* get the font row of data */ - font_data8 = font8x16[(c * FONT_HEIGHT) + font_row]; - - - for (font_col = 0; font_col < 8; font_col += 4) - { - /* get a words worth of pixels */ - wr16 = (((font_data8 & 0x80) ? sed_fg_color << 12 : sed_bg_color << 12) - | ((font_data8 & 0x40) ? sed_fg_color << 8 : sed_bg_color << 8) - | ((font_data8 & 0x20) ? sed_fg_color << 4 : sed_bg_color << 4) - | ((font_data8 & 0x10) ? sed_fg_color << 0 : sed_bg_color << 0)); - font_data8 = font_data8 << 4; - WR_FB16(sed_mem_add, wr16); - /* if we are in the 2nd frame buffer, write to the 1st - * frame buffer also - */ - if (sed_row > (ROWS_PER_SCREEN - 1)) { - WR_FB16((sed_mem_add - SED_FB_SIZE(sed_color_depth)), wr16); - } - sed_mem_add += 2; - } /* for font_col */ - /* go to the next pixel row */ - sed_mem_add += (SED_ROW_SIZE(sed_color_depth) - ((FONT_WIDTH * sed_color_depth) / 8)); - } /* for font_row */ - break; - - case 8: - /* Now render the font by painting one font row at a time */ - for (font_row = 0; font_row < FONT_HEIGHT; font_row++) { - /* get the font row of data */ - font_data8 = font8x16[(c * FONT_HEIGHT) + font_row]; - for (font_col = 0; font_col < 8; font_col += 2) - { - /* get a words worth of pixels */ - wr16 = (((font_data8 & 0x80) ? sed_fg_color << 8 : sed_bg_color << 8) - | ((font_data8 & 0x40) ? sed_fg_color << 0 : sed_bg_color << 0)); - font_data8 = font_data8 << 2; - WR_FB16(sed_mem_add, wr16); - /* if we are in the 2nd frame buffer, write to the 1st - * frame buffer also - */ - if (sed_row > (ROWS_PER_SCREEN - 1)) { - WR_FB16((sed_mem_add - SED_FB_SIZE(sed_color_depth)), wr16); - } - sed_mem_add += 2; - } /* for font_col */ - /* go to the next pixel row */ - sed_mem_add += (SED_ROW_SIZE(sed_color_depth) - ((FONT_WIDTH * sed_color_depth) / 8)); - } /* for font_row */ - break; - - case 16: - /* Now render the font by painting one font row at a time */ - for (font_row = 0; font_row < FONT_HEIGHT; font_row++) { - /* get the font row of data */ - font_data8 = font8x16[(c * FONT_HEIGHT) + font_row]; - for (font_col = 0; font_col < 8; font_col++) - { - /* get a words worth of pixels */ - wr16 = ((font_data8 & 0x80) ? - vga_lookup[sed_fg_color] : vga_lookup[sed_bg_color]); - font_data8 = font_data8 << 1; - WR_FB16(sed_mem_add, wr16); - /* if we are in the 2nd frame buffer, write to the 1st - * frame buffer also. - */ - if (sed_row > (ROWS_PER_SCREEN - 1)) { - WR_FB16((sed_mem_add - SED_FB_SIZE(sed_color_depth)), wr16); - } - sed_mem_add += 2; - } /* for font_col */ - /* go to the next pixel row */ - sed_mem_add += (SED_ROW_SIZE(sed_color_depth) - ((FONT_WIDTH * sed_color_depth) / 8)); - } /* for font_row */ - break; - - } /* switch sed_color depth */ - } /* FONT_WIDTH == 8 */ - else - { - return; - } -} /* sed_writechar() */ - -static void sed_update_fb_offset(void) -{ - /* write the new sed_fb_offset value */ - if (sed_disp_mode_crt) { - /* before we change the address offset, wait for the display to - * go from active to non-active, unless the display is not enabled - */ - if (SED1356_REG_DISP_MODE & H2SED(SED1356_DISP_MODE_CRT)) { /* CRT is on */ - while ((SED1356_REG_CRT_VER_NONDISP_and_START & H2SED(SED1356_VER_NONDISP)) == 0) {} - while ((SED1356_REG_CRT_VER_NONDISP_and_START & H2SED(SED1356_VER_NONDISP)) == 1) {} - } - SED1356_REG_CRT_DISP_START_LO_and_MID = H2SED(((sed_fb_offset & 0x00ffff) >> 0)); - SED1356_REG_CRT_DISP_START_HI = H2SED(((sed_fb_offset & 0x070000) >> 16)); - } - else /* LCD */ - { - if (SED1356_REG_DISP_MODE & H2SED(SED1356_DISP_MODE_LCD)) { /* LCD is on */ - while ((SED1356_REG_LCD_VER_NONDISP_and_START & H2SED(SED1356_VER_NONDISP)) == 0) {} - while ((SED1356_REG_LCD_VER_NONDISP_and_START & H2SED(SED1356_VER_NONDISP)) == 1) {} - } - SED1356_REG_LCD_DISP_START_LO_and_MID = H2SED(((sed_fb_offset & 0x00ffff) >> 0)); - SED1356_REG_LCD_DISP_START_HI = H2SED(((sed_fb_offset & 0x070000) >> 16)); - } -} - -/* sed_scroll() - * - * Because we are most likely running out of FLASH and probably also with - * cache disabled, a brute force memcpy of the whole screen would be very - * slow, even with reduced color depths. Instead, we define a frame buffer - * that is twice the size of our actual display. This does limit us to a - * 1Mbyte active display size, but 640 x 480 @ 16-bits/pixel = 614K so it - * works just fine. 800 x 600 can be had by reducing the color depth to - * 8-bits/pixel and using the look up tables. - * - * With the double buffering, we always write to the first buffer, even - * when the second buffer is active. This allows us to scroll by adjusting - * the starting and ending addresses in the SED135x by one row. When we - * reach the end of our virtual buffer, we reset the starting and ending - * addresses to the first buffer. Note that we can not adjust the SED135x - * registers until it is in vertical retrace. That means we have to wait - * until it is in active display, then goes to non-display, unless the - * screen is blanked, in which case we can update immediately. - */ -void sed_scroll(void) -{ - sed_row++; - - /* clear the new row(s) */ - sed_clr_row(sed_row); - if (sed_row > (ROWS_PER_SCREEN - 1)) { - sed_clr_row(sed_row - ROWS_PER_SCREEN); - } - /* when sed_y_pos is greater than ROWS_PER_SCREEN we just adjust the - * start and end addresses in the SED135x. If it is equal to 2 * - * ROWS_PER_SCREEN, we reset the start and end addresses to SED_MEM_BASE. - */ - if (sed_row > (ROWS_PER_SCREEN - 1)) { - if (sed_row > ((ROWS_PER_SCREEN * 2) - 1)) { - sed_fb_offset = 0x00; - sed_row = 0; - sed_clearscreen(); - } else { - /* calculate the new offset address of the frame buffer in words */ - sed_fb_offset += (SED_GET_ADD(1, 0, sed_color_depth) / 2); - } - sed_update_fb_offset(); - } /* if (sed_row > (ROWS_PER_SCREEN - 1)) */ -} - -void sed_putstring(char *s) -{ - char *p = s; - while (*p) - sed_putchar(*p++); -} - -void sed_clearscreen(void) -{ - int i; - uint16_t wr16; - int bg = sed_bg_color; - int fbsize = sed_frame_buffer_size(); - - /* we double buffer so clear ALL of memory */ - fbsize *= 2; - - /* fill the frame buffer with incrementing color values */ - switch (sed_color_depth){ - case 4: wr16 = bg | bg << 4 | bg << 8 | bg << 12; break; - case 8: wr16 = bg | bg << 8; break; - /* 16-bits bypasses the lookup table */ - default: wr16 = vga_lookup[bg]; break; - } - for (i = 0; i < fbsize; i += 2){ - sed_write_frame_buffer(i, wr16); - } -} diff --git a/c/src/lib/libbsp/arm/csb337/console/uarts.c b/c/src/lib/libbsp/arm/csb337/console/uarts.c deleted file mode 100644 index b705a477b7..0000000000 --- a/c/src/lib/libbsp/arm/csb337/console/uarts.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Console driver for for KIT637_V6 (CSB637) - * - * This driver uses the shared console driver in - * ...../libbsp/shared/console.c - * - * Copyright (c) 2003 by Cogent Computer Systems - * Written by Jay Monkman <jtm@lopingdog.com> - * - * Modified by Fernando Nicodemos <fgnicodemos@terra.com.br> - * from NCB - Sistemas Embarcados Ltda. (Brazil) - * - * 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 and FrameBuffer Console Device Support added by - * Joel Sherrill, 2009. - */ - -#include <bsp.h> -#include <rtems/libio.h> -#include <termios.h> -#include <rtems/bspIo.h> - -#include <at91rm9200.h> -#include <at91rm9200_dbgu.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> -#include <bspopts.h> - -extern const console_fns dbgu_fns; - -#if ENABLE_LCD - extern const console_fns fbcons_fns; - #define LCD_DEV 1 -#else - #define LCD_DEV 0 -#endif - -#if (ENABLE_UMON && ENABLE_UMON_CONSOLE) - extern const console_fns umoncons_fns; - #define UMON_CONS_DEV 1 -#else - #define UMON_CONS_DEV 0 -#endif - -#if ENABLE_USART0 || ENABLE_USART1 || ENABLE_USART2 || ENABLE_USART3 - extern const console_fns usart_polling_fns; -#endif - -#if ENABLE_USART0 - #define USART0_DEV 1 -#else - #define USART0_DEV 0 -#endif - -#if ENABLE_USART1 - #define USART1_DEV 1 -#else - #define USART1_DEV 0 -#endif - -#if ENABLE_USART2 - #define USART2_DEV 1 -#else - #define USART2_DEV 0 -#endif - -#if ENABLE_USART3 - #define USART3_DEV 1 -#else - #define USART3_DEV 0 -#endif - -#define NUM_DEVS \ - (1 + LCD_DEV + UMON_CONS_DEV + \ - USART0_DEV + USART1_DEV + USART2_DEV + USART3_DEV) - -/* These are used by code in console.c */ -unsigned long Console_Configuration_Count = NUM_DEVS; - -/* - * There's one item in array for each UART. - * - * Some of these fields are marked "NOT USED". They are not used - * by console.c, but may be used by drivers in libchip - * - * when we add other types of UARTS we will need to move this - * structure to a generic uart.c file with only this in it - */ -console_tbl Console_Configuration_Ports[] = { - { - "/dev/com0", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &dbgu_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - DBGU_BASE, /* ulCtrlPort1 - Pointer to DBGU regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }, -#if ENABLE_LCD - { - "/dev/fbcons", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &fbcons_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - Pointer to DBGU regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }, -#endif -#if (ENABLE_UMON && ENABLE_UMON_CONSOLE) - { - "/dev/umon", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &umoncons_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - Pointer to UMON regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }, -#endif -#if ENABLE_USART0 - { - "/dev/com1", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &usart_polling_fns,/* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - USART0_BASE, /* ulCtrlPort1 - Pointer to USART 0 regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }, -#endif -#if ENABLE_USART1 - { - "/dev/com2", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &usart_polling_fns,/* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - USART1_BASE, /* ulCtrlPort1 - Pointer to USART 1 regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }, -#endif -#if ENABLE_USART2 - { - "/dev/com3", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &usart_polling_fns,/* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - USART2_BASE, /* ulCtrlPort1 - Pointer to USART 2 regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }, -#endif -#if ENABLE_USART3 - { - "/dev/com4", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &usart_polling_fns,/* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - USART3_BASE, /* ulCtrlPort1 - Pointer to USART 3 regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - } -#endif -}; - -console_tbl *BSP_get_uart_from_minor(int minor) -{ - return Console_Port_Tbl[minor]; -} diff --git a/c/src/lib/libbsp/arm/csb337/console/usart.c b/c/src/lib/libbsp/arm/csb337/console/usart.c deleted file mode 100644 index 23b877ce64..0000000000 --- a/c/src/lib/libbsp/arm/csb337/console/usart.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Driver for AT91RM9200 USART ports - */ - -/* - * COPYRIGHT (c) 2006-2009. - * NCB - Sistemas Embarcados Ltda. (Brazil) - * Fernando Nicodemos <fgnicodemos@terra.com.br> - * - * and - * - * COPYRIGHT (c) 1989-2009. - * On-Line Applications Research Corporation (OAR). - * - * 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. -*/ - -#include <bsp.h> -#include <rtems/libio.h> -#include <termios.h> - -#include <at91rm9200.h> -#include <at91rm9200_usart.h> -#include <at91rm9200_pmc.h> -#include <rtems/bspIo.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -/* static function prototypes */ -static int usart_first_open(int major, int minor, void *arg); -static int usart_last_close(int major, int minor, void *arg); -static int usart_read_polled(int minor); -static ssize_t usart_write_polled_support(int minor, const char *buf, size_t len); -static void usart_init(int minor); -static void usart_write_polled(int minor, char c); -static int usart_set_attributes(int minor, const struct termios *t); -at91rm9200_usart_regs_t *usart_get_base(int minor); - -/* Pointers to functions for handling the UART polled. */ -const console_fns usart_polling_fns = { - libchip_serial_default_probe, /* deviceProbe */ - usart_first_open, /* deviceFirstOpen */ - usart_last_close, /* deviceLastClose */ - usart_read_polled, /* deviceRead */ - usart_write_polled_support, /* deviceWrite */ - usart_init, /* deviceInitialize */ - usart_write_polled, /* deviceWritePolled */ - usart_set_attributes, /* deviceSetAttributes */ - FALSE /* TRUE if interrupt driven, FALSE if not. */ -}; - -at91rm9200_usart_regs_t *usart_get_base(int minor) -{ - console_tbl *console_entry; - at91rm9200_usart_regs_t *port; - - console_entry = BSP_get_uart_from_minor(minor); - - if (console_entry == NULL) - return 0; - - port = (at91rm9200_usart_regs_t *) console_entry->ulCtrlPort1; - //printk( "minor=%d entry=%p port=%p\n", minor, console_entry, port ); - - return port; -} - -/* - * Functions called via callbacks (i.e. the ones in uart_fns - */ - -/* - * This is called the first time each device is opened. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd enable interrupts here. - */ -static int usart_first_open(int major, int minor, void *arg) -{ - at91rm9200_usart_regs_t *usart; - - usart = usart_get_base(minor); - if ( !usart ) - return -1; - - /* XXX port isn't being initialized or enabled */ - - /* XXX I hope this is enough */ - usart->cr = (US_CR_RXEN | US_CR_TXEN); - return 0; -} - -/* - * This is called the last time each device is closed. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd disable interrupts here. - */ -static int usart_last_close(int major, int minor, void *arg) -{ - at91rm9200_usart_regs_t *usart; - - usart = usart_get_base(minor); - if ( !usart ) - return -1; - - return 0; -} - -/* - * Read one character from UART. - * - * return -1 if there's no data, otherwise return - * the character in lowest 8 bits of returned int. - */ -static int usart_read_polled(int minor) -{ - at91rm9200_usart_regs_t *usart; - - usart = usart_get_base(minor); - if ( !usart ) - return -1; - - /* if nothing ready return -1 */ - if ( (usart->sr & US_IER_RXRDY) == 0 ) - return -1; - - return usart->rhr; -} - - -/* - * Write character out - */ -static void usart_write_polled(int minor, char c) -{ - at91rm9200_usart_regs_t *usart; - - usart = usart_get_base(minor); - if ( !usart ) - return; - - /* delay until TX empty */ - while ( (usart->sr & US_IER_TXEMPTY) == 0 ) - ; - - usart->thr = c; -} - -/* - * Write buffer to UART - * - * return 1 on success, -1 on error - */ -static ssize_t usart_write_polled_support(int minor, const char *buf, size_t len) -{ - at91rm9200_usart_regs_t *usart; - int nwrite=0; - - /* - * Verify the minor number - */ - usart = usart_get_base(minor); - if ( !usart ) - return -1; - - /* - * poll each byte in the string out of the port. - */ - while (nwrite < len) { - usart_write_polled(minor, *buf++); - nwrite++; - } - - /* - * return the number of bytes written. - */ - return nwrite; - - return 1; -} - - -/* Set up the UART. */ -static void usart_init(int minor) -{ - at91rm9200_usart_regs_t *usart; - - usart = usart_get_base(minor); - if ( !usart ) - return; - -} - - -/* This is for setting baud rate, bits, etc. */ -static int usart_set_attributes(int minor, const struct termios *t) -{ - uint32_t brgr; - uint32_t mode, baud, baud_requested; - at91rm9200_usart_regs_t *usart; - - usart = usart_get_base(minor); - if ( !usart ) - return -1; - - /* Get current mode register */ - mode = usart->mr & ~(US_MR_USMODE | US_MR_USCLKS | US_MR_CHRL - | US_MR_PAR | US_MR_NBSTOP); - - /* Byte size */ - switch (t->c_cflag & CSIZE){ - case CS5: - mode |= US_MR_CHRL_5; - break; - case CS6: - mode |= US_MR_CHRL_6; - break; - case CS7: - mode |= US_MR_CHRL_7; - break; - default: - mode |= US_MR_CHRL_8; - break; - } - - /* Stop bits */ - if (t->c_cflag & CSTOPB){ - mode |= US_MR_NBSTOP_2; /* 2 stop bits */ - } else - mode |= US_MR_NBSTOP_1; /* 1 stop bits */ - - /* Parity */ - if (t->c_cflag & PARENB){ - /* Mark or Space parity */ - if (t->c_cflag & PARODD){ - mode |= US_MR_PAR_ODD; - } else - mode |= US_MR_PAR_EVEN; - } else - mode |= US_MR_PAR_NONE; - - baud_requested = t->c_ospeed; - - /* If not, set the dbgu console baud as USART baud default */ - if (!baud_requested) - baud_requested = BSP_get_baud(); - - baud = rtems_termios_baud_to_number(baud_requested); - - brgr = (at91rm9200_get_mck() / 16) / baud; - - if (brgr > 65535){ /* BRGR is 16-bit, so switch to slower clock */ - brgr /= 8; - mode |= US_MR_USCLKS_MCK_DIV8; - } - - usart->mr = mode; - usart->brgr = brgr; - return 0; -} diff --git a/c/src/lib/libbsp/arm/edb7312/Makefile.am b/c/src/lib/libbsp/arm/edb7312/Makefile.am index 612afe1f99..6404930f8f 100644 --- a/c/src/lib/libbsp/arm/edb7312/Makefile.am +++ b/c/src/lib/libbsp/arm/edb7312/Makefile.am @@ -32,7 +32,7 @@ librtemsbsp_a_SOURCES +=../../../../../../bsps/arm/edb7312/clock/clockdrv.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/uart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/edb7312/console/uart.c # timer librtemsbsp_a_SOURCES += timer/timer.c diff --git a/c/src/lib/libbsp/arm/edb7312/console/uart.c b/c/src/lib/libbsp/arm/edb7312/console/uart.c deleted file mode 100644 index 4ba71c8cc2..0000000000 --- a/c/src/lib/libbsp/arm/edb7312/console/uart.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Cirrus EP7312 Console Driver - * - * Copyright (c) 2002 by Jay Monkman <jtm@smoothsmoothie.com> - * - * 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. - */ - -#include <bsp.h> /* Must be before libio.h */ -#include <rtems/libio.h> -#include <termios.h> -#include <rtems/bspIo.h> - -#include <ep7312.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -#define NUM_DEVS 1 -int uart_poll_read(int minor); - -static int uart_first_open(int major, int minor, void *arg); -static int uart_last_close(int major, int minor, void *arg); -static int uart_read(int minor); -static ssize_t uart_write(int minor, const char *buf, size_t len); -static void uart_init(int minor); -static void uart_write_polled(int minor, char c); -static int uart_set_attributes(int minor, const struct termios *t); - -unsigned long Console_Configuration_Count = NUM_DEVS; - -const console_fns uart_fns = -{ - libchip_serial_default_probe, - uart_first_open, - uart_last_close, - uart_read, - uart_write, - uart_init, - uart_write_polled, - uart_set_attributes, - FALSE -}; -console_tbl Console_Configuration_Ports[] = { - { - "/dev/com0", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &uart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 16, /* ulMargin */ - 8, /* ulHysteresis */ - NULL, /* pDeviceParams */ - (uint32_t)EP7312_UARTCR1, /* ulCtrlPort1 */ - (uint32_t)EP7312_SYSFLG1, /* ulCtrlPort2 */ - (uint32_t)EP7312_UARTDR1, /* ulDataPort */ - 0, /* getRegister */ - 0, /* setRegister */ - 0, /* getData */ - 0, /* setData */ - 0, /* ulClock */ - 0 /* ulIntVector */ - }}; - -static int uart_first_open(int major, int minor, void *arg) {return 0;} -static int uart_last_close(int major, int minor, void *arg) {return 0;} -static int uart_read(int minor) -{ - return uart_poll_read(minor); -} - -static void uart_write_polled(int minor, char c) -{ - uart_write(minor, &c, 1); -} - -static int uart_set_attributes(int minor, const struct termios *t) -{ - return 0; -} - -int uart_poll_read(int minor) -{ - volatile uint32_t *data_reg; - volatile uint32_t *ctrl_reg2; - char c; - int err; - - data_reg = (uint32_t *)Console_Port_Tbl[minor]->ulDataPort; - ctrl_reg2 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort2; - - if ((*ctrl_reg2 & EP7312_UART_URXFE1) != 0) { - return -1; - } - - err = *data_reg; - c = err & 0xff; - err &= (EP7312_UART_FRMERR | EP7312_UART_PARERR | EP7312_UART_OVERR); - - return c; -} - -static ssize_t uart_do_write( - volatile uint32_t *uartdr, - const char *buf, - size_t len, - volatile uint32_t *sysflg -) -{ - size_t i; - - for (i = 0; i < len; i++) { - /* Wait for fifo to have room */ - while ((*sysflg & EP7312_UART_UTXFF1) != 0) { - continue; - } - - *uartdr = buf[i]; - } - - return len; -} - -static ssize_t uart_write(int minor, const char *buf, size_t len) -{ - volatile uint32_t *data_reg; - volatile uint32_t *ctrl_reg2; - - data_reg = (uint32_t *)Console_Port_Tbl[minor]->ulDataPort; - ctrl_reg2 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort2; - - return uart_do_write(data_reg, buf, len, ctrl_reg2); -} - -static void uart_init(int minor) -{ - volatile uint32_t *ctrl_reg1; - - ctrl_reg1 = (uint32_t *)Console_Port_Tbl[minor]->ulCtrlPort1; - - /* *ctrl_reg = (BSP_UART_DATA8 | - BSP_UART_STOP1 | - BSP_UART_PARITY_NONE | - EP7312_UART_FIFOEN | - BSP_UART_BAUD_9600); - */ - *ctrl_reg1 = (EP7312_UART_WRDLEN8 | - EP7312_UART_FIFOEN | - 0x17); /* 9600 baud */ - -} - -/* - * Debug IO support - */ -static void _BSP_null_char(char c) -{ - uart_do_write(EP7312_UARTDR1, &c, 1, EP7312_SYSFLG1); -} - -static int _BSP_get_char(void) -{ - return uart_poll_read(0); -} - -BSP_output_char_function_type BSP_output_char = _BSP_null_char; - -BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char; diff --git a/c/src/lib/libbsp/arm/gdbarmsim/Makefile.am b/c/src/lib/libbsp/arm/gdbarmsim/Makefile.am index 83bbda0094..68521ca1c2 100644 --- a/c/src/lib/libbsp/arm/gdbarmsim/Makefile.am +++ b/c/src/lib/libbsp/arm/gdbarmsim/Makefile.am @@ -28,8 +28,8 @@ librtemsbsp_a_SOURCES += startup/syscalls.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/cpucounter/cpucounterread.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/cpucounter/cpucounterdiff.c # console -librtemsbsp_a_SOURCES += ../../shared/console-polled.c -librtemsbsp_a_SOURCES += console/console-io.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-polled.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/gdbarmsim/console/console-io.c # clock librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/clock/clock-simidle.c # timer diff --git a/c/src/lib/libbsp/arm/gdbarmsim/console/console-io.c b/c/src/lib/libbsp/arm/gdbarmsim/console/console-io.c deleted file mode 100644 index 8bea74d934..0000000000 --- a/c/src/lib/libbsp/arm/gdbarmsim/console/console-io.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * COPYRIGHT (c) 1989-2009. - * On-Line Applications Research Corporation (OAR). - * - * 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. - */ - -#include <bsp.h> -#include <bsp/console-polled.h> -#include <rtems/libio.h> -#include <stdlib.h> -#include <assert.h> - -/* - * console_initialize_hardware - * - * This routine initializes the console hardware. - * - */ -void console_initialize_hardware(void) -{ - return; -} - -/* - * console_outbyte_polled - * - * This routine transmits a character using polling. - */ -void console_outbyte_polled( - int port, - char ch -) -{ - gdbarmsim_writec(ch); -} - -/* - * console_inbyte_nonblocking - * - * This routine polls for a character. - */ - -int console_inbyte_nonblocking( - int port -) -{ - return -1; -} - -#include <rtems/bspIo.h> - -static void MyBSP_output_char(char c) { console_outbyte_polled( 0, c ); } - -BSP_output_char_function_type BSP_output_char = MyBSP_output_char; -BSP_polling_getchar_function_type BSP_poll_char = NULL; diff --git a/c/src/lib/libbsp/arm/gumstix/Makefile.am b/c/src/lib/libbsp/arm/gumstix/Makefile.am index ec5d8c910e..d262811e47 100644 --- a/c/src/lib/libbsp/arm/gumstix/Makefile.am +++ b/c/src/lib/libbsp/arm/gumstix/Makefile.am @@ -33,8 +33,8 @@ librtemsbsp_a_SOURCES += timer/timer.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/uarts.c -librtemsbsp_a_SOURCES += console/ffuart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/gumstix/console/uarts.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/gumstix/console/ffuart.c # IRQ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c diff --git a/c/src/lib/libbsp/arm/gumstix/console/ffuart.c b/c/src/lib/libbsp/arm/gumstix/console/ffuart.c deleted file mode 100644 index 335fc6f4de..0000000000 --- a/c/src/lib/libbsp/arm/gumstix/console/ffuart.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Console driver for pxa255 full function port by Yang Xi <hiyangxi@gmail.com> - * Copyright (c) 2004 by Jay Monkman <jtm@lopingdog.com> - * - * 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. - */ - -#include <bsp.h> -#include <rtems/libio.h> -#include <termios.h> - -#include <pxa255.h> -#include <ffuart.h> -#include <rtems/bspIo.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -volatile int dbg_dly; - -/* static function prototypes */ -static int ffuart_first_open(int major, int minor, void *arg); -static int ffuart_last_close(int major, int minor, void *arg); -static int ffuart_read(int minor); -static ssize_t ffuart_write(int minor, const char *buf, size_t len); -static void ffuart_init(int minor); -static void ffuart_write_polled(int minor, char c); -static int ffuart_set_attributes(int minor, const struct termios *t); - -/* Pointers to functions for handling the UART. */ -const console_fns ffuart_fns = -{ - libchip_serial_default_probe, - ffuart_first_open, - ffuart_last_close, - ffuart_read, - ffuart_write, - ffuart_init, - ffuart_write_polled, /* not used in this driver */ - ffuart_set_attributes, - FALSE /* TRUE if interrupt driven, FALSE if not. */ -}; - - -/* - * This is called the first time each device is opened. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd enable interrupts here. - */ -static int ffuart_first_open(int major, int minor, void *arg) -{ - return 0; -} - - -/* - * This is called the last time each device is closed. Since - * the driver is polled, we don't have to do anything. If the driver - * were interrupt driven, we'd disable interrupts here. - */ -static int ffuart_last_close(int major, int minor, void *arg) -{ - return 0; -} - - -/* - * Read one character from UART. - * - * return -1 if there's no data, otherwise return - * the character in lowest 8 bits of returned int. - */ -static int ffuart_read(int minor) -{ - char c; - console_tbl *console_entry; - ffuart_reg_t *ffuart; - - console_entry = BSP_get_uart_from_minor(minor); - - if (console_entry == NULL) { - return -1; - } - - ffuart = (ffuart_reg_t *)console_entry->ulCtrlPort1; - - if (!(ffuart->lsr & FULL_RECEIVE)) { - return -1; - } - - c = ffuart->rbr & 0xff; - - return c; -} - - -/* - * Write buffer to UART - * - * return 1 on success, -1 on error - */ -static ssize_t ffuart_write(int minor, const char *buf, size_t len) -{ - size_t i, x; - char c; - console_tbl *console_entry; - ffuart_reg_t *ffuart; - - console_entry = BSP_get_uart_from_minor(minor); - - if (console_entry == NULL) { - return -1; - } - - ffuart = (ffuart_reg_t *)console_entry->ulCtrlPort1; - - for (i = 0; i < len; i++) { - - while(1) { - if (ffuart->lsr & SEND_EMPTY) { - break; - } - } - - c = (char) buf[i]; -#if ON_SKYEYE != 1 - if(c=='\n'){ - ffuart->rbr = '\r'; - for (x = 0; x < 100; x++) { - dbg_dly++; /* using a global so this doesn't get optimized out */ - } - while(1){ - if(ffuart->lsr & SEND_EMPTY){ - break; - } - } - } -#endif - ffuart->rbr = c; - - /* the TXRDY flag does not seem to update right away (is this true?) */ - /* so we wait a bit before continuing */ - for (x = 0; x < 100; x++) { - dbg_dly++; /* using a global so this doesn't get optimized out */ - } - } - - return 1; -} - - -static void ffuart_init(int minor) -{ - - - console_tbl *console_entry; - ffuart_reg_t *ffuart; - unsigned int divisor; - - console_entry = BSP_get_uart_from_minor(minor); - - - - if (console_entry == NULL) { - return; - } - - ffuart = (ffuart_reg_t *)console_entry->ulCtrlPort1; - ffuart->lcr |= DLAB; - /*Set the Bound*/ - ffuart->lcr |= DLAB; - divisor = FREQUENCY_UART / (115200*16); - ffuart->rbr = divisor & 0xff; - ffuart->ier = (divisor >> 8)&0xff; - /*Disable FIFO*/ - ffuart->iir = 0; - ffuart->lcr &=~DLAB; - /*Enable UART*/ - ffuart->ier = 0x40; - ffuart->lcr = EIGHT_BITS_NOPARITY_1STOPBIT; - -} - -/* I'm not sure this is needed for the shared console driver. */ -static void ffuart_write_polled(int minor, char c) -{ - ffuart_write(minor, &c, 1); -} - -/* This is for setting baud rate, bits, etc. */ -static int ffuart_set_attributes(int minor, const struct termios *t) -{ - return 0; -} - -/***********************************************************************/ -/* - * The following functions are not used by TERMIOS, but other RTEMS - * functions use them instead. - */ -/***********************************************************************/ -/* - * Read from UART. This is used in the exit code, and can't - * rely on interrupts. - */ -static int ffuart_poll_read(int minor) -{ - return ffuart_read(minor); -} - - -/* - * Write a character to the console. This is used by printk() and - * maybe other low level functions. It should not use interrupts or any - * RTEMS system calls. It needs to be very simple - */ -static void _BSP_put_char( char c ) { - ffuart_write_polled(0, c); -} - -static int _BSP_poll_char(void) { - return ffuart_poll_read(0); -} - -BSP_output_char_function_type BSP_output_char = _BSP_put_char; -BSP_polling_getchar_function_type BSP_poll_char = _BSP_poll_char; diff --git a/c/src/lib/libbsp/arm/gumstix/console/uarts.c b/c/src/lib/libbsp/arm/gumstix/console/uarts.c deleted file mode 100644 index 08408695e0..0000000000 --- a/c/src/lib/libbsp/arm/gumstix/console/uarts.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Console driver for GUMSTIX by Yang Xi <hiyangxi@gmail.com> - * - * This driver uses the shared console driver in - * ...../libbsp/shared/console.c - * - * Copyright (c) 2003 by Cogent Computer Systems - * Written by Jay Monkman <jtm@lopingdog.com> - * - * 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. - */ - -#include <bsp.h> -#include <rtems/libio.h> -#include <termios.h> -#include <rtems/bspIo.h> - -#include <pxa255.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -/* How many serial ports? */ -#define NUM_DEVS 1 - -/* These are used by code in console.c */ -unsigned long Console_Configuration_Count = NUM_DEVS; - -extern const console_fns ffuart_fns; - -/* - * There's one item in array for each UART. - * - * Some of these fields are marked "NOT USED". They are not used - * by console.c, but may be used by drivers in libchip - * - * when we add other types of UARTS we will need to move this - * structure to a generic uart.c file with only this in it - */ -console_tbl Console_Configuration_Ports[] = { - { - "/dev/com0", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &ffuart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - FFUART_BASE, /* ulCtrlPort1 - Pointer to DBGU regs */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - }}; - - -console_tbl *BSP_get_uart_from_minor(int minor) -{ - return Console_Port_Tbl[minor]; -} diff --git a/c/src/lib/libbsp/arm/imx/Makefile.am b/c/src/lib/libbsp/arm/imx/Makefile.am index c02152f8ca..2d62ed445d 100644 --- a/c/src/lib/libbsp/arm/imx/Makefile.am +++ b/c/src/lib/libbsp/arm/imx/Makefile.am @@ -56,8 +56,8 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += ../shared/arm-gic-irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/imx/console/console-config.c # Clock librtemsbsp_a_SOURCES += ../shared/arm-generic-timer-clock-config.c diff --git a/c/src/lib/libbsp/arm/imx/console/console-config.c b/c/src/lib/libbsp/arm/imx/console/console-config.c deleted file mode 100644 index 0731446f08..0000000000 --- a/c/src/lib/libbsp/arm/imx/console/console-config.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright (c) 2017 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@embedded-brains.de> - * - * 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. - */ - -#include <sys/param.h> - -#include <rtems/bspIo.h> -#include <rtems/console.h> -#include <rtems/sysinit.h> -#include <rtems/termiostypes.h> - -#include <bsp.h> -#include <bsp/fdt.h> -#include <bsp/irq.h> - -#include <arm/freescale/imx/imx_ccmvar.h> -#include <arm/freescale/imx/imx_uartreg.h> - -#include <libfdt.h> - -#define IMX_UART_TX_FIFO_LEVEL 16 - -typedef struct { - rtems_termios_device_context base; - volatile imx_uart *regs; -#ifdef CONSOLE_USE_INTERRUPTS - rtems_vector_number irq; - int tx_in_progress; -#endif -} imx_uart_context; - -static imx_uart_context imx_uart_instances[7]; - -static imx_uart_context *imx_uart_console = &imx_uart_instances[0]; - -static volatile imx_uart *imx_uart_get_regs(rtems_termios_device_context *base) -{ - imx_uart_context *ctx; - - ctx = (imx_uart_context *) base; - return ctx->regs; -} - -static void imx_uart_write_polled(rtems_termios_device_context *base, char c) -{ - volatile imx_uart *regs; - - regs = imx_uart_get_regs(base); - - while ((regs->usr1 & IMX_UART_USR1_TRDY) == 0) { - /* Wait */ - } - - regs->utxd = IMX_UART_UTXD_TX_DATA(c); -} - -void imx_uart_console_drain(void) -{ - volatile imx_uart *regs; - - regs = imx_uart_get_regs(&imx_uart_console->base); - - if (regs != NULL) { - while ((regs->usr2 & IMX_UART_USR2_TXFE) == 0) { - /* Wait */ - } - } -} - -static void imx_output_char(char c) -{ - imx_uart_write_polled(&imx_uart_console->base, c); -} - -static void imx_uart_init_context( - imx_uart_context *ctx, - const char *fdt, - const char *serial -) -{ - int node; - - rtems_termios_device_context_initialize(&ctx->base, "UART"); - node = fdt_path_offset(fdt, serial); - ctx->regs = imx_get_reg_of_node(fdt, node); -#ifdef CONSOLE_USE_INTERRUPTS - ctx->irq = imx_get_irq_of_node(fdt, node, 0); -#endif -} - -static void imx_uart_probe(void) -{ - const void *fdt; - int node; - int offset; - const char *console; - size_t i; - - fdt = bsp_fdt_get(); - node = fdt_path_offset(fdt, "/chosen"); - - console = fdt_getprop(fdt, node, "stdout-path", NULL); - if (console == NULL) { - console = ""; - } - - node = fdt_path_offset(fdt, "/aliases"); - offset = fdt_first_property_offset(fdt, node); - i = 0; - - while (offset >= 0 && i < RTEMS_ARRAY_SIZE(imx_uart_instances)) { - const struct fdt_property *prop; - - prop = fdt_get_property_by_offset(fdt, offset, NULL); - - if (prop != NULL) { - const char *name; - - name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); - if (strstr(name, "serial") != NULL) { - imx_uart_context *ctx; - const char *serial; - - ctx = &imx_uart_instances[i]; - serial = prop->data; - - if (strcmp(serial, console) == 0) { - imx_uart_console = ctx; - } - - imx_uart_init_context(ctx, fdt, serial); - ++i; - } - } - - offset = fdt_next_property_offset(fdt, offset); - } - - BSP_output_char = imx_output_char; -} - -static void imx_output_char_init(char c) -{ - imx_uart_probe(); - imx_output_char(c); -} - -BSP_output_char_function_type BSP_output_char = imx_output_char_init; - -BSP_polling_getchar_function_type BSP_poll_char = NULL; - -#ifdef CONSOLE_USE_INTERRUPTS -static void imx_uart_interrupt(void *arg) -{ - rtems_termios_tty *tty; - imx_uart_context *ctx; - volatile imx_uart *regs; - uint32_t usr2; - - tty = arg; - ctx = rtems_termios_get_device_context(tty); - regs = ctx->regs; - usr2 = regs->usr2; - - regs->usr1 = IMX_UART_USR1_AGTIM; - - while ((usr2 & IMX_UART_USR2_RDR) != 0) { - char c; - - c = IMX_UART_URXD_RX_DATA_GET(regs->urxd); - rtems_termios_enqueue_raw_characters(tty, &c, 1); - usr2 = regs->usr2; - } - - if (ctx->tx_in_progress > 0 && (regs->usr1 & IMX_UART_USR1_TRDY) != 0) { - rtems_termios_dequeue_characters(tty, ctx->tx_in_progress); - } -} -#endif - -static bool imx_uart_set_attributes( - rtems_termios_device_context *base, - const struct termios *term -) -{ - imx_uart_context *ctx; - volatile imx_uart *regs; - uint32_t ufcr; - uint32_t baud; - - ctx = (imx_uart_context *) base; - regs = imx_uart_get_regs(&ctx->base); - - baud = rtems_termios_baud_to_number(term->c_ospeed); - - if (baud != 0) { - ufcr = regs->ufcr; - ufcr = IMX_UART_UFCR_RFDIV_SET(ufcr, 0x5); - regs->ufcr = ufcr; - regs->ubir = 15; - regs->ubmr = imx_ccm_uart_hz() / baud - 1; - } - - return true; -} - -static bool imx_uart_first_open( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - imx_uart_context *ctx; - volatile imx_uart *regs; -#ifdef CONSOLE_USE_INTERRUPTS - rtems_status_code sc; - uint32_t ufcr; -#endif - - ctx = (imx_uart_context *) base; - regs = imx_uart_get_regs(&ctx->base); - - regs->ucr1 = IMX_UART_UCR1_UARTEN; - regs->ucr2 = IMX_UART_UCR2_IRTS | IMX_UART_UCR2_WS | IMX_UART_UCR2_RXEN - | IMX_UART_UCR2_TXEN | IMX_UART_UCR2_SRST; - - rtems_termios_set_initial_baud(tty, 115200); - imx_uart_set_attributes(base, term); - -#ifdef CONSOLE_USE_INTERRUPTS - ufcr = regs->ufcr; - ufcr = IMX_UART_UFCR_RXTL_SET(ufcr, 16); - ufcr = IMX_UART_UFCR_TXTL_SET(ufcr, IMX_UART_TX_FIFO_LEVEL); - regs->ufcr = ufcr; - regs->ucr1 |= IMX_UART_UCR1_RRDYEN; - regs->ucr2 |= IMX_UART_UCR2_ATEN; - sc = rtems_interrupt_handler_install( - ctx->irq, - "UART", - RTEMS_INTERRUPT_SHARED, - imx_uart_interrupt, - tty - ); - if (sc != RTEMS_SUCCESSFUL) { - return false; - } -#endif - - return true; -} - -static void imx_uart_last_close( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ -#ifdef CONSOLE_USE_INTERRUPTS - imx_uart_context *ctx; - - ctx = (imx_uart_context *) base; - rtems_interrupt_handler_remove(ctx->irq, imx_uart_interrupt, tty); -#endif -} - -static void imx_uart_write( - rtems_termios_device_context *base, - const char *buf, - size_t len -) -{ -#ifdef CONSOLE_USE_INTERRUPTS - imx_uart_context *ctx; - volatile imx_uart *regs; - int n; - uint32_t ucr1; - - ctx = (imx_uart_context *) base; - regs = imx_uart_get_regs(&ctx->base); - ucr1 = regs->ucr1; - - if (len > 0) { - int i; - - n = (int) MIN(len, IMX_UART_TX_FIFO_LEVEL); - ucr1 |= IMX_UART_UCR1_TRDYEN; - - for (i = 0; i < n; ++i) { - regs->utxd = IMX_UART_UTXD_TX_DATA(buf[i]); - } - } else { - n = 0; - ucr1 &= ~IMX_UART_UCR1_TRDYEN; - } - - regs->ucr1 = ucr1; - ctx->tx_in_progress = n; -#else - size_t i; - - for (i = 0; i < len; ++i) { - imx_uart_write_polled(base, buf[i]); - } -#endif -} - -#ifndef CONSOLE_USE_INTERRUPTS -static int imx_uart_read(rtems_termios_device_context *base) -{ - volatile imx_uart *regs; - - regs = imx_uart_get_regs(base); - - if ((regs->usr2 & IMX_UART_USR2_RDR) != 0) { - return IMX_UART_URXD_RX_DATA_GET(regs->urxd); - } else { - return -1; - } -} -#endif - -static const rtems_termios_device_handler imx_uart_handler = { - .first_open = imx_uart_first_open, - .last_close = imx_uart_last_close, - .write = imx_uart_write, - .set_attributes = imx_uart_set_attributes, -#ifdef CONSOLE_USE_INTERRUPTS - .mode = TERMIOS_IRQ_DRIVEN -#else - .poll_read = imx_uart_read, - .mode = TERMIOS_POLLED -#endif -}; - -rtems_status_code console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - char path[] = "/dev/ttyS?"; - size_t i; - - rtems_termios_initialize(); - - for (i = 0; i < RTEMS_ARRAY_SIZE(imx_uart_instances); ++i) { - imx_uart_context *ctx; - - ctx = &imx_uart_instances[i]; - path[sizeof(path) - 2] = (char) ('0' + i); - - rtems_termios_device_install( - path, - &imx_uart_handler, - NULL, - &ctx->base - ); - - if (ctx == imx_uart_console) { - link(path, CONSOLE_DEVICE_NAME); - } - } - - return RTEMS_SUCCESSFUL; -} - -RTEMS_SYSINIT_ITEM( - imx_uart_probe, - RTEMS_SYSINIT_BSP_START, - RTEMS_SYSINIT_ORDER_LAST -); diff --git a/c/src/lib/libbsp/arm/lm3s69xx/Makefile.am b/c/src/lib/libbsp/arm/lm3s69xx/Makefile.am index 31ee769f16..52bbb89ce3 100644 --- a/c/src/lib/libbsp/arm/lm3s69xx/Makefile.am +++ b/c/src/lib/libbsp/arm/lm3s69xx/Makefile.am @@ -56,8 +56,8 @@ librtemsbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq-dispatch.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/console-config.c -librtemsbsp_a_SOURCES += console/uart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lm3s69xx/console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lm3s69xx/console/uart.c # Clock librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-armv7m.c diff --git a/c/src/lib/libbsp/arm/lm3s69xx/console/console-config.c b/c/src/lib/libbsp/arm/lm3s69xx/console/console-config.c deleted file mode 100644 index b702f0cd66..0000000000 --- a/c/src/lib/libbsp/arm/lm3s69xx/console/console-config.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright © 2013 Eugeniy Meshcheryakov <eugen@debian.org> - * - * Copyright (c) 2011 Sebastian Huber. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <rtems/bspIo.h> - -#include <libchip/serial.h> - -#include <bspopts.h> -#include <bsp/irq.h> -#include <bsp/uart.h> -#include <bsp/lm3s69xx.h> - -console_tbl Console_Configuration_Ports [] = { - #ifdef LM3S69XX_ENABLE_UART_0 - { - .sDeviceName = "/dev/ttyS0", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &lm3s69xx_uart_fns, - .ulCtrlPort1 = LM3S69XX_UART_0_BASE, - .ulClock = LM3S69XX_UART_BAUD, - .ulIntVector = LM3S69XX_IRQ_UART_0, - .pDeviceParams = (void *)0 - }, - #endif - #ifdef LM3S69XX_ENABLE_UART_1 - { - .sDeviceName = "/dev/ttyS1", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &lm3s69xx_uart_fns, - .ulCtrlPort1 = LM3S69XX_UART_1_BASE, - .ulClock = LM3S69XX_UART_BAUD, - .ulIntVector = LM3S69XX_IRQ_UART_1, - .pDeviceParams = (void *)1 - }, - #endif - #ifdef LM3S69XX_ENABLE_UART_2 - { - .sDeviceName = "/dev/ttyS2", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &lm3s69xx_uart_fns, - .ulCtrlPort1 = LM3S69XX_UART_2_BASE, - .ulClock = LM3S69XX_UART_BAUD, - .ulIntVector = LM3S69XX_IRQ_UART_2, - .pDeviceParams = (void *)2 - } - #endif -}; - -#define PORT_COUNT \ - (sizeof(Console_Configuration_Ports) \ - / sizeof(Console_Configuration_Ports [0])) - -unsigned long Console_Configuration_Count = PORT_COUNT; - -static void output_char(char c) -{ - const console_fns *con = - Console_Configuration_Ports [Console_Port_Minor].pDeviceFns; - - con->deviceWritePolled((int) Console_Port_Minor, c); -} - -BSP_output_char_function_type BSP_output_char = output_char; - -BSP_polling_getchar_function_type BSP_poll_char = NULL; diff --git a/c/src/lib/libbsp/arm/lm3s69xx/console/uart.c b/c/src/lib/libbsp/arm/lm3s69xx/console/uart.c deleted file mode 100644 index 67a85f4e96..0000000000 --- a/c/src/lib/libbsp/arm/lm3s69xx/console/uart.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright © 2013 Eugeniy Meshcheryakov <eugen@debian.org> - * - * Copyright (c) 2011 Sebastian Huber. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <bspopts.h> -#include <bsp/uart.h> -#include <libchip/sersupp.h> -#include <bsp/syscon.h> -#include <bsp/lm3s69xx.h> -#include <rtems/irq-extension.h> -#include <assert.h> - -#define LM3S69XX_UART_FIFO_DEPTH 16 - -static volatile lm3s69xx_uart *get_uart_regs(int minor) -{ - console_tbl *ct = Console_Port_Tbl [minor]; - - return (lm3s69xx_uart *) ct->ulCtrlPort1; -} - -static unsigned int get_uart_number(int minor) -{ - console_tbl *ct = Console_Port_Tbl [minor]; - - return (unsigned int)ct->pDeviceParams; -} - -/* - * Returns both integer and fractional parts as one number. - */ -static uint32_t get_baud_div(uint32_t baud) -{ - uint32_t clock4 = LM3S69XX_SYSTEM_CLOCK * 4; - return (clock4 + baud - 1) / baud; -} - -static void irq_handler(void *arg) -{ - int minor = (int)arg; - console_data *cd = &Console_Port_Data [minor]; - volatile lm3s69xx_uart *uart = get_uart_regs(minor); - - do { - char buf[LM3S69XX_UART_FIFO_DEPTH]; - int i = 0; - uint32_t status = uart->fr; - - while (((status & UARTFR_RXFE) == 0) && (i < LM3S69XX_UART_FIFO_DEPTH)) { - uint32_t d = uart->dr; - - if ((d & UARTDR_ERROR_MSK) == 0) { - buf[i] = UARTDR_DATA_GET(d); - i++; - } - - status = uart->fr; - } - - if (i > 0) - rtems_termios_enqueue_raw_characters(cd->termios_data, buf, i); - } while (uart->mis != 0); -} - -static void initialize(int minor) -{ - const console_tbl *ct = Console_Port_Tbl[minor]; - volatile lm3s69xx_uart *uart = get_uart_regs(minor); - unsigned int num = get_uart_number(minor); - - lm3s69xx_syscon_enable_uart_clock(num, true); - - uart->ctl = 0; - - uint32_t brd = get_baud_div(LM3S69XX_UART_BAUD); - uart->ibrd = brd / 64; - uart->fbrd = brd % 64; - - uart->lcrh = UARTLCRH_WLEN(0x3) | UARTLCRH_FEN; - uart->ctl = UARTCTL_RXE | UARTCTL_TXE | UARTCTL_UARTEN; - - int rv = rtems_interrupt_handler_install(ct->ulIntVector, "UART", - RTEMS_INTERRUPT_UNIQUE, irq_handler, (void *)minor); - assert(rv == RTEMS_SUCCESSFUL); -} - -static int first_open(int major, int minor, void *arg) -{ - rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; - struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; - console_data *cd = &Console_Port_Data [minor]; - volatile lm3s69xx_uart *uart = get_uart_regs(minor); - - cd->termios_data = tty; - rtems_termios_set_initial_baud(tty, LM3S69XX_UART_BAUD); - - /* Drain the RX FIFO. */ - while ((uart->fr & UARTFR_RXFE) == 0) - (void)uart->dr; - - uart->im = UARTI_RX | UARTI_RT; - - return 0; -} - -static int last_close(int major, int minor, void *arg) -{ - volatile lm3s69xx_uart *uart = get_uart_regs(minor); - uart->im = 0; - - return 0; -} - -static void write_polled(int minor, char c) -{ - volatile lm3s69xx_uart *uart = get_uart_regs(minor); - - while ((uart->fr & UARTFR_TXFF) != 0) { - /* Wait */ - } - - uart->dr = UARTDR_DATA(c); -} - -static ssize_t write_support_polled( - int minor, - const char *s, - size_t n -) -{ - ssize_t i = 0; - - for (i = 0; i < n; ++i) { - write_polled(minor, s [i]); - } - - return n; -} - -static int set_attribues(int minor, const struct termios *term) -{ - return -1; -} - -const console_fns lm3s69xx_uart_fns = { - .deviceProbe = libchip_serial_default_probe, - .deviceFirstOpen = first_open, - .deviceLastClose = last_close, - .deviceRead = NULL, - .deviceWrite = write_support_polled, - .deviceInitialize = initialize, - .deviceWritePolled = write_polled, - .deviceSetAttributes = set_attribues, - .deviceOutputUsesInterrupts = false -}; diff --git a/c/src/lib/libbsp/arm/lpc176x/Makefile.am b/c/src/lib/libbsp/arm/lpc176x/Makefile.am index 49e6620a9e..ba2475febb 100644 --- a/c/src/lib/libbsp/arm/lpc176x/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc176x/Makefile.am @@ -59,9 +59,9 @@ librtemsbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq-dispatch.c librtemsbsp_a_SOURCES += irq/irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios-init.c -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc176x/console/console-config.c # Clock librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-nxp-lpc.c diff --git a/c/src/lib/libbsp/arm/lpc176x/console/console-config.c b/c/src/lib/libbsp/arm/lpc176x/console/console-config.c deleted file mode 100644 index c80932daf7..0000000000 --- a/c/src/lib/libbsp/arm/lpc176x/console/console-config.c +++ /dev/null @@ -1,192 +0,0 @@ -/** - * @file - * - * @ingroup lpc176x - * - * @brief Console configuration. - */ - -/* - * Copyright (c) 2008-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <libchip/ns16550.h> - -#include <bsp.h> -#include <bsp/io.h> -#include <bsp/irq.h> -#include <bsp/console-termios.h> - -/** - * @brief Gets the uart register according to the current address. - * - * @param addr Register address. - * @param i Index register. - * @return Uart register. - */ -static inline uint8_t lpc176x_uart_get_register( - const uintptr_t addr, - const uint8_t i -) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - return (uint8_t) reg[ i ]; -} - -/** - * @brief Sets the uart register address according to the value passed. - * - * @param addr Register address. - * @param i Index register. - * @param val Value to set. - */ -static inline void lpc176x_uart_set_register( - const uintptr_t addr, - const uint8_t i, - const uint8_t val -) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - reg[ i ] = val; -} - -static bool lpc176x_uart1_probe(rtems_termios_device_context *ctx) -{ - (void)ctx; - - lpc176x_module_enable( LPC176X_MODULE_UART_1, LPC176X_MODULE_PCLK_DEFAULT ); - - lpc176x_pin_select( LPC176X_PIN_UART_1_TXD, LPC176X_PIN_FUNCTION_01 ); - lpc176x_pin_select( LPC176X_PIN_UART_1_RXD, LPC176X_PIN_FUNCTION_01 ); - - return true; -} - -#ifdef LPC176X_CONFIG_UART_2 -static bool lpc176x_uart2_probe(rtems_termios_device_context *ctx) -{ - (void)ctx; - - lpc176x_module_enable( LPC176X_MODULE_UART_2, LPC176X_MODULE_PCLK_DEFAULT ); - - lpc176x_pin_select( LPC176X_PIN_UART_2_TXD, LPC176X_PIN_FUNCTION_01 ); - lpc176x_pin_select( LPC176X_PIN_UART_2_RXD, LPC176X_PIN_FUNCTION_01 ); - - return true; -} -#endif - -#ifdef LPC176X_CONFIG_UART_3 -static bool lpc176x_uart3_probe(rtems_termios_device_context *ctx) -{ - (void)ctx; - - lpc176x_module_enable( LPC176X_MODULE_UART_3, LPC176X_MODULE_PCLK_DEFAULT ); - - lpc176x_pin_select( LPC176X_PIN_UART_3_TXD, LPC176X_PIN_FUNCTION_10 ); - lpc176x_pin_select( LPC176X_PIN_UART_3_RXD, LPC176X_PIN_FUNCTION_10 ); - - return true; -} -#endif - -#ifdef LPC176X_CONFIG_CONSOLE -static ns16550_context lpc176x_uart_context_0 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 0"), - .get_reg = lpc176x_uart_get_register, - .set_reg = lpc176x_uart_set_register, - .port = UART0_BASE_ADDR, - .irq = LPC176X_IRQ_UART_0, - .clock = LPC176X_PCLK, - .initial_baud = LPC176X_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -#ifdef LPC176X_CONFIG_UART_1 -static ns16550_context lpc176x_uart_context_1 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 1"), - .get_reg = lpc176x_uart_get_register, - .set_reg = lpc176x_uart_set_register, - .port = UART1_BASE_ADDR, - .irq = LPC176X_IRQ_UART_1, - .clock = LPC176X_PCLK, - .initial_baud = LPC176X_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -#ifdef LPC176X_CONFIG_UART_2 -static ns16550_context lpc176x_uart_context_2 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 2"), - .get_reg = lpc176x_uart_get_register, - .set_reg = lpc176x_uart_set_register, - .port = UART2_BASE_ADDR, - .irq = LPC176X_IRQ_UART_2, - .clock = LPC176X_PCLK, - .initial_baud = LPC176X_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -#ifdef LPC176X_CONFIG_UART_3 -static ns16550_context lpc176x_uart_context_3 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 3"), - .get_reg = lpc176x_uart_get_register, - .set_reg = lpc176x_uart_set_register, - .port = UART3_BASE_ADDR, - .irq = LPC176X_IRQ_UART_3, - .clock = LPC176X_PCLK, - .initial_baud = LPC176X_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -const console_device console_device_table[] = { - #ifdef LPC176X_CONFIG_CONSOLE - { - .device_file = "/dev/ttyS0", - .probe = console_device_probe_default, - .handler = &ns16550_handler_interrupt, - .context = &lpc176x_uart_context_0.base - }, - #endif - #ifdef LPC176X_CONFIG_UART_1 - { - .device_file = "/dev/ttyS1", - .probe = lpc176x_uart1_probe, - .handler = &ns16550_handler_interrupt, - .context = &lpc176x_uart_context_1.base - }, - #endif - #ifdef LPC176X_CONFIG_UART_2 - { - .device_file = "/dev/ttyS2", - .probe = lpc176x_uart2_probe, - .handler = &ns16550_handler_interrupt, - .context = &lpc176x_uart_context_2.base - }, - #endif - #ifdef LPC176X_CONFIG_UART_3 - { - .device_file = "/dev/ttyS3", - .probe = lpc176x_uart3_probe, - .handler = &ns16550_handler_interrupt, - .context = &lpc176x_uart_context_3.base - }, - #endif -}; - -const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table); diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am index ee2b7b4da0..a597be7e05 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am @@ -71,12 +71,12 @@ librtemsbsp_a_SOURCES += irq/irq.c librtemsbsp_a_SOURCES += irq/irq-dispatch.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios-init.c -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console-config.c -librtemsbsp_a_SOURCES += console/uart-probe-1.c -librtemsbsp_a_SOURCES += console/uart-probe-2.c -librtemsbsp_a_SOURCES += console/uart-probe-3.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc24xx/console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc24xx/console/uart-probe-1.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc24xx/console/uart-probe-2.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc24xx/console/uart-probe-3.c # Clock librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-nxp-lpc.c diff --git a/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c b/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c deleted file mode 100644 index de94552c27..0000000000 --- a/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @file - * - * @ingroup lpc24xx - * - * @brief Console configuration. - */ - -/* - * Copyright (c) 2008-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <rtems/console.h> - -#include <libchip/ns16550.h> - -#include <bsp.h> -#include <bsp/lpc24xx.h> -#include <bsp/irq.h> -#include <bsp/io.h> -#include <bsp/console-termios.h> - -static uint8_t lpc24xx_uart_get_register(uintptr_t addr, uint8_t i) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - return (uint8_t) reg [i]; -} - -static void lpc24xx_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - reg [i] = val; -} - -#ifdef LPC24XX_CONFIG_CONSOLE -static ns16550_context lpc24xx_uart_context_0 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 0"), - .get_reg = lpc24xx_uart_get_register, - .set_reg = lpc24xx_uart_set_register, - .port = UART0_BASE_ADDR, - .irq = LPC24XX_IRQ_UART_0, - .clock = LPC24XX_PCLK, - .initial_baud = LPC24XX_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -#ifdef LPC24XX_CONFIG_UART_1 -static ns16550_context lpc24xx_uart_context_1 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 1"), - .get_reg = lpc24xx_uart_get_register, - .set_reg = lpc24xx_uart_set_register, - .port = UART1_BASE_ADDR, - .irq = LPC24XX_IRQ_UART_1, - .clock = LPC24XX_PCLK, - .initial_baud = LPC24XX_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -#ifdef LPC24XX_CONFIG_UART_2 -static ns16550_context lpc24xx_uart_context_2 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 2"), - .get_reg = lpc24xx_uart_get_register, - .set_reg = lpc24xx_uart_set_register, - .port = UART2_BASE_ADDR, - .irq = LPC24XX_IRQ_UART_2, - .clock = LPC24XX_PCLK, - .initial_baud = LPC24XX_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -#ifdef LPC24XX_CONFIG_UART_3 -static ns16550_context lpc24xx_uart_context_3 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 3"), - .get_reg = lpc24xx_uart_get_register, - .set_reg = lpc24xx_uart_set_register, - .port = UART3_BASE_ADDR, - .irq = LPC24XX_IRQ_UART_3, - .clock = LPC24XX_PCLK, - .initial_baud = LPC24XX_UART_BAUD, - .has_fractional_divider_register = true -}; -#endif - -const console_device console_device_table[] = { - #ifdef LPC24XX_CONFIG_CONSOLE - { - .device_file = "/dev/ttyS0", - .probe = console_device_probe_default, - .handler = &ns16550_handler_interrupt, - .context = &lpc24xx_uart_context_0.base - }, - #endif - #ifdef LPC24XX_CONFIG_UART_1 - { - .device_file = "/dev/ttyS1", - .probe = lpc24xx_uart_probe_1, - .handler = &ns16550_handler_interrupt, - .context = &lpc24xx_uart_context_1.base - }, - #endif - #ifdef LPC24XX_CONFIG_UART_2 - { - .device_file = "/dev/ttyS2", - .probe = lpc24xx_uart_probe_2, - .handler = &ns16550_handler_interrupt, - .context = &lpc24xx_uart_context_2.base - }, - #endif - #ifdef LPC24XX_CONFIG_UART_3 - { - .device_file = "/dev/ttyS3", - .probe = lpc24xx_uart_probe_3, - .handler = &ns16550_handler_interrupt, - .context = &lpc24xx_uart_context_3.base - }, - #endif -}; - -const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table); diff --git a/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-1.c b/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-1.c deleted file mode 100644 index 3b5f08059f..0000000000 --- a/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-1.c +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file - * - * @ingroup lpc24xx - * - * @brief UART 1 probe. - */ - -/* - * Copyright (c) 2011-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <libchip/ns16550.h> - -#include <bsp.h> -#include <bsp/io.h> - -bool lpc24xx_uart_probe_1(rtems_termios_device_context *context) -{ - static const lpc24xx_pin_range pins [] = { - LPC24XX_PIN_UART_1_TXD_P0_15, - LPC24XX_PIN_UART_1_RXD_P0_16, - LPC24XX_PIN_TERMINAL - }; - - lpc24xx_module_enable(LPC24XX_MODULE_UART_1, LPC24XX_MODULE_PCLK_DEFAULT); - lpc24xx_pin_config(&pins [0], LPC24XX_PIN_SET_FUNCTION); - - return ns16550_probe(context); -} diff --git a/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-2.c b/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-2.c deleted file mode 100644 index d45dbb755b..0000000000 --- a/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-2.c +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file - * - * @ingroup lpc24xx - * - * @brief UART 2 probe. - */ - -/* - * Copyright (c) 2011-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <libchip/ns16550.h> - -#include <bsp.h> -#include <bsp/io.h> - -bool lpc24xx_uart_probe_2(rtems_termios_device_context *context) -{ - static const lpc24xx_pin_range pins [] = { - LPC24XX_PIN_UART_2_TXD_P0_10, - LPC24XX_PIN_UART_2_RXD_P0_11, - LPC24XX_PIN_TERMINAL - }; - - lpc24xx_module_enable(LPC24XX_MODULE_UART_2, LPC24XX_MODULE_PCLK_DEFAULT); - lpc24xx_pin_config(&pins [0], LPC24XX_PIN_SET_FUNCTION); - - return ns16550_probe(context); -} diff --git a/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-3.c b/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-3.c deleted file mode 100644 index fad932ef9e..0000000000 --- a/c/src/lib/libbsp/arm/lpc24xx/console/uart-probe-3.c +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file - * - * @ingroup lpc24xx - * - * @brief UART 3 probe. - */ - -/* - * Copyright (c) 2011-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <libchip/ns16550.h> - -#include <bsp.h> -#include <bsp/io.h> - -bool lpc24xx_uart_probe_3(rtems_termios_device_context *context) -{ - static const lpc24xx_pin_range pins [] = { - LPC24XX_PIN_UART_3_TXD_P0_0, - LPC24XX_PIN_UART_3_RXD_P0_1, - LPC24XX_PIN_TERMINAL - }; - - lpc24xx_module_enable(LPC24XX_MODULE_UART_3, LPC24XX_MODULE_PCLK_DEFAULT); - lpc24xx_pin_config(&pins [0], LPC24XX_PIN_SET_FUNCTION); - - return ns16550_probe(context); -} diff --git a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am index 743b0722b3..d07607060d 100644 --- a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am @@ -59,10 +59,10 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios-init.c -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console-config.c -librtemsbsp_a_SOURCES += console/hsu.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc32xx/console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/lpc32xx/console/hsu.c # Clock librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/shared/clock/clock-nxp-lpc.c diff --git a/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c b/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c deleted file mode 100644 index 17e6b0af8f..0000000000 --- a/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c +++ /dev/null @@ -1,225 +0,0 @@ -/** - * @file - * - * @ingroup arm_lpc32xx - * - * @brief Console configuration. - */ - -/* - * Copyright (c) 2009-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <libchip/ns16550.h> - -#include <bsp.h> -#include <bsp/lpc32xx.h> -#include <bsp/irq.h> -#include <bsp/hsu.h> -#include <bsp/console-termios.h> - -static uint8_t lpc32xx_uart_get_register(uintptr_t addr, uint8_t i) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - return (uint8_t) reg [i]; -} - -static void lpc32xx_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val) -{ - volatile uint32_t *reg = (volatile uint32_t *) addr; - - reg [i] = val; -} - -#ifdef LPC32XX_UART_3_BAUD - static bool lpc32xx_uart_probe_3(rtems_termios_device_context *context) - { - LPC32XX_UARTCLK_CTRL |= BSP_BIT32(0); - LPC32XX_U3CLK = LPC32XX_CONFIG_U3CLK; - LPC32XX_UART_CLKMODE = BSP_FLD32SET(LPC32XX_UART_CLKMODE, 0x2, 4, 5); - - return ns16550_probe(context); - } -#endif - -#ifdef LPC32XX_UART_4_BAUD - static bool lpc32xx_uart_probe_4(rtems_termios_device_context *context) - { - volatile lpc32xx_gpio *gpio = &lpc32xx.gpio; - - /* - * Set GPO_21/U4_TX/LCDVD[3] to U4_TX. This works only if LCD module is - * disabled. - */ - gpio->p2_mux_set = BSP_BIT32(2); - - LPC32XX_UARTCLK_CTRL |= BSP_BIT32(1); - LPC32XX_U4CLK = LPC32XX_CONFIG_U4CLK; - LPC32XX_UART_CLKMODE = BSP_FLD32SET(LPC32XX_UART_CLKMODE, 0x2, 6, 7); - - return ns16550_probe(context); - } -#endif - -#ifdef LPC32XX_UART_6_BAUD - static bool lpc32xx_uart_probe_6(rtems_termios_device_context *context) - { - /* Bypass the IrDA modulator/demodulator */ - LPC32XX_UART_CTRL |= BSP_BIT32(5); - - LPC32XX_UARTCLK_CTRL |= BSP_BIT32(3); - LPC32XX_U6CLK = LPC32XX_CONFIG_U6CLK; - LPC32XX_UART_CLKMODE = BSP_FLD32SET(LPC32XX_UART_CLKMODE, 0x2, 10, 11); - - return ns16550_probe(context); - } -#endif - -/* FIXME: Console selection */ - -#ifdef LPC32XX_UART_5_BAUD -static ns16550_context lpc32xx_uart_context_5 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 5"), - .get_reg = lpc32xx_uart_get_register, - .set_reg = lpc32xx_uart_set_register, - .port = LPC32XX_BASE_UART_5, - .irq = LPC32XX_IRQ_UART_5, - .clock = 16 * LPC32XX_UART_5_BAUD, - .initial_baud = LPC32XX_UART_5_BAUD -}; -#endif - -#ifdef LPC32XX_UART_3_BAUD -static ns16550_context lpc32xx_uart_context_3 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 3"), - .get_reg = lpc32xx_uart_get_register, - .set_reg = lpc32xx_uart_set_register, - .port = LPC32XX_BASE_UART_3, - .irq = LPC32XX_IRQ_UART_3, - .clock = 16 * LPC32XX_UART_3_BAUD, - .initial_baud = LPC32XX_UART_3_BAUD -}; -#endif - -#ifdef LPC32XX_UART_4_BAUD -static ns16550_context lpc32xx_uart_context_4 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 4"), - .get_reg = lpc32xx_uart_get_register, - .set_reg = lpc32xx_uart_set_register, - .port = LPC32XX_BASE_UART_4, - .irq = LPC32XX_IRQ_UART_4, - .clock = 16 * LPC32XX_UART_4_BAUD, - .initial_baud = LPC32XX_UART_4_BAUD -}; -#endif - -#ifdef LPC32XX_UART_6_BAUD -static ns16550_context lpc32xx_uart_context_6 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 6"), - .get_reg = lpc32xx_uart_get_register, - .set_reg = lpc32xx_uart_set_register, - .port = LPC32XX_BASE_UART_6, - .irq = LPC32XX_IRQ_UART_6, - .clock = 16 * LPC32XX_UART_6_BAUD, - .initial_baud = LPC32XX_UART_6_BAUD -}; -#endif - -#ifdef LPC32XX_UART_1_BAUD -static lpc32xx_hsu_context lpc32xx_uart_context_1 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 1"), - .hsu = (volatile lpc32xx_hsu *) LPC32XX_BASE_UART_1, - .irq = LPC32XX_IRQ_UART_1, - .initial_baud = LPC32XX_UART_1_BAUD -}; -#endif - -#ifdef LPC32XX_UART_2_BAUD -static lpc32xx_hsu_context lpc32xx_uart_context_2 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 2"), - .hsu = (volatile lpc32xx_hsu *) LPC32XX_BASE_UART_2, - .irq = LPC32XX_IRQ_UART_2, - .initial_baud = LPC32XX_UART_2_BAUD -}; -#endif - -#ifdef LPC32XX_UART_7_BAUD -static lpc32xx_hsu_context lpc32xx_uart_context_7 = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 7"), - .hsu = (volatile lpc32xx_hsu *) LPC32XX_BASE_UART_7, - .irq = LPC32XX_IRQ_UART_7, - .initial_baud = LPC32XX_UART_7_BAUD -}; -#endif - -const console_device console_device_table[] = { - #ifdef LPC32XX_UART_5_BAUD - { - .device_file = "/dev/ttyS5", - .probe = console_device_probe_default, - .handler = &ns16550_handler_interrupt, - .context = &lpc32xx_uart_context_5.base - }, - #endif - #ifdef LPC32XX_UART_3_BAUD - { - .device_file = "/dev/ttyS3", - .probe = lpc32xx_uart_probe_3, - .handler = &ns16550_handler_interrupt, - .context = &lpc32xx_uart_context_3.base - }, - #endif - #ifdef LPC32XX_UART_4_BAUD - { - .device_file = "/dev/ttyS4", - .probe = lpc32xx_uart_probe_4, - .handler = &ns16550_handler_interrupt, - .context = &lpc32xx_uart_context_4.base - }, - #endif - #ifdef LPC32XX_UART_6_BAUD - { - .device_file = "/dev/ttyS6", - .probe = lpc32xx_uart_probe_6, - .handler = &ns16550_handler_interrupt, - .context = &lpc32xx_uart_context_6.base - }, - #endif - #ifdef LPC32XX_UART_1_BAUD - { - .device_file = "/dev/ttyS1", - .probe = lpc32xx_hsu_probe, - .handler = &lpc32xx_hsu_fns, - .context = &lpc32xx_uart_context_1.base - }, - #endif - #ifdef LPC32XX_UART_2_BAUD - { - .device_file = "/dev/ttyS2", - .probe = lpc32xx_hsu_probe, - .handler = &lpc32xx_hsu_fns, - .context = &lpc32xx_uart_context_2.base - }, - #endif - #ifdef LPC32XX_UART_7_BAUD - { - .device_file = "/dev/ttyS7", - .probe = lpc32xx_hsu_probe, - .handler = &lpc32xx_hsu_fns, - .context = &lpc32xx_uart_context_7.base - }, - #endif -}; - -const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table); diff --git a/c/src/lib/libbsp/arm/lpc32xx/console/hsu.c b/c/src/lib/libbsp/arm/lpc32xx/console/hsu.c deleted file mode 100644 index b2044e0753..0000000000 --- a/c/src/lib/libbsp/arm/lpc32xx/console/hsu.c +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @file - * - * @ingroup arm_lpc32xx - * - * @brief High speed UART driver (14-clock). - */ - -/* - * Copyright (c) 2010-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <bsp.h> -#include <bsp/lpc32xx.h> -#include <bsp/irq.h> -#include <bsp/hsu.h> - -#define HSU_FIFO_SIZE 64 - -#define HSU_LEVEL_RX_MASK 0xffU -#define HSU_LEVEL_TX_MASK 0xff00U -#define HSU_LEVEL_TX_SHIFT 8 - -#define HSU_RX_DATA_MASK 0xffU -#define HSU_RX_EMPTY (1U << 8) -#define HSU_RX_ERROR (1U << 9) -#define HSU_RX_BREAK (1U << 10) - -#define HSU_IIR_TX (1U << 0) -#define HSU_IIR_RX_TRIG (1U << 1) -#define HSU_IIR_RX_TIMEOUT (1U << 2) - -#define HSU_CTRL_INTR_DISABLED 0x1280fU -#define HSU_CTRL_RX_INTR_ENABLED 0x1284fU -#define HSU_CTRL_RX_AND_TX_INTR_ENABLED 0x1286fU - -/* We are interested in RX timeout, RX trigger and TX trigger interrupts */ -#define HSU_IIR_MASK 0x7U - -bool lpc32xx_hsu_probe(rtems_termios_device_context *base) -{ - lpc32xx_hsu_context *ctx = (lpc32xx_hsu_context *) base; - volatile lpc32xx_hsu *hsu = ctx->hsu; - - hsu->ctrl = HSU_CTRL_INTR_DISABLED; - - /* Drain FIFOs */ - while (hsu->level != 0) { - hsu->fifo; - } - - return true; -} - -static void lpc32xx_hsu_interrupt_handler(void *arg) -{ - rtems_termios_tty *tty = arg; - lpc32xx_hsu_context *ctx = rtems_termios_get_device_context(tty); - volatile lpc32xx_hsu *hsu = ctx->hsu; - - /* Iterate until no more interrupts are pending */ - do { - int rv = 0; - int i = 0; - char buf [HSU_FIFO_SIZE]; - - /* Enqueue received characters */ - while (i < HSU_FIFO_SIZE) { - uint32_t in = hsu->fifo; - - if ((in & HSU_RX_EMPTY) == 0) { - if ((in & HSU_RX_BREAK) == 0) { - buf [i] = in & HSU_RX_DATA_MASK; - ++i; - } - } else { - break; - } - } - rtems_termios_enqueue_raw_characters(tty, buf, i); - - /* Dequeue transmitted characters */ - rv = rtems_termios_dequeue_characters(tty, (int) ctx->chars_in_transmission); - if (rv == 0) { - /* Nothing to transmit */ - } - } while ((hsu->iir & HSU_IIR_MASK) != 0); -} - -static bool lpc32xx_hsu_first_open( - struct rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - lpc32xx_hsu_context *ctx = (lpc32xx_hsu_context *) base; - volatile lpc32xx_hsu *hsu = ctx->hsu; - rtems_status_code sc; - bool ok; - - sc = rtems_interrupt_handler_install( - ctx->irq, - "HSU", - RTEMS_INTERRUPT_UNIQUE, - lpc32xx_hsu_interrupt_handler, - tty - ); - ok = sc == RTEMS_SUCCESSFUL; - - if (ok) { - rtems_termios_set_initial_baud(tty, ctx->initial_baud); - hsu->ctrl = HSU_CTRL_RX_INTR_ENABLED; - } - - return ok; -} - -static void lpc32xx_hsu_last_close( - struct rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ - lpc32xx_hsu_context *ctx = (lpc32xx_hsu_context *) base; - volatile lpc32xx_hsu *hsu = ctx->hsu; - - hsu->ctrl = HSU_CTRL_INTR_DISABLED; - - rtems_interrupt_handler_remove( - ctx->irq, - lpc32xx_hsu_interrupt_handler, - tty - ); -} - -static void lpc32xx_hsu_write( - rtems_termios_device_context *base, - const char *buf, - size_t len -) -{ - lpc32xx_hsu_context *ctx = (lpc32xx_hsu_context *) base; - volatile lpc32xx_hsu *hsu = ctx->hsu; - size_t tx_level = (hsu->level & HSU_LEVEL_TX_MASK) >> HSU_LEVEL_TX_SHIFT; - size_t tx_free = HSU_FIFO_SIZE - tx_level; - size_t i = 0; - size_t out = len > tx_free ? tx_free : len; - - for (i = 0; i < out; ++i) { - hsu->fifo = buf [i]; - } - - ctx->chars_in_transmission = out; - - if (len > 0) { - hsu->ctrl = HSU_CTRL_RX_AND_TX_INTR_ENABLED; - } else { - hsu->ctrl = HSU_CTRL_RX_INTR_ENABLED; - hsu->iir = HSU_IIR_TX; - } -} - -static bool lpc32xx_hsu_set_attributes( - rtems_termios_device_context *base, - const struct termios *term -) -{ - lpc32xx_hsu_context *ctx = (lpc32xx_hsu_context *) base; - volatile lpc32xx_hsu *hsu = ctx->hsu; - int baud_flags = term->c_ospeed; - - if (baud_flags != 0) { - int32_t baud = rtems_termios_baud_to_number(baud_flags); - - if (baud > 0) { - uint32_t baud_divisor = 14 * (uint32_t) baud; - uint32_t rate = LPC32XX_PERIPH_CLK / baud_divisor; - uint32_t remainder = LPC32XX_PERIPH_CLK - rate * baud_divisor; - - if (2 * remainder >= baud_divisor) { - ++rate; - } - - hsu->rate = rate - 1; - } - } - - return true; -} - -const rtems_termios_device_handler lpc32xx_hsu_fns = { - .first_open = lpc32xx_hsu_first_open, - .last_close = lpc32xx_hsu_last_close, - .write = lpc32xx_hsu_write, - .set_attributes = lpc32xx_hsu_set_attributes, - .mode = TERMIOS_IRQ_DRIVEN -}; diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am index 58cfe1f237..106c0b43f9 100644 --- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am +++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am @@ -16,7 +16,7 @@ dist_project_lib_DATA = startup/bsp_specs # Header # ############################################################################### -noinst_HEADERS = console/font_data.h +noinst_HEADERS = ../../../../../../bsps/arm/raspberrypi/console/font_data.h ############################################################################### # Data # @@ -68,12 +68,12 @@ librtemsbsp_a_SOURCES += irq/irq.c # Console librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c -librtemsbsp_a_SOURCES += console/console-config.c -librtemsbsp_a_SOURCES += console/console_select.c -librtemsbsp_a_SOURCES += console/usart.c -librtemsbsp_a_SOURCES += console/fb.c -librtemsbsp_a_SOURCES += console/fbcons.c -librtemsbsp_a_SOURCES += console/outch.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/console_select.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/usart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/fb.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/fbcons.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/raspberrypi/console/outch.c # Mailbox librtemsbsp_a_SOURCES += misc/mailbox.c diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c b/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c deleted file mode 100644 index d2186c918b..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi_usart - * - * @brief Console Configuration. - */ - -/* - * Copyright (c) 2015 Yang Qiao - * based on work by: - * Copyright (c) 2013 Alan Cudmore - * - * 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 - * - */ - -#include <rtems/bspIo.h> - -#include <libchip/serial.h> - -#include <bspopts.h> -#include <bsp/irq.h> -#include <bsp/usart.h> -#include <bsp/raspberrypi.h> -#include <bsp/fbcons.h> - -console_tbl Console_Configuration_Ports [] = { - { - .sDeviceName = "/dev/ttyS0", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &bcm2835_usart_fns, - .deviceProbe = NULL, - .pDeviceFlow = NULL, - .ulCtrlPort1 = BCM2835_UART0_BASE, - .ulCtrlPort2 = 0, - .ulClock = USART0_DEFAULT_BAUD, - .ulIntVector = BCM2835_IRQ_ID_UART - }, - { - .sDeviceName ="/dev/fbcons", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &fbcons_fns, - .deviceProbe = fbcons_probe, - .pDeviceFlow = NULL, - }, -}; - -#define PORT_COUNT \ - (sizeof(Console_Configuration_Ports) \ - / sizeof(Console_Configuration_Ports [0])) - -unsigned long Console_Configuration_Count = PORT_COUNT; - -static void output_char(char c) -{ - const console_fns *con = - Console_Configuration_Ports [Console_Port_Minor].pDeviceFns; - - con->deviceWritePolled((int) Console_Port_Minor, c); -} - -BSP_output_char_function_type BSP_output_char = output_char; - -BSP_polling_getchar_function_type BSP_poll_char = NULL; diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c b/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c deleted file mode 100644 index 42c4944ebe..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi_console - * - * @brief console select - */ - -/* - * Copyright (c) 2015 Yang Qiao - * - * 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 - * - */ - -#include <bsp.h> -#include <bsp/fatal.h> -#include <rtems/libio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <termios.h> - -#include <rtems/termiostypes.h> -#include <libchip/serial.h> -#include "../../../../../../../bsps/shared/dev/serial/legacy-console.h" -#include <bsp/rpi-fb.h> - -rtems_device_minor_number BSPPrintkPort = 0; - -/* - * Method to return true if the device associated with the - * minor number probs available. - */ -static bool bsp_Is_Available( rtems_device_minor_number minor ) -{ - console_tbl *cptr = Console_Port_Tbl[ minor ]; - - /* - * First perform the configuration dependent probe, then the - * device dependent probe - */ - if ( ( !cptr->deviceProbe || cptr->deviceProbe( minor ) ) && - cptr->pDeviceFns->deviceProbe( minor ) ) { - return true; - } - - return false; -} - -/* - * Method to return the first available device. - */ -static rtems_device_minor_number bsp_First_Available_Device( void ) -{ - rtems_device_minor_number minor; - - for ( minor = 0; minor < Console_Port_Count; minor++ ) { - console_tbl *cptr = Console_Port_Tbl[ minor ]; - - /* - * First perform the configuration dependent probe, then the - * device dependent probe - */ - - if ( ( !cptr->deviceProbe || cptr->deviceProbe( minor ) ) && - cptr->pDeviceFns->deviceProbe( minor ) ) { - return minor; - } - } - - /* - * Error No devices were found. We will want to bail here. - */ - bsp_fatal( BSP_FATAL_CONSOLE_NO_DEV ); -} - -void bsp_console_select( void ) -{ - /* - * Reset Console_Port_Minor and - * BSPPrintkPort here if desired. - * - * This default version allows the bsp to set these - * values at creation and will not touch them again - * unless the selected port number is not available. - */ - const char *opt; - - Console_Port_Minor = BSP_CONSOLE_UART0; - BSPPrintkPort = BSP_CONSOLE_UART0; - - opt = rpi_cmdline_get_arg( "--console=" ); - - if ( opt ) { - if ( strncmp( opt, "fbcons", sizeof( "fbcons" ) - 1 ) == 0 ) { - if ( rpi_video_is_initialized() > 0 ) { - Console_Port_Minor = BSP_CONSOLE_FB; - BSPPrintkPort = BSP_CONSOLE_FB; - } - } - } - - /* - * If the device that was selected isn't available then - * let the user know and select the first available device. - */ - if ( !bsp_Is_Available( Console_Port_Minor ) ) { - Console_Port_Minor = bsp_First_Available_Device(); - } -} diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/fb.c b/c/src/lib/libbsp/arm/raspberrypi/console/fb.c deleted file mode 100644 index 815d17e8ca..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/fb.c +++ /dev/null @@ -1,437 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi - * - * @brief framebuffer support. - */ - -/* - * Copyright (c) 2015 Yang Qiao - * - * 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 - * - */ - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <errno.h> -#include <sys/types.h> - -#include <bsp.h> -#include <bsp/raspberrypi.h> -#include <bsp/mailbox.h> -#include <bsp/vc.h> -#include <bsp/rpi-fb.h> - -#include <libcpu/arm-cp15.h> - -#include <rtems.h> -#include <rtems/libio.h> -#include <rtems/fb.h> -#include <rtems/framebuffer.h> -#include <rtems/score/atomic.h> -#include <rtems/bspIo.h> - -#define SCREEN_WIDTH 1024 -#define SCREEN_HEIGHT 768 -#define BPP 32 - -/* flag to limit driver to protect against multiple opens */ -static Atomic_Flag driver_mutex; - -/* - * screen information for the driver (fb0). - */ - -static struct fb_var_screeninfo fb_var_info = { - .xres = SCREEN_WIDTH, - .yres = SCREEN_HEIGHT, - .bits_per_pixel = BPP -}; - -static struct fb_fix_screeninfo fb_fix_info = { - .smem_start = (void *) NULL, - .smem_len = 0, - .type = FB_TYPE_PACKED_PIXELS, - .visual = FB_VISUAL_TRUECOLOR, - .line_length = 0 -}; - -typedef enum { - NO_SUITABLE_MODE = -1, - BAD_FORMAT = -2, - AUTO_SELECT = -3, - DONT_INIT = -4, - NO_MODE_REQ = -5, -} mode_err_ret_val; - -int rpi_get_fix_screen_info( struct fb_fix_screeninfo *info ) -{ - *info = fb_fix_info; - return 0; -} - -int rpi_get_var_screen_info( struct fb_var_screeninfo *info ) -{ - *info = fb_var_info; - return 0; -} - -/** - * @brief Find mode given in string format. - * - * expected format - * <resX>x<resY>[-<bpp>] - * numbers <resX>, <resY> and <bpp> are decadic - * - * @param[out] fb_var_ptr pointer to variable mode part filled by function - * @param[in] video_string string to be parsed - * @retval video mode number to be set - * @retval -1 no suitable mode found - * @retval -2 bad format of the video_string - * @retval -3 automatic mode selection requested - * @retval -4 request to not initialize graphics - * @retval -5 no mode requested/empty video string - */ - -static int parse_mode_from_string( - struct fb_var_screeninfo *fb_var_ptr, - const char *video_string -) -{ - const char *opt; - char *endptr; - uint32_t width; - uint32_t height; - uint32_t bpp = 0; - - opt = video_string; - - if ( opt == NULL ) - return NO_MODE_REQ; - - if ( strncmp( opt, "auto", 4 ) == 0 ) - return AUTO_SELECT; - - if ( strncmp( opt, "none", 4 ) == 0 || - strncmp( opt, "off", 3 ) == 0 ) - return DONT_INIT; - - width = strtol( opt, &endptr, 10 ); - - if ( *endptr != 'x' ) { - return BAD_FORMAT; - } - - opt = endptr + 1; - height = strtol( opt, &endptr, 10 ); - - switch ( *endptr ) { - case '-': - opt = endptr + 1; - endptr = NULL; - bpp = strtol( opt, &endptr, 10 ); - - if ( ( endptr == opt ) || ( endptr == NULL ) ) - return BAD_FORMAT; - - if ( *endptr && ( *endptr != ' ' ) ) - return BAD_FORMAT; - - break; - case ' ': - case 0: - break; - default: - return BAD_FORMAT; - } - - fb_var_ptr->xres = width; - fb_var_ptr->yres = height; - - if ( bpp != 0 ) - fb_var_ptr->bits_per_pixel = bpp; - - return 0; -} - -static int find_mode_from_vc( void ) -{ - int res; - unsigned int width; - unsigned int height; - bcm2835_get_display_size_entries entries; - - res = bcm2835_mailbox_get_display_size( &entries ); - - width = entries.width; - height = entries.height; - - if ( width == 0 || height == 0 ) { - fb_var_info.xres = SCREEN_WIDTH; - fb_var_info.yres = SCREEN_HEIGHT; - } else { - fb_var_info.xres = width; - fb_var_info.yres = height; - } - printk("find_mode_from_vc %u x %u, res %d\n", width, height, res); - - return res; -} - -bool rpi_fb_hdmi_is_present( void ) -{ - bcm2835_get_display_size_entries entries; - - memset( &entries, 0, sizeof( entries ) ); - bcm2835_mailbox_get_display_size( &entries ); - - /* Impossible display dimension */ - if ( ( entries.width < 10 ) || ( entries.height < 10 ) ) - return false; - - /* Know default values reported when monitor is not present */ - if ( ( entries.width == 0x290 ) && ( entries.height == 0x1A0 ) ) - return false; - - return true; -} - -int rpi_fb_init( void ) -{ - int res; - int mode_from_cmdline; - bcm2835_init_frame_buffer_entries init_frame_buffer_entries; - - if ( fb_fix_info.smem_start != NULL ) { - return RPI_FB_INIT_ALREADY_INITIALIZED; - } - - if ( rpi_fb_hdmi_is_present() == false ) { - return RPI_FB_INIT_NO_DISPLAY; - } - - mode_from_cmdline = parse_mode_from_string( &fb_var_info, - rpi_cmdline_get_arg( "--video=" ) ); - - switch ( mode_from_cmdline ) { - case BAD_FORMAT: - return RPI_FB_INIT_CMDLINE_BAD_FORMAT; - case AUTO_SELECT: - break; - case DONT_INIT: - return RPI_FB_INIT_CMDLINE_DONT_INIT; - case NO_MODE_REQ: - return RPI_FB_INIT_CMDLINE_NO_MODE_REQ; - } - - if ( mode_from_cmdline ) { - if ( find_mode_from_vc() ) - return RPI_FB_INIT_MODE_PROBE_ERROR; - } - - memset( &init_frame_buffer_entries, 0, sizeof( init_frame_buffer_entries ) ); - init_frame_buffer_entries.xres = fb_var_info.xres; - init_frame_buffer_entries.yres = fb_var_info.yres; - init_frame_buffer_entries.xvirt = fb_var_info.xres; - init_frame_buffer_entries.yvirt = fb_var_info.yres; - init_frame_buffer_entries.depth = fb_var_info.bits_per_pixel; - init_frame_buffer_entries.pixel_order = bcm2835_mailbox_pixel_order_rgb; - init_frame_buffer_entries.alpha_mode = bcm2835_mailbox_alpha_mode_0_opaque; - init_frame_buffer_entries.voffset_x = 0; - init_frame_buffer_entries.voffset_y = 0; - init_frame_buffer_entries.overscan_left = 0; - init_frame_buffer_entries.overscan_right = 0; - init_frame_buffer_entries.overscan_top = 0; - init_frame_buffer_entries.overscan_bottom = 0; - printk("bcm2835_mailbox_init_frame_buffer ...\n"); - res = bcm2835_mailbox_init_frame_buffer( &init_frame_buffer_entries ); - printk("bcm2835_mailbox_init_frame_buffer returned %d\n", res); - if (res != 0) { - printk("bcm2835_mailbox_init_frame_buffer retry ...\n"); - res = bcm2835_mailbox_init_frame_buffer( &init_frame_buffer_entries ); - printk("bcm2835_mailbox_init_frame_buffer returned %d\n", res); - if (res != 0) - return RPI_FB_INIT_SETUP_FAILED; - } - - bcm2835_get_pitch_entries get_pitch_entries; - bcm2835_mailbox_get_pitch( &get_pitch_entries ); - - fb_var_info.xres = init_frame_buffer_entries.xres; - fb_var_info.yres = init_frame_buffer_entries.yres; - fb_var_info.bits_per_pixel = init_frame_buffer_entries.depth; - fb_fix_info.smem_start = (void *) init_frame_buffer_entries.base; - fb_fix_info.smem_len = init_frame_buffer_entries.size; - fb_fix_info.line_length = get_pitch_entries.pitch; - - if ( fb_fix_info.smem_start == NULL ) - return RPI_FB_INIT_START_ADDR_UNKNOWN; - - printk("fb_fix_info.smem_start %p\n", fb_fix_info.smem_start); - - arm_cp15_set_translation_table_entries( (void *) fb_fix_info.smem_start, - (void *) fb_fix_info.smem_start + - fb_fix_info.smem_len, - ARMV7_MMU_DATA_READ_WRITE_CACHED ); - - return RPI_FB_INIT_OK; -} - -/* - * fbds device driver initialize entry point. - */ - -rtems_device_driver frame_buffer_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code status; - - /* register the devices */ - status = rtems_io_register_name( FRAMEBUFFER_DEVICE_0_NAME, major, 0 ); - - if ( status != RTEMS_SUCCESSFUL ) { - printk( "[!] error registering framebuffer\n" ); - rtems_fatal_error_occurred( status ); - } - - _Atomic_Flag_clear( &driver_mutex, ATOMIC_ORDER_RELEASE ); - return RTEMS_SUCCESSFUL; -} - -/* - * fbds device driver open operation. - */ - -rtems_device_driver frame_buffer_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - if ( _Atomic_Flag_test_and_set( &driver_mutex, - ATOMIC_ORDER_ACQUIRE ) != 0 ) { - printk( "RaspberryPi framebuffer could not lock driver_mutex\n" ); - return RTEMS_UNSATISFIED; - } - - if ( fb_fix_info.smem_start == NULL ) { - int res; - res = rpi_fb_init(); - if ( (res < RPI_FB_INIT_OK) || (fb_fix_info.smem_start == NULL) ) { - _Atomic_Flag_clear( &driver_mutex, ATOMIC_ORDER_RELEASE ); - printk( "RaspberryPi framebuffer initialization failed\n" ); - return RTEMS_UNSATISFIED; - } - } - - memset( (void *) fb_fix_info.smem_start, 0, fb_fix_info.smem_len ); - return RTEMS_SUCCESSFUL; -} - -/* - * fbds device driver close operation. - */ - -rtems_device_driver frame_buffer_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - /* restore previous state. for VGA this means return to text mode. - * leave out if graphics hardware has been initialized in - * frame_buffer_initialize() */ - memset( (void *) fb_fix_info.smem_start, 0, fb_fix_info.smem_len ); - _Atomic_Flag_clear( &driver_mutex, ATOMIC_ORDER_RELEASE ); - return RTEMS_SUCCESSFUL; -} - -/* - * fbds device driver read operation. - */ - -rtems_device_driver frame_buffer_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; - - rw_args->bytes_moved = - ( ( rw_args->offset + rw_args->count ) > fb_fix_info.smem_len ) ? - ( fb_fix_info.smem_len - rw_args->offset ) : rw_args->count; - memcpy( rw_args->buffer, - (const void *) ( fb_fix_info.smem_start + rw_args->offset ), - rw_args->bytes_moved ); - return RTEMS_SUCCESSFUL; -} - -/* - * fbds device driver write operation. - */ - -rtems_device_driver frame_buffer_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; - - rw_args->bytes_moved = - ( ( rw_args->offset + rw_args->count ) > fb_fix_info.smem_len ) ? - ( fb_fix_info.smem_len - rw_args->offset ) : rw_args->count; - memcpy( (void *) ( fb_fix_info.smem_start + rw_args->offset ), - rw_args->buffer, - rw_args->bytes_moved ); - return RTEMS_SUCCESSFUL; -} - -/* - * ioctl entry point. - */ - -rtems_device_driver frame_buffer_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_libio_ioctl_args_t *args = arg; - - /* XXX check minor */ - - switch ( args->command ) { - case FBIOGET_VSCREENINFO: - memcpy( args->buffer, &fb_var_info, sizeof( fb_var_info ) ); - args->ioctl_return = 0; - break; - case FBIOGET_FSCREENINFO: - memcpy( args->buffer, &fb_fix_info, sizeof( fb_fix_info ) ); - args->ioctl_return = 0; - break; - case FBIOGETCMAP: - /* no palette - truecolor mode */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - case FBIOPUTCMAP: - /* no palette - truecolor mode */ - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - default: - args->ioctl_return = -1; - return RTEMS_UNSATISFIED; - } - - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c b/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c deleted file mode 100644 index 3669ba458d..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/fbcons.c +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi_console - * - * @brief framebuffer graphic console support. - */ - -/* - * Copyright (c) 2015 Yang Qiao - * - * 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 - * - */ - -#include <rtems.h> -#include <rtems/libio.h> - -#include <stdlib.h> - -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -#include <bsp.h> -#include <bsp/fbcons.h> -#include <bsp/vc.h> -#include <bsp/rpi-fb.h> - -/* - * fbcons_init - * - * This function initializes the fb console to a quiecsent state. - */ -static void fbcons_init( int minor ) -{ -} - -/* - * fbcons_open - * - * This function opens a port for communication. - * - * Default state is 9600 baud, 8 bits, No parity, and 1 stop bit. - */ -static int fbcons_open( - int major, - int minor, - void *arg -) -{ - return RTEMS_SUCCESSFUL; -} - -/* - * fbcons_close - * - * This function shuts down the requested port. - */ -static int fbcons_close( - int major, - int minor, - void *arg -) -{ - return ( RTEMS_SUCCESSFUL ); -} - -/* - * fbcons_write_polled - * - * This routine polls out the requested character. - */ -static void fbcons_write_polled( - int minor, - char c -) -{ - rpi_fb_outch( c ); - - if ( c == '\n' ) - rpi_fb_outch( '\r' ); /* LF = LF + CR */ -} - -/* - * fbcons_write_support_polled - * - * Console Termios output entry point when using polled output. - * - */ -static ssize_t fbcons_write_support_polled( - int minor, - const char *buf, - size_t len -) -{ - int nwrite = 0; - - /* - * poll each byte in the string out of the port. - */ - while ( nwrite < len ) { - fbcons_write_polled( minor, *buf++ ); - nwrite++; - } - - /* - * return the number of bytes written. - */ - return nwrite; -} - -/* - * fbcons_inbyte_nonblocking_polled - * - * Console Termios polling input entry point. - */ -static int fbcons_inbyte_nonblocking_polled( int minor ) -{ - // if( rtems_kbpoll() ) { - // int c = getch(); - // return c; - // } - - return -1; -} - -/* - * fbcons_set_attributes - * - * This function sets the UART channel to reflect the requested termios - * port settings. - */ -static int fbcons_set_attributes( - int minor, - const struct termios *t -) -{ - return 0; -} - -bool fbcons_probe( int minor ) -{ - // rtems_status_code status; - static bool firstTime = true; - static bool ret = false; - - /* - * keyboard interrupt should be registered when the keyboard is available - */ - if ( firstTime ) { - if ( !rpi_fb_hdmi_is_present() ) { - ret = false; - } else { - ret = true; - } - } - - firstTime = false; - - return ret; -} - -const console_fns fbcons_fns = -{ - .deviceProbe = libchip_serial_default_probe, /* deviceProbe */ - .deviceFirstOpen = fbcons_open, /* deviceFirstOpen */ - .deviceLastClose = fbcons_close, /* deviceLastClose */ - .deviceRead = fbcons_inbyte_nonblocking_polled, /* deviceRead */ - .deviceWrite = fbcons_write_support_polled, /* deviceWrite */ - .deviceInitialize = fbcons_init, /* deviceInitialize */ - .deviceWritePolled = fbcons_write_polled, /* deviceWritePolled */ - .deviceSetAttributes = fbcons_set_attributes, /* deviceSetAttributes */ - .deviceOutputUsesInterrupts = FALSE, /* deviceOutputUsesInterrupts*/ -}; diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/font_data.h b/c/src/lib/libbsp/arm/raspberrypi/console/font_data.h deleted file mode 100644 index 852310cbf9..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/font_data.h +++ /dev/null @@ -1,4639 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi - * - * @brief graphic text console font file - * - */ -/* - * Copyright (c) 2015 Yang Qiao - * - * 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 - * - */ - -#ifndef LIBBSP_ARM_RASPBERRYPI_FONT_DATA_H -#define LIBBSP_ARM_RASPBERRYPI_FONT_DATA_H - -#define RPI_FONT_CHARS 256 -#define RPI_FONT_WIDTH 8 -#define RPI_FONT_HEIGHT 16 -#define RPI_FONT_SIZE (RPI_FONT_CHARS * RPI_FONT_HEIGHT) - -static unsigned char rpi_font[RPI_FONT_SIZE] = { - - /* 0 0x00 '^@' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 1 0x01 '^A' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x81, /* 10000001 */ - 0xa5, /* 10100101 */ - 0x81, /* 10000001 */ - 0x81, /* 10000001 */ - 0xbd, /* 10111101 */ - 0x99, /* 10011001 */ - 0x81, /* 10000001 */ - 0x81, /* 10000001 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 2 0x02 '^B' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xff, /* 11111111 */ - 0xdb, /* 11011011 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xc3, /* 11000011 */ - 0xe7, /* 11100111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 3 0x03 '^C' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 4 0x04 '^D' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x7c, /* 01111100 */ - 0xfe, /* 11111110 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 5 0x05 '^E' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0xe7, /* 11100111 */ - 0xe7, /* 11100111 */ - 0xe7, /* 11100111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 6 0x06 '^F' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 7 0x07 '^G' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 8 0x08 '^H' */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xe7, /* 11100111 */ - 0xc3, /* 11000011 */ - 0xc3, /* 11000011 */ - 0xe7, /* 11100111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 9 0x09 '^I' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x42, /* 01000010 */ - 0x42, /* 01000010 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 10 0x0a '^J' */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xc3, /* 11000011 */ - 0x99, /* 10011001 */ - 0xbd, /* 10111101 */ - 0xbd, /* 10111101 */ - 0x99, /* 10011001 */ - 0xc3, /* 11000011 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 11 0x0b '^K' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1e, /* 00011110 */ - 0x0e, /* 00001110 */ - 0x1a, /* 00011010 */ - 0x32, /* 00110010 */ - 0x78, /* 01111000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x78, /* 01111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 12 0x0c '^L' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 13 0x0d '^M' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3f, /* 00111111 */ - 0x33, /* 00110011 */ - 0x3f, /* 00111111 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x70, /* 01110000 */ - 0xf0, /* 11110000 */ - 0xe0, /* 11100000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 14 0x0e '^N' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7f, /* 01111111 */ - 0x63, /* 01100011 */ - 0x7f, /* 01111111 */ - 0x63, /* 01100011 */ - 0x63, /* 01100011 */ - 0x63, /* 01100011 */ - 0x63, /* 01100011 */ - 0x67, /* 01100111 */ - 0xe7, /* 11100111 */ - 0xe6, /* 11100110 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 15 0x0f '^O' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xdb, /* 11011011 */ - 0x3c, /* 00111100 */ - 0xe7, /* 11100111 */ - 0x3c, /* 00111100 */ - 0xdb, /* 11011011 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 16 0x10 '^P' */ - 0x00, /* 00000000 */ - 0x80, /* 10000000 */ - 0xc0, /* 11000000 */ - 0xe0, /* 11100000 */ - 0xf0, /* 11110000 */ - 0xf8, /* 11111000 */ - 0xfe, /* 11111110 */ - 0xf8, /* 11111000 */ - 0xf0, /* 11110000 */ - 0xe0, /* 11100000 */ - 0xc0, /* 11000000 */ - 0x80, /* 10000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 17 0x11 '^Q' */ - 0x00, /* 00000000 */ - 0x02, /* 00000010 */ - 0x06, /* 00000110 */ - 0x0e, /* 00001110 */ - 0x1e, /* 00011110 */ - 0x3e, /* 00111110 */ - 0xfe, /* 11111110 */ - 0x3e, /* 00111110 */ - 0x1e, /* 00011110 */ - 0x0e, /* 00001110 */ - 0x06, /* 00000110 */ - 0x02, /* 00000010 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 18 0x12 '^R' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 19 0x13 '^S' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 20 0x14 '^T' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7f, /* 01111111 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0x7b, /* 01111011 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 21 0x15 '^U' */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x60, /* 01100000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x0c, /* 00001100 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 22 0x16 '^V' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 23 0x17 '^W' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 24 0x18 '^X' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 25 0x19 '^Y' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 26 0x1a '^Z' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0xfe, /* 11111110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 27 0x1b '^[' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xfe, /* 11111110 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 28 0x1c '^\' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 29 0x1d '^]' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x28, /* 00101000 */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x28, /* 00101000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 30 0x1e '^^' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x38, /* 00111000 */ - 0x7c, /* 01111100 */ - 0x7c, /* 01111100 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 31 0x1f '^_' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0x7c, /* 01111100 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 32 0x20 ' ' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 33 0x21 '!' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 34 0x22 '"' */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x24, /* 00100100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 35 0x23 '#' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 36 0x24 '$' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc2, /* 11000010 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x86, /* 10000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 37 0x25 '%' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc2, /* 11000010 */ - 0xc6, /* 11000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc6, /* 11000110 */ - 0x86, /* 10000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 38 0x26 '&' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 39 0x27 ''' */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 40 0x28 '(' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 41 0x29 ')' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 42 0x2a '*' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0xff, /* 11111111 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 43 0x2b '+' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 44 0x2c ',' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 45 0x2d '-' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 46 0x2e '.' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 47 0x2f '/' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x02, /* 00000010 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0x80, /* 10000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 48 0x30 '0' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 49 0x31 '1' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x38, /* 00111000 */ - 0x78, /* 01111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 50 0x32 '2' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 51 0x33 '3' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x3c, /* 00111100 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 52 0x34 '4' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x0c, /* 00001100 */ - 0x1c, /* 00011100 */ - 0x3c, /* 00111100 */ - 0x6c, /* 01101100 */ - 0xcc, /* 11001100 */ - 0xfe, /* 11111110 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x1e, /* 00011110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 53 0x35 '5' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfc, /* 11111100 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 54 0x36 '6' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 55 0x37 '7' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 56 0x38 '8' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 57 0x39 '9' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x78, /* 01111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 58 0x3a ':' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 59 0x3b ';' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 60 0x3c '<' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x06, /* 00000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 61 0x3d '=' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 62 0x3e '>' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 63 0x3f '?' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 64 0x40 '@' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xde, /* 11011110 */ - 0xde, /* 11011110 */ - 0xde, /* 11011110 */ - 0xdc, /* 11011100 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 65 0x41 'A' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 66 0x42 'B' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfc, /* 11111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 67 0x43 'C' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0xc2, /* 11000010 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc2, /* 11000010 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 68 0x44 'D' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xf8, /* 11111000 */ - 0x6c, /* 01101100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x6c, /* 01101100 */ - 0xf8, /* 11111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 69 0x45 'E' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x66, /* 01100110 */ - 0x62, /* 01100010 */ - 0x68, /* 01101000 */ - 0x78, /* 01111000 */ - 0x68, /* 01101000 */ - 0x60, /* 01100000 */ - 0x62, /* 01100010 */ - 0x66, /* 01100110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 70 0x46 'F' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x66, /* 01100110 */ - 0x62, /* 01100010 */ - 0x68, /* 01101000 */ - 0x78, /* 01111000 */ - 0x68, /* 01101000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0xf0, /* 11110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 71 0x47 'G' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0xc2, /* 11000010 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xde, /* 11011110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x66, /* 01100110 */ - 0x3a, /* 00111010 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 72 0x48 'H' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 73 0x49 'I' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 74 0x4a 'J' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1e, /* 00011110 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x78, /* 01111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 75 0x4b 'K' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xe6, /* 11100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x6c, /* 01101100 */ - 0x78, /* 01111000 */ - 0x78, /* 01111000 */ - 0x6c, /* 01101100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0xe6, /* 11100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 76 0x4c 'L' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xf0, /* 11110000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x62, /* 01100010 */ - 0x66, /* 01100110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 77 0x4d 'M' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xee, /* 11101110 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xd6, /* 11010110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 78 0x4e 'N' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xe6, /* 11100110 */ - 0xf6, /* 11110110 */ - 0xfe, /* 11111110 */ - 0xde, /* 11011110 */ - 0xce, /* 11001110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 79 0x4f 'O' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 80 0x50 'P' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfc, /* 11111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0xf0, /* 11110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 81 0x51 'Q' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xd6, /* 11010110 */ - 0xde, /* 11011110 */ - 0x7c, /* 01111100 */ - 0x0c, /* 00001100 */ - 0x0e, /* 00001110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 82 0x52 'R' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfc, /* 11111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0x6c, /* 01101100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0xe6, /* 11100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 83 0x53 'S' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x60, /* 01100000 */ - 0x38, /* 00111000 */ - 0x0c, /* 00001100 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 84 0x54 'T' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x5a, /* 01011010 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 85 0x55 'U' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 86 0x56 'V' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 87 0x57 'W' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xfe, /* 11111110 */ - 0xee, /* 11101110 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 88 0x58 'X' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0x38, /* 00111000 */ - 0x7c, /* 01111100 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 89 0x59 'Y' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 90 0x5a 'Z' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0x86, /* 10000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc2, /* 11000010 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 91 0x5b '[' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 92 0x5c '\' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x80, /* 10000000 */ - 0xc0, /* 11000000 */ - 0xe0, /* 11100000 */ - 0x70, /* 01110000 */ - 0x38, /* 00111000 */ - 0x1c, /* 00011100 */ - 0x0e, /* 00001110 */ - 0x06, /* 00000110 */ - 0x02, /* 00000010 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 93 0x5d ']' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 94 0x5e '^' */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 95 0x5f '_' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 96 0x60 '`' */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 97 0x61 'a' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 98 0x62 'b' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xe0, /* 11100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x78, /* 01111000 */ - 0x6c, /* 01101100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 99 0x63 'c' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 100 0x64 'd' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1c, /* 00011100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x3c, /* 00111100 */ - 0x6c, /* 01101100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 101 0x65 'e' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 102 0x66 'f' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1c, /* 00011100 */ - 0x36, /* 00110110 */ - 0x32, /* 00110010 */ - 0x30, /* 00110000 */ - 0x78, /* 01111000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x78, /* 01111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 103 0x67 'g' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x7c, /* 01111100 */ - 0x0c, /* 00001100 */ - 0xcc, /* 11001100 */ - 0x78, /* 01111000 */ - 0x00, /* 00000000 */ - - /* 104 0x68 'h' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xe0, /* 11100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x6c, /* 01101100 */ - 0x76, /* 01110110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0xe6, /* 11100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 105 0x69 'i' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 106 0x6a 'j' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x00, /* 00000000 */ - 0x0e, /* 00001110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 107 0x6b 'k' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xe0, /* 11100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x66, /* 01100110 */ - 0x6c, /* 01101100 */ - 0x78, /* 01111000 */ - 0x78, /* 01111000 */ - 0x6c, /* 01101100 */ - 0x66, /* 01100110 */ - 0xe6, /* 11100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 108 0x6c 'l' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 109 0x6d 'm' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xec, /* 11101100 */ - 0xfe, /* 11111110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 110 0x6e 'n' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xdc, /* 11011100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 111 0x6f 'o' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 112 0x70 'p' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xdc, /* 11011100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0xf0, /* 11110000 */ - 0x00, /* 00000000 */ - - /* 113 0x71 'q' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x7c, /* 01111100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x1e, /* 00011110 */ - 0x00, /* 00000000 */ - - /* 114 0x72 'r' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xdc, /* 11011100 */ - 0x76, /* 01110110 */ - 0x66, /* 01100110 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0xf0, /* 11110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 115 0x73 's' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x60, /* 01100000 */ - 0x38, /* 00111000 */ - 0x0c, /* 00001100 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 116 0x74 't' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0xfc, /* 11111100 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x36, /* 00110110 */ - 0x1c, /* 00011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 117 0x75 'u' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 118 0x76 'v' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 119 0x77 'w' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xd6, /* 11010110 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 120 0x78 'x' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x38, /* 00111000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 121 0x79 'y' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0xf8, /* 11111000 */ - 0x00, /* 00000000 */ - - /* 122 0x7a 'z' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xcc, /* 11001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 123 0x7b '{' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x0e, /* 00001110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x70, /* 01110000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x0e, /* 00001110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 124 0x7c '|' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 125 0x7d '}' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x70, /* 01110000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x0e, /* 00001110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 126 0x7e '~' */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 127 0x7f */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 128 0x80 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0xc2, /* 11000010 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc2, /* 11000010 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 129 0x81 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 130 0x82 */ - 0x00, /* 00000000 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 131 0x83 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 132 0x84 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 133 0x85 */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 134 0x86 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 135 0x87 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x18, /* 00011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 136 0x88 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 137 0x89 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 138 0x8a */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 139 0x8b */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 140 0x8c */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 141 0x8d */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 142 0x8e */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 143 0x8f */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 144 0x90 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x66, /* 01100110 */ - 0x62, /* 01100010 */ - 0x68, /* 01101000 */ - 0x78, /* 01111000 */ - 0x68, /* 01101000 */ - 0x62, /* 01100010 */ - 0x66, /* 01100110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 145 0x91 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xec, /* 11101100 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x7e, /* 01111110 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0x6e, /* 01101110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 146 0x92 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3e, /* 00111110 */ - 0x6c, /* 01101100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xfe, /* 11111110 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xce, /* 11001110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 147 0x93 */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 148 0x94 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 149 0x95 */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 150 0x96 */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x78, /* 01111000 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 151 0x97 */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 152 0x98 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x78, /* 01111000 */ - 0x00, /* 00000000 */ - - /* 153 0x99 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 154 0x9a */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 155 0x9b */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 156 0x9c */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x64, /* 01100100 */ - 0x60, /* 01100000 */ - 0xf0, /* 11110000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0xe6, /* 11100110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 157 0x9d */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 158 0x9e */ - 0x00, /* 00000000 */ - 0xf8, /* 11111000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xf8, /* 11111000 */ - 0xc4, /* 11000100 */ - 0xcc, /* 11001100 */ - 0xde, /* 11011110 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 159 0x9f */ - 0x00, /* 00000000 */ - 0x0e, /* 00001110 */ - 0x1b, /* 00011011 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xd8, /* 11011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 160 0xa0 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 161 0xa1 */ - 0x00, /* 00000000 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 162 0xa2 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 163 0xa3 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 164 0xa4 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0xdc, /* 11011100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 165 0xa5 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xe6, /* 11100110 */ - 0xf6, /* 11110110 */ - 0xfe, /* 11111110 */ - 0xde, /* 11011110 */ - 0xce, /* 11001110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 166 0xa6 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x3e, /* 00111110 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 167 0xa7 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 168 0xa8 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 169 0xa9 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 170 0xaa */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 171 0xab */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0xe0, /* 11100000 */ - 0x62, /* 01100010 */ - 0x66, /* 01100110 */ - 0x6c, /* 01101100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xdc, /* 11011100 */ - 0x86, /* 10000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x3e, /* 00111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 172 0xac */ - 0x00, /* 00000000 */ - 0x60, /* 01100000 */ - 0xe0, /* 11100000 */ - 0x62, /* 01100010 */ - 0x66, /* 01100110 */ - 0x6c, /* 01101100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x66, /* 01100110 */ - 0xce, /* 11001110 */ - 0x9a, /* 10011010 */ - 0x3f, /* 00111111 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 173 0xad */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 174 0xae */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x36, /* 00110110 */ - 0x6c, /* 01101100 */ - 0xd8, /* 11011000 */ - 0x6c, /* 01101100 */ - 0x36, /* 00110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 175 0xaf */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xd8, /* 11011000 */ - 0x6c, /* 01101100 */ - 0x36, /* 00110110 */ - 0x6c, /* 01101100 */ - 0xd8, /* 11011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 176 0xb0 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - 0x11, /* 00010001 */ - 0x44, /* 01000100 */ - - /* 177 0xb1 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - - /* 178 0xb2 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - - /* 179 0xb3 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 180 0xb4 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 181 0xb5 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 182 0xb6 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf6, /* 11110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 183 0xb7 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 184 0xb8 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 185 0xb9 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf6, /* 11110110 */ - 0x06, /* 00000110 */ - 0xf6, /* 11110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 186 0xba */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 187 0xbb */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x06, /* 00000110 */ - 0xf6, /* 11110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 188 0xbc */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf6, /* 11110110 */ - 0x06, /* 00000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 189 0xbd */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 190 0xbe */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 191 0xbf */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 192 0xc0 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 193 0xc1 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 194 0xc2 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 195 0xc3 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 196 0xc4 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 197 0xc5 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 198 0xc6 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 199 0xc7 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x37, /* 00110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 200 0xc8 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x37, /* 00110111 */ - 0x30, /* 00110000 */ - 0x3f, /* 00111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 201 0xc9 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3f, /* 00111111 */ - 0x30, /* 00110000 */ - 0x37, /* 00110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 202 0xca */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf7, /* 11110111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 203 0xcb */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xf7, /* 11110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 204 0xcc */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x37, /* 00110111 */ - 0x30, /* 00110000 */ - 0x37, /* 00110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 205 0xcd */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 206 0xce */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf7, /* 11110111 */ - 0x00, /* 00000000 */ - 0xf7, /* 11110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 207 0xcf */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 208 0xd0 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 209 0xd1 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 210 0xd2 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 211 0xd3 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x3f, /* 00111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 212 0xd4 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 213 0xd5 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 214 0xd6 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3f, /* 00111111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 215 0xd7 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xff, /* 11111111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 216 0xd8 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 217 0xd9 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 218 0xda */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 219 0xdb */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 220 0xdc */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 221 0xdd */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - - /* 222 0xde */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - - /* 223 0xdf */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 224 0xe0 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xdc, /* 11011100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 225 0xe1 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xd8, /* 11011000 */ - 0xcc, /* 11001100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 226 0xe2 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 227 0xe3 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 228 0xe4 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 229 0xe5 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 230 0xe6 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - - /* 231 0xe7 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 232 0xe8 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 233 0xe9 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 234 0xea */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0xee, /* 11101110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 235 0xeb */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1e, /* 00011110 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x3e, /* 00111110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 236 0xec */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 237 0xed */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x03, /* 00000011 */ - 0x06, /* 00000110 */ - 0x7e, /* 01111110 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0xf3, /* 11110011 */ - 0x7e, /* 01111110 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 238 0xee */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1c, /* 00011100 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x7c, /* 01111100 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x1c, /* 00011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 239 0xef */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 240 0xf0 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 241 0xf1 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 242 0xf2 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 243 0xf3 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 244 0xf4 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x0e, /* 00001110 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 245 0xf5 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 246 0xf6 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 247 0xf7 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 248 0xf8 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 249 0xf9 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 250 0xfa */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 251 0xfb */ - 0x00, /* 00000000 */ - 0x0f, /* 00001111 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0xec, /* 11101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x3c, /* 00111100 */ - 0x1c, /* 00011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 252 0xfc */ - 0x00, /* 00000000 */ - 0x6c, /* 01101100 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 253 0xfd */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x32, /* 00110010 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 254 0xfe */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 255 0xff */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - -}; - -#endif diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/outch.c b/c/src/lib/libbsp/arm/raspberrypi/console/outch.c deleted file mode 100644 index 20601384c7..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/outch.c +++ /dev/null @@ -1,463 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi - * - * @brief displaying characters on the console - */ - -/** - * - * Copyright (c) 2015 Yang Qiao - * based on work by: - * Copyright (C) 1998 Eric Valette (valette@crf.canon.fr) - * Canon Centre Recherche France. - * - * 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. - * - * Till Straumann <strauman@slac.stanford.edu>, 2003/9: - * - added handling of basic escape sequences (cursor movement - * and erasing; just enough for the line editor 'libtecla' to - * work...) - * - */ - -#include <bsp.h> -#include <bsp/vc.h> -#include <bsp/rpi-fb.h> -#include <rtems/fb.h> - -#include <stdlib.h> -#include <string.h> -#include "font_data.h" - -static void wr_cursor( - int r, - int c -) -{ - /* dummy function for now */ -} - -#define TAB_SPACE 4 -#define CONSOLE_BG_COL 0x00 -#define CONSOLE_FG_COL 0xa0 - -static void *fb_mem = NULL; -static unsigned short maxCol; -static unsigned short maxRow; -static unsigned short bytes_per_pixel; -static unsigned int bytes_per_line; -static unsigned int bytes_per_char_line; -static unsigned char row; -static unsigned char column; -static unsigned int nLines; -static uint32_t fgx, bgx, eorx; -static int rpi_video_initialized; - -static const int video_font_draw_table32[ 16 ][ 4 ] = { - { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, - { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff }, - { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 }, - { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff }, - { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 }, - { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff }, - { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 }, - { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff }, - { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 }, - { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff }, - { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 }, - { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff }, - { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 }, - { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff }, - { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 }, - { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } -}; - -static void scroll( void ) -{ - int i, j; /* Counters */ - uint8_t *pt_scroll, *pt_bitmap; /* Pointers on the bit-map */ - - pt_bitmap = fb_mem; - j = 0; - pt_bitmap = pt_bitmap + j; - pt_scroll = pt_bitmap + bytes_per_char_line; - - for ( i = j; i < maxRow - 1; i++ ) { - memcpy( pt_bitmap, pt_scroll, bytes_per_char_line ); - pt_bitmap = pt_bitmap + bytes_per_char_line; - pt_scroll = pt_bitmap + bytes_per_char_line; - } - - /* - * Blank characters are displayed on the last line. - */ - memset( pt_bitmap, 0, bytes_per_char_line ); -} - -static void doCRNL( - int cr, - int nl -) -{ - if ( nl ) { - if ( ++row == maxRow ) { - scroll(); /* Scroll the screen now */ - row = maxRow - 1; - } - - nLines++; - } - - if ( cr ) - column = 0; - - /* Move cursor on the next location */ - if ( cr || nl ) { - wr_cursor( row, column ); - } -} - -static void advanceCursor( void ) -{ - if ( ++column == maxCol ) - doCRNL( 1, 1 ); - else - wr_cursor( row, column ); -} - -static void gotorc( - int r, - int c -) -{ - column = c; - row = r; - wr_cursor( row, column ); -} - -static void video_drawchars( - int r, - int c, - unsigned char ch -) -{ - if ( fb_mem == NULL ) { - return; - } - - uint8_t *cdat, *dest, *dest0; - int rows, offset; - - offset = r * bytes_per_char_line + c * bytes_per_pixel * RPI_FONT_WIDTH; - dest0 = fb_mem + offset; - - /* - * only 32-bit per pixel format is supported for now - */ - cdat = rpi_font + ch * RPI_FONT_HEIGHT; - - for ( rows = RPI_FONT_HEIGHT, dest = dest0; - rows--; dest += bytes_per_line ) { - uint8_t bits = *cdat++; - - ( (uint32_t *) dest )[ 0 ] = - ( video_font_draw_table32 - [ bits >> 4 ][ 0 ] & eorx ) ^ bgx; - ( (uint32_t *) dest )[ 1 ] = - ( video_font_draw_table32 - [ bits >> 4 ][ 1 ] & eorx ) ^ bgx; - ( (uint32_t *) dest )[ 2 ] = - ( video_font_draw_table32 - [ bits >> 4 ][ 2 ] & eorx ) ^ bgx; - ( (uint32_t *) dest )[ 3 ] = - ( video_font_draw_table32 - [ bits >> 4 ][ 3 ] & eorx ) ^ bgx; - - ( (uint32_t *) dest )[ 4 ] = - ( video_font_draw_table32 - [ bits & 15 ][ 0 ] & eorx ) ^ bgx; - ( (uint32_t *) dest )[ 5 ] = - ( video_font_draw_table32 - [ bits & 15 ][ 1 ] & eorx ) ^ bgx; - ( (uint32_t *) dest )[ 6 ] = - ( video_font_draw_table32 - [ bits & 15 ][ 2 ] & eorx ) ^ bgx; - ( (uint32_t *) dest )[ 7 ] = - ( video_font_draw_table32 - [ bits & 15 ][ 3 ] & eorx ) ^ bgx; - } -} - -#define ESC ( (char) 27 ) -/* erase current location without moving the cursor */ -#define BLANK ( (char) 0x7f ) - -static void videoPutChar( char ch ) -{ - switch ( ch ) { - case '\b': { - if ( column ) - column--; - - /* Move cursor on the previous location */ - wr_cursor( row, column ); - return; - } - case '\t': { - int i; - - i = TAB_SPACE - ( column & ( TAB_SPACE - 1 ) ); - - while ( i-- ) { - - video_drawchars( row, column, ' ' ); - column += 1; - - if ( column >= maxCol ) { - doCRNL( 1, 1 ); - return; - } - } - - wr_cursor( row, column ); - - return; - } - case '\n': { - doCRNL( 0, 1 ); - return; - } - case 7: { /* Bell code must be inserted here */ - return; - } - case '\r': { - doCRNL( 1, 0 ); - return; - } - case BLANK: { - video_drawchars( row, column, ' ' ); - - wr_cursor( row, column ); - - return; - } - default: { - // *pt_bitmap = (unsigned char)ch | attribute; - video_drawchars( row, column, ch ); - advanceCursor(); - return; - } - } -} - -/* trivial state machine to handle escape sequences: - * - * --------------------------------- - * | | - * | | - * KEY: esc V [ DCABHKJ esc | - * STATE: 0 -----> 27 -----> '[' ----------> -1 ----- - * ^\ \ \ \ - * KEY: | \other \ other \ other \ other - * <------------------------------------- - * - * in state '-1', the DCABHKJ cases are handled - * - * (cursor motion and screen clearing) - */ - -#define DONE ( -1 ) - -static int handleEscape( - int oldState, - char ch -) -{ - int rval = 0; - int ro, co; - - switch ( oldState ) { - case DONE: /* means the previous char terminated an ESC sequence... */ - case 0: - - if ( 27 == ch ) { - rval = 27; /* START of an ESC sequence */ - } - - break; - - case 27: - - if ( '[' == ch ) { - rval = ch; /* received ESC '[', so far */ - } else { - /* dump suppressed 'ESC'; outch will append the char */ - videoPutChar( ESC ); - } - - break; - - case '[': - /* handle 'ESC' '[' sequences here */ - ro = row; - co = column; - rval = DONE; /* done */ - - switch ( ch ) { - case 'D': /* left */ - - if ( co > 0 ) - co--; - - break; - case 'C': /* right */ - - if ( co < maxCol ) - co++; - - break; - case 'A': /* up */ - - if ( ro > 0 ) - ro--; - - break; - case 'B': /* down */ - - if ( ro < maxRow ) - ro++; - - break; - case 'H': /* home */ - ro = co = 0; - break; - case 'K': /* clear to end of line */ - - while ( column < maxCol - 1 ) - videoPutChar( ' ' ); - - videoPutChar( BLANK ); - break; - case 'J': /* clear to end of screen */ - - while ( ( ( row < maxRow - 1 ) || ( column < maxCol - 1 ) ) ) - videoPutChar( ' ' ); - - videoPutChar( BLANK ); - break; - default: - videoPutChar( ESC ); - videoPutChar( '[' ); - /* DONT move the cursor */ - ro = -1; - rval = 0; - break; - } - - // /* reset cursor */ - if ( ro >= 0 ) - gotorc( ro, co ); - - default: - break; - } - - return rval; -} - -static void clear_screen( void ) -{ - int i, j; - - for ( j = 0; j < maxRow; j++ ) { - for ( i = 0; i < maxCol; i++ ) { - videoPutChar( ' ' ); - } - } - - column = 0; - row = 0; -} - -void rpi_fb_outch( char c ) -{ - static int escaped = 0; - - if ( !( escaped = handleEscape( escaped, c ) ) ) { - if ( '\n' == c ) - videoPutChar( '\r' ); - - videoPutChar( c ); - } -} - -void rpi_video_init( void ) -{ - int ret = rpi_fb_init(); - - if ( ( ret != RPI_FB_INIT_OK ) && - ( ret != RPI_FB_INIT_ALREADY_INITIALIZED ) ) { - rpi_video_initialized = 0; - return; - } - - struct fb_var_screeninfo fb_var_info; - struct fb_fix_screeninfo fb_fix_info; - rpi_get_var_screen_info( &fb_var_info ); - rpi_get_fix_screen_info( &fb_fix_info ); - maxCol = fb_var_info.xres / RPI_FONT_WIDTH; - maxRow = fb_var_info.yres / RPI_FONT_HEIGHT; - bytes_per_pixel = fb_var_info.bits_per_pixel / 8; - bytes_per_line = bytes_per_pixel * fb_var_info.xres; - bytes_per_char_line = RPI_FONT_HEIGHT * bytes_per_line; - fb_mem = RTEMS_DEVOLATILE( void *, fb_fix_info.smem_start ); - column = 0; - row = 0; - nLines = 0; - fgx = ( CONSOLE_FG_COL << 24 ) | - ( CONSOLE_FG_COL << 16 ) | - ( CONSOLE_FG_COL << 8 ) | - CONSOLE_FG_COL; - bgx = ( CONSOLE_BG_COL << 24 ) | - ( CONSOLE_BG_COL << 16 ) | - ( CONSOLE_BG_COL << 8 ) | - CONSOLE_BG_COL; - eorx = fgx ^ bgx; - clear_screen(); - rpi_video_initialized = 1; -} - -int rpi_video_is_initialized( void ) -{ - return rpi_video_initialized; -} - -/* for old DOS compatibility n-curses type of applications */ -void gotoxy( - int x, - int y -); -int whereX( void ); -int whereY( void ); - -void gotoxy( - int x, - int y -) -{ - gotorc( y, x ); -} - -int whereX( void ) -{ - return row; -} - -int whereY( void ) -{ - return column; -} diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/usart.c b/c/src/lib/libbsp/arm/raspberrypi/console/usart.c deleted file mode 100644 index 25fb523621..0000000000 --- a/c/src/lib/libbsp/arm/raspberrypi/console/usart.c +++ /dev/null @@ -1,167 +0,0 @@ -/** - * @file - * - * @ingroup raspberrypi_usart - * - * @brief USART support. - */ - -/* - * Copyright (c) 2013 Alan Cudmore - * - * 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 - * - */ - -#include <libchip/sersupp.h> - -#include <bsp.h> -#include <bsp/irq.h> -#include <bsp/usart.h> -#include <bsp/raspberrypi.h> -#include <rtems/bspIo.h> - -static void usart_delay(uint32_t n) -{ - volatile uint32_t i = 0; - - for(i = 0; i < n; i++) - ; -} - -#if 0 -/* - * These will be useful when the driver supports interrupt driven IO. - */ -static rtems_vector_number usart_get_irq_number(const console_tbl *ct) -{ - return ct->ulIntVector; -} - -static uint32_t usart_get_baud(const console_tbl *ct) -{ - return ct->ulClock; -} -#endif - -static void usart_set_baud(int minor, int baud) -{ - /* - * Nothing for now - */ - return; -} - -static void usart_initialize(int minor) -{ - unsigned int gpio_reg; - - /* - ** Program GPIO pins for UART 0 - */ - gpio_reg = BCM2835_REG(BCM2835_GPIO_GPFSEL1); - gpio_reg &= ~(7<<12); /* gpio14 */ - gpio_reg |= (4<<12); /* alt0 */ - gpio_reg &= ~(7<<15); /* gpio15 */ - gpio_reg |= (4<<15); /* alt0 */ - BCM2835_REG(BCM2835_GPIO_GPFSEL1) = gpio_reg; - - BCM2835_REG(BCM2835_GPIO_GPPUD) = 0; - usart_delay(150); - BCM2835_REG(BCM2835_GPIO_GPPUDCLK0) = (1<<14)|(1<<15); - usart_delay(150); - BCM2835_REG(BCM2835_GPIO_GPPUDCLK0) = 0; - - /* - ** Init the PL011 UART - */ - BCM2835_REG(BCM2835_UART0_CR) = 0; - BCM2835_REG(BCM2835_UART0_ICR) = 0x7FF; - BCM2835_REG(BCM2835_UART0_IMSC) = 0; - BCM2835_REG(BCM2835_UART0_IBRD) = 1; - BCM2835_REG(BCM2835_UART0_FBRD) = 40; - BCM2835_REG(BCM2835_UART0_LCRH) = 0x70; - BCM2835_REG(BCM2835_UART0_RSRECR) = 0; - - BCM2835_REG(BCM2835_UART0_CR) = 0x301; - - BCM2835_REG(BCM2835_UART0_IMSC) = BCM2835_UART0_IMSC_RX; - - usart_set_baud(minor, 115000); -} - -static int usart_first_open(int major, int minor, void *arg) -{ - rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; - struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; - const console_tbl *ct = Console_Port_Tbl [minor]; - console_data *cd = &Console_Port_Data [minor]; - - cd->termios_data = tty; - rtems_termios_set_initial_baud(tty, ct->ulClock); - - return 0; -} - -static int usart_last_close(int major, int minor, void *arg) -{ - return 0; -} - -static int usart_read_polled(int minor) -{ - if (minor == 0) { - if (((BCM2835_REG(BCM2835_UART0_FR)) & BCM2835_UART0_FR_RXFE) == 0) { - return((BCM2835_REG(BCM2835_UART0_DR)) & 0xFF ); - } else { - return -1; - } - } else { - printk("Unknown console minor number: %d\n", minor); - return -1; - } -} - -static void usart_write_polled(int minor, char c) -{ - while (1) { - if ((BCM2835_REG(BCM2835_UART0_FR) & BCM2835_UART0_FR_TXFF) == 0) - break; - } - BCM2835_REG(BCM2835_UART0_DR) = c; -} - -static ssize_t usart_write_support_polled( - int minor, - const char *s, - size_t n -) -{ - ssize_t i = 0; - - for (i = 0; i < n; ++i) { - usart_write_polled(minor, s [i]); - } - - return n; -} - -static int usart_set_attributes(int minor, const struct termios *term) -{ - return -1; -} - -const console_fns bcm2835_usart_fns = { - .deviceProbe = libchip_serial_default_probe, - .deviceFirstOpen = usart_first_open, - .deviceLastClose = usart_last_close, - .deviceRead = usart_read_polled, - .deviceWrite = usart_write_support_polled, - .deviceInitialize = usart_initialize, - .deviceWritePolled = usart_write_polled, - .deviceSetAttributes = usart_set_attributes, - .deviceOutputUsesInterrupts = false -}; diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am index 7f235343e5..bc1e0437cb 100644 --- a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am +++ b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am @@ -61,12 +61,12 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += ../shared/arm-gic-irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios-init.c -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += ../../shared/get-serial-mouse-ps2.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios-init.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/getserialmouseps2.c librtemsbsp_a_SOURCES += ../shared/arm-pl011.c librtemsbsp_a_SOURCES += ../shared/arm-pl050.c -librtemsbsp_a_SOURCES += console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/realview-pbx-a9/console/console-config.c # Clock librtemsbsp_a_SOURCES += ../shared/arm-a9mpcore-clock-config.c diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c b/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c deleted file mode 100644 index 66dcfa6803..0000000000 --- a/c/src/lib/libbsp/arm/realview-pbx-a9/console/console-config.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@embedded-brains.de> - * - * 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. - */ - -#include <rtems/serial_mouse.h> -#include <rtems/bspIo.h> - -#include <bsp.h> -#include <bsp/irq.h> -#include <bsp/arm-pl011.h> -#include <bsp/arm-pl050.h> -#include <bsp/console-termios.h> - -static arm_pl011_context pl011_context = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("PL011"), - .regs = (volatile pl011 *) 0x10009000, - .irq = RVPBXA9_IRQ_UART_0, - .initial_baud = 115200 -}; - -static arm_pl050_context pl050_context = { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("PL050"), - .regs = (volatile pl050 *) 0x10007000, - .irq = RVPBXA9_IRQ_KMI1, - .initial_baud = 115200 -}; - -static void output_char(char c) -{ - arm_pl011_write_polled(&pl011_context.base, c); -} - -static bool pl011_probe(rtems_termios_device_context *base) -{ - BSP_output_char = output_char; - - return arm_pl011_probe(base); -} - -static void output_char_init(char c) -{ - pl011_probe(&pl011_context.base); - output_char(c); -} - -BSP_output_char_function_type BSP_output_char = output_char_init; - -BSP_polling_getchar_function_type BSP_poll_char = NULL; - -const console_device console_device_table[] = { - { - .device_file = "/dev/ttyS0", - .probe = pl011_probe, - .handler = &arm_pl011_fns, - .context = &pl011_context.base - }, { - .device_file = SERIAL_MOUSE_DEVICE_PS2, - .probe = console_device_probe_default, - .handler = &arm_pl050_fns, - .context = &pl050_context.base - } -}; - -const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table); diff --git a/c/src/lib/libbsp/arm/rtl22xx/Makefile.am b/c/src/lib/libbsp/arm/rtl22xx/Makefile.am index da8ef3aef1..e64bbeee9f 100644 --- a/c/src/lib/libbsp/arm/rtl22xx/Makefile.am +++ b/c/src/lib/libbsp/arm/rtl22xx/Makefile.am @@ -33,7 +33,7 @@ librtemsbsp_a_SOURCES +=../../../../../../bsps/arm/rtl22xx/clock/clockdrv.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/uart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/rtl22xx/console/uart.c # IRQ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c diff --git a/c/src/lib/libbsp/arm/rtl22xx/console/lpc22xx_uart.h b/c/src/lib/libbsp/arm/rtl22xx/console/lpc22xx_uart.h deleted file mode 100644 index f6ae249672..0000000000 --- a/c/src/lib/libbsp/arm/rtl22xx/console/lpc22xx_uart.h +++ /dev/null @@ -1,187 +0,0 @@ -/** - * @file - * @ingroup rtl22xx_uart - * @brief UART support. - */ - -#ifndef LPC22XX_UART_H -#define LPC22XX_UART_H - -/** - * @defgroup rtl22xx_uart UART Support - * @ingroup arm_rtl22xx - * @brief UART (Universal Asynchronous Reciever/Transmitter) Support - * @{ - */ - -#define FIFODEEP 16 - -#define BD115200 115200 -#define BD38400 38400 -#define BD9600 9600 - -/** @brief PINSEL0 Value for UART0 */ -#define U0_PINSEL (0x00000005) -/** @brief PINSEL0 Mask for UART0 */ -#define U0_PINMASK (0x0000000F) -/** @brief PINSEL0 Value for UART1 */ -#define U1_PINSEL (0x00050000) -/** @brief PINSEL0 Mask for UART1 */ -#define U1_PINMASK (0x000F0000) - -/** - * @name Uart line control register bit descriptions - * @{ - */ - -#define LCR_WORDLENTH_BIT 0 -#define LCR_STOPBITSEL_BIT 2 -#define LCR_PARITYENBALE_BIT 3 -#define LCR_PARITYSEL_BIT 4 -#define LCR_BREAKCONTROL_BIT 6 -#define LCR_DLAB_BIT 7 - -/** @} */ - -/** - * @name Line Control Register bit definitions - * @{ - */ - -/** @brief 5-bit character length */ -#define ULCR_CHAR_5 (0 << 0) -/** @brief 6-bit character length */ -#define ULCR_CHAR_6 (1 << 0) -/** @brief 7-bit character length */ -#define ULCR_CHAR_7 (2 << 0) -/** @brief 8-bit character length */ -#define ULCR_CHAR_8 (3 << 0) -/** @brief no stop bits */ -#define ULCR_STOP_0 (0 << 2) -/** @brief 1 stop bit */ -#define ULCR_STOP_1 (1 << 2) -/** @brief No Parity */ -#define ULCR_PAR_NO (0 << 3) -/** @brief Odd Parity */ -#define ULCR_PAR_ODD (1 << 3) -/** @brief Even Parity */ -#define ULCR_PAR_EVEN (3 << 3) -/** @brief MARK "1" Parity */ -#define ULCR_PAR_MARK (5 << 3) -/** @brief SPACE "0" Paruty */ -#define ULCR_PAR_SPACE (7 << 3) -/** @brief Output BREAK line condition */ -#define ULCR_BREAK_ENABLE (1 << 6) -/** @brief Enable Divisor Latch Access */ -#define ULCR_DLAB_ENABLE (1 << 7) - -/** @} */ - -/** - * @name Modem Control Register bit definitions - * @{ - */ - -/** @brief Data Terminal Ready */ -#define UMCR_DTR (1 << 0) -/** @brief Request To Send */ -#define UMCR_RTS (1 << 1) -/** @brief Loopback */ -#define UMCR_LB (1 << 4) - -/** @} */ - -/** - * @name Line Status Register bit definitions - * @{ - */ - -/** @brief Receive Data Ready */ -#define ULSR_RDR (1 << 0) -/** @brief Overrun Error */ -#define ULSR_OE (1 << 1) -/** @brief Parity Error */ -#define ULSR_PE (1 << 2) -/** @brief Framing Error */ -#define ULSR_FE (1 << 3) -/** @brief Break Interrupt */ -#define ULSR_BI (1 << 4) -/** @brief Transmit Holding Register Empty */ -#define ULSR_THRE (1 << 5) -/** @brief Transmitter Empty */ -#define ULSR_TEMT (1 << 6) -/** @brief Error in Receive FIFO */ -#define ULSR_RXFE (1 << 7) -#define ULSR_ERR_MASK 0x1E - -/** @} */ - -/** - * @name Modem Status Register bit definitions - * @{ - */ - -/** @brief Delta Clear To Send */ -#define UMSR_DCTS (1 << 0) -/** @brief Delta Data Set Ready */ -#define UMSR_DDSR (1 << 1) -/** @brief Trailing Edge Ring Indicator */ -#define UMSR_TERI (1 << 2) -/** @brief Delta Data Carrier Detect */ -#define UMSR_DDCD (1 << 3) -/** @brief Clear To Send */ -#define UMSR_CTS (1 << 4) -/** @brief Data Set Ready */ -#define UMSR_DSR (1 << 5) -/** @brief Ring Indicator */ -#define UMSR_RI (1 << 6) -/** @brief Data Carrier Detect */ -#define UMSR_DCD (1 << 7) - -/** @} */ - -/** - * @name Uart Interrupt Identification - * @{ - */ - -#define IIR_RSL 0x3 -#define IIR_RDA 0x2 -#define IIR_CTI 0x6 -#define IIR_THRE 0x1 - -/** @} */ - -/** - * @name Uart Interrupt Enable Type - * @{ - */ - -#define IER_RBR 0x1 -#define IER_THRE 0x2 -#define IER_RLS 0x4 - -/** @} */ - -/** - * @name Uart Receiver Errors - * @{ - */ - -#define RC_FIFO_OVERRUN_ERR 0x1 -#define RC_OVERRUN_ERR 0x2 -#define RC_PARITY_ERR 0x4 -#define RC_FRAMING_ERR 0x8 -#define RC_BREAK_IND 0x10 - -/** @} */ - -typedef enum { - UART0 = 0, - UART1 -} LPC_UartChanel_t; - -/** @} */ - -#endif - diff --git a/c/src/lib/libbsp/arm/rtl22xx/console/uart.c b/c/src/lib/libbsp/arm/rtl22xx/console/uart.c deleted file mode 100644 index 2952e74508..0000000000 --- a/c/src/lib/libbsp/arm/rtl22xx/console/uart.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * console driver for RTL22xx UARTs - * - * If you want the driver to be interrupt driven, you - * need to write the ISR, and in the ISR insert the - * chars into termios's queue. - */ - -/* - * Copyright (c) By ray <rayx.cn@gmail.com> - * - * 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. - */ - -#include <bsp.h> /* Must be before libio.h */ -#include <rtems/libio.h> -#include <termios.h> -#include <rtems/bspIo.h> - -/* Put the CPU (or UART) specific header file #include here */ -#include <lpc22xx.h> -#include "lpc22xx_uart.h" - -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -/* How many serial ports? */ -#define NUM_DEVS 1 - -int dbg_dly; - -/* static function prototypes */ -static int uart_first_open(int major, int minor, void *arg); -static int uart_last_close(int major, int minor, void *arg); -static int uart_read(int minor); -static ssize_t uart_write(int minor, const char *buf, size_t len); -static void uart_init(int minor); -static void uart_write_polled(int minor, char c); -static int uart_set_attributes(int minor, const struct termios *t); - -/* These are used by code in console.c */ -unsigned long Console_Configuration_Count = NUM_DEVS; - -/* Pointers to functions for handling the UART. */ -const console_fns uart_fns = { - libchip_serial_default_probe, - uart_first_open, - uart_last_close, - uart_read, - uart_write, - uart_init, - uart_write_polled, /* not used in this driver */ - uart_set_attributes, - FALSE /* TRUE if interrupt driven, FALSE if not. */ -}; - -/* - * There's one item in array for each UART. - * - * Some of these fields are marked "NOT USED". They are not used - * by console.c, but may be used by drivers in libchip - */ -console_tbl Console_Configuration_Ports[] = { -{ - "/dev/com0", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &uart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - NOT USED */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ -} -#if 0 -{ - "/dev/com1", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &uart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - NOT USED */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ -} -#endif -}; - -/* - * This is called the first time each device is opened. If the driver - * is interrupt driven, you should enable interrupts here. Otherwise, - * it's probably safe to do nothing. - * - * Since micromonitor already set up the UART, we do nothing. - */ -static int uart_first_open(int major, int minor, void *arg) -{ - return 0; -} - -/* - * This is called the last time each device is closed. If the driver - * is interrupt driven, you should disable interrupts here. Otherwise, - * it's probably safe to do nothing. - */ -static int uart_last_close(int major, int minor, void *arg) -{ - return 0; -} - -/* - * Read one character from UART. - * - * Return -1 if there's no data, otherwise return - * the character in lowest 8 bits of returned int. - */ -static int uart_read(int minor) -{ - char c; - - switch (minor) { - case 0: - if (U0LSR & ULSR_RDR) { - c = U0RBR; - return c; - } - return -1; - case 1: - if (U1LSR & ULSR_RDR) { - c = U1RBR; - return c; - } - return -1; - default: - break; - } - printk("Unknown console minor number %d\n", minor); - return -1; -} - -/* - * Write buffer to UART - * - * return 1 on success, -1 on error - */ -static ssize_t uart_write(int minor, const char *buf, size_t len) -{ - size_t i; - - switch (minor) { - case 0: - for (i = 0; i < len; i++) { - while (!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/ - continue; /* also either WDOG() or swap()*/ - U0THR = (char) buf[i]; - } - break; - case 1: - for (i = 0; i < len; i++) { - while (!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/ - continue; /* also either WDOG() or swap()*/ - U0THR = (char) buf[i]; - } - break; - default: - printk("Unknown console minor number %d\n", minor); - return -1; - } - - return len; -} - -/* Set up the UART. */ -static void uart_init(int minor) -{ -#if 0 //init will be done in bspstart.c - int baud=6; - int mode =0x03; - if(minor==0){ - // set port pins for UART0 - PINSEL0 = (PINSEL0 & ~U0_PINMASK) | U0_PINSEL; - - U0IER = 0x00; // disable all interrupts - - // set the baudrate - U0LCR = 1<<7; // select divisor latches - U0DLL = (uint8_t)baud; // set for baud low byte - U0DLM = (uint8_t)(baud >> 8); // set for baud high byte - - // set the number of characters and other - // user specified operating parameters - U0LCR = (mode & ~ULCR_DLAB_ENABLE); - U0FCR = mode>>8; /*fifo mode*/ - - // set port pins for UART1 - PINSEL0 = (PINSEL0 & ~U1_PINMASK) | U1_PINSEL; - - U1IER = 0x00; // disable all interrupts - }else if(minor==1){ - // set the baudrate - U1LCR = ULCR_DLAB_ENABLE; // select divisor latches - U1DLL = (uint8_t)baud; // set for baud low byte - U1DLM = (uint8_t)(baud >> 8); // set for baud high byte - - // set the number of characters and other - // user specified operating parameters - U1LCR = (mode & ~ULCR_DLAB_ENABLE); - U1FCR = mode>>8;/*fifo mode*/ - } - -#endif -} - -/* I'm not sure this is needed for the shared console driver. */ -static void uart_write_polled(int minor, char c) -{ - uart_write(minor, &c, 1); -} - -/* This is for setting baud rate, bits, etc. */ -static int uart_set_attributes(int minor, const struct termios *t) -{ - return 0; -} - -/* - * Write a character to the console. This is used by printk() and - * maybe other low level functions. It should not use interrupts or any - * RTEMS system calls. It needs to be very simple - */ -static void _BSP_put_char( char c ) -{ - uart_write_polled(0, c); -} - -BSP_output_char_function_type BSP_output_char = _BSP_put_char; - -static int _BSP_get_char(void) -{ - return uart_read(0); -} - -BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char; - -/* - * init USART 0¡£8 bit, 1 Stop,No checkout, BPS115200 - */ -void UART0_Ini(void) -{ - long Fdiv; - int i; - - PINSEL0 = 0x00000005; // I/O to UART0 - U0LCR = 0x83; // DLAB = 1 - Fdiv = (Fpclk >>4) / UART_BPS; // configure BPS - U0DLM = Fdiv/256; - U0DLL = Fdiv%256; - U0LCR = 0x03; - - for(i=0;i<10;i++){ - U0THR = 67; //send a C to see if is OK - while ( (U0LSR&0x40)==0 ); - } -} diff --git a/c/src/lib/libbsp/arm/smdk2410/Makefile.am b/c/src/lib/libbsp/arm/smdk2410/Makefile.am index a9c43789f4..748cde9c94 100644 --- a/c/src/lib/libbsp/arm/smdk2410/Makefile.am +++ b/c/src/lib/libbsp/arm/smdk2410/Makefile.am @@ -34,7 +34,7 @@ librtemsbsp_a_SOURCES +=../../../../../../bsps/arm/smdk2410/clock/support.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/uart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/smdk2410/console/uart.c # IRQ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c diff --git a/c/src/lib/libbsp/arm/smdk2410/console/uart.c b/c/src/lib/libbsp/arm/smdk2410/console/uart.c deleted file mode 100644 index 06adecf239..0000000000 --- a/c/src/lib/libbsp/arm/smdk2410/console/uart.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * console driver for S3C2400 UARTs - * - * This driver uses the shared console driver in - * ...../libbsp/shared/console.c - * - * If you want the driver to be interrupt driven, you - * need to write the ISR, and in the ISR insert the - * chars into termios's queue. - * - * Copyright (c) 2004 Cogent Computer Systems - * Written by Jay Monkman <jtm@lopingdog.com> - * - * 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. -*/ -#include <bsp.h> /* Must be before libio.h */ -#include <rtems/libio.h> -#include <termios.h> -#include <rtems/bspIo.h> - -/* Put the CPU (or UART) specific header file #include here */ -#include <s3c24xx.h> -#include <libchip/serial.h> -#include <libchip/sersupp.h> - -/* How many serial ports? */ -#define NUM_DEVS 1 - -int uart_poll_read(int minor); - -int dbg_dly; - -/* static function prototypes */ -static int uart_first_open(int major, int minor, void *arg); -static int uart_last_close(int major, int minor, void *arg); -static int uart_read(int minor); -static ssize_t uart_write(int minor, const char *buf, size_t len); -static void uart_init(int minor); -static void uart_write_polled(int minor, char c); -static int uart_set_attributes(int minor, const struct termios *t); - -/* These are used by code in console.c */ -unsigned long Console_Configuration_Count = NUM_DEVS; - -/* Pointers to functions for handling the UART. */ -const console_fns uart_fns = -{ - libchip_serial_default_probe, - uart_first_open, - uart_last_close, - uart_read, - uart_write, - uart_init, - uart_write_polled, /* not used in this driver */ - uart_set_attributes, - FALSE /* TRUE if interrupt driven, FALSE if not. */ -}; - -/* - * There's one item in array for each UART. - * - * Some of these fields are marked "NOT USED". They are not used - * by console.c, but may be used by drivers in libchip - * - */ -console_tbl Console_Configuration_Ports[] = { - { - "/dev/com0", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &uart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - NOT USED */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - } -}; - -/*********************************************************************/ -/* Functions called via termios callbacks (i.e. the ones in uart_fns */ -/*********************************************************************/ - -/* - * This is called the first time each device is opened. If the driver - * is interrupt driven, you should enable interrupts here. Otherwise, - * it's probably safe to do nothing. - * - * Since micromonitor already set up the UART, we do nothing. - */ -static int uart_first_open(int major, int minor, void *arg) -{ - return 0; -} - - -/* - * This is called the last time each device is closed. If the driver - * is interrupt driven, you should disable interrupts here. Otherwise, - * it's probably safe to do nothing. - */ -static int uart_last_close(int major, int minor, void *arg) -{ - return 0; -} - - -/* - * Read one character from UART. - * - * Return -1 if there's no data, otherwise return - * the character in lowest 8 bits of returned int. - */ -static int uart_read(int minor) -{ - char c; - - if (minor == 0) { - if (rUTRSTAT0 & 0x1) { - c = rURXH0 & 0xff; - return c; - } else { - return -1; - } - } else { - printk("Unknown console minor number: %d\n", minor); - return -1; - } - -} - - -/* - * Write buffer to UART - * - * return 1 on success, -1 on error - */ -static ssize_t uart_write(int minor, const char *buf, size_t len) -{ - int i; - - if (minor == 0) { - for (i = 0; i < len; i++) { - /* Wait for fifo to have room */ - while(!(rUTRSTAT0 & 0x2)) { - continue; - } - - rUTXH0 = (char) buf[i]; - } - } else { - printk("Unknown console minor number: %d\n", minor); - return -1; - } - - return 1; -} - - -/* Set up the UART. */ -static void uart_init(int minor) -{ - int i; - unsigned int reg = 0; - - /* enable UART0 */ - rCLKCON|=0x100; - - /* value is calculated so : (int)(PCLK/16./baudrate) -1 */ - reg = get_PCLK() / (16 * 115200) - 1; - - /* FIFO enable, Tx/Rx FIFO clear */ - rUFCON0 = 0x07; - rUMCON0 = 0x0; - /* Normal,No parity,1 stop,8 bit */ - rULCON0 = 0x3; - /* - * tx=level,rx=edge,disable timeout int.,enable rx error int., - * normal,interrupt or polling - */ - rUCON0 = 0x245; - rUBRDIV0 = reg; - - for (i = 0; i < 100; i++); - -} - -/* I'm not sure this is needed for the shared console driver. */ -static void uart_write_polled(int minor, char c) -{ - uart_write(minor, &c, 1); -} - -/* This is for setting baud rate, bits, etc. */ -static int uart_set_attributes(int minor, const struct termios *t) -{ - return 0; -} - -/***********************************************************************/ -/* - * The following functions are not used by TERMIOS, but other RTEMS - * functions use them instead. - */ -/***********************************************************************/ -/* - * Read from UART. This is used in the exit code, and can't - * rely on interrupts. -*/ -int uart_poll_read(int minor) -{ - return uart_read(minor); -} - - -/* - * Write a character to the console. This is used by printk() and - * maybe other low level functions. It should not use interrupts or any - * RTEMS system calls. It needs to be very simple - */ -static void _BSP_put_char( char c ) { - uart_write_polled(0, c); -} - -BSP_output_char_function_type BSP_output_char = _BSP_put_char; - -static int _BSP_get_char(void) -{ - return uart_poll_read(0); -} - -BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char; diff --git a/c/src/lib/libbsp/arm/stm32f4/Makefile.am b/c/src/lib/libbsp/arm/stm32f4/Makefile.am index 640cb59adf..760b387a18 100644 --- a/c/src/lib/libbsp/arm/stm32f4/Makefile.am +++ b/c/src/lib/libbsp/arm/stm32f4/Makefile.am @@ -56,8 +56,8 @@ librtemsbsp_a_SOURCES += ../shared/armv7m/irq/armv7m-irq-dispatch.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c -librtemsbsp_a_SOURCES += console/console-config.c -librtemsbsp_a_SOURCES += console/usart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/stm32f4/console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/stm32f4/console/usart.c # I2C librtemsbsp_a_SOURCES += i2c/i2c.c diff --git a/c/src/lib/libbsp/arm/stm32f4/console/console-config.c b/c/src/lib/libbsp/arm/stm32f4/console/console-config.c deleted file mode 100644 index 6bf2d7e3b5..0000000000 --- a/c/src/lib/libbsp/arm/stm32f4/console/console-config.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2012 Sebastian Huber. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <rtems/bspIo.h> - -#include <libchip/serial.h> - -#include <bspopts.h> -#include <bsp/irq.h> -#include <bsp/usart.h> -#include <bsp/stm32f4.h> - -console_tbl Console_Configuration_Ports [] = { - #ifdef STM32F4_ENABLE_USART_1 - { - .sDeviceName = "/dev/ttyS0", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &stm32f4_usart_fns, - .ulCtrlPort1 = (uint32_t) STM32F4_USART_1, - .ulCtrlPort2 = 0, - .ulClock = STM32F4_USART_BAUD, - .ulIntVector = STM32F4_IRQ_USART1 - }, - #endif - #ifdef STM32F4_ENABLE_USART_2 - { - .sDeviceName = "/dev/ttyS1", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &stm32f4_usart_fns, - .ulCtrlPort1 = (uint32_t) STM32F4_USART_2, - .ulCtrlPort2 = 1, - .ulClock = STM32F4_USART_BAUD, - .ulIntVector = STM32F4_IRQ_USART2 - }, - #endif - #ifdef STM32F4_ENABLE_USART_3 - { - .sDeviceName = "/dev/ttyS2", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &stm32f4_usart_fns, - .ulCtrlPort1 = (uint32_t) STM32F4_USART_3, - .ulCtrlPort2 = 2, - .ulClock = STM32F4_USART_BAUD, - .ulIntVector = STM32F4_IRQ_USART3 - }, - #endif - #ifdef STM32F4_ENABLE_UART_4 - { - .sDeviceName = "/dev/ttyS3", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &stm32f4_usart_fns, - .ulCtrlPort1 = (uint32_t) STM32F4_USART_4, - .ulCtrlPort2 = 3, - .ulClock = STM32F4_USART_BAUD, - .ulIntVector = STM32F4_IRQ_UART4 - }, - #endif - #ifdef STM32F4_ENABLE_UART_5 - { - .sDeviceName = "/dev/ttyS4", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &stm32f4_usart_fns, - .ulCtrlPort1 = (uint32_t) STM32F4_USART_5, - .ulCtrlPort2 = 4, - .ulClock = STM32F4_USART_BAUD, - .ulIntVector = STM32F4_IRQ_UART5 - }, - #endif - #ifdef STM32F4_ENABLE_USART_6 - { - .sDeviceName = "/dev/ttyS5", - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = &stm32f4_usart_fns, - .ulCtrlPort1 = (uint32_t) STM32F4_USART_6, - .ulCtrlPort2 = 5, - .ulClock = STM32F4_USART_BAUD, - .ulIntVector = STM32F4_IRQ_USART6 - }, - #endif -}; - -#define PORT_COUNT \ - (sizeof(Console_Configuration_Ports) \ - / sizeof(Console_Configuration_Ports [0])) - -unsigned long Console_Configuration_Count = PORT_COUNT; - -static void output_char(char c) -{ - const console_fns *con = - Console_Configuration_Ports [Console_Port_Minor].pDeviceFns; - - con->deviceWritePolled((int) Console_Port_Minor, c); -} - -BSP_output_char_function_type BSP_output_char = output_char; - -BSP_polling_getchar_function_type BSP_poll_char = NULL; diff --git a/c/src/lib/libbsp/arm/stm32f4/console/usart.c b/c/src/lib/libbsp/arm/stm32f4/console/usart.c deleted file mode 100644 index 24e010d6bf..0000000000 --- a/c/src/lib/libbsp/arm/stm32f4/console/usart.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2012 Sebastian Huber. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <libchip/sersupp.h> - -#include <bsp.h> -#include <bsp/io.h> -#include <bsp/rcc.h> -#include <bsp/irq.h> -#include <bsp/usart.h> -#include <bsp/stm32f4.h> - -static volatile stm32f4_usart *usart_get_regs(const console_tbl *ct) -{ - return (stm32f4_usart *) ct->ulCtrlPort1; -} - -#if 0 -static rtems_vector_number usart_get_irq_number(const console_tbl *ct) -{ - return ct->ulIntVector; -} -#endif - -static const stm32f4_rcc_index usart_rcc_index [] = { - STM32F4_RCC_USART1, - STM32F4_RCC_USART2, - STM32F4_RCC_USART3, - STM32F4_RCC_UART4, - STM32F4_RCC_UART5, -#ifdef STM32F4_FAMILY_F4XXXX - STM32F4_RCC_USART6 -#endif /* STM32F4_FAMILY_F4XXXX */ -}; - -static stm32f4_rcc_index usart_get_rcc_index(const console_tbl *ct) -{ - return usart_rcc_index [ct->ulCtrlPort2]; -} - -static const uint8_t usart_pclk_index [] = { 1, 0, 0, 0, 0, 1 }; - -static const uint32_t usart_pclk_by_index [] = { - STM32F4_PCLK1, - STM32F4_PCLK2 -}; - -static uint32_t usart_get_pclk(const console_tbl *ct) -{ - return usart_pclk_by_index [usart_pclk_index [ct->ulCtrlPort2]]; -} - -static uint32_t usart_get_baud(const console_tbl *ct) -{ - return ct->ulClock; -} - -/* - * a = 8 * (2 - CR1[OVER8]) - * - * usartdiv = div_mantissa + div_fraction / a - * - * baud = pclk / (a * usartdiv) - * - * usartdiv = pclk / (a * baud) - * - * Calculation in integer arithmetic: - * - * 1. div_mantissa = pclk / (a * baud) - * - * 2. div_fraction = pclk / (baud - a * div_mantissa) - */ -static uint32_t usart_get_bbr( - volatile stm32f4_usart *usart, - uint32_t pclk, - uint32_t baud -) -{ - uint32_t a = 8 * (2 - ((usart->cr1 & STM32F4_USART_CR1_OVER8) != 0)); - uint32_t div_mantissa_low = pclk / (a * baud); - uint32_t div_fraction_low = pclk / (baud - a * div_mantissa_low); - uint32_t div_mantissa_high; - uint32_t div_fraction_high; - uint32_t high_err; - uint32_t low_err; - uint32_t div_mantissa; - uint32_t div_fraction; - - if (div_fraction_low < a - 1) { - div_mantissa_high = div_fraction_low; - div_fraction_high = div_fraction_low + 1; - } else { - div_mantissa_high = div_fraction_low + 1; - div_fraction_high = 0; - } - - high_err = pclk - baud * (a * div_mantissa_high + div_fraction_high); - low_err = baud * (a * div_mantissa_low + div_fraction_low) - pclk; - - if (low_err < high_err) { - div_mantissa = div_mantissa_low; - div_fraction = div_fraction_low; - } else { - div_mantissa = div_mantissa_high; - div_fraction = div_fraction_high; - } - - return STM32F4_USART_BBR_DIV_MANTISSA(div_mantissa) - | STM32F4_USART_BBR_DIV_FRACTION(div_fraction); -} - -static void usart_initialize(int minor) -{ - const console_tbl *ct = Console_Port_Tbl [minor]; - volatile stm32f4_usart *usart = usart_get_regs(ct); - uint32_t pclk = usart_get_pclk(ct); - uint32_t baud = usart_get_baud(ct); - stm32f4_rcc_index rcc_index = usart_get_rcc_index(ct); - - stm32f4_rcc_set_clock(rcc_index, true); - - usart->cr1 = 0; - usart->cr2 = 0; - usart->cr3 = 0; - usart->bbr = usart_get_bbr(usart, pclk, baud); - usart->cr1 = STM32F4_USART_CR1_UE - | STM32F4_USART_CR1_TE - | STM32F4_USART_CR1_RE; -} - -static int usart_first_open(int major, int minor, void *arg) -{ - rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; - struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; - const console_tbl *ct = Console_Port_Tbl [minor]; - console_data *cd = &Console_Port_Data [minor]; - - cd->termios_data = tty; - rtems_termios_set_initial_baud(tty, ct->ulClock); - - return 0; -} - -static int usart_last_close(int major, int minor, void *arg) -{ - return 0; -} - -static int usart_read_polled(int minor) -{ - const console_tbl *ct = Console_Port_Tbl [minor]; - volatile stm32f4_usart *usart = usart_get_regs(ct); - - if ((usart->sr & STM32F4_USART_SR_RXNE) != 0) { - return STM32F4_USART_DR_GET(usart->dr); - } else { - return -1; - } -} - -static void usart_write_polled(int minor, char c) -{ - const console_tbl *ct = Console_Port_Tbl [minor]; - volatile stm32f4_usart *usart = usart_get_regs(ct); - - while ((usart->sr & STM32F4_USART_SR_TXE) == 0) { - /* Wait */ - } - - usart->dr = STM32F4_USART_DR(c); -} - -static ssize_t usart_write_support_polled( - int minor, - const char *s, - size_t n -) -{ - ssize_t i = 0; - - for (i = 0; i < n; ++i) { - usart_write_polled(minor, s [i]); - } - - return n; -} - -static int usart_set_attributes(int minor, const struct termios *term) -{ - return -1; -} - -const console_fns stm32f4_usart_fns = { - .deviceProbe = libchip_serial_default_probe, - .deviceFirstOpen = usart_first_open, - .deviceLastClose = usart_last_close, - .deviceRead = usart_read_polled, - .deviceWrite = usart_write_support_polled, - .deviceInitialize = usart_initialize, - .deviceWritePolled = usart_write_polled, - .deviceSetAttributes = usart_set_attributes, - .deviceOutputUsesInterrupts = false -}; diff --git a/c/src/lib/libbsp/arm/tms570/Makefile.am b/c/src/lib/libbsp/arm/tms570/Makefile.am index 3857fc4fda..106d6c1d9e 100644 --- a/c/src/lib/libbsp/arm/tms570/Makefile.am +++ b/c/src/lib/libbsp/arm/tms570/Makefile.am @@ -62,9 +62,9 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += irq/irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/printk-support.c -librtemsbsp_a_SOURCES += console/tms570-sci.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/tms570/console/printk-support.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/tms570/console/tms570-sci.c # Clock librtemsbsp_a_SOURCES +=../../../../../../bsps/arm/tms570/clock/clock.c diff --git a/c/src/lib/libbsp/arm/tms570/console/printk-support.c b/c/src/lib/libbsp/arm/tms570/console/printk-support.c deleted file mode 100644 index 529c5dba20..0000000000 --- a/c/src/lib/libbsp/arm/tms570/console/printk-support.c +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @file printk-support.c - * - * @ingroup tms570 - * - * @brief definitions of serial line for debugging. - */ - -/* - * Copyright (c) 2014 Premysl Houdek <kom541000@gmail.com> - * - * Google Summer of Code 2014 at - * Czech Technical University in Prague - * Zikova 1903/4 - * 166 36 Praha 6 - * Czech Republic - * - * Based on LPC24xx and LPC1768 BSP - * by embedded brains GmbH and others - * - * 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. - */ - -#include <rtems/bspIo.h> -#include <rtems/sysinit.h> -#include <stdint.h> -#include <string.h> -#include <bsp/tms570-sci.h> -#include <bsp/tms570-sci-driver.h> - -#define TMS570_CONSOLE (&driver_context_table[0]) - -/** - * @brief Puts chars into peripheral - * - * debug functions always use serial dev 0 peripheral - * - * @retval Void - */ -static void tms570_debug_console_putc(char ch) -{ - tms570_sci_context *ctx = TMS570_CONSOLE; - volatile tms570_sci_t *regs = ctx->regs; - rtems_interrupt_level level; - - rtems_interrupt_disable(level); - while ( ( regs->FLR & TMS570_SCI_FLR_TXRDY ) == 0) { - rtems_interrupt_flash(level); - } - regs->TD = ch; - while ( ( regs->FLR & TMS570_SCI_FLR_TX_EMPTY ) == 0) { - rtems_interrupt_flash(level); - } - rtems_interrupt_enable(level); -} - -/** - * @brief debug console output - * - * debug functions always use serial dev 0 peripheral - * - * @retval Void - */ -static void tms570_debug_console_out(char c) -{ - tms570_debug_console_putc(c); -} - -static void tms570_debug_console_init(void) -{ - tms570_sci_context *ctx = TMS570_CONSOLE; - struct termios term; - - tms570_sci_initialize(ctx); - memset(&term, 0, sizeof(term)); - term.c_cflag = B115200; - tms570_sci_set_attributes(&ctx->base, &term); - BSP_output_char = tms570_debug_console_out; -} - -static void tms570_debug_console_early_init(char c) -{ - tms570_debug_console_init(); - tms570_debug_console_out(c); -} - -/** - * @brief debug console input - * - * debug functions always use serial dev 0 peripheral - * - * @retval x Read char - * @retval -1 No input character available - */ -static int tms570_debug_console_in( void ) -{ - tms570_sci_context *ctx = TMS570_CONSOLE; - volatile tms570_sci_t *regs = ctx->regs; - rtems_interrupt_level level; - int c; - - rtems_interrupt_disable(level); - - if ( regs->FLR & TMS570_SCI_FLR_RXRDY ) { - c = (unsigned char) regs->RD; - } else { - c = -1; - } - - rtems_interrupt_enable(level); - - return c; -} - -BSP_output_char_function_type BSP_output_char = - tms570_debug_console_early_init; - -BSP_polling_getchar_function_type BSP_poll_char = tms570_debug_console_in; - -RTEMS_SYSINIT_ITEM( - tms570_debug_console_init, - RTEMS_SYSINIT_BSP_START, - RTEMS_SYSINIT_ORDER_LAST -); diff --git a/c/src/lib/libbsp/arm/tms570/console/tms570-sci.c b/c/src/lib/libbsp/arm/tms570/console/tms570-sci.c deleted file mode 100644 index 48986e9a2e..0000000000 --- a/c/src/lib/libbsp/arm/tms570/console/tms570-sci.c +++ /dev/null @@ -1,642 +0,0 @@ -/** - * @file tms570-sci.c - * - * @ingroup tms570 - * - * @brief Serial communication interface (SCI) functions definitions. - */ - -/* - * Copyright (c) 2014 Premysl Houdek <kom541000@gmail.com> - * - * Google Summer of Code 2014 at - * Czech Technical University in Prague - * Zikova 1903/4 - * 166 36 Praha 6 - * Czech Republic - * - * Based on LPC24xx and LPC1768 BSP - * by embedded brains GmbH and others - * - * 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. - */ - -#include <bspopts.h> -#include <termios.h> -#include <rtems/termiostypes.h> -#include <bsp/tms570-sci.h> -#include <bsp/tms570-sci-driver.h> -#include <rtems/console.h> -#include <bsp.h> -#include <bsp/fatal.h> -#include <bsp/irq.h> - -#define TMS570_SCI_BUFFER_SIZE 1 - -/** - * @brief Table including all serial drivers - * - * Definitions of all serial drivers - */ -tms570_sci_context driver_context_table[] = { - { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("TMS570 SCI1"), - .device_name = "/dev/console", - /* TMS570 UART peripheral use subset of LIN registers which are equivalent - * to SCI ones - */ - .regs = (volatile tms570_sci_t *) &TMS570_LIN, - .irq = TMS570_IRQ_SCI_LEVEL_0, - }, - { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("TMS570 SCI2"), - .device_name = "/dev/ttyS1", - .regs = &TMS570_SCI, - .irq = TMS570_IRQ_SCI2_LEVEL_0, - } -}; - -void tms570_sci_initialize(tms570_sci_context *ctx) -{ - uint32_t rx_pin = 1 << 1; - uint32_t tx_pin = 1 << 2; - - /* Resec SCI peripheral */ - ctx->regs->GCR0 = TMS570_SCI_GCR0_RESET * 0; - ctx->regs->GCR0 = TMS570_SCI_GCR0_RESET * 1; - - /* Clear all interrupt sources */ - ctx->regs->CLEARINT = 0xffffffff; - - /* Map all interrupts to SCI INT0 line */ - ctx->regs->CLEARINTLVL = 0xffffffff; - - ctx->regs->GCR1 = TMS570_SCI_GCR1_TXENA * 0 | - TMS570_SCI_GCR1_RXENA * 0 | - TMS570_SCI_GCR1_CONT * 0 | /* continue operation when debugged */ - TMS570_SCI_GCR1_LOOP_BACK * 0 | - TMS570_SCI_GCR1_POWERDOWN * 0 | - TMS570_SCI_GCR1_SLEEP * 0 | - TMS570_SCI_GCR1_SWnRST * 0 | /* reset state */ - TMS570_SCI_GCR1_CLOCK * 1 | /* internal clock */ - TMS570_SCI_GCR1_TIMING_MODE * 1 | - TMS570_SCI_GCR1_COMM_MODE * 0; - - /* Setup connection of SCI peripheral Rx and Tx pins */ - ctx->regs->PIO0 = rx_pin * 1 | tx_pin * 1; /* Rx and Tx pins are not GPIO */ - ctx->regs->PIO3 = rx_pin * 0 | tx_pin * 0; /* Default output low */ - ctx->regs->PIO1 = rx_pin * 0 | tx_pin * 0; /* Input when not used by SCI */ - ctx->regs->PIO6 = rx_pin * 0 | tx_pin * 0; /* No open drain */ - ctx->regs->PIO7 = rx_pin * 0 | tx_pin * 0; /* Pull-up/down enabled */ - ctx->regs->PIO8 = rx_pin * 1 | tx_pin * 1; /* Select pull-up */ - - /* Bring device out of software reset */ - ctx->regs->GCR1 |= TMS570_SCI_GCR1_SWnRST; -} - -/** - * @brief Serial drivers init function - * - * Initialize all serial drivers specified in driver_context_table - * - * @param[in] major - * @param[in] minor - * @param[in] arg - * @retval RTEMS_SUCCESSFUL Initialization completed - */ -rtems_device_driver console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code sc; -#if CONSOLE_USE_INTERRUPTS - const rtems_termios_device_handler *handler = &tms570_sci_handler_interrupt; -#else - const rtems_termios_device_handler *handler = &tms570_sci_handler_polled; -#endif - - /* - * Initialize the Termios infrastructure. If Termios has already - * been initialized by another device driver, then this call will - * have no effect. - */ - rtems_termios_initialize(); - - /* Initialize each device */ - for ( - minor = 0; - minor < RTEMS_ARRAY_SIZE(driver_context_table); - ++minor - ) { - tms570_sci_context *ctx = &driver_context_table[minor]; - - tms570_sci_initialize(ctx); - - /* - * Install this device in the file system and Termios. In order - * to use the console (i.e. being able to do printf, scanf etc. - * on stdin, stdout and stderr), one device must be registered as - * "/dev/console" (CONSOLE_DEVICE_NAME). - */ - sc = rtems_termios_device_install( - ctx->device_name, - handler, - NULL, - &ctx->base - ); - if ( sc != RTEMS_SUCCESSFUL ) { - bsp_fatal(BSP_FATAL_CONSOLE_NO_DEV); - } - } - return RTEMS_SUCCESSFUL; -} - -/** - * @brief Reads chars from HW - * - * Reads chars from HW peripheral specified in driver context. - * TMS570 does not have HW buffer for serial line so this function can - * return only 0 or 1 char - * - * @param[in] ctx context of the driver - * @param[out] buf read data buffer - * @param[in] N size of buffer - * @retval x Number of read chars from peripherals - */ -static int tms570_sci_read_received_chars( - tms570_sci_context * ctx, - char * buf, - int N) -{ - if ( N < 1 ) { - return 0; - } - if ( ctx->regs->RD != 0 ) { - buf[0] = ctx->regs->RD; - return 1; - } - return 0; -} - -/** - * @brief Enables RX interrupt - * - * Enables RX interrupt source of SCI peripheral - * specified in the driver context. - * - * @param[in] ctx context of the driver - * @retval Void - */ -static void tms570_sci_enable_interrupts(tms570_sci_context * ctx) -{ - ctx->regs->SETINT = TMS570_SCI_SETINT_SET_RX_INT; -} - -/** - * @brief Disables RX interrupt - * - * Disables RX interrupt source of SCI peripheral specified in the driver - * context. - * - * @param[in] ctx context of the driver - * @retval Void - */ -static void tms570_sci_disable_interrupts(tms570_sci_context * ctx) -{ - ctx->regs->CLEARINT = TMS570_SCI_CLEARINT_CLR_RX_INT; -} - -/** - * @brief Check whether driver has put char in HW - * - * Check whether driver has put char in HW. - * This information is read from the driver context not from a peripheral. - * TMS570 does not have write data buffer asociated with SCI - * so the return can be only 0 or 1. - * - * @param[in] ctx context of the driver - * @retval x - */ -static int tms570_sci_transmitted_chars(tms570_sci_context * ctx) -{ - int ret; - - ret = ctx->tx_chars_in_hw; - if ( ret == 1 ) { - ctx->tx_chars_in_hw = 0; - return 1; - } - return ret; -} - -/** - * @brief Set attributes of the HW peripheral - * - * Sets attributes of the HW peripheral (parity, baud rate, etc.) - * - * @param[in] base context of the driver - * @param[in] t termios driver - * @retval true peripheral setting is changed - */ -bool tms570_sci_set_attributes( - rtems_termios_device_context *base, - const struct termios *t -) -{ - tms570_sci_context *ctx = (tms570_sci_context *) base; - rtems_interrupt_lock_context lock_context; - int32_t bauddiv; - int32_t baudrate; - uint32_t flr_tx_ready = TMS570_SCI_FLR_TX_EMPTY; - /* - * Test for TMS570_SCI_FLR_TXRDY is not necessary - * because both SCITD and SCITXSHF has to be empty - * to TX_EMPTY be asserted. But there is no interrupt - * option for TX_EMPTY. Polling is used isntead. - */ - - /* Baud rate */ - baudrate = rtems_termios_baud_to_number(cfgetospeed(t)); - - rtems_termios_device_lock_acquire(base, &lock_context); - - while ( (ctx->regs->GCR1 & TMS570_SCI_GCR1_TXENA) && - (ctx->regs->FLR & flr_tx_ready) != flr_tx_ready) { - /* - * There are pending characters in the hardware, - * change in the middle of the character Tx leads - * to disturb of the character and SCI engine - */ - rtems_interval tw; - - rtems_termios_device_lock_release(base, &lock_context); - - tw = rtems_clock_get_ticks_per_second(); - tw = tw * 5 / baudrate + 1; - rtems_task_wake_after( tw ); - - rtems_termios_device_lock_acquire(base, &lock_context); - } - - ctx->regs->GCR1 &= ~( TMS570_SCI_GCR1_SWnRST | TMS570_SCI_GCR1_TXENA | - TMS570_SCI_GCR1_RXENA ); - - ctx->regs->GCR1 &= ~TMS570_SCI_GCR1_STOP; /*one stop bit*/ - ctx->regs->FORMAT = TMS570_SCI_FORMAT_CHAR(0x7); - - switch ( t->c_cflag & ( PARENB|PARODD ) ) { - case ( PARENB|PARODD ): - /* Odd parity */ - ctx->regs->GCR1 &= ~TMS570_SCI_GCR1_PARITY; - ctx->regs->GCR1 |= TMS570_SCI_GCR1_PARITY_ENA; - break; - - case PARENB: - /* Even parity */ - ctx->regs->GCR1 |= TMS570_SCI_GCR1_PARITY; - ctx->regs->GCR1 |= TMS570_SCI_GCR1_PARITY_ENA; - break; - - default: - case 0: - case PARODD: - /* No Parity */ - ctx->regs->GCR1 &= ~TMS570_SCI_GCR1_PARITY_ENA; - } - - /* Apply baudrate to the hardware */ - baudrate *= 2 * 16; - bauddiv = (BSP_PLL_OUT_CLOCK + baudrate / 2) / baudrate; - ctx->regs->BRS = bauddiv; - - ctx->regs->GCR1 |= TMS570_SCI_GCR1_SWnRST | TMS570_SCI_GCR1_TXENA | - TMS570_SCI_GCR1_RXENA; - - rtems_termios_device_lock_release(base, &lock_context); - - return true; -} - -/** - * @brief sci interrupt handler - * - * Handler checks which interrupt occured and provides nessesary maintenance - * dequeue characters in termios driver whether character is send succesfully - * enqueue characters in termios driver whether character is recieved - * - * @param[in] arg rtems_termios_tty - * @retval Void - */ -static void tms570_sci_interrupt_handler(void * arg) -{ - rtems_termios_tty *tty = arg; - tms570_sci_context *ctx = rtems_termios_get_device_context(tty); - char buf[TMS570_SCI_BUFFER_SIZE]; - size_t n; - - /* - * Check if we have received something. - */ - if ( (ctx->regs->FLR & TMS570_SCI_FLR_RXRDY ) == TMS570_SCI_FLR_RXRDY ) { - n = tms570_sci_read_received_chars(ctx, buf, TMS570_SCI_BUFFER_SIZE); - if ( n > 0 ) { - /* Hand the data over to the Termios infrastructure */ - rtems_termios_enqueue_raw_characters(tty, buf, n); - } - } - /* - * Check if we have something transmitted. - */ - if ( (ctx->regs->FLR & TMS570_SCI_FLR_TXRDY ) == TMS570_SCI_FLR_TXRDY ) { - n = tms570_sci_transmitted_chars(ctx); - if ( n > 0 ) { - /* - * Notify Termios that we have transmitted some characters. It - * will call now the interrupt write function if more characters - * are ready for transmission. - */ - rtems_termios_dequeue_characters(tty, n); - } - } -} - -/** - * @brief sci write function called from interrupt - * - * Nonblocking write function. Writes characters to HW peripheral - * TMS570 does not have write data buffer asociated with SCI - * so only one character can be written. - * - * @param[in] base context of the driver - * @param[in] buf buffer of characters pending to send - * @param[in] len size of the buffer - * @retval Void - */ -static void tms570_sci_interrupt_write( - rtems_termios_device_context *base, - const char *buf, - size_t len -) -{ - tms570_sci_context *ctx = (tms570_sci_context *) base; - - if ( len > 0 ) { - /* start UART TX, this will result in an interrupt when done */ - ctx->regs->TD = *buf; - /* character written - raise count*/ - ctx->tx_chars_in_hw = 1; - /* Enable TX interrupt (interrupt is edge-triggered) */ - ctx->regs->SETINT = (1<<8); - - } else { - /* No more to send, disable TX interrupts */ - ctx->regs->CLEARINT = (1<<8); - /* Tell close that we sent everything */ - } -} - -/** - * @brief sci write function - * - * Blocking write function. Waits until HW peripheral is ready and then writes - * character to HW peripheral. Writes all characters in the buffer. - * - * @param[in] base context of the driver - * @param[in] buf buffer of characters pending to send - * @param[in] len size of the buffer - * @retval Void - */ -static void tms570_sci_poll_write( - rtems_termios_device_context *base, - const char *buf, - size_t n -) -{ - tms570_sci_context *ctx = (tms570_sci_context *) base; - size_t i; - - /* Write */ - - for ( i = 0; i < n; ++i ) { - while ( (ctx->regs->FLR & TMS570_SCI_FLR_TX_EMPTY ) == 0) { - ; - } - ctx->regs->TD = buf[i]; - } -} - -/** - * @brief See if there is recieved charakter to read - * - * read the RX flag from peripheral specified in context - * - * @param[in] ctx context of the driver - * @retval 0 No character to read - * @retval x Character ready to read - */ -static int TMS570_sci_can_read_char( - tms570_sci_context * ctx -) -{ - return ctx->regs->FLR & TMS570_SCI_FLR_RXRDY; -} - -/** - * @brief reads character from peripheral - * - * reads the recieved character from peripheral specified in context - * - * @param[in] ctx context of the driver - * @retval x Character - */ -static char TMS570_sci_read_char( - tms570_sci_context * ctx -) -{ - return ctx->regs->RD; -} - -/** - * @brief sci read function - * - * check if there is recieved character to be read and reads it. - * - * @param[in] base context of the driver - * @retval -1 No character to be read - * @retval x Read character - */ -static int tms570_sci_poll_read(rtems_termios_device_context *base) -{ - tms570_sci_context *ctx = (tms570_sci_context *) base; - - /* Check if a character is available */ - if ( TMS570_sci_can_read_char(ctx) ) { - return TMS570_sci_read_char(ctx); - } else { - return -1; - } -} - -/** - * @brief initialization of the driver - * - * initialization of the HW peripheral specified in contex of the driver. - * This function is called only once when opening the driver. - * - * @param[in] tty Termios control - * @param[in] ctx context of the driver - * @param[in] term Termios attributes - * @param[in] args - * @retval false Error occured during initialization - * @retval true Driver is open and ready - */ -static bool tms570_sci_poll_first_open( - rtems_termios_tty *tty, - rtems_termios_device_context *ctx, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - bool ok; - - rtems_termios_set_best_baud(term, TMS570_SCI_BAUD_RATE); - ok = tms570_sci_set_attributes(ctx, term); - if ( !ok ) { - return false; - } - return true; -} - -/** - * @brief initialization of the interrupt driven driver - * - * calls tms570_sci_poll_first_open function. - * install and enables interrupts. - * - * @param[in] tty Termios control - * @param[in] base context of the driver - * @param[in] args - * @retval false Error occured during initialization - * @retval true Driver is open and ready - */ -static bool tms570_sci_interrupt_first_open( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ - tms570_sci_context *ctx = (tms570_sci_context *) base; - rtems_status_code sc; - bool ret; - - ret = tms570_sci_poll_first_open(tty, base, term, args); - if ( ret == false ) { - return false; - } - - /* Register Interrupt handler */ - sc = rtems_interrupt_handler_install(ctx->irq, - ctx->device_name, - RTEMS_INTERRUPT_SHARED, - tms570_sci_interrupt_handler, - tty - ); - if ( sc != RTEMS_SUCCESSFUL ) { - return false; - } - tms570_sci_enable_interrupts(ctx); - return true; -} - -/** - * @brief closes sci peripheral - * - * @param[in] tty Termios control - * @param[in] base context of the driver - * @param[in] args - * @retval false Error occured during initialization - * @retval true Driver is open and ready - */ -static void tms570_sci_poll_last_close( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ - ; -} - -/** - * @brief closes sci peripheral of interrupt driven driver - * - * calls tms570_sci_poll_last_close and disables interrupts - * - * @param[in] tty Termios control - * @param[in] base context of the driver - * @param[in] args - * @retval false Error occured during initialization - * @retval true Driver is open and ready - */ -static void tms570_sci_interrupt_last_close( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ - tms570_sci_context *ctx = (tms570_sci_context *) base; - rtems_interrupt_lock_context lock_context; - rtems_interval tw; - int32_t baudrate; - - /* Turn off RX interrupts */ - rtems_termios_device_lock_acquire(base, &lock_context); - tms570_sci_disable_interrupts(ctx); - rtems_termios_device_lock_release(base, &lock_context); - - tw = rtems_clock_get_ticks_per_second(); - baudrate = rtems_termios_baud_to_number(cfgetospeed(&tty->termios)); - tw = tw * 10 / baudrate + 1; - while ( ( ctx->regs->FLR & TMS570_SCI_FLR_TX_EMPTY ) == 0 ) { - rtems_task_wake_after(tw); - } - - /* uninstall ISR */ - rtems_interrupt_handler_remove(ctx->irq, tms570_sci_interrupt_handler, tty); - - tms570_sci_poll_last_close(tty, base, args); -} - -/** - * @brief Struct containing definitions of polled driver functions. - * - * Encapsulates polled driver functions. - * Use of this table is determited by not defining TMS570_USE_INTERRUPTS - */ -const rtems_termios_device_handler tms570_sci_handler_polled = { - .first_open = tms570_sci_poll_first_open, - .last_close = tms570_sci_poll_last_close, - .poll_read = tms570_sci_poll_read, - .write = tms570_sci_poll_write, - .set_attributes = tms570_sci_set_attributes, - .mode = TERMIOS_POLLED -}; - -/** - * @brief Struct containing definitions of interrupt driven driver functions. - * - * Encapsulates interrupt driven driver functions. - * Use of this table is determited by defining TMS570_USE_INTERRUPTS - */ -const rtems_termios_device_handler tms570_sci_handler_interrupt = { - .first_open = tms570_sci_interrupt_first_open, - .last_close = tms570_sci_interrupt_last_close, - .poll_read = NULL, - .write = tms570_sci_interrupt_write, - .set_attributes = tms570_sci_set_attributes, - .mode = TERMIOS_IRQ_DRIVEN -}; diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/Makefile.am b/c/src/lib/libbsp/arm/xilinx-zynq/Makefile.am index 823c92be4b..0b468fd12e 100644 --- a/c/src/lib/libbsp/arm/xilinx-zynq/Makefile.am +++ b/c/src/lib/libbsp/arm/xilinx-zynq/Makefile.am @@ -59,10 +59,10 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += ../shared/arm-gic-irq.c # Console -librtemsbsp_a_SOURCES += ../../shared/console-termios.c -librtemsbsp_a_SOURCES += console/console-config.c -librtemsbsp_a_SOURCES += console/debug-console.c -librtemsbsp_a_SOURCES += console/zynq-uart.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/xilinx-zynq/console/console-config.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/xilinx-zynq/console/debug-console.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/xilinx-zynq/console/zynq-uart.c # Clock librtemsbsp_a_SOURCES += ../shared/arm-a9mpcore-clock-config.c diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/console/console-config.c b/c/src/lib/libbsp/arm/xilinx-zynq/console/console-config.c deleted file mode 100644 index ce7da2f114..0000000000 --- a/c/src/lib/libbsp/arm/xilinx-zynq/console/console-config.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@embedded-brains.de> - * - * 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. - */ - -#include <rtems/console.h> -#include <rtems/bspIo.h> - -#include <bsp/irq.h> -#include <bsp/zynq-uart.h> - -#include <bspopts.h> - -zynq_uart_context zynq_uart_instances[2] = { - { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER( "Zynq UART 0" ), - .regs = (volatile struct zynq_uart *) 0xe0000000, - .irq = ZYNQ_IRQ_UART_0 - }, { - .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER( "Zynq UART 1" ), - .regs = (volatile struct zynq_uart *) 0xe0001000, - .irq = ZYNQ_IRQ_UART_1 - } -}; - -rtems_status_code console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - size_t i; - - rtems_termios_initialize(); - - for (i = 0; i < RTEMS_ARRAY_SIZE(zynq_uart_instances); ++i) { - char uart[] = "/dev/ttySX"; - - uart[sizeof(uart) - 2] = (char) ('0' + i); - rtems_termios_device_install( - &uart[0], - &zynq_uart_handler, - NULL, - &zynq_uart_instances[i].base - ); - - if (i == BSP_CONSOLE_MINOR) { - link(&uart[0], CONSOLE_DEVICE_NAME); - } - } - - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/console/debug-console.c b/c/src/lib/libbsp/arm/xilinx-zynq/console/debug-console.c deleted file mode 100644 index 38c0050e90..0000000000 --- a/c/src/lib/libbsp/arm/xilinx-zynq/console/debug-console.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * 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. - */ - -#include <rtems/bspIo.h> -#include <rtems/sysinit.h> - -#include <bsp/zynq-uart.h> - -#include <bspopts.h> - -static void zynq_debug_console_out(char c) -{ - rtems_termios_device_context *base = - &zynq_uart_instances[BSP_CONSOLE_MINOR].base; - - zynq_uart_write_polled(base, c); -} - -static void zynq_debug_console_init(void) -{ - rtems_termios_device_context *base = - &zynq_uart_instances[BSP_CONSOLE_MINOR].base; - - zynq_uart_initialize(base); - BSP_output_char = zynq_debug_console_out; -} - -static void zynq_debug_console_early_init(char c) -{ - rtems_termios_device_context *base = - &zynq_uart_instances[BSP_CONSOLE_MINOR].base; - - zynq_uart_initialize(base); - zynq_debug_console_out(c); -} - -static int zynq_debug_console_in(void) -{ - rtems_termios_device_context *base = - &zynq_uart_instances[BSP_CONSOLE_MINOR].base; - - return zynq_uart_read_polled(base); -} - -BSP_output_char_function_type BSP_output_char = zynq_debug_console_early_init; - -BSP_polling_getchar_function_type BSP_poll_char = zynq_debug_console_in; - -RTEMS_SYSINIT_ITEM( - zynq_debug_console_init, - RTEMS_SYSINIT_BSP_START, - RTEMS_SYSINIT_ORDER_LAST -); diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c b/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c deleted file mode 100644 index fa91f3f46e..0000000000 --- a/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@embedded-brains.de> - * - * 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. - */ - -#include <bsp/zynq-uart.h> -#include <bsp/zynq-uart-regs.h> -#include <bsp/irq.h> - -#include <bspopts.h> - -/* - * Make weak and let the user override. - */ -uint32_t zynq_uart_input_clock(void) __attribute__ ((weak)); - -uint32_t zynq_uart_input_clock(void) -{ - return ZYNQ_CLOCK_UART; -} - -static int zynq_cal_baud_rate(uint32_t baudrate, - uint32_t* brgr, - uint32_t* bauddiv, - uint32_t modereg) -{ - uint32_t brgr_value; /* Calculated value for baud rate generator */ - uint32_t calcbaudrate; /* Calculated baud rate */ - uint32_t bauderror; /* Diff between calculated and requested baud rate */ - uint32_t best_error = 0xFFFFFFFF; - uint32_t percenterror; - uint32_t bdiv; - uint32_t inputclk = zynq_uart_input_clock(); - - /* - * Make sure the baud rate is not impossilby large. - * Fastest possible baud rate is Input Clock / 2. - */ - if ((baudrate * 2) > inputclk) { - return -1; - } - /* - * Check whether the input clock is divided by 8 - */ - if(modereg & ZYNQ_UART_MODE_CLKS) { - inputclk = inputclk / 8; - } - - /* - * Determine the Baud divider. It can be 4to 254. - * Loop through all possible combinations - */ - for (bdiv = 4; bdiv < 255; bdiv++) { - - /* - * Calculate the value for BRGR register - */ - brgr_value = inputclk / (baudrate * (bdiv + 1)); - - /* - * Calculate the baud rate from the BRGR value - */ - calcbaudrate = inputclk/ (brgr_value * (bdiv + 1)); - - /* - * Avoid unsigned integer underflow - */ - if (baudrate > calcbaudrate) { - bauderror = baudrate - calcbaudrate; - } - else { - bauderror = calcbaudrate - baudrate; - } - - /* - * Find the calculated baud rate closest to requested baud rate. - */ - if (best_error > bauderror) { - *brgr = brgr_value; - *bauddiv = bdiv; - best_error = bauderror; - } - } - - /* - * Make sure the best error is not too large. - */ - percenterror = (best_error * 100) / baudrate; -#define XUARTPS_MAX_BAUD_ERROR_RATE 3 /* max % error allowed */ - if (XUARTPS_MAX_BAUD_ERROR_RATE < percenterror) { - return -1; - } - - return 0; -} - -void zynq_uart_initialize(rtems_termios_device_context *base) -{ - zynq_uart_context *ctx = (zynq_uart_context *) base; - volatile zynq_uart *regs = ctx->regs; - uint32_t brgr = 0x3e; - uint32_t bauddiv = 0x6; - - zynq_cal_baud_rate(ZYNQ_UART_DEFAULT_BAUD, &brgr, &bauddiv, regs->mode); - - regs->control &= ~(ZYNQ_UART_CONTROL_RXEN | ZYNQ_UART_CONTROL_TXEN); - regs->control = ZYNQ_UART_CONTROL_RXDIS - | ZYNQ_UART_CONTROL_TXDIS - | ZYNQ_UART_CONTROL_RXRES - | ZYNQ_UART_CONTROL_TXRES; - regs->mode = ZYNQ_UART_MODE_CHMODE(ZYNQ_UART_MODE_CHMODE_NORMAL) - | ZYNQ_UART_MODE_PAR(ZYNQ_UART_MODE_PAR_NONE) - | ZYNQ_UART_MODE_CHRL(ZYNQ_UART_MODE_CHRL_8); - regs->baud_rate_gen = ZYNQ_UART_BAUD_RATE_GEN_CD(brgr); - regs->baud_rate_div = ZYNQ_UART_BAUD_RATE_DIV_BDIV(bauddiv); - regs->rx_fifo_trg_lvl = ZYNQ_UART_RX_FIFO_TRG_LVL_RTRIG(0); - regs->rx_timeout = ZYNQ_UART_RX_TIMEOUT_RTO(0); - regs->control = ZYNQ_UART_CONTROL_RXEN - | ZYNQ_UART_CONTROL_TXEN - | ZYNQ_UART_CONTROL_RSTTO; -} - -#ifdef ZYNQ_CONSOLE_USE_INTERRUPTS -static void zynq_uart_interrupt(void *arg) -{ - rtems_termios_tty *tty = arg; - zynq_uart_context *ctx = rtems_termios_get_device_context(tty); - volatile zynq_uart *regs = ctx->regs; - uint32_t channel_sts; - - if ((regs->irq_sts & (ZYNQ_UART_TIMEOUT | ZYNQ_UART_RTRIG)) != 0) { - regs->irq_sts = ZYNQ_UART_TIMEOUT | ZYNQ_UART_RTRIG; - - do { - char c = (char) ZYNQ_UART_TX_RX_FIFO_FIFO_GET(regs->tx_rx_fifo); - - rtems_termios_enqueue_raw_characters(tty, &c, 1); - - channel_sts = regs->channel_sts; - } while ((channel_sts & ZYNQ_UART_CHANNEL_STS_REMPTY) == 0); - } else { - channel_sts = regs->channel_sts; - } - - if (ctx->transmitting && (channel_sts & ZYNQ_UART_CHANNEL_STS_TEMPTY) != 0) { - rtems_termios_dequeue_characters(tty, 1); - } -} -#endif - -static bool zynq_uart_first_open( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - struct termios *term, - rtems_libio_open_close_args_t *args -) -{ -#ifdef ZYNQ_CONSOLE_USE_INTERRUPTS - zynq_uart_context *ctx = (zynq_uart_context *) base; - volatile zynq_uart *regs = ctx->regs; - rtems_status_code sc; -#endif - - rtems_termios_set_initial_baud(tty, ZYNQ_UART_DEFAULT_BAUD); - zynq_uart_initialize(base); - -#ifdef ZYNQ_CONSOLE_USE_INTERRUPTS - regs->rx_timeout = 32; - regs->rx_fifo_trg_lvl = ZYNQ_UART_FIFO_DEPTH / 2; - regs->irq_dis = 0xffffffff; - regs->irq_sts = 0xffffffff; - regs->irq_en = ZYNQ_UART_RTRIG | ZYNQ_UART_TIMEOUT; - sc = rtems_interrupt_handler_install( - ctx->irq, - "UART", - RTEMS_INTERRUPT_SHARED, - zynq_uart_interrupt, - tty - ); - if (sc != RTEMS_SUCCESSFUL) { - return false; - } -#endif - - return true; -} - -#ifdef ZYNQ_CONSOLE_USE_INTERRUPTS -static void zynq_uart_last_close( - rtems_termios_tty *tty, - rtems_termios_device_context *base, - rtems_libio_open_close_args_t *args -) -{ - zynq_uart_context *ctx = (zynq_uart_context *) base; - - rtems_interrupt_handler_remove(ctx->irq, zynq_uart_interrupt, tty); -} -#endif - -int zynq_uart_read_polled(rtems_termios_device_context *base) -{ - zynq_uart_context *ctx = (zynq_uart_context *) base; - volatile zynq_uart *regs = ctx->regs; - - if ((regs->channel_sts & ZYNQ_UART_CHANNEL_STS_REMPTY) != 0) { - return -1; - } else { - return ZYNQ_UART_TX_RX_FIFO_FIFO_GET(regs->tx_rx_fifo); - } -} - -void zynq_uart_write_polled( - rtems_termios_device_context *base, - char c -) -{ - zynq_uart_context *ctx = (zynq_uart_context *) base; - volatile zynq_uart *regs = ctx->regs; - - while ((regs->channel_sts & ZYNQ_UART_CHANNEL_STS_TFUL) != 0) { - /* Wait */ - } - - regs->tx_rx_fifo = ZYNQ_UART_TX_RX_FIFO_FIFO(c); -} - -static void zynq_uart_write_support( - rtems_termios_device_context *base, - const char *buf, - size_t len -) -{ -#ifdef ZYNQ_CONSOLE_USE_INTERRUPTS - zynq_uart_context *ctx = (zynq_uart_context *) base; - volatile zynq_uart *regs = ctx->regs; - - if (len > 0) { - ctx->transmitting = true; - regs->irq_sts = ZYNQ_UART_TEMPTY; - regs->irq_en = ZYNQ_UART_TEMPTY; - regs->tx_rx_fifo = ZYNQ_UART_TX_RX_FIFO_FIFO(buf[0]); - } else { - ctx->transmitting = false; - regs->irq_dis = ZYNQ_UART_TEMPTY; - } -#else - ssize_t i; - - for (i = 0; i < len; ++i) { - zynq_uart_write_polled(base, buf[i]); - } -#endif -} - -static bool zynq_uart_set_attributes( - rtems_termios_device_context *context, - const struct termios *term -) -{ -#if 0 - volatile zynq_uart *regs = zynq_uart_get_regs(minor); - uint32_t brgr = 0; - uint32_t bauddiv = 0; - int rc; - - rc = zynq_cal_baud_rate(115200, &brgr, &bauddiv, regs->mode); - if (rc != 0) - return rc; - - regs->control &= ~(ZYNQ_UART_CONTROL_RXEN | ZYNQ_UART_CONTROL_TXEN); - regs->baud_rate_gen = ZYNQ_UART_BAUD_RATE_GEN_CD(brgr); - regs->baud_rate_div = ZYNQ_UART_BAUD_RATE_DIV_BDIV(bauddiv); - regs->control |= ZYNQ_UART_CONTROL_RXEN | ZYNQ_UART_CONTROL_TXEN; - - return true; -#else - return false; -#endif -} - -const rtems_termios_device_handler zynq_uart_handler = { - .first_open = zynq_uart_first_open, - .set_attributes = zynq_uart_set_attributes, - .write = zynq_uart_write_support, -#ifdef ZYNQ_CONSOLE_USE_INTERRUPTS - .last_close = zynq_uart_last_close, - .mode = TERMIOS_IRQ_DRIVEN -#else - .poll_read = zynq_uart_read_polled, - .mode = TERMIOS_POLLED -#endif -}; - -void zynq_uart_reset_tx_flush(zynq_uart_context *ctx) -{ - volatile zynq_uart *regs = ctx->regs; - int c = 4; - - while (c-- > 0) - zynq_uart_write_polled(&ctx->base, '\r'); - - while ((regs->channel_sts & ZYNQ_UART_CHANNEL_STS_TEMPTY) == 0) { - /* Wait */ - } -} |