目录
一、UART驱动关键结构体
1、uart_driver 结构体
(1) uart_driver 结构体表示 UART 驱动, uart_driver 定义在 include/linux/serial_core.h 文件中,内容如下:
(2) 每个串口驱动都需要定义一个 uart_driver,加载驱动的时候通过 uart_register_driver 函数向
系统注册这个 uart_driver,此函数原型如下:
(3) 注销驱动的时候也需要注销掉前面注册的 uart_driver,需要用到 uart_unregister_driver 函数,
函数原型如下:
2、uart_port 结构体
(1) uart_port 表示一个具体的 port, uart_port 定义在 include/linux/serial_core.h 文件,内容如下(有省略):
(2) 每个 UART 都有一个 uart_port,uart_port 通过uart_add_one_port 函数与uart_driver 结合起来:
(3) 卸载 UART 驱动的时候也需要将 uart_port 从相应的 uart_driver 中移除,需要用到
uart_remove_one_port 函数,函数原型如下:
(4)uart_ops 结构体: ops 包含了针对 UART 具体的驱动函数, Linux 系统收发数据最终调用的都是 ops 中的函数。ops 是 uart_ops类型的结构体指针变量, uart_ops 定义在 include/linux/serial_core.h 文件中,内容如下:
uart_ops 是最底层的 UART 驱动接口,是实实在在的和 UART 寄存器打交道的。
二、UART驱动分析
1、UART 本质上是一个 platform 驱动;
2、打开 imx6ull.dtsi 文件,找到 UART3 对应的子节点,子节点内容如下所示:
3、通过 compatible 属性值找到对应的 UART 驱动文件,此文件为 drivers/tty/serial/imx.c:
(1) imx_serial_init 函数中向 Linux 内核注册了 imx_reg, imx_reg 就是 uart_driver 类型的结
构体变量:
(2) 设备,总线匹配
(3) probe函数的实现
三、UART驱动编写
1、直接修改设备树配置即可
(1) 创建 uart 对应的 pinctrl 子节点
(2) 添加 uart 节点