summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/uart/cons.c
diff options
context:
space:
mode:
authorMartin Aberg <maberg@gaisler.com>2017-02-01 16:48:51 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2017-05-02 12:34:46 +0200
commitfd9fb2154a5da3bb2b23bf790d9b5906c68ee6f9 (patch)
tree2d4e9568b64fa6e391551551ba281902943492db /c/src/lib/libbsp/sparc/shared/uart/cons.c
parentleon, apbuart: added register defines: FIFO, delay int (diff)
downloadrtems-fd9fb2154a5da3bb2b23bf790d9b5906c68ee6f9.tar.bz2
leon, cons: drvmgr cons interface uses new TERMIOS
LEON driver manager console driver interface (cons) and the APBUART cons driver (apbuart_cons) have been updated for recent TERMIOS interface changes. The legacy callback API is not used anymore and deprecated functions are eliminated. This new implementation is based on RTEMS BSP and Device Driver Development Guide, chapter named "Console Driver". - Functions marked as deprecated (rtems_termios_open() and rtems_termios_close()) have been updated with the present-day versions. - The legacy "callback" interface is replaced with the "handler" interface. - Implementation is inspired by the documentation example, the non-driver manager driver for APBUART (apbuart_termios). - Polled, interrupt and task mode is supported.
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/uart/cons.c')
-rw-r--r--c/src/lib/libbsp/sparc/shared/uart/cons.c105
1 files changed, 24 insertions, 81 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/uart/cons.c b/c/src/lib/libbsp/sparc/shared/uart/cons.c
index 7d113b2ff7..8426adddf4 100644
--- a/c/src/lib/libbsp/sparc/shared/uart/cons.c
+++ b/c/src/lib/libbsp/sparc/shared/uart/cons.c
@@ -14,9 +14,8 @@
#include <bsp.h>
#include <stdlib.h>
-#include <rtems/libio.h>
-#include <rtems/bspIo.h>
#include <bsp/cons.h>
+#include <rtems/console.h>
#ifdef RTEMS_DRVMGR_STARTUP
@@ -26,25 +25,26 @@
* handle interrupts.
*/
-int console_initialized = 0;
-rtems_device_major_number console_major = 0;
+static int console_initialized = 0;
#define FLAG_SYSCON 0x01
struct console_priv {
- unsigned char flags; /* 0x1=SystemConsole */
- unsigned char minor;
+ int flags; /* 0x1=SystemConsole */
+ int minor;
struct console_dev *dev;
};
#define CONSOLE_MAX BSP_NUMBER_OF_TERMIOS_PORTS
struct console_priv cons[CONSOLE_MAX] = {{0,0},};
-/* Register Console to TERMIOS layer and initialize it */
-static void console_dev_init(struct console_priv *con, int minor)
+/* Install Console in TERMIOS layer */
+static void console_dev_init(struct console_priv *con)
{
char name[16], *fsname;
rtems_status_code status;
+ int minor;
+ minor = con->minor;
if (!con->dev->fsname) {
strcpy(name, "/dev/console_a");
/* Special console name and MINOR for SYSTEM CONSOLE */
@@ -55,11 +55,18 @@ static void console_dev_init(struct console_priv *con, int minor)
} else {
fsname = con->dev->fsname;
}
- status = rtems_io_register_name(fsname, console_major, minor);
- if ((minor == 0) && (status != RTEMS_SUCCESSFUL))
+ status = rtems_termios_device_install(
+ fsname,
+ con->dev->handler,
+ NULL,
+ &con->dev->base
+ );
+ if (status != RTEMS_SUCCESSFUL) {
rtems_fatal_error_occurred(status);
+ }
}
+/* Called by device driver to register itself to the cons interface. */
void console_dev_register(struct console_dev *dev)
{
int i, minor = 0;
@@ -87,11 +94,12 @@ void console_dev_register(struct console_dev *dev)
con->dev = dev;
con->minor = minor;
- /* Console layer is already initialized, that means that we can
- * register termios interface directly.
- */
- if (console_initialized)
- console_dev_init(con, minor);
+ if (console_initialized) {
+ /* Console layer is already initialized, that means that we can
+ * register termios interface directly.
+ */
+ console_dev_init(con);
+ }
}
#if 0
@@ -108,14 +116,12 @@ rtems_device_driver console_initialize(
{
int i;
- console_major = major;
-
rtems_termios_initialize();
/* Register all Console a file system device node */
for (i=0; i<CONSOLE_MAX; i++) {
if (cons[i].dev)
- console_dev_init(&cons[i], i);
+ console_dev_init(&cons[i]);
}
console_initialized = 1;
@@ -123,67 +129,4 @@ rtems_device_driver console_initialize(
return RTEMS_SUCCESSFUL;
}
-rtems_device_driver console_open(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- rtems_status_code status;
- struct termios term;
-
- if ((minor >= CONSOLE_MAX) || !cons[minor].dev)
- return RTEMS_INVALID_NUMBER;
-
- status = rtems_termios_open(
- major,
- (int)cons[minor].dev,
- arg,
- cons[minor].dev->callbacks);
-
- /* Inherit UART hardware parameters from bootloader on system console */
- if ((status == RTEMS_SUCCESSFUL) && (cons[minor].flags & FLAG_SYSCON) &&
- (cons[minor].dev->ops.get_uart_attrs != NULL)) {
- if (tcgetattr(STDIN_FILENO, &term) >= 0) {
- cons[minor].dev->ops.get_uart_attrs(cons[minor].dev,
- &term);
- term.c_oflag |= ONLCR;
- tcsetattr(STDIN_FILENO, TCSANOW, &term);
- }
- }
-
- return status;
-}
-
-rtems_device_driver console_close(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- return rtems_termios_close(arg);
-}
-
-rtems_device_driver console_read(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- return rtems_termios_read(arg);
-}
-
-rtems_device_driver console_write(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- return rtems_termios_write(arg);
-}
-
-rtems_device_driver console_control(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- return rtems_termios_ioctl(arg);
-}
-
#endif