OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [tags/] [linux-2.6/] [linux-2.6.24_or32_unified_v2.3/] [Documentation/] [serial/] [driver] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
 
2
                        Low Level Serial API
3
                        --------------------
4
 
5
 
6
This document is meant as a brief overview of some aspects of the new serial
7
driver.  It is not complete, any questions you have should be directed to
8
9
 
10
The reference implementation is contained within amba_pl011.c.
11
 
12
 
13
 
14
Low Level Serial Hardware Driver
15
--------------------------------
16
 
17
The low level serial hardware driver is responsible for supplying port
18
information (defined by uart_port) and a set of control methods (defined
19
by uart_ops) to the core serial driver.  The low level driver is also
20
responsible for handling interrupts for the port, and providing any
21
console support.
22
 
23
 
24
Console Support
25
---------------
26
 
27
The serial core provides a few helper functions.  This includes identifing
28
the correct port structure (via uart_get_console) and decoding command line
29
arguments (uart_parse_options).
30
 
31
There is also a helper function (uart_write_console) which performs a
32
character by character write, translating newlines to CRLF sequences.
33
Driver writers are recommended to use this function rather than implementing
34
their own version.
35
 
36
 
37
Locking
38
-------
39
 
40
It is the responsibility of the low level hardware driver to perform the
41
necessary locking using port->lock.  There are some exceptions (which
42
are described in the uart_ops listing below.)
43
 
44
There are three locks.  A per-port spinlock, a per-port tmpbuf semaphore,
45
and an overall semaphore.
46
 
47
From the core driver perspective, the port->lock locks the following
48
data:
49
 
50
        port->mctrl
51
        port->icount
52
        info->xmit.head (circ->head)
53
        info->xmit.tail (circ->tail)
54
 
55
The low level driver is free to use this lock to provide any additional
56
locking.
57
 
58
The core driver uses the info->tmpbuf_sem lock to prevent multi-threaded
59
access to the info->tmpbuf bouncebuffer used for port writes.
60
 
61
The port_sem semaphore is used to protect against ports being added/
62
removed or reconfigured at inappropriate times.
63
 
64
 
65
uart_ops
66
--------
67
 
68
The uart_ops structure is the main interface between serial_core and the
69
hardware specific driver.  It contains all the methods to control the
70
hardware.
71
 
72
  tx_empty(port)
73
        This function tests whether the transmitter fifo and shifter
74
        for the port described by 'port' is empty.  If it is empty,
75
        this function should return TIOCSER_TEMT, otherwise return 0.
76
        If the port does not support this operation, then it should
77
        return TIOCSER_TEMT.
78
 
79
        Locking: none.
80
        Interrupts: caller dependent.
81
        This call must not sleep
82
 
83
  set_mctrl(port, mctrl)
84
        This function sets the modem control lines for port described
85
        by 'port' to the state described by mctrl.  The relevant bits
86
        of mctrl are:
87
                - TIOCM_RTS     RTS signal.
88
                - TIOCM_DTR     DTR signal.
89
                - TIOCM_OUT1    OUT1 signal.
90
                - TIOCM_OUT2    OUT2 signal.
91
                - TIOCM_LOOP    Set the port into loopback mode.
92
        If the appropriate bit is set, the signal should be driven
93
        active.  If the bit is clear, the signal should be driven
94
        inactive.
95
 
96
        Locking: port->lock taken.
97
        Interrupts: locally disabled.
98
        This call must not sleep
99
 
100
  get_mctrl(port)
101
        Returns the current state of modem control inputs.  The state
102
        of the outputs should not be returned, since the core keeps
103
        track of their state.  The state information should include:
104
                - TIOCM_DCD     state of DCD signal
105
                - TIOCM_CTS     state of CTS signal
106
                - TIOCM_DSR     state of DSR signal
107
                - TIOCM_RI      state of RI signal
108
        The bit is set if the signal is currently driven active.  If
109
        the port does not support CTS, DCD or DSR, the driver should
110
        indicate that the signal is permanently active.  If RI is
111
        not available, the signal should not be indicated as active.
112
 
113
        Locking: port->lock taken.
114
        Interrupts: locally disabled.
115
        This call must not sleep
116
 
117
  stop_tx(port)
118
        Stop transmitting characters.  This might be due to the CTS
119
        line becoming inactive or the tty layer indicating we want
120
        to stop transmission due to an XOFF character.
121
 
122
        The driver should stop transmitting characters as soon as
123
        possible.
124
 
125
        Locking: port->lock taken.
126
        Interrupts: locally disabled.
