123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- The U-Boot Driver Model Project
- ===============================
- Serial I/O analysis
- ===================
- Marek Vasut <marek.vasut@gmail.com>
- 2012-02-20
- I) Overview
- -----------
- The serial port support currently requires the driver to export the following
- functions:
- serial_putc() ...... Output a character
- serial_puts() ...... Output string, often done using serial_putc()
- serial_tstc() ...... Test if incoming character is in a buffer
- serial_getc() ...... Retrieve incoming character
- serial_setbrg() .... Configure port options
- serial_init() ...... Initialize the hardware
- The simpliest implementation, supporting only one port, simply defines these six
- functions and calls them. Such calls are scattered all around U-Boot, especiall
- serial_putc(), serial_puts(), serial_tstc() and serial_getc(). The serial_init()
- and serial_setbrg() are often called from platform-dependent places.
- It's important to consider current implementation of CONFIG_SERIAL_MULTI though.
- This resides in common/serial.c and behaves as a multiplexer for serial ports.
- This, by calling serial_assign(), allows user to switch I/O from one serial port
- to another. Though the environmental variables "stdin", "stdout", "stderr"
- remain set to "serial".
- These variables are managed by the IOMUX. This resides in common/iomux.c and
- manages all console input/output from U-Boot. For serial port, only one IOMUX is
- always registered, called "serial" and the switching of different serial ports
- is done by code in common/serial.c.
- On a final note, it's important to mention function default_serial_console(),
- which is platform specific and reports the default serial console for the
- platform, unless proper environment variable overrides this.
- II) Approach
- ------------
- Drivers not using CONFIG_SERIAL_MULTI already will have to be converted to
- similar approach. The probe() function of a driver will call a function
- registering the driver with a STDIO subsystem core, stdio_device_register().
- The serial_init() function will now be replaced by probe() function of the
- driver, the rest of the components of the driver will be converted to standard
- STDIO driver calls. See [ UDM-stdio.txt ] for details.
- The serial_setbrg() function depends on global data pointer. This is wrong,
- since there is likely to be user willing to configure different baudrate on two
- different serial ports. The function will be replaced with STDIO's "conf()"
- call, with STDIO_CONFIG_SERIAL_BAUDRATE argument.
- III) Analysis of in-tree drivers
- --------------------------------
- 1) altera_jtag_uart.c
- ---------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 2) altera_uart.c
- ----------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 3) arm_dcc.c
- ------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible, unless used
- with CONFIG_ARM_DCC_MULTI. Then it registers another separate IOMUX.
- 4) atmel_usart.c
- ----------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 5) mcfuart.c
- ------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 6) ns16550.c
- ------------
- This driver seems complicated and certain consideration will need to be made
- during conversion. This driver is implemented in very universal manner,
- therefore it'll be necessary to properly design it's platform_data.
- 7) ns9750_serial.c
- ------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 8) opencores_yanu.c
- -------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 9) s3c4510b_uart.c
- ------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 10) s3c64xx.c
- -------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 11) sandbox.c
- -------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 12) serial.c
- ------------
- This is a complementary part of NS16550 UART driver, see above.
- 13) serial_clps7111.c
- ---------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 14) serial_imx.c
- ----------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible. This driver
- might be removed in favor of serial_mxc.c .
- 15) serial_ixp.c
- ----------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 16) serial_ks8695.c
- -------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 17) serial_max3100.c
- --------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 18) serial_mxc.c
- ----------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 19) serial_netarm.c
- -------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 20) serial_pl01x.c
- ------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible, though this
- driver in fact contains two drivers in total.
- 21) serial_pxa.c
- ----------------
- This driver is a bit complicated, but due to clean support for
- CONFIG_SERIAL_MULTI, there are no expected obstructions throughout the
- conversion process.
- 22) serial_s3c24x0.c
- --------------------
- This driver, being quite ad-hoc might need some work to bring back to shape.
- 23) serial_s3c44b0.c
- --------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 24) serial_s5p.c
- ----------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 25) serial_sa1100.c
- -------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 26) serial_sh.c
- ---------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 27) serial_xuartlite.c
- ----------------------
- No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
- 28) usbtty.c
- ------------
- This driver seems very complicated and entangled with USB framework. The
- conversion might be complicated here.
- 29) arch/powerpc/cpu/mpc512x/serial.c
- -------------------------------------
- This driver supports CONFIG_SERIAL_MULTI. This driver will need to be moved to
- proper place.
|