summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/qoriq
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-10-07 08:29:16 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-10-07 16:35:20 +0200
commit6ec438e8a323cf623cdaecce6f2b3b52b062881a (patch)
tree8cd71b9fb974897a825b36ea1f070dd4405af46f /c/src/lib/libbsp/powerpc/qoriq
parentbsps: Add Termios console driver initialization (diff)
downloadrtems-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.am14
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/console/console-config.c195
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-master.c88
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c114
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/include/uart-bridge.h18
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/startup/bspstart.c40
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 */