Skip to content
Snippets Groups Projects
README.iomux 3.64 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * (C) Copyright 2008
     * Gary Jennejohn, DENX Software Engineering GmbH <garyj@denx.de>
     *
    
     * SPDX-License-Identifier:	GPL-2.0+
    
     */
    
    U-Boot console multiplexing
    ===========================
    
    HOW CONSOLE MULTIPLEXING WORKS
    ------------------------------
    
    This functionality is controlled with CONFIG_CONSOLE_MUX in the board
    configuration file.
    
    Two new files, common/iomux.c and include/iomux.h, contain the heart
    (iomux_doenv()) of the environment setting implementation.
    
    iomux_doenv() is called in common/cmd_nvedit.c to handle setenv and in
    common/console.c in console_init_r() during bootup to initialize
    stdio_devices[].
    
    A user can use a comma-separated list of devices to set stdin, stdout
    and stderr.  For example: "setenv stdin serial,nc".  NOTE: No spaces
    are allowed around the comma(s)!
    
    The length of the list is limited by malloc(), since the array used
    is allocated and freed dynamically.
    
    It should be possible to specify any device which console_assign()
    finds acceptable, but the code has only been tested with serial and
    nc.
    
    iomux_doenv() prevents multiple use of the same device, e.g. "setenv
    stdin nc,nc,serial" will discard the second nc.  iomux_doenv() is
    not able to modify the environment, however, so that "pri stdin" still
    shows "nc,nc,serial".
    
    The major change in common/console.c was to modify fgetc() to call
    the iomux_tstc() routine in a for-loop.  iomux_tstc() in turn calls
    the tstc() routine for every registered device, but exits immediately
    when one of them returns true.  fgetc() then calls iomux_getc(),
    which calls the corresponding getc() routine.  fgetc() hangs in
    the for-loop until iomux_tstc() returns true and the input can be
    retrieved.
    
    Thus, a user can type into any device registered for stdin.  No effort
    has been made to demulitplex simultaneous input from multiple stdin
    devices.
    
    fputc() and fputs() have been modified to call iomux_putc() and
    iomux_puts() respectively, which call the corresponding output
    routines for every registered device.
    
    Thus, a user can see the ouput for any device registered for stdout
    or stderr on all devices registered for stdout or stderr.  As an
    example, if stdin=serial,nc and stdout=serial,nc then all output
    for serial, e.g. echos of input on serial, will appear on serial and nc.
    
    Just as with the old console code, this statement is still true:
    If not defined in the environment, the first input device is assigned
    to the 'stdin' file, the first output one to 'stdout' and 'stderr'.
    
    If CONFIG_SYS_CONSOLE_IS_IN_ENV is defined then multiple input/output
    devices can be set at boot time if defined in the environment.
    
    CAVEATS
    -------
    
    Note that common/iomux.c calls console_assign() for every registered
    device as it is discovered.  This means that the environment settings
    for application consoles will be set to the last device in the list.
    
    On a slow machine, such as MPC852T clocked at 66MHz, the overhead associated
    with calling tstc() and then getc() means that copy&paste will normally not
    work, even when stdin=stdout=stderr=serial.
    On a faster machine, such as a sequoia, cut&paste of longer (about 80
    characters) lines works fine when serial is the only device used.
    
    Using nc as a stdin device results in even more overhead because nc_tstc()
    is quite slow.  Even on a sequoia cut&paste does not work on the serial
    interface when nc is added to stdin, although there is no character loss using
    the ethernet interface for input. In this test case stdin=serial,nc and
    stdout=serial.
    
    In addition, the overhead associated with sending to two devices, when one of
    them is nc, also causes problems.  Even on a sequoia cut&paste does not work
    on the serial interface (stdin=serial) when nc is added to stdout (stdout=
    serial,nc).