Add a simple Termios console driver using a table for statically registered devices used in console_initialize() and dynamic installation via console_device_install(). --- c/src/lib/libbsp/Makefile.am | 1 + c/src/lib/libbsp/preinstall.am | 4 + c/src/lib/libbsp/shared/console-termios-init.c | 101 ++++++++++++++++ c/src/lib/libbsp/shared/include/console-termios.h | 136 ++++++++++++++++++++++ c/src/lib/libbsp/shared/include/fatal.h | 2 + 5 files changed, 244 insertions(+) create mode 100644 c/src/lib/libbsp/shared/console-termios-init.c create mode 100644 c/src/lib/libbsp/shared/include/console-termios.h
diff --git a/c/src/lib/libbsp/Makefile.am b/c/src/lib/libbsp/Makefile.am index e947192..ac64f37 100644 --- a/c/src/lib/libbsp/Makefile.am +++ b/c/src/lib/libbsp/Makefile.am @@ -34,6 +34,7 @@ include_bspdir = $(includedir)/bsp include_bsp_HEADERS = include_bsp_HEADERS += shared/include/default-initial-extension.h include_bsp_HEADERS += shared/include/fatal.h +include_bsp_HEADERS += shared/include/console-termios.h include $(srcdir)/preinstall.am include $(top_srcdir)/automake/subdirs.am diff --git a/c/src/lib/libbsp/preinstall.am b/c/src/lib/libbsp/preinstall.am index abaf028..651f136 100644 --- a/c/src/lib/libbsp/preinstall.am +++ b/c/src/lib/libbsp/preinstall.am @@ -26,3 +26,7 @@ $(PROJECT_INCLUDE)/bsp/fatal.h: shared/include/fatal.h $(PROJECT_INCLUDE)/bsp/$( $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/fatal.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/fatal.h +$(PROJECT_INCLUDE)/bsp/console-termios.h: shared/include/console-termios.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/console-termios.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/console-termios.h + diff --git a/c/src/lib/libbsp/shared/console-termios-init.c b/c/src/lib/libbsp/shared/console-termios-init.c new file mode 100644 index 0000000..08b0a7f --- /dev/null +++ b/c/src/lib/libbsp/shared/console-termios-init.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rt...@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/console-termios.h> +#include <bsp/fatal.h> + +#include <rtems/console.h> + +static rtems_interrupt_lock console_lock = + RTEMS_INTERRUPT_LOCK_INITIALIZER( "console" ); + +static rtems_device_major_number console_major = UINT32_MAX; + +static rtems_device_minor_number console_minor; + +rtems_status_code console_device_install( + const char *device_file, + const rtems_termios_device_handler *handler, + const rtems_termios_device_flow *flow, + rtems_termios_device_context *context +) +{ + rtems_interrupt_lock_context lock_context; + rtems_device_minor_number minor; + + rtems_interrupt_lock_acquire( &console_lock, &lock_context ); + minor = console_minor; + ++console_minor; + rtems_interrupt_lock_release( &console_lock, &lock_context ); + + return rtems_termios_device_install( + device_file, + console_major, + minor, + handler, + flow, + context + ); +} + +bool console_device_probe_default(rtems_termios_device_context *context) +{ + (void) context; + + return true; +} + +rtems_device_driver console_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + bool console_device_done = false; + + rtems_termios_initialize(); + + for ( minor = 0; minor < console_device_count; ++minor ) { + const console_device *ctx = &console_device_table[ minor ]; + rtems_status_code sc; + + if ( ( *ctx->probe )( ctx->context ) ) { + sc = rtems_termios_device_install( + ctx->device_file, + major, + minor, + ctx->handler, + ctx->flow, + ctx->context + ); + if ( sc != RTEMS_SUCCESSFUL ) { + bsp_fatal( BSP_FATAL_CONSOLE_INSTALL_0 ); + } + + if ( !console_device_done ) { + console_device_done = true; + + sc = rtems_io_register_name( CONSOLE_DEVICE_NAME, major, minor ); + if ( sc != RTEMS_SUCCESSFUL ) { + bsp_fatal( BSP_FATAL_CONSOLE_INSTALL_1 ); + } + } + } + } + + console_major = major; + console_minor = minor; + + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/shared/include/console-termios.h b/c/src/lib/libbsp/shared/include/console-termios.h new file mode 100644 index 0000000..bbb9f35 --- /dev/null +++ b/c/src/lib/libbsp/shared/include/console-termios.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rt...@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. + */ + +#ifndef BSP_CONSOLE_TERMIOS_H +#define BSP_CONSOLE_TERMIOS_H + +#include <rtems/termiostypes.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup ConsoleTermios Termios Console Driver + * + * @ingroup TermiostypesSupport + * + * @brief Console driver for Termios devices. + * + * In order to use this driver add the following lines to the Makefile.am of + * the BSP: + * + * @code + * libbsp_a_SOURCES += ../../shared/console-termios-init.c + * libbsp_a_SOURCES += ../../shared/console-termios.c + * libbsp_a_SOURCES += console/console-config.c + * @endcode + * + * Define the console_device_table and console_device_count in the + * console-config.c file of the BSP. + * + * @{ + */ + +/** + * @brief Console device probe function type. + * + * @param[in] context The Termios device context. + * + * @retval true Install this device. + * @retval false Otherwise. + */ +typedef bool (*console_device_probe)(rtems_termios_device_context *context); + +/** + * @brief Console device information. + */ +typedef struct { + /** + * @brief The device file path. + * + * The "/dev/console" device will be automatically installed as the first + * device of console_device_table with a successful probe. + */ + const char *device_file; + + /** + * @brief The device probe function. + */ + console_device_probe probe; + + /** + * @brief The Termios device handler. + */ + const rtems_termios_device_handler *handler; + + /** + * @brief The Termios device flow control handler. + */ + const rtems_termios_device_flow *flow; + + /** + * @brief The Termios device context. + */ + rtems_termios_device_context *context; +} console_device; + +/** + * @brief Installs a console device after console driver initialization. + * + * @param[in] device_file The device file path. + * @param[in] handler The Termios device handler. It must be persistent + * throughout the installed time of the device. + * @param[in] flow The Termios device flow control handler. The device flow + * control handler are optional and may be @c NULL. If present must be + * persistent throughout the installed time of the device. + * @param[in] context The Termios device context. It must be persistent + * throughout the installed time of the device. + */ +rtems_status_code console_device_install( + const char *device_file, + const rtems_termios_device_handler *handler, + const rtems_termios_device_flow *flow, + rtems_termios_device_context *context +); + +/** + * @brief Returns true and does nothing else. + */ +bool console_device_probe_default(rtems_termios_device_context *context); + +/** + * @brief Table for console devices installed via console_initialize() during + * system initialization. + * + * It must be provided by the BSP. + * + * @see console_device_count. + */ +extern const console_device console_device_table[]; + +/** + * @brief Count of entries in the console_device_table. + * + * It must be provided by the BSP. + */ +extern const size_t console_device_count; + +/** @{ */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* BSP_CONSOLE_TERMIOS_H */ diff --git a/c/src/lib/libbsp/shared/include/fatal.h b/c/src/lib/libbsp/shared/include/fatal.h index e928bba..b57fbaa 100644 --- a/c/src/lib/libbsp/shared/include/fatal.h +++ b/c/src/lib/libbsp/shared/include/fatal.h @@ -38,6 +38,8 @@ typedef enum { BSP_FATAL_CONSOLE_REGISTER_DEV_0, BSP_FATAL_CONSOLE_REGISTER_DEV_1, BSP_FATAL_CONSOLE_NO_DEV, + BSP_FATAL_CONSOLE_INSTALL_0, + BSP_FATAL_CONSOLE_INSTALL_1, /* ARM fatal codes */ BSP_ARM_A9MPCORE_FATAL_CLOCK_IRQ_INSTALL = BSP_FATAL_CODE_BLOCK(1), -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel