summaryrefslogtreecommitdiffstats
path: root/bsps
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-05 17:07:20 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-12 07:09:10 +0200
commitb43ea9fed2ce52997933704a522fc28ebcd27968 (patch)
tree9e8b521394df11aecba4c44feb801b1cca412adf /bsps
parentbsps: Remove unused console_select_simple.c (diff)
downloadrtems-b43ea9fed2ce52997933704a522fc28ebcd27968.tar.bz2
bsps: Move legacy console driver to bsps
This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'bsps')
-rw-r--r--bsps/shared/dev/serial/legacy-console-control.c45
-rw-r--r--bsps/shared/dev/serial/legacy-console-select.c97
-rw-r--r--bsps/shared/dev/serial/legacy-console.c402
-rw-r--r--bsps/shared/dev/serial/legacy-console.h89
4 files changed, 633 insertions, 0 deletions
diff --git a/bsps/shared/dev/serial/legacy-console-control.c b/bsps/shared/dev/serial/legacy-console-control.c
new file mode 100644
index 0000000000..01c6793c67
--- /dev/null
+++ b/bsps/shared/dev/serial/legacy-console-control.c
@@ -0,0 +1,45 @@
+/**
+ * @file
+ *
+ * @ingroup Console
+ *
+ * @brief Generic libchip console io_ctl extension
+ */
+
+
+/*
+ * This file is an extension of the generic console driver
+ * shell used by all console drivers using libchip.
+ *
+ * COPYRIGHT (c) 1989-2011.
+ * 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 <stdlib.h>
+#include <assert.h>
+#include <termios.h>
+
+#include <rtems/termiostypes.h>
+#include <rtems/console.h>
+#include <libchip/serial.h>
+#include "legacy-console.h"
+
+/*
+ * console_control
+ *
+ * this routine uses the termios driver to process io
+ */
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return rtems_termios_ioctl (arg);
+}
diff --git a/bsps/shared/dev/serial/legacy-console-select.c b/bsps/shared/dev/serial/legacy-console-select.c
new file mode 100644
index 0000000000..8d545e7737
--- /dev/null
+++ b/bsps/shared/dev/serial/legacy-console-select.c
@@ -0,0 +1,97 @@
+/**
+ * @file
+ *
+ * @ingroup Console
+ *
+ * @brief Generic libchip console select
+ */
+
+/*
+ * This file contains a routine to select the
+ * console based upon a number of criteria.
+ *
+ * COPYRIGHT (c) 2011.
+ * 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/fatal.h>
+#include <rtems/libio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <termios.h>
+
+#include <rtems/termiostypes.h>
+#include <libchip/serial.h>
+#include "legacy-console.h"
+
+/*
+ * 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.
+ */
+
+ /*
+ * 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/bsps/shared/dev/serial/legacy-console.c b/bsps/shared/dev/serial/legacy-console.c
new file mode 100644
index 0000000000..998e4aa6fd
--- /dev/null
+++ b/bsps/shared/dev/serial/legacy-console.c
@@ -0,0 +1,402 @@
+/**
+ * @file
+ *
+ * @ingroup Console
+ *
+ * @brief Extension of the generic libchip console driver shell
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2011, 2016.
+ * 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/fatal.h>
+#include <rtems/libio.h>
+#include <rtems/console.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <termios.h>
+
+#include <rtems/termiostypes.h>
+#include <libchip/serial.h>
+#include "legacy-console.h"
+
+unsigned long Console_Port_Count = 0;
+console_tbl **Console_Port_Tbl = NULL;
+console_data *Console_Port_Data = NULL;
+rtems_device_minor_number Console_Port_Minor = 0;
+static bool console_initialized = false;
+
+/*
+ * console_find_console_entry
+ *
+ * This method is used to search the console entries for a
+ * specific device entry.
+ */
+console_tbl* console_find_console_entry(
+ const char *match,
+ size_t length,
+ rtems_device_minor_number *match_minor
+)
+{
+ rtems_device_minor_number minor;
+
+ /*
+ * The the match name is NULL get the minor number entry.
+ */
+ if (match == NULL) {
+ if (*match_minor < Console_Port_Count)
+ return Console_Port_Tbl[*match_minor];
+ return NULL;
+ }
+
+ for (minor=0; minor < Console_Port_Count ; minor++) {
+ console_tbl *cptr = Console_Port_Tbl[minor];
+
+ /*
+ * Console table entries include /dev/ prefix, device names passed
+ * in on command line do not.
+ */
+ if ( !strncmp( cptr->sDeviceName, match, length ) ) {
+ *match_minor = minor;
+ return cptr;
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * console_initialize_data
+ *
+ * This method is used to initialize the table of pointers to the
+ * serial port configuration structure entries.
+ */
+void console_initialize_data(void)
+{
+ int i;
+
+ if ( Console_Port_Tbl )
+ return;
+
+ /*
+ * Allocate memory for the table of device pointers.
+ */
+ Console_Port_Count = Console_Configuration_Count;
+ Console_Port_Tbl = malloc( Console_Port_Count * sizeof( console_tbl * ) );
+ if (Console_Port_Tbl == NULL)
+ bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_0 );
+
+ /*
+ * Allocate memory for the table of device specific data pointers.
+ */
+ Console_Port_Data = calloc( Console_Port_Count, sizeof( console_data ) );
+ if ( Console_Port_Data == NULL ) {
+ bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_3 );
+ }
+
+ /*
+ * Fill in the Console Table
+ */
+ for (i=0 ; i < Console_Port_Count ; i++) {
+ Console_Port_Tbl[i] = &Console_Configuration_Ports[i];
+ }
+}
+
+/*
+ * console_register_devices
+ *
+ * This method is used to add dynamically discovered devices to the
+ * set of serial ports supported.
+ */
+void console_register_devices(
+ console_tbl *new_ports,
+ size_t number_of_ports
+)
+{
+ int old_number_of_ports;
+ int i;
+
+ /*
+ * Initialize the console data elements
+ */
+ console_initialize_data();
+
+ /*
+ * console_initialize() has been invoked so it is now too late to
+ * register devices.
+ */
+ if ( console_initialized ) {
+ bsp_fatal( BSP_FATAL_CONSOLE_MULTI_INIT );
+ }
+
+ /*
+ * Allocate memory for the console port extension
+ */
+ old_number_of_ports = Console_Port_Count;
+ Console_Port_Count += number_of_ports;
+ Console_Port_Tbl = realloc(
+ Console_Port_Tbl,
+ Console_Port_Count * sizeof(console_tbl *)
+ );
+ if ( Console_Port_Tbl == NULL ) {
+ bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_1 );
+ }
+
+ /*
+ * Since we can only add devices before console_initialize(),
+ * the data area will contain no information and must be zero
+ * before it is used. So extend the area and zero it out.
+ */
+ Console_Port_Data = realloc(
+ Console_Port_Data,
+ Console_Port_Count * sizeof(console_data)
+ );
+ if ( Console_Port_Data == NULL ) {
+ bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_2 );
+ }
+ memset(Console_Port_Data, '\0', Console_Port_Count * sizeof(console_data));
+
+ /*
+ * Now add the new devices at the end.
+ */
+ for (i=0 ; i < number_of_ports ; i++) {
+ Console_Port_Tbl[old_number_of_ports + i] = &new_ports[i];
+ }
+}
+
+/*
+ * console_open
+ *
+ * open a port as a termios console.
+ */
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_status_code status;
+ rtems_libio_open_close_args_t *args = arg;
+ rtems_libio_ioctl_args_t IoctlArgs;
+ struct termios Termios;
+ rtems_termios_callbacks Callbacks;
+ console_tbl *cptr;
+ struct rtems_termios_tty *current_tty;
+
+ /*
+ * Verify the port number is valid.
+ */
+ if ( minor > Console_Port_Count ) {
+ return RTEMS_INVALID_NUMBER;
+ }
+
+ /*
+ * Open the port as a termios console driver.
+ */
+
+ cptr = Console_Port_Tbl[minor];
+ Callbacks.firstOpen = cptr->pDeviceFns->deviceFirstOpen;
+ Callbacks.lastClose = cptr->pDeviceFns->deviceLastClose;
+ Callbacks.pollRead = cptr->pDeviceFns->deviceRead;
+ Callbacks.write = cptr->pDeviceFns->deviceWrite;
+ Callbacks.setAttributes = cptr->pDeviceFns->deviceSetAttributes;
+ if (cptr->pDeviceFlow != NULL) {
+ Callbacks.stopRemoteTx = cptr->pDeviceFlow->deviceStopRemoteTx;
+ Callbacks.startRemoteTx = cptr->pDeviceFlow->deviceStartRemoteTx;
+ } else {
+ Callbacks.stopRemoteTx = NULL;
+ Callbacks.startRemoteTx = NULL;
+ }
+ Callbacks.outputUsesInterrupts = cptr->pDeviceFns->deviceOutputUsesInterrupts;
+
+ /* XXX what about
+ * Console_Port_Tbl[minor].ulMargin,
+ * Console_Port_Tbl[minor].ulHysteresis);
+ */
+
+ status = rtems_termios_open( major, minor, arg, &Callbacks );
+ Console_Port_Data[minor].termios_data = args->iop->data1;
+
+ /* Get tty pointur from the Console_Port_Data */
+ current_tty = Console_Port_Data[minor].termios_data;
+
+ if ( (current_tty->refcount == 1) ) {
+
+ /*
+ * If this BSP has a preferred default rate, then use that.
+ */
+ #if defined(BSP_DEFAULT_BAUD_RATE)
+ rtems_termios_set_initial_baud( current_tty, BSP_DEFAULT_BAUD_RATE );
+ #endif
+
+ /*
+ * If it's the first open, modified, if need, the port parameters
+ */
+ if ( minor != Console_Port_Minor ) {
+ /*
+ * If this is not the console we do not want ECHO and so forth
+ */
+ IoctlArgs.iop = args->iop;
+ IoctlArgs.command = TIOCGETA;
+ IoctlArgs.buffer = &Termios;
+ rtems_termios_ioctl( &IoctlArgs );
+
+ Termios.c_lflag = ICANON;
+ IoctlArgs.command = TIOCSETA;
+ rtems_termios_ioctl( &IoctlArgs );
+ }
+ }
+
+ if (rtems_libio_iop_is_readable(args->iop) &&
+ cptr->pDeviceFlow &&
+ cptr->pDeviceFlow->deviceStartRemoteTx) {
+ cptr->pDeviceFlow->deviceStartRemoteTx(minor);
+ }
+
+ return status;
+}
+
+/*
+ * console_close
+ *
+ * This routine closes a port that has been opened as console.
+ */
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_open_close_args_t *args = arg;
+ struct rtems_termios_tty *current_tty;
+ console_tbl *cptr;
+
+ cptr = Console_Port_Tbl[minor];
+
+ /* Get tty pointer from the Console_Port_Data */
+ current_tty = Console_Port_Data[minor].termios_data;
+
+ /* Get the tty refcount to determine if we need to do deviceStopRemoteTx.
+ * Stop only if it's the last one opened.
+ */
+ if ( (current_tty->refcount == 1) ) {
+ if (rtems_libio_iop_is_readable(args->iop) &&
+ cptr->pDeviceFlow &&
+ cptr->pDeviceFlow->deviceStopRemoteTx) {
+ cptr->pDeviceFlow->deviceStopRemoteTx(minor);
+ }
+ }
+
+ return rtems_termios_close (arg);
+}
+
+/*
+ * console_initialize
+ *
+ * Routine called to initialize the console device driver.
+ */
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor_arg,
+ void *arg
+)
+{
+ rtems_status_code status;
+ rtems_device_minor_number minor;
+ console_tbl *port;
+
+ /*
+ * If we have no devices which were registered earlier then we
+ * must still initialize pointers for Console_Port_Tbl and
+ * Console_Port_Data.
+ */
+ console_initialize_data();
+
+ /*
+ * console_initialize has been invoked so it is now too late to
+ * register devices.
+ */
+ console_initialized = true;
+
+ /*
+ * Initialize the termio interface, our table of pointers to device
+ * information structures, and determine if the user has explicitly
+ * specified which device is to be used for the console.
+ */
+ rtems_termios_initialize();
+ bsp_console_select();
+
+ /*
+ * Iterate over all of the console devices we know about
+ * and initialize them.
+ */
+ for (minor=0 ; minor < Console_Port_Count ; minor++) {
+ /*
+ * First perform the configuration dependent probe, then the
+ * device dependent probe
+ */
+ port = Console_Port_Tbl[minor];
+
+ if ( (!port->deviceProbe || port->deviceProbe(minor)) &&
+ port->pDeviceFns->deviceProbe(minor)) {
+
+ if (port->sDeviceName != NULL) {
+ status = rtems_io_register_name( port->sDeviceName, major, minor );
+ if (status != RTEMS_SUCCESSFUL) {
+ bsp_fatal( BSP_FATAL_CONSOLE_REGISTER_DEV_0 );
+ }
+ }
+
+ if (minor == Console_Port_Minor) {
+ status = rtems_io_register_name( CONSOLE_DEVICE_NAME, major, minor );
+ if (status != RTEMS_SUCCESSFUL) {
+ bsp_fatal( BSP_FATAL_CONSOLE_REGISTER_DEV_1 );
+ }
+ }
+
+ /*
+ * Initialize the hardware device.
+ */
+ port->pDeviceFns->deviceInitialize(minor);
+
+ }
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * console_read
+ *
+ * This routine uses the termios driver to read a character.
+ */
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return rtems_termios_read (arg);
+}
+
+/*
+ * console_write
+ *
+ * this routine uses the termios driver to write a character.
+ */
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return rtems_termios_write (arg);
+}
diff --git a/bsps/shared/dev/serial/legacy-console.h b/bsps/shared/dev/serial/legacy-console.h
new file mode 100644
index 0000000000..3855e83100
--- /dev/null
+++ b/bsps/shared/dev/serial/legacy-console.h
@@ -0,0 +1,89 @@
+/**
+ * @file
+ *
+ * @ingroup Console
+ *
+ * @brief Extension of the generic libchip console driver shell
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2011, 2016.
+ * 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.
+ */
+
+#ifndef _PC386_CONSOLE_PRIVATE_h
+#define _PC386_CONSOLE_PRIVATE_h
+
+#include <rtems.h>
+
+#include <libchip/serial.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern rtems_device_minor_number BSPPrintkPort;
+
+/**
+ * @brief
+ *
+ * This function is the ioctl() support for a VGA buffer driver.
+ *
+ * @return This method returns 0 on success.
+ */
+int vt_ioctl(
+ unsigned int cmd,
+ unsigned long arg
+);
+
+/**
+ * @brief console_find_console_entry
+ *
+ * This method is used to search the console entries for a
+ * specific device entry and return it. If match is NULL the
+ * minor number provided is matched.
+ */
+console_tbl* console_find_console_entry(
+ const char *match,
+ size_t length,
+ rtems_device_minor_number *match_minor
+);
+
+/**
+ * @brief console_initialize_data
+ *
+ * This must be called before dynamic registration of devices can occur.
+ * It is normally called as a side-effect of @a console_initialize() but
+ * if a probe and dynamic registration occurs before that, then this method
+ * should be explicitly invoked.
+ */
+void console_initialize_data(void);
+
+/**
+ * @brief console_register_devices
+ *
+ * This function expands the console table to include previous
+ * ports and the array of new ports specified.
+ *
+ * @param[in] new_ports specifies an array of new ports to register
+ * @param[in] number_of_ports specifies the number of elements
+ * in the new_ports array
+ *
+ */
+void console_register_devices(
+ console_tbl *new_ports,
+ size_t number_of_ports
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif
+/* end of include file */