1/* 2 * (C) Copyright 2008 3 * Gary Jennejohn, DENX Software Engineering GmbH <garyj@denx.de> 4 * 5 * See file CREDITS for list of people who contributed to this 6 * project. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation; either version 2 of 11 * the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21 * MA 02111-1307 USA 22 */ 23 24U-Boot console multiplexing 25=========================== 26 27HOW CONSOLE MULTIPLEXING WORKS 28------------------------------ 29 30This functionality is controlled with CONFIG_CONSOLE_MUX in the board 31configuration file. 32 33Two new files, common/iomux.c and include/iomux.h, contain the heart 34(iomux_doenv()) of the environment setting implementation. 35 36iomux_doenv() is called in common/cmd_nvedit.c to handle setenv and in 37common/console.c in console_init_r() during bootup to initialize 38stdio_devices[]. 39 40A user can use a comma-separated list of devices to set stdin, stdout 41and stderr. For example: "setenv stdin serial,nc". NOTE: No spaces 42are allowed around the comma(s)! 43 44The length of the list is limited by malloc(), since the array used 45is allocated and freed dynamically. 46 47It should be possible to specify any device which console_assign() 48finds acceptable, but the code has only been tested with serial and 49nc. 50 51iomux_doenv() prevents multiple use of the same device, e.g. "setenv 52stdin nc,nc,serial" will discard the second nc. iomux_doenv() is 53not able to modify the environment, however, so that "pri stdin" still 54shows "nc,nc,serial". 55 56The major change in common/console.c was to modify fgetc() to call 57the iomux_tstc() routine in a for-loop. iomux_tstc() in turn calls 58the tstc() routine for every registered device, but exits immediately 59when one of them returns true. fgetc() then calls iomux_getc(), 60which calls the corresponding getc() routine. fgetc() hangs in 61the for-loop until iomux_tstc() returns true and the input can be 62retrieved. 63 64Thus, a user can type into any device registered for stdin. No effort 65has been made to demulitplex simultaneous input from multiple stdin 66devices. 67 68fputc() and fputs() have been modified to call iomux_putc() and 69iomux_puts() respectively, which call the corresponding output 70routines for every registered device. 71 72Thus, a user can see the ouput for any device registered for stdout 73or stderr on all devices registered for stdout or stderr. As an 74example, if stdin=serial,nc and stdout=serial,nc then all output 75for serial, e.g. echos of input on serial, will appear on serial and nc. 76 77Just as with the old console code, this statement is still true: 78If not defined in the environment, the first input device is assigned 79to the 'stdin' file, the first output one to 'stdout' and 'stderr'. 80 81If CONFIG_SYS_CONSOLE_IS_IN_ENV is defined then multiple input/output 82devices can be set at boot time if defined in the environment. 83 84CAVEATS 85------- 86 87Note that common/iomux.c calls console_assign() for every registered 88device as it is discovered. This means that the environment settings 89for application consoles will be set to the last device in the list. 90 91On a slow machine, such as MPC852T clocked at 66MHz, the overhead associated 92with calling tstc() and then getc() means that copy&paste will normally not 93work, even when stdin=stdout=stderr=serial. 94On a faster machine, such as a sequoia, cut&paste of longer (about 80 95characters) lines works fine when serial is the only device used. 96 97Using nc as a stdin device results in even more overhead because nc_tstc() 98is quite slow. Even on a sequoia cut&paste does not work on the serial 99interface when nc is added to stdin, although there is no character loss using 100the ethernet interface for input. In this test case stdin=serial,nc and 101stdout=serial. 102 103In addition, the overhead associated with sending to two devices, when one of 104them is nc, also causes problems. Even on a sequoia cut&paste does not work 105on the serial interface (stdin=serial) when nc is added to stdout (stdout= 106serial,nc). 107