127
        This call must not sleep
128
 
129
  start_tx(port)
130
        Start transmitting characters.
131
 
132
        Locking: port->lock taken.
133
        Interrupts: locally disabled.
134
        This call must not sleep
135
 
136
  stop_rx(port)
137
        Stop receiving characters; the port is in the process of
138
        being closed.
139
 
140
        Locking: port->lock taken.
141
        Interrupts: locally disabled.
142
        This call must not sleep
143
 
144
  enable_ms(port)
145
        Enable the modem status interrupts.
146
 
147
        This method may be called multiple times.  Modem status
148
        interrupts should be disabled when the shutdown method is
149
        called.
150
 
151
        Locking: port->lock taken.
152
        Interrupts: locally disabled.
153
        This call must not sleep
154
 
155
  break_ctl(port,ctl)
156
        Control the transmission of a break signal.  If ctl is
157
        nonzero, the break signal should be transmitted.  The signal
158
        should be terminated when another call is made with a zero
159
        ctl.
160
 
161
        Locking: none.
162
        Interrupts: caller dependent.
163
        This call must not sleep
164
 
165
  startup(port)
166
        Grab any interrupt resources and initialise any low level driver
167
        state.  Enable the port for reception.  It should not activate
168
        RTS nor DTR; this will be done via a separate call to set_mctrl.
169
 
170
        This method will only be called when the port is initially opened.
171
 
172
        Locking: port_sem taken.
173
        Interrupts: globally disabled.
174
 
175
  shutdown(port)
176
        Disable the port, disable any break condition that may be in
177
        effect, and free any interrupt resources.  It should not disable
178
        RTS nor DTR; this will have already been done via a separate
179
        call to set_mctrl.
180
 
181
        Drivers must not access port->info once this call has completed.
182
 
183
        This method will only be called when there are no more users of
184
        this port.
185
 
186
        Locking: port_sem taken.
187
        Interrupts: caller dependent.
188
 
189
  set_termios(port,termios,oldtermios)
190
        Change the port parameters, including word length, parity, stop
191
        bits.  Update read_status_mask and ignore_status_mask to indicate
192
        the types of events we are interested in receiving.  Relevant
193
        termios->c_cflag bits are:
194
                CSIZE   - word size
195
                CSTOPB  - 2 stop bits
196
                PARENB  - parity enable
197
                PARODD  - odd parity (when PARENB is in force)
