UART驱动情景分析_write
参考资料
-
参考代码:
硬件相关: drivers/tty/serial/imx.c drivers/tty/serial/stm32-usart.c 串口核心层: drivers/tty/serial/serial_core.c TTY层: drivers/tty/tty_io.c
1. 情景分析大纲
- 注册过程分析
open
过程分析read
过程分析write
过程分析
2. 源码框架回顾
3. write过程分析
流程为:
-
APP写
- 使用行规程来写
- 数据最终存入uart_state->xmit的buffer里
-
硬件发送:怎么发送数据?
- 使用硬件驱动中uart_ops->start_tx开始发送
- 具体的发送方法有2种:通过DMA,或通过中断
-
中断方式
- 方法1:直接使能 tx empty中断,一开始tx buffer为空,在中断里填入数据
- 方法2:写部分数据到tx fifo,使能中断,剩下的数据再中断里继续发送
3.1 tty_write
文件:drivers\tty\tty_io.c
3.2 ldisk write
文件:drivers\tty\n_tty.c
函数:n_tty_write
3.3 uart_write
文件:drivers\tty\serial\serial_core.c
函数:uart_write
3.3 硬件相关的发送
3.3.1 IMX6ULL
文件:drivers\tty\serial\imx.c
函数:imx_start_tx
和imx_txint
一开始时,发送buffer肯定为空,会立刻产生中断:
3.3.2 STM32MP157
文件:drivers\tty\serial\stm32-usart.c
函数:stm32_usart_threaded_interrupt
STM32MP157发送串口数据时,有两种方法:DMA、中断。
我们来分析第二种方式:通过中断来发送数据。
- UART有Tx FIFO,可以往里面写入若干个数据,然后使能中断
- 剩下的数据通过中断函数继续发送: