README.iomux 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. U-Boot console multiplexing
  24. ===========================
  25. HOW CONSOLE MULTIPLEXING WORKS
  26. ------------------------------
  27. This functionality is controlled with CONFIG_CONSOLE_MUX in the board
  28. configuration file.
  29. Two new files, common/iomux.c and include/iomux.h, contain the heart
  30. (iomux_doenv()) of the environment setting implementation.
  31. iomux_doenv() is called in common/cmd_nvedit.c to handle setenv and in
  32. common/console.c in console_init_r() during bootup to initialize
  33. stdio_devices[].
  34. A user can use a comma-separated list of devices to set stdin, stdout
  35. and stderr. For example: "setenv stdin serial,nc". NOTE: No spaces
  36. are allowed around the comma(s)!
  37. The length of the list is limited by malloc(), since the array used
  38. is allocated and freed dynamically.
  39. It should be possible to specify any device which console_assign()
  40. finds acceptable, but the code has only been tested with serial and
  41. nc.
  42. iomux_doenv() prevents multiple use of the same device, e.g. "setenv
  43. stdin nc,nc,serial" will discard the second nc. iomux_doenv() is
  44. not able to modify the environment, however, so that "pri stdin" still
  45. shows "nc,nc,serial".
  46. The major change in common/console.c was to modify fgetc() to call
  47. the iomux_tstc() routine in a for-loop. iomux_tstc() in turn calls
  48. the tstc() routine for every registered device, but exits immediately
  49. when one of them returns true. fgetc() then calls iomux_getc(),
  50. which calls the corresponding getc() routine. fgetc() hangs in
  51. the for-loop until iomux_tstc() returns true and the input can be
  52. retrieved.
  53. Thus, a user can type into any device registered for stdin. No effort
  54. has been made to demulitplex simultaneous input from multiple stdin
  55. devices.
  56. fputc() and fputs() have been modified to call iomux_putc() and
  57. iomux_puts() respectively, which call the corresponding output
  58. routines for every registered device.
  59. Thus, a user can see the ouput for any device registered for stdout
  60. or stderr on all devices registered for stdout or stderr. As an
  61. example, if stdin=serial,nc and stdout=serial,nc then all output
  62. for serial, e.g. echos of input on serial, will appear on serial and nc.
  63. Just as with the old console code, this statement is still true:
  64. If not defined in the environment, the first input device is assigned
  65. to the 'stdin' file, the first output one to 'stdout' and 'stderr'.
  66. If CONFIG_SYS_CONSOLE_IS_IN_ENV is defined then multiple input/output
  67. devices can be set at boot time if defined in the environment.
  68. CAVEATS
  69. -------
  70. Note that common/iomux.c calls console_assign() for every registered
  71. device as it is discovered. This means that the environment settings
  72. for application consoles will be set to the last device in the list.
  73. On a slow machine, such as MPC852T clocked at 66MHz, the overhead associated
  74. with calling tstc() and then getc() means that copy&paste will normally not
  75. work, even when stdin=stdout=stderr=serial.
  76. On a faster machine, such as a sequoia, cut&paste of longer (about 80
  77. characters) lines works fine when serial is the only device used.
  78. Using nc as a stdin device results in even more overhead because nc_tstc()
  79. is quite slow. Even on a sequoia cut&paste does not work on the serial
  80. interface when nc is added to stdin, although there is no character loss using
  81. the ethernet interface for input. In this test case stdin=serial,nc and
  82. stdout=serial.
  83. In addition, the overhead associated with sending to two devices, when one of
  84. them is nc, also causes problems. Even on a sequoia cut&paste does not work
  85. on the serial interface (stdin=serial) when nc is added to stdout (stdout=
  86. serial,nc).