总结
分层
主要分为三层,
- 最下面的厂商硬件相关驱动
drivers\tty\serial\imx.c
- 中间的行规层
drivers\tty\n_tty.c
, 用于决定换行等特殊字符是否生效 - 上层 tty
drivers\tty\tty_io.c
结构体
- uart 驱动中关键结构体
uart_driver
定义在include\linux\serial_core.h
,里面有两个成员变量struct uart_state *state;
struct tty_driver *tty_driver;
serial_core.h
中的struct uart_state *state;
->struct uart_port *uart_port;
->const struct uart_ops *ops;
. 而在厂商驱动成员中,定义了static const struct uart_ops imx_pops
里面包括了各种硬件相关的操作函数,probe 的时候,会把厂商的 uart_ops 给到uart_driver
一路向下的 uart_ops,让后续系统调用中可以正确的操作硬件。include\linux\tty_driver.h
中的struct tty_driver
包含了面向上层用的 tty 相关的内容,包括struct cdev **cdevs;
struct tty_struct **ttys;
struct tty_port **ports;
struct ktermios **termios;
其中struct tty_port **ports;
指向前面struct uart_state *state;
中的struct tty_port port;
注册
使用 int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
去注册。
console
console 是 tty 中的一种,可以通过设备树或者 cmdline 进行配置,具体的实现也是在厂商驱动中,需要实现 static struct console imx_console
这样的结构体。