mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-19 11:18:28 +00:00
192 lines
6.3 KiB
Text
192 lines
6.3 KiB
Text
|
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_lh7a40x.c
|
||
|
--------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
18) serial_lpc2292.c
|
||
|
--------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
19) serial_max3100.c
|
||
|
--------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
20) serial_mxc.c
|
||
|
----------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
21) serial_netarm.c
|
||
|
-------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
22) serial_pl01x.c
|
||
|
------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible, though this
|
||
|
driver in fact contains two drivers in total.
|
||
|
|
||
|
23) 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.
|
||
|
|
||
|
24) serial_s3c24x0.c
|
||
|
--------------------
|
||
|
This driver, being quite ad-hoc might need some work to bring back to shape.
|
||
|
|
||
|
25) serial_s3c44b0.c
|
||
|
--------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
26) serial_s5p.c
|
||
|
----------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
27) serial_sa1100.c
|
||
|
-------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
28) serial_sh.c
|
||
|
---------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
29) serial_xuartlite.c
|
||
|
----------------------
|
||
|
No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
|
||
|
|
||
|
30) usbtty.c
|
||
|
------------
|
||
|
This driver seems very complicated and entangled with USB framework. The
|
||
|
conversion might be complicated here.
|
||
|
|
||
|
31) arch/powerpc/cpu/mpc512x/serial.c
|
||
|
-------------------------------------
|
||
|
This driver supports CONFIG_SERIAL_MULTI. This driver will need to be moved to
|
||
|
proper place.
|