blob: 279e941fc03b69d43f368add25c45711c1f0c874 [file] [log] [blame]
Marek Vasut909bbcc2012-08-08 01:42:17 +00001The U-Boot Driver Model Project
2===============================
3Serial I/O analysis
4===================
5Marek Vasut <marek.vasut@gmail.com>
62012-02-20
7
8I) Overview
9-----------
10
11The serial port support currently requires the driver to export the following
12functions:
13
14 serial_putc() ...... Output a character
15 serial_puts() ...... Output string, often done using serial_putc()
16 serial_tstc() ...... Test if incoming character is in a buffer
17 serial_getc() ...... Retrieve incoming character
18 serial_setbrg() .... Configure port options
19 serial_init() ...... Initialize the hardware
20
21The simpliest implementation, supporting only one port, simply defines these six
22functions and calls them. Such calls are scattered all around U-Boot, especiall
23serial_putc(), serial_puts(), serial_tstc() and serial_getc(). The serial_init()
24and serial_setbrg() are often called from platform-dependent places.
25
26It's important to consider current implementation of CONFIG_SERIAL_MULTI though.
27This resides in common/serial.c and behaves as a multiplexer for serial ports.
28This, by calling serial_assign(), allows user to switch I/O from one serial port
29to another. Though the environmental variables "stdin", "stdout", "stderr"
30remain set to "serial".
31
32These variables are managed by the IOMUX. This resides in common/iomux.c and
33manages all console input/output from U-Boot. For serial port, only one IOMUX is
34always registered, called "serial" and the switching of different serial ports
35is done by code in common/serial.c.
36
37On a final note, it's important to mention function default_serial_console(),
38which is platform specific and reports the default serial console for the
39platform, unless proper environment variable overrides this.
40
41II) Approach
42------------
43
44Drivers not using CONFIG_SERIAL_MULTI already will have to be converted to
45similar approach. The probe() function of a driver will call a function
46registering the driver with a STDIO subsystem core, stdio_device_register().
47
48The serial_init() function will now be replaced by probe() function of the
49driver, the rest of the components of the driver will be converted to standard
50STDIO driver calls. See [ UDM-stdio.txt ] for details.
51
52The serial_setbrg() function depends on global data pointer. This is wrong,
53since there is likely to be user willing to configure different baudrate on two
54different serial ports. The function will be replaced with STDIO's "conf()"
55call, with STDIO_CONFIG_SERIAL_BAUDRATE argument.
56
57III) Analysis of in-tree drivers
58--------------------------------
59
Masahiro Yamadaa756da92013-09-24 10:32:04 +090060 altera_jtag_uart.c
61 ------------------
Marek Vasut909bbcc2012-08-08 01:42:17 +000062 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
63
Masahiro Yamadaa756da92013-09-24 10:32:04 +090064 altera_uart.c
65 -------------
Marek Vasut909bbcc2012-08-08 01:42:17 +000066 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
67
Masahiro Yamadaa756da92013-09-24 10:32:04 +090068 arm_dcc.c
69 ---------
Marek Vasut909bbcc2012-08-08 01:42:17 +000070 No support for CONFIG_SERIAL_MULTI. Simple conversion possible, unless used
71 with CONFIG_ARM_DCC_MULTI. Then it registers another separate IOMUX.
72
Masahiro Yamadaa756da92013-09-24 10:32:04 +090073 atmel_usart.c
74 -------------
Marek Vasut909bbcc2012-08-08 01:42:17 +000075 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
76
Masahiro Yamadaa756da92013-09-24 10:32:04 +090077 mcfuart.c
78 ---------
Marek Vasut909bbcc2012-08-08 01:42:17 +000079 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
80
Masahiro Yamadaa756da92013-09-24 10:32:04 +090081 ns16550.c
82 ---------
Marek Vasut909bbcc2012-08-08 01:42:17 +000083 This driver seems complicated and certain consideration will need to be made
84 during conversion. This driver is implemented in very universal manner,
85 therefore it'll be necessary to properly design it's platform_data.
86
Masahiro Yamadaa756da92013-09-24 10:32:04 +090087 opencores_yanu.c
88 ----------------
Marek Vasut909bbcc2012-08-08 01:42:17 +000089 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
90
Masahiro Yamadaa756da92013-09-24 10:32:04 +090091 sandbox.c
92 ---------
Marek Vasut909bbcc2012-08-08 01:42:17 +000093 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
94
Masahiro Yamadaa756da92013-09-24 10:32:04 +090095 serial.c
96 --------
Marek Vasut909bbcc2012-08-08 01:42:17 +000097 This is a complementary part of NS16550 UART driver, see above.
98
Masahiro Yamadaa756da92013-09-24 10:32:04 +090099 serial_imx.c
100 ------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000101 No support for CONFIG_SERIAL_MULTI. Simple conversion possible. This driver
102 might be removed in favor of serial_mxc.c .
103
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900104 serial_ixp.c
105 ------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000106 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
107
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900108 serial_ks8695.c
109 ---------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000110 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
111
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900112 serial_max3100.c
113 ----------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000114 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
115
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900116 serial_mxc.c
117 ------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000118 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
119
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900120 serial_pl01x.c
121 --------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000122 No support for CONFIG_SERIAL_MULTI. Simple conversion possible, though this
123 driver in fact contains two drivers in total.
124
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900125 serial_pxa.c
126 ------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000127 This driver is a bit complicated, but due to clean support for
128 CONFIG_SERIAL_MULTI, there are no expected obstructions throughout the
129 conversion process.
130
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900131 serial_s3c24x0.c
132 ----------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000133 This driver, being quite ad-hoc might need some work to bring back to shape.
134
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900135 serial_s5p.c
136 ------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000137 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
138
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900139 serial_sa1100.c
140 ---------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000141 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
142
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900143 serial_sh.c
144 -----------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000145 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
146
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900147 serial_xuartlite.c
148 ------------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000149 No support for CONFIG_SERIAL_MULTI. Simple conversion possible.
150
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900151 usbtty.c
152 --------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000153 This driver seems very complicated and entangled with USB framework. The
154 conversion might be complicated here.
155
Masahiro Yamadaa756da92013-09-24 10:32:04 +0900156 arch/powerpc/cpu/mpc512x/serial.c
157 ---------------------------------
Marek Vasut909bbcc2012-08-08 01:42:17 +0000158 This driver supports CONFIG_SERIAL_MULTI. This driver will need to be moved to
159 proper place.