总结
分层
主要分为三层,
- 最下面的厂商硬件相关驱动
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 这样的结构体。