From d7d66d7d4523b904c8ccc6aea3709dc0d5aa5bdc Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 19 Apr 2018 06:28:01 +0200 Subject: bsps: Move console drivers to bsps This patch is a part of the BSP source reorganization. Update #3285. --- bsps/powerpc/t32mppc/console/console.c | 128 +++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 bsps/powerpc/t32mppc/console/console.c (limited to 'bsps/powerpc/t32mppc') diff --git a/bsps/powerpc/t32mppc/console/console.c b/bsps/powerpc/t32mppc/console/console.c new file mode 100644 index 0000000000..5fbd648765 --- /dev/null +++ b/bsps/powerpc/t32mppc/console/console.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2012, 2015 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * 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. + */ + +/* + * Console driver for Lauterbach Trace32 Simulator. The implementation is + * based on the example in "demo/powerpc/etc/terminal/terminal_mpc85xx.cmm" in + * the Trace32 system directory. + */ + +#include +#include +#include + +volatile unsigned char messagebufferin[256]; + +volatile unsigned char messagebufferout[256]; + +typedef struct { + rtems_termios_device_context base; + int input_size; + int input_index; +} t32_console_context; + +static t32_console_context t32_console_instance; + +static bool t32_console_first_open( + rtems_termios_tty *tty, + rtems_termios_device_context *base, + struct termios *term, + rtems_libio_open_close_args_t *args +) +{ + rtems_termios_set_initial_baud(tty, 115200); + + return true; +} + +static int t32_console_read_polled(rtems_termios_device_context *base) +{ + t32_console_context *ctx = (t32_console_context *) base; + int c; + + if (ctx->input_size == 0) { + int new_bufsize = messagebufferin[0]; + + if (new_bufsize != 0) { + ctx->input_size = new_bufsize; + ctx->input_index = 0; + } else { + return -1; + } + } + + c = messagebufferin[4 + ctx->input_index]; + + ++ctx->input_index; + if (ctx->input_index >= ctx->input_size) { + messagebufferin[0] = 0; + ctx->input_size = 0; + } + + return c; +} + +static void t32_console_write_char_polled(char c) +{ + while (messagebufferout[0] != 0) { + /* Wait for ready */ + } + + messagebufferout[4] = (unsigned char) c; + messagebufferout[0] = 1; +} + +static void t32_console_write_polled( + rtems_termios_device_context *base, + const char *s, + size_t n +) +{ + size_t i; + + for (i = 0; i < n; ++i) { + t32_console_write_char_polled(s[i]); + } +} + +const rtems_termios_device_handler t32_console_handler = { + .first_open = t32_console_first_open, + .poll_read = t32_console_read_polled, + .write = t32_console_write_polled, + .mode = TERMIOS_POLLED +}; + +rtems_device_driver console_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + t32_console_context *ctx = &t32_console_instance; + + rtems_termios_initialize(); + rtems_termios_device_context_initialize(&ctx->base, "T32 Console"); + rtems_termios_device_install( + CONSOLE_DEVICE_NAME, + &t32_console_handler, + NULL, + &ctx->base + ); + + return RTEMS_SUCCESSFUL; +} + +BSP_output_char_function_type BSP_output_char = t32_console_write_char_polled; + +BSP_polling_getchar_function_type BSP_poll_char = NULL; -- cgit v1.2.3