123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- ====================
- Low Level Serial API
- ====================
- This document is meant as a brief overview of some aspects of the new serial
- driver. It is not complete, any questions you have should be directed to
- <[email protected]>
- The reference implementation is contained within amba-pl011.c.
- Low Level Serial Hardware Driver
- --------------------------------
- The low level serial hardware driver is responsible for supplying port
- information (defined by uart_port) and a set of control methods (defined
- by uart_ops) to the core serial driver. The low level driver is also
- responsible for handling interrupts for the port, and providing any
- console support.
- Console Support
- ---------------
- The serial core provides a few helper functions. This includes identifing
- the correct port structure (via uart_get_console()) and decoding command line
- arguments (uart_parse_options()).
- There is also a helper function (uart_console_write()) which performs a
- character by character write, translating newlines to CRLF sequences.
- Driver writers are recommended to use this function rather than implementing
- their own version.
- Locking
- -------
- It is the responsibility of the low level hardware driver to perform the
- necessary locking using port->lock. There are some exceptions (which
- are described in the struct uart_ops listing below.)
- There are two locks. A per-port spinlock, and an overall semaphore.
- From the core driver perspective, the port->lock locks the following
- data::
- port->mctrl
- port->icount
- port->state->xmit.head (circ_buf->head)
- port->state->xmit.tail (circ_buf->tail)
- The low level driver is free to use this lock to provide any additional
- locking.
- The port_sem semaphore is used to protect against ports being added/
- removed or reconfigured at inappropriate times. Since v2.6.27, this
- semaphore has been the 'mutex' member of the tty_port struct, and
- commonly referred to as the port mutex.
- uart_ops
- --------
- .. kernel-doc:: include/linux/serial_core.h
- :identifiers: uart_ops
- Other functions
- ---------------
- .. kernel-doc:: drivers/tty/serial/serial_core.c
- :identifiers: uart_update_timeout uart_get_baud_rate uart_get_divisor
- uart_match_port uart_write_wakeup uart_register_driver
- uart_unregister_driver uart_suspend_port uart_resume_port
- uart_add_one_port uart_remove_one_port uart_console_write
- uart_parse_earlycon uart_parse_options uart_set_options
- uart_get_lsr_info uart_handle_dcd_change uart_handle_cts_change
- uart_try_toggle_sysrq uart_get_console
- Other notes
- -----------
- It is intended some day to drop the 'unused' entries from uart_port, and
- allow low level drivers to register their own individual uart_port's with
- the core. This will allow drivers to use uart_port as a pointer to a
- structure containing both the uart_port entry with their own extensions,
- thus::
- struct my_port {
- struct uart_port port;
- int my_stuff;
- };
- Modem control lines via GPIO
- ----------------------------
- Some helpers are provided in order to set/get modem control lines via GPIO.
- .. kernel-doc:: drivers/tty/serial/serial_mctrl_gpio.c
- :identifiers: mctrl_gpio_init mctrl_gpio_free mctrl_gpio_to_gpiod
- mctrl_gpio_set mctrl_gpio_get mctrl_gpio_enable_ms
- mctrl_gpio_disable_ms
|