diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-10-07 08:29:16 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-10-07 16:35:20 +0200 |
commit | 6ec438e8a323cf623cdaecce6f2b3b52b062881a (patch) | |
tree | 8cd71b9fb974897a825b36ea1f070dd4405af46f /c/src/lib/libbsp/powerpc/qoriq | |
parent | bsps: Add Termios console driver initialization (diff) | |
download | rtems-6ec438e8a323cf623cdaecce6f2b3b52b062881a.tar.bz2 |
libchip/serial: Add alternative NS16550 driver
Use the Termios device API.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/qoriq')
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/Makefile.am | 14 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/console/console-config.c | 195 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-master.c | 88 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c | 114 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/include/uart-bridge.h | 18 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c | 40 |
6 files changed, 217 insertions, 252 deletions
diff --git a/c/src/lib/libbsp/powerpc/qoriq/Makefile.am b/c/src/lib/libbsp/powerpc/qoriq/Makefile.am index ebd4160c41..97d97a25ec 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/Makefile.am +++ b/c/src/lib/libbsp/powerpc/qoriq/Makefile.am @@ -92,15 +92,11 @@ libbsp_a_SOURCES += ../../shared/src/irq-shell.c libbsp_a_SOURCES += irq/irq.c # Console -libbsp_a_SOURCES += ../../shared/console.c \ - ../../shared/console_select.c \ - console/uart-bridge-master.c \ - console/uart-bridge-slave.c \ - console/console-config.c \ - ../../shared/console_read.c \ - ../../shared/console_write.c \ - ../../shared/console_control.c - +libbsp_a_SOURCES += ../../shared/console-termios-init.c +libbsp_a_SOURCES += ../../shared/console-termios.c +libbsp_a_SOURCES += console/uart-bridge-master.c +libbsp_a_SOURCES += console/uart-bridge-slave.c +libbsp_a_SOURCES += console/console-config.c # RTC libbsp_a_SOURCES += ../../shared/tod.c \ diff --git a/c/src/lib/libbsp/powerpc/qoriq/console/console-config.c b/c/src/lib/libbsp/powerpc/qoriq/console/console-config.c index 6260fd3802..1abefe8462 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/console/console-config.c +++ b/c/src/lib/libbsp/powerpc/qoriq/console/console-config.c @@ -7,10 +7,10 @@ */ /* - * Copyright (c) 2010 embedded brains GmbH. All rights reserved. + * Copyright (c) 2010-2014 embedded brains GmbH. All rights reserved. * * embedded brains GmbH - * Obere Lagerstr. 30 + * Dornierstr. 4 * 82178 Puchheim * Germany * <rtems@embedded-brains.de> @@ -20,25 +20,16 @@ * http://www.rtems.org/license/LICENSE. */ -#include <assert.h> - #include <rtems/bspIo.h> -#include <libchip/serial.h> #include <libchip/ns16550.h> -#include "../../../shared/console_private.h" -#include <bspopts.h> +#include <bsp.h> #include <bsp/irq.h> #include <bsp/qoriq.h> #include <bsp/intercom.h> #include <bsp/uart-bridge.h> - -#define CONSOLE_COUNT \ - (QORIQ_UART_0_ENABLE \ - + QORIQ_UART_1_ENABLE \ - + QORIQ_UART_BRIDGE_0_ENABLE \ - + QORIQ_UART_BRIDGE_1_ENABLE) +#include <bsp/console-termios.h> #if (QORIQ_UART_0_ENABLE + QORIQ_UART_BRIDGE_0_ENABLE == 2) \ || (QORIQ_UART_1_ENABLE + QORIQ_UART_BRIDGE_1_ENABLE == 2) @@ -47,158 +38,156 @@ #define BRIDGE_SLAVE #endif +#ifdef BSP_USE_UART_INTERRUPTS + #define DEVICE_FNS &ns16550_handler_interrupt +#else + #define DEVICE_FNS &ns16550_handler_polled +#endif + +#if QORIQ_UART_0_ENABLE || QORIQ_UART_1_ENABLE + static uint8_t get_register(uintptr_t addr, uint8_t i) + { + volatile uint8_t *reg = (uint8_t *) addr; + + return reg [i]; + } + + static void set_register(uintptr_t addr, uint8_t i, uint8_t val) + { + volatile uint8_t *reg = (uint8_t *) addr; + + reg [i] = val; + } +#endif + +#if QORIQ_UART_0_ENABLE +static ns16550_context qoriq_uart_context_0 = { + .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 0"), + .get_reg = get_register, + .set_reg = set_register, + .port = (uintptr_t) &qoriq.uart_0, + .irq = QORIQ_IRQ_DUART, + .initial_baud = BSP_CONSOLE_BAUD +}; +#endif + +#if QORIQ_UART_1_ENABLE +static ns16550_context qoriq_uart_context_1 = { + .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART 1"), + .get_reg = get_register, + .set_reg = set_register, + .port = (uintptr_t) &qoriq.uart_1, + .irq = QORIQ_IRQ_DUART, + .initial_baud = BSP_CONSOLE_BAUD +}; +#endif + #ifdef BRIDGE_MASTER + #define BRIDGE_PROBE qoriq_uart_bridge_master_probe #define BRIDGE_FNS &qoriq_uart_bridge_master #if QORIQ_UART_BRIDGE_0_ENABLE - static uart_bridge_master_control bridge_0_control = { + static uart_bridge_master_context bridge_0_context = { + .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART Bridge 0"), .device_path = "/dev/ttyS0", .type = INTERCOM_TYPE_UART_0, .transmit_fifo = RTEMS_CHAIN_INITIALIZER_EMPTY( - bridge_0_control.transmit_fifo + bridge_0_context.transmit_fifo ) }; - #define BRIDGE_0_CONTROL &bridge_0_control + #define BRIDGE_0_CONTEXT &bridge_0_context #endif #if QORIQ_UART_BRIDGE_1_ENABLE - static uart_bridge_master_control bridge_1_control = { + static uart_bridge_master_context bridge_1_context = { + .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART Bridge 1"), .device_path = "/dev/ttyS1", .type = INTERCOM_TYPE_UART_1, .transmit_fifo = RTEMS_CHAIN_INITIALIZER_EMPTY( - bridge_1_control.transmit_fifo + bridge_1_context.transmit_fifo ) }; - #define BRIDGE_1_CONTROL &bridge_1_control + #define BRIDGE_1_CONTEXT &bridge_1_context #endif #endif #ifdef BRIDGE_SLAVE + #define BRIDGE_PROBE console_device_probe_default #define BRIDGE_FNS &qoriq_uart_bridge_slave #if QORIQ_UART_BRIDGE_0_ENABLE - static uart_bridge_slave_control bridge_0_control = { + static uart_bridge_slave_context bridge_0_context = { + .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART Bridge 0"), .type = INTERCOM_TYPE_UART_0, .transmit_fifo = RTEMS_CHAIN_INITIALIZER_EMPTY( - bridge_0_control.transmit_fifo + bridge_0_context.transmit_fifo ) }; - #define BRIDGE_0_CONTROL &bridge_0_control + #define BRIDGE_0_CONTEXT &bridge_0_context #endif #if QORIQ_UART_BRIDGE_1_ENABLE - static uart_bridge_slave_control bridge_1_control = { + static uart_bridge_slave_context bridge_1_context = { + .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART Bridge 1"), .type = INTERCOM_TYPE_UART_1, .transmit_fifo = RTEMS_CHAIN_INITIALIZER_EMPTY( - bridge_1_control.transmit_fifo + bridge_1_context.transmit_fifo ) }; - #define BRIDGE_1_CONTROL &bridge_1_control + #define BRIDGE_1_CONTEXT &bridge_1_context #endif #endif -#ifdef BSP_USE_UART_INTERRUPTS - #define DEVICE_FNS &ns16550_fns -#else - #define DEVICE_FNS &ns16550_fns_polled -#endif - -#if QORIQ_UART_0_ENABLE || QORIQ_UART_1_ENABLE - static uint8_t get_register(uintptr_t addr, uint8_t i) - { - volatile uint8_t *reg = (uint8_t *) addr; - - return reg [i]; - } - - static void set_register(uintptr_t addr, uint8_t i, uint8_t val) - { - volatile uint8_t *reg = (uint8_t *) addr; - - reg [i] = val; - } -#endif - -unsigned long Console_Configuration_Count = CONSOLE_COUNT; -console_tbl Console_Configuration_Ports [CONSOLE_COUNT] = { +const console_device console_device_table[] = { #if QORIQ_UART_0_ENABLE { - .sDeviceName = "/dev/ttyS0", - .deviceType = SERIAL_NS16550, - .pDeviceFns = DEVICE_FNS, - .deviceProbe = NULL, - .pDeviceFlow = NULL, - .ulMargin = 16, - .ulHysteresis = 8, - .pDeviceParams = (void *) BSP_CONSOLE_BAUD, - .ulCtrlPort1 = (uintptr_t) &qoriq.uart_0, - .ulCtrlPort2 = 0, - .ulDataPort = (uintptr_t) &qoriq.uart_0, - .getRegister = get_register, - .setRegister = set_register, - .getData = NULL, - .setData = NULL, - .ulClock = 0, - .ulIntVector = QORIQ_IRQ_DUART + .device_file = "/dev/ttyS0", + .probe = ns16550_probe, + .handler = DEVICE_FNS, + .context = &qoriq_uart_context_0.base }, #endif #if QORIQ_UART_1_ENABLE { - .sDeviceName = "/dev/ttyS1", - .deviceType = SERIAL_NS16550, - .pDeviceFns = DEVICE_FNS, - .deviceProbe = NULL, - .pDeviceFlow = NULL, - .ulMargin = 16, - .ulHysteresis = 8, - .pDeviceParams = (void *) BSP_CONSOLE_BAUD, - .ulCtrlPort1 = (uintptr_t) &qoriq.uart_1, - .ulCtrlPort2 = 0, - .ulDataPort = (uintptr_t) &qoriq.uart_1, - .getRegister = get_register, - .setRegister = set_register, - .getData = NULL, - .setData = NULL, - .ulClock = 0, - .ulIntVector = QORIQ_IRQ_DUART + .device_file = "/dev/ttyS1", + .probe = ns16550_probe, + .handler = DEVICE_FNS, + .context = &qoriq_uart_context_1.base }, #endif #if QORIQ_UART_BRIDGE_0_ENABLE { #if QORIQ_UART_1_ENABLE - .sDeviceName = "/dev/ttyB0", + .device_file = "/dev/ttyB0", #else - .sDeviceName = "/dev/ttyS0", + .device_file = "/dev/ttyS0", #endif - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = BRIDGE_FNS, - .pDeviceParams = BRIDGE_0_CONTROL + .probe = BRIDGE_PROBE, + .handler = BRIDGE_FNS, + .context = BRIDGE_0_CONTEXT }, #endif #if QORIQ_UART_BRIDGE_1_ENABLE { #if QORIQ_UART_1_ENABLE - .sDeviceName = "/dev/ttyB1", + .device_file = "/dev/ttyB1", #else - .sDeviceName = "/dev/ttyS1", + .device_file = "/dev/ttyS1", #endif - .deviceType = SERIAL_CUSTOM, - .pDeviceFns = BRIDGE_FNS, - .pDeviceParams = BRIDGE_1_CONTROL + .probe = BRIDGE_PROBE, + .handler = BRIDGE_FNS, + .context = BRIDGE_1_CONTEXT } #endif }; +const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table); + static void output_char(char c) { - int minor = (int) Console_Port_Minor; - const console_tbl **ct_tbl = Console_Port_Tbl; - - if (ct_tbl != NULL) { - const console_fns *cf = ct_tbl[minor]->pDeviceFns; + rtems_termios_device_context *ctx = console_device_table[0].context; - if (c == '\n') { - (*cf->deviceWritePolled)(minor, '\r'); - } - - (*cf->deviceWritePolled)(minor, c); + if (c == '\n') { + ns16550_polled_putchar(ctx, '\r'); } + + ns16550_polled_putchar(ctx, c); } BSP_output_char_function_type BSP_output_char = output_char; diff --git a/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-master.c b/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-master.c index 939448a795..41ad51779b 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-master.c +++ b/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-master.c @@ -7,10 +7,10 @@ */ /* - * Copyright (c) 2011 embedded brains GmbH. All rights reserved. + * Copyright (c) 2011-2014 embedded brains GmbH. All rights reserved. * * embedded brains GmbH - * Obere Lagerstr. 30 + * Dornierstr. 4 * 82178 Puchheim * Germany * <rtems@embedded-brains.de> @@ -26,8 +26,6 @@ #include <unistd.h> #include <termios.h> -#include <libchip/sersupp.h> - #include <bspopts.h> #include <bsp/uart-bridge.h> @@ -55,12 +53,12 @@ static void serial_settings(int fd) static void uart_bridge_master_service(intercom_packet *packet, void *arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; - uart_bridge_master_control *control = arg; + uart_bridge_master_context *ctx = arg; sc = rtems_chain_append_with_notification( - &control->transmit_fifo, + &ctx->transmit_fifo, &packet->glue.node, - control->transmit_task, + ctx->transmit_task, TRANSMIT_EVENT ); assert(sc == RTEMS_SUCCESSFUL); @@ -68,10 +66,10 @@ static void uart_bridge_master_service(intercom_packet *packet, void *arg) static void receive_task(rtems_task_argument arg) { - uart_bridge_master_control *control = (uart_bridge_master_control *) arg; - intercom_type type = control->type; + uart_bridge_master_context *ctx = (uart_bridge_master_context *) arg; + intercom_type type = ctx->type; - int fd = open(control->device_path, O_RDONLY); + int fd = open(ctx->device_path, O_RDONLY); assert(fd >= 0); serial_settings(fd); @@ -94,10 +92,10 @@ static void receive_task(rtems_task_argument arg) static void transmit_task(rtems_task_argument arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; - uart_bridge_master_control *control = (uart_bridge_master_control *) arg; - rtems_chain_control *fifo = &control->transmit_fifo; + uart_bridge_master_context *ctx = (uart_bridge_master_context *) arg; + rtems_chain_control *fifo = &ctx->transmit_fifo; - int fd = open(control->device_path, O_WRONLY); + int fd = open(ctx->device_path, O_WRONLY); assert(fd >= 0); serial_settings(fd); @@ -119,12 +117,12 @@ static void transmit_task(rtems_task_argument arg) static rtems_id create_task( char name, rtems_task_entry entry, - uart_bridge_master_control *control + uart_bridge_master_context *ctx ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_id task = RTEMS_ID_NONE; - char index = (char) ('0' + control->type - INTERCOM_TYPE_UART_0); + char index = (char) ('0' + ctx->type - INTERCOM_TYPE_UART_0); sc = rtems_task_create( rtems_build_name('U', 'B', name, index), @@ -139,57 +137,45 @@ static rtems_id create_task( sc = rtems_task_start( task, entry, - (rtems_task_argument) control + (rtems_task_argument) ctx ); assert(sc == RTEMS_SUCCESSFUL); return task; } -static void initialize(int minor) +bool qoriq_uart_bridge_master_probe(rtems_termios_device_context *base) { - console_tbl *ct = Console_Port_Tbl [minor]; - uart_bridge_master_control *control = ct->pDeviceParams; - intercom_type type = control->type; - - qoriq_intercom_service_install(type, uart_bridge_master_service, control); - create_task('R', receive_task, control); - control->transmit_task = create_task('T', transmit_task, control); -} + uart_bridge_master_context *ctx = (uart_bridge_master_context *) base; + intercom_type type = ctx->type; -static int first_open(int major, int minor, void *arg) -{ - return -1; -} + qoriq_intercom_service_install(type, uart_bridge_master_service, ctx); + create_task('R', receive_task, ctx); + ctx->transmit_task = create_task('T', transmit_task, ctx); -static int last_close(int major, int minor, void *arg) -{ - return -1; + return true; } -static int read_polled(int minor) -{ - return -1; -} - -static void write_polled(int minor, char c) +static bool first_open( + struct rtems_termios_tty *tty, + rtems_termios_device_context *base, + struct termios *term, + rtems_libio_open_close_args_t *args +) { - /* Do nothing */ + return false; } -static int set_attributes(int minor, const struct termios *term) +static bool set_attributes( + rtems_termios_device_context *base, + const struct termios *term +) { - return -1; + return false; } -const console_fns qoriq_uart_bridge_master = { - .deviceProbe = libchip_serial_default_probe, - .deviceFirstOpen = first_open, - .deviceLastClose = last_close, - .deviceRead = read_polled, - .deviceWrite = NULL, - .deviceInitialize = initialize, - .deviceWritePolled = write_polled, - .deviceSetAttributes = set_attributes, - .deviceOutputUsesInterrupts = false +const rtems_termios_device_handler qoriq_uart_bridge_master = { + .first_open = first_open, + .set_attributes = set_attributes, + .mode = TERMIOS_POLLED }; diff --git a/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c b/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c index 71969e32af..44d4cfb712 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c +++ b/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c @@ -50,8 +50,8 @@ static void restore_preemption(rtems_mode prev_mode) static void uart_bridge_slave_service(intercom_packet *packet, void *arg) { - uart_bridge_slave_control *control = arg; - struct rtems_termios_tty *tty = control->tty; + uart_bridge_slave_context *ctx = arg; + struct rtems_termios_tty *tty = ctx->tty; /* Workaround for https://www.rtems.org/bugzilla/show_bug.cgi?id=1736 */ rtems_mode prev_mode = disable_preemption(); @@ -65,9 +65,9 @@ static void uart_bridge_slave_service(intercom_packet *packet, void *arg) static void transmit_task(rtems_task_argument arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; - uart_bridge_slave_control *control = (uart_bridge_slave_control *) arg; - rtems_chain_control *fifo = &control->transmit_fifo; - struct rtems_termios_tty *tty = control->tty; + uart_bridge_slave_context *ctx = (uart_bridge_slave_context *) arg; + rtems_chain_control *fifo = &ctx->transmit_fifo; + struct rtems_termios_tty *tty = ctx->tty; while (true) { intercom_packet *packet = NULL; @@ -91,12 +91,12 @@ static void transmit_task(rtems_task_argument arg) } static void create_transmit_task( - uart_bridge_slave_control *control + uart_bridge_slave_context *ctx ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_id task = RTEMS_ID_NONE; - char index = (char) ('0' + control->type - INTERCOM_TYPE_UART_0); + char index = (char) ('0' + ctx->type - INTERCOM_TYPE_UART_0); sc = rtems_task_create( rtems_build_name('U', 'B', 'T', index), @@ -111,54 +111,53 @@ static void create_transmit_task( sc = rtems_task_start( task, transmit_task, - (rtems_task_argument) control + (rtems_task_argument) ctx ); assert(sc == RTEMS_SUCCESSFUL); - control->transmit_task = task; + ctx->transmit_task = task; } -static void initialize(int minor) +static bool first_open( + struct rtems_termios_tty *tty, + rtems_termios_device_context *base, + struct termios *term, + rtems_libio_open_close_args_t *args +) { - /* Do nothing */ -} + uart_bridge_slave_context *ctx = (uart_bridge_slave_context *) base; + intercom_type type = ctx->type; -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_tbl *ct = Console_Port_Tbl[minor]; - console_data *cd = &Console_Port_Data [minor]; - uart_bridge_slave_control *control = ct->pDeviceParams; - intercom_type type = control->type; - - control->tty = tty; - cd->termios_data = tty; + ctx->tty = tty; rtems_termios_set_initial_baud(tty, 115200); - create_transmit_task(control); - qoriq_intercom_service_install(type, uart_bridge_slave_service, control); + create_transmit_task(ctx); + qoriq_intercom_service_install(type, uart_bridge_slave_service, ctx); - return 0; + return true; } -static int last_close(int major, int minor, void *arg) +static void last_close( + struct rtems_termios_tty *tty, + rtems_termios_device_context *base, + rtems_libio_open_close_args_t *args +) { - console_tbl *ct = Console_Port_Tbl[minor]; - uart_bridge_slave_control *control = ct->pDeviceParams; - - qoriq_intercom_service_remove(control->type); + uart_bridge_slave_context *ctx = (uart_bridge_slave_context *) base; - return 0; + qoriq_intercom_service_remove(ctx->type); } -static ssize_t write_with_interrupts(int minor, const char *buf, size_t len) +static void write_with_interrupts( + rtems_termios_device_context *base, + const char *buf, + size_t len +) { if (len > 0) { rtems_status_code sc = RTEMS_SUCCESSFUL; - console_tbl *ct = Console_Port_Tbl[minor]; - uart_bridge_slave_control *control = ct->pDeviceParams; + uart_bridge_slave_context *ctx = (uart_bridge_slave_context *) base; intercom_packet *packet = qoriq_intercom_allocate_packet( - control->type, + ctx->type, INTERCOM_SIZE_64 ); @@ -170,44 +169,27 @@ static ssize_t write_with_interrupts(int minor, const char *buf, size_t len) * another context. */ sc = rtems_chain_append_with_notification( - &control->transmit_fifo, + &ctx->transmit_fifo, &packet->glue.node, - control->transmit_task, + ctx->transmit_task, TRANSMIT_EVENT ); assert(sc == RTEMS_SUCCESSFUL); } - - return 0; -} - -static void write_polled(int minor, char c) -{ - console_tbl *ct = Console_Port_Tbl[minor]; - uart_bridge_slave_control *control = ct->pDeviceParams; - intercom_packet *packet = qoriq_intercom_allocate_packet( - control->type, - INTERCOM_SIZE_64 - ); - char *data = packet->data; - data [0] = c; - packet->size = 1; - qoriq_intercom_send_packet(QORIQ_UART_BRIDGE_MASTER_CORE, packet); } -static int set_attribues(int minor, const struct termios *term) +static bool set_attributes( + rtems_termios_device_context *base, + const struct termios *term +) { - return -1; + return false; } -const console_fns qoriq_uart_bridge_slave = { - .deviceProbe = libchip_serial_default_probe, - .deviceFirstOpen = first_open, - .deviceLastClose = last_close, - .deviceRead = NULL, - .deviceWrite = write_with_interrupts, - .deviceInitialize = initialize, - .deviceWritePolled = write_polled, - .deviceSetAttributes = set_attribues, - .deviceOutputUsesInterrupts = true +const rtems_termios_device_handler qoriq_uart_bridge_slave = { + .first_open = first_open, + .last_close = last_close, + .write = write_with_interrupts, + .set_attributes = set_attributes, + .mode = TERMIOS_IRQ_DRIVEN }; diff --git a/c/src/lib/libbsp/powerpc/qoriq/include/uart-bridge.h b/c/src/lib/libbsp/powerpc/qoriq/include/uart-bridge.h index e94fe2051a..cd342ffcb6 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/include/uart-bridge.h +++ b/c/src/lib/libbsp/powerpc/qoriq/include/uart-bridge.h @@ -7,10 +7,10 @@ */ /* - * Copyright (c) 2011 embedded brains GmbH. All rights reserved. + * Copyright (c) 2011-2014 embedded brains GmbH. All rights reserved. * * embedded brains GmbH - * Obere Lagerstr. 30 + * Dornierstr. 4 * 82178 Puchheim * Germany * <rtems@embedded-brains.de> @@ -23,7 +23,7 @@ #ifndef LIBBSP_POWERPC_QORIQ_UART_BRIDGE_H #define LIBBSP_POWERPC_QORIQ_UART_BRIDGE_H -#include <libchip/serial.h> +#include <rtems/termiostypes.h> #include <bsp/intercom.h> @@ -42,22 +42,26 @@ extern "C" { */ typedef struct { + rtems_termios_device_context base; const char *device_path; intercom_type type; rtems_id transmit_task; rtems_chain_control transmit_fifo; -} uart_bridge_master_control; +} uart_bridge_master_context; typedef struct { + rtems_termios_device_context base; struct rtems_termios_tty *tty; intercom_type type; rtems_id transmit_task; rtems_chain_control transmit_fifo; -} uart_bridge_slave_control; +} uart_bridge_slave_context; -extern const console_fns qoriq_uart_bridge_master; +bool qoriq_uart_bridge_master_probe(rtems_termios_device_context *base); -extern const console_fns qoriq_uart_bridge_slave; +extern const rtems_termios_device_handler qoriq_uart_bridge_master; + +extern const rtems_termios_device_handler qoriq_uart_bridge_slave; /** @} */ diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c b/c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c index 5785078c41..43caabbfae 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c +++ b/c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c @@ -24,7 +24,7 @@ #include <rtems/config.h> #include <rtems/counter.h> -#include <libchip/serial.h> +#include <libchip/ns16550.h> #include <libcpu/powerpc-utility.h> @@ -36,6 +36,7 @@ #include <bsp/linker-symbols.h> #include <bsp/mmu.h> #include <bsp/qoriq.h> +#include <bsp/console-termios.h> LINKER_SYMBOL(bsp_exc_vector_base); @@ -50,6 +51,7 @@ void BSP_panic(char *s) rtems_interrupt_level level; rtems_interrupt_disable(level); + (void) level; printk("%s PANIC %s\n", rtems_get_version_string(), s); @@ -63,6 +65,7 @@ void _BSP_Fatal_error(unsigned n) rtems_interrupt_level level; rtems_interrupt_disable(level); + (void) level; printk("%s PANIC ERROR %u\n", rtems_get_version_string(), n); @@ -75,15 +78,12 @@ void bsp_start(void) { unsigned long i = 0; - ppc_cpu_id_t myCpu; - ppc_cpu_revision_t myCpuRevision; - /* * Get CPU identification dynamically. Note that the get_ppc_cpu_type() function * store the result in global variables so that it can be used latter... */ - myCpu = get_ppc_cpu_type(); - myCpuRevision = get_ppc_cpu_revision(); + get_ppc_cpu_type(); + get_ppc_cpu_revision(); /* Initialize some device driver parameters */ #ifdef HAS_UBOOT @@ -93,16 +93,24 @@ void bsp_start(void) rtems_counter_initialize_converter(BSP_bus_frequency / 8); /* Initialize some console parameters */ - for (i = 0; i < Console_Configuration_Count; ++i) { - console_tbl *ct = &Console_Configuration_Ports[i]; - - ct->ulClock = BSP_bus_frequency; - - #ifdef HAS_UBOOT - if (ct->deviceType == SERIAL_NS16550) { - ct->pDeviceParams = (void *) bsp_uboot_board_info.bi_baudrate; - } - #endif + for (i = 0; i < console_device_count; ++i) { + const console_device *dev = &console_device_table[i]; + const rtems_termios_device_handler *ns16550 = + #ifdef BSP_USE_UART_INTERRUPTS + &ns16550_handler_interrupt; + #else + &ns16550_handler_polled; + #endif + + if (dev->handler == ns16550) { + ns16550_context *ctx = (ns16550_context *) dev->context; + + ctx->clock = BSP_bus_frequency; + + #ifdef HAS_UBOOT + ctx->initial_baud = bsp_uboot_board_info.bi_baudrate; + #endif + } } /* Disable decrementer */ |