198
                CREAD   - enable reception of characters (if not set,
199
                          still receive characters from the port, but
200
                          throw them away.
201
                CRTSCTS - if set, enable CTS status change reporting
202
                CLOCAL  - if not set, enable modem status change
203
                          reporting.
204
        Relevant termios->c_iflag bits are:
205
                INPCK   - enable frame and parity error events to be
206
                          passed to the TTY layer.
207
                BRKINT
208
                PARMRK  - both of these enable break events to be
209
                          passed to the TTY layer.
210
 
211
                IGNPAR  - ignore parity and framing errors
212
                IGNBRK  - ignore break errors,  If IGNPAR is also
213
                          set, ignore overrun errors as well.
214
        The interaction of the iflag bits is as follows (parity error
215
        given as an example):
216
        Parity error    INPCK   IGNPAR
217
        n/a             0        n/a     character received, marked as
218
                                        TTY_NORMAL
219
        None            1       n/a     character received, marked as
220
                                        TTY_NORMAL
221
        Yes             1       0        character received, marked as
222
                                        TTY_PARITY
223
        Yes             1       1       character discarded
224
 
225
        Other flags may be used (eg, xon/xoff characters) if your
226
        hardware supports hardware "soft" flow control.
227
 
228
        Locking: none.
229
        Interrupts: caller dependent.
230
        This call must not sleep
231
 
232
  pm(port,state,oldstate)
233
        Perform any power management related activities on the specified
234
        port.  State indicates the new state (defined by ACPI D0-D3),
235
        oldstate indicates the previous state.  Essentially, D0 means
236
        fully on, D3 means powered down.
237
 
238
        This function should not be used to grab any resources.
239
 
240
        This will be called when the port is initially opened and finally
241
        closed, except when the port is also the system console.  This
242
        will occur even if CONFIG_PM is not set.
243
 
244
        Locking: none.
245
        Interrupts: caller dependent.
246
 
247
  type(port)
248
        Return a pointer to a string constant describing the specified
249
        port, or return NULL, in which case the string 'unknown' is
250
        substituted.
251
 
252
        Locking: none.
253
        Interrupts: caller dependent.
254
 
255
  release_port(port)
256
        Release any memory and IO region resources currently in use by
257
        the port.
258
 
259
        Locking: none.
260
        Interrupts: caller dependent.
261
 
262
  request_port(port)
263
        Request any memory and IO region resources required by the port.
264
        If any fail, no resources should be registered when this function
265
        returns, and it should return -EBUSY on failure.
266
 
267
        Locking: none.
268
        Interrupts: caller dependent.
269
 
270
  config_port(port,type)
271
        Perform any autoconfiguration steps required for the port.  `type`
272
        contains a bit mask of the required configuration.  UART_CONFIG_TYPE
273
        indicates that the port requires detection and identification.
274
        port->type should be set to the type found, or PORT_UNKNOWN if
275
        no port was detected.
276
 
277
        UART_CONFIG_IRQ indicates autoconfiguration of the interrupt signal,
278
        which should be probed using standard kernel autoprobing techniques.
279
        This is not necessary on platforms where ports have interrupts
280
        internally hard wired (eg, system on a chip implementations).
281
 
282
        Locking: none.
283
        Interrupts: caller dependent.
284
 
285
  verify_port(port,serinfo)
286
        Verify the new serial port information contained within serinfo is
287
        suitable for this port type.
288
 
289
        Locking: none.
290
        Interrupts: caller dependent.
291
 
292
  ioctl(port,cmd,arg)
293
        Perform any port specific IOCTLs.  IOCTL commands must be defined
294
        using the standard numbering system found in 
295
 
296
        Locking: none.
297
        Interrupts: caller dependent.
298
 
299
Other functions
300
---------------
301
 
302
uart_update_timeout(port,cflag,baud)
303
        Update the FIFO drain timeout, port->timeout, according to the
304
        number of bits, parity, stop bits and baud rate.
305
 
306
        Locking: caller is expected to take port->lock
307
        Interrupts: n/a
308
 
309
uart_get_baud_rate(port,termios,old,min,max)
310
        Return the numeric baud rate for the specified termios, taking
311
        account of the special 38400 baud "kludge".  The B0 baud rate
312
        is mapped to 9600 baud.
313
 
314
        If the baud rate is not within min..max, then if old is non-NULL,
315
        the original baud rate will be tried.  If that exceeds the
316
        min..max constraint, 9600 baud will be returned.  termios will
317
        be updated to the baud rate in use.
318
 
319
        Note: min..max must always allow 9600 baud to be selected.
320
 
321
        Locking: caller dependent.
322
        Interrupts: n/a
323
 
324
uart_get_divisor(port,baud)
325
        Return the divsor (baud_base / baud) for the specified baud
326
        rate, appropriately rounded.
327
 
328
        If 38400 baud and custom divisor is selected, return the
329
        custom divisor instead.
330
 
331
        Locking: caller dependent.
332
        Interrupts: n/a
333
 
334
uart_match_port(port1,port2)
335
        This utility function can be used to determine whether two
336
        uart_port structures describe the same port.
337
 
338
        Locking: n/a
339
        Interrupts: n/a
340
 
341
uart_write_wakeup(port)
342
        A driver is expected to call this function when the number of
343
        characters in the transmit buffer have dropped below a threshold.
344
 
345
        Locking: port->lock should be held.
346
        Interrupts: n/a
347
 
348
uart_register_driver(drv)
349
        Register a uart driver with the core driver.  We in turn register
350
        with the tty layer, and initialise the core driver per-port state.
351
 
352
        drv->port should be NULL, and the per-port structures should be
353
        registered using uart_add_one_port after this call has succeeded.
354
 
355
        Locking: none
356
        Interrupts: enabled
357
 
358
uart_unregister_driver()
359
        Remove all references to a driver from the core driver.  The low
360
        level driver must have removed all its ports via the
361
        uart_remove_one_port() if it registered them with uart_add_one_port().
362
 
363
        Locking: none
364
        Interrupts: enabled
365
 
366
uart_suspend_port()
367
 
368
uart_resume_port()
369
 
370
uart_add_one_port()
371
 
372
uart_remove_one_port()
373
 
374
Other notes
375
-----------
376
 
377
It is intended some day to drop the 'unused' entries from uart_port, and
378
allow low level drivers to register their own individual uart_port's with
379
the core.  This will allow drivers to use uart_port as a pointer to a
380
structure containing both the uart_port entry with their own extensions,
381
thus:
382
 
383
        struct my_port {
384
                struct uart_port        port;
385
                int                     my_stuff;
386
        };

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.