linux中pl011串口驱动的简单分析
•
背景
需要用 rust 重写串口驱动,那么第一步就是对其进行分析。
代码链接
Amba 总线
pl011 作为 arm 的片内外设,可以使用 amba 总线相关的函数进行驱动注册。
arch_initcall 表示初始化代码与体系结构相关,确保该 pl011_init 在体系结构特定的初始化代码后运行。
amba_driver结构体
在 init 中,通过 amba_driver_register 函数将 pl011_driver 结构体注册到了总线上。
在 kernel 发现有与 id_table 相匹配的设备时,将调用 probe 函数。
我们需要在 probe 中进行设备的初始化和 uart_driver 的注册。
probe 函数
pl011_setup_port函数
pl011_register_port函数
amba_pl011_pops结构体
工作量最大的地方(
这个结构体 uart_ops
包含了一组函数指针,用于定义 UART 驱动的操作。每个函数指针对应特定的 UART 操作。下面是每个成员的作用:
基本操作
-
tx_empty
:pl011_tx_empty
- 检查传输缓冲区是否为空。用于确定是否可以发送新的数据。
-
set_mctrl
:pl011_set_mctrl
- 设置调制控制(Modem Control)信号,如 RTS(请求发送)和 DTR(数据终端就绪)。
-
get_mctrl
:pl011_get_mctrl
-
stop_tx
:pl011_stop_tx
-
start_tx
:pl011_start_tx
-
stop_rx
:pl011_stop_rx
-
throttle
:pl011_throttle_rx
- 节流接收数据。通常用于流控制(flow control),防止接收端过载。
-
unthrottle
:pl011_unthrottle_rx
-
enable_ms
:pl011_enable_ms
- 启用调制信号(Modem Status)中断,以监控调制信号的变化。
-
break_ctl
:pl011_break_ctl
- 控制 UART 的中断信号。通常用于发送 Break 信号。
初始化和配置
-
startup
:pl011_startup
- 启动 UART 端口。在端口打开时调用,进行初始化。
-
shutdown
:pl011_shutdown
- 关闭 UART 端口。在端口关闭时调用,进行清理工作。
-
set_termios
:pl011_set_termios
- 设置端口的串行参数,如波特率、数据位、停止位、校验位等。
-
type
:pl011_type
-
config_port
:pl011_config_port
-
verify_port
:pl011_verify_port
控制台轮询(仅在启用 CONFIG_CONSOLE_POLL
时有效)
-
poll_init
:pl011_hwinit
-
poll_get_char
:pl011_get_poll_char
- 从 UART 端口读取一个字符。在轮询模式下获取输入。
-
poll_put_char
:pl011_put_poll_char
- 向 UART 端口写入一个字符。在轮询模式下输出字符。
这些函数指针定义了 UART 驱动的各个操作,实现了 UART 的初始化、配置、传输控制、状态获取等功能。每个函数对应一个特定的操作,通过这些操作可以全面管理 UART 端口的工作。