105 lines · 3.3 KB · Text
RawDownload
====================Low Level Serial API====================  This document is meant as a brief overview of some aspects of the new serialdriver.  It is not complete, any questions you have should be directed to<rmk@arm.linux.org.uk> The reference implementation is contained within amba-pl011.c.   Low Level Serial Hardware Driver-------------------------------- The low level serial hardware driver is responsible for supplying portinformation (defined by uart_port) and a set of control methods (definedby uart_ops) to the core serial driver.  The low level driver is alsoresponsible for handling interrupts for the port, and providing anyconsole support.  Console Support--------------- The serial core provides a few helper functions.  This includesdecoding command line arguments (uart_parse_options()). There is also a helper function (uart_console_write()) which performs acharacter by character write, translating newlines to CRLF sequences.Driver writers are recommended to use this function rather than implementingtheir own version.  Locking------- It is the responsibility of the low level hardware driver to perform thenecessary locking using port->lock.  There are some exceptions (whichare 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 followingdata:: 	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 additionallocking. The port_sem semaphore is used to protect against ports being added/removed or reconfigured at inappropriate times. Since v2.6.27, thissemaphore has been the 'mutex' member of the tty_port struct, andcommonly 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 .. kernel-doc:: include/linux/serial_core.h   :identifiers: uart_port_tx_limited uart_port_tx Other notes----------- It is intended some day to drop the 'unused' entries from uart_port, andallow low level drivers to register their own individual uart_port's withthe core.  This will allow drivers to use uart_port as a pointer to astructure 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_to_gpiod           mctrl_gpio_set mctrl_gpio_get mctrl_gpio_enable_ms           mctrl_gpio_disable_ms_sync mctrl_gpio_disable_ms_no_sync