UART子系统(十)UART驱动情景分析_read

简介: UART子系统(十)UART驱动情景分析_read

UART驱动情景分析_read


参考资料

参考代码:
硬件相关:
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. 源码框架回顾


1670938943452.jpg

3. 使用哪个行规程


3.1 行规程注册


文件:drivers\tty\n_tty.c

void __init n_tty_init(void)
{
  tty_register_ldisc(N_TTY, &n_tty_ops);
}


以后可以通过标号N_TTY找到这个行规程。


3.2 open设备时确定行规程


tty_open
    tty_open_by_driver
      tty_init_dev
      tty = alloc_tty_struct(driver, idx);
      tty_ldisc_init(tty);
      struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
      tty->ldisc = ld;


4. read过程分析


流程为:


APP读

使用行规程来读 * 无数据则休眠


UART接收到数据,产生中断

中断程序从硬件上读入数据

发给行规程 * 行规程处理后存入buffer * 行规程唤醒APP


APP被唤醒后,从行规程buffer中读入数据,返回


4.1 tty_read


文件:drivers\tty\tty_io.c


1670939008352.jpg


4.2 ldisk read


文件:drivers\tty\n_tty.c


函数:n_tty_read

1670939020295.jpg

copy_from_read_buf
  const unsigned char *from = read_buf_addr(ldata, tail);
          // return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
  retval = copy_to_user(*b, from, n);


4.3 数据源头: 中断


4.3.1 IMX6ULL


文件:drivers\tty\serial\imx.c


函数:imx_rxint

imx_rxint
    // 读取硬件状态
    // 得到数据
    // 在对应的uart_port中更新统计信息, 比如sport->port.icount.rx++;
    // 把数据存入tty_port里的tty_buffer
    tty_insert_flip_char(port, rx, flg)
    // 通知行规程来处理
    tty_flip_buffer_push(port);
      tty_schedule_flip(port);
    queue_work(system_unbound_wq, &buf->work); // 使用工作队列来处理
    // 对应flush_to_ldisc函数


4.3.2 STM32MP157


文件:drivers\tty\serial\stm32-usart.c


函数:

stm32_usart_threaded_interrupt
    stm32_usart_receive_chars(port, true);
  // 通过DMA方式得到数据
  stm32_usart_receive_chars_dma(port);
    stm32_usart_push_buffer_dma(port, dma_size);
    // 把数据存入tty_port里的tty_buffer
    dma_count = tty_insert_flip_string(ttyport, dma_start, dma_size);
    // 更新统计信息
    port->icount.rx += dma_count;
  // 通知行规程来处理
  tty_flip_buffer_push(tport);
            tty_schedule_flip(port);
                queue_work(system_unbound_wq, &buf->work); // 使用工作队列来处理
                    // 对应flush_to_ldisc函数
相关文章
|
7月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
258 0
|
存储 芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
539 0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
|
缓存 Linux 定位技术
嵌入式Linux系列第7篇:操作UART
嵌入式Linux系列第7篇:操作UART
|
传感器 移动开发 Linux
RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据)
RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据)
251 0
|
缓存 Linux API
Linux驱动分析之Uart驱动架构
UART设备驱动可以使用tty驱动的框架来实现,但是因为串口之间有共性,所以Linux在tty接口上封装了一层(serial core)。后面我们再拿一篇文章来解释tty驱动,tty其实就是各种终端设备,串口其实也是终端设备。
Linux驱动分析之Uart驱动架构
UART子系统(八)UART驱动情景分析_注册
UART子系统(八)UART驱动情景分析_注册
93 1
UART子系统(八)UART驱动情景分析_注册
LED模板驱动程序的改造:总线设备驱动模型
LED模板驱动程序的改造:总线设备驱动模型
130 0
|
缓存 Linux 芯片
Linux驱动分析之Uart驱动
之前对Uart驱动的整体架构做了介绍,现在来分析具体的驱动程序。我们以NXP 的 IMX6来进行分析。
UART子系统(十一)UART驱动情景分析_write
UART子系统(十一)UART驱动情景分析_write
203 0
UART子系统(十一)UART驱动情景分析_write
UART子系统(九)UART驱动情景分析_open
UART子系统(九)UART驱动情景分析_open
154 0
UART子系统(九)UART驱动情景分析_open