总结

分层

主要分为三层,

  • 最下面的厂商硬件相关驱动 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 这样的结构体。

发表评论