一、UART 驱动程序概述
在嵌入式 Linux 系统中,串口被看成终端设备,终端设备(tty)的驱动程序分为三个部分:
tty_core
tty_disicipline
tty_driver
包括3个结构体:
uart_driver
uart_port
uart_ops( include/serial_core.h)
因此实现一个平台的 UART 驱动程序只需要实现这3个结构体即可。
二、uart_drvier 与 tty_driver 之间的关系
uart_driver 结构体:
uart_driver 结构体包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了 tty_driver(底层串口驱动,无需关心 tty_driver)。
struct uart_driver
{
struct module *owner; //拥有该uart_driver的模块,一般为THIS_MODULE
const char *driver_name; //串口驱动名,串口设备文件名以驱动名为基础
const char *dev_name; //串口设备名
int major; //主设备号
int minor; //次设备号
int nr; //该 uart_driver 支持的最大串口个数
struct console *cons; //其对应的console。若该uart_driver支持serial console,否则为NULL
...........................
struct uart_state *state;
struct tty_driver *tty_driver; //uart_driver 封装了 tty_driver,使底层uart驱动不用关心tty_driver。
};
一个 tty 驱动程序必须注册/注销 tty_driver;
一个 uart 驱动则变为注册/注销 uart_driver;
使用如下接口:
int uart_register_driver(struct uart_driver *drv);
void uart_unregister_driver(struct uart_drvier *drv);
int tty_register_driver(struct tty_driver *drv);
void tty_unregister_driver(struct tty_driver *drv);