参考代码
串口核心层:
drivers/tty/serial/serial_core.c
TTY层:
drivers/tty/tty_io.c
行规程:
drivers/tty/tty_ldisc.c
drivers/tty/n_tty.c
read 过程
-
APP 读:
使用行规程来读
无数据时休眠 -
UART 接收到数据,产生硬件中断
在中断处理函数中,从硬件上读入数据 -
发给行规程 行规程处理后存入buffer 唤醒APP
-
APP 在行规程中得到数据
源码解析
drivers/tty/tty_io.c
这里的ld ->ops 是 n_tty.c 文件中的tty_ldisc_N_TTY 结构体,详情见: Uart驱动 open流程
drivers/tty/n_tty.c
当UART 硬件上,有数据产生时,触发中断, 读入 数据并且 发送给行规程,行规程得到数据后,唤醒APP
uart_insert_char(port, lsr, UART_LSR_OE, ch, flag); //将数据插入tty_port 的tty_buffer中
tty_flip_buffer_push(&port->state->port); //通知行规程