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月前
|
存储 固态存储 芯片
【文末送书】典型IO接口与总线 | SPI、IIC、UART、GPIO
【文末送书】典型IO接口与总线 | SPI、IIC、UART、GPIO
144 0
|
8月前
|
缓存 Linux 定位技术
嵌入式Linux系列第7篇:操作UART
嵌入式Linux系列第7篇:操作UART
LED模板驱动程序的改造:总线设备驱动模型
LED模板驱动程序的改造:总线设备驱动模型
83 0
|
缓存 Linux 芯片
Linux驱动分析之Uart驱动
之前对Uart驱动的整体架构做了介绍,现在来分析具体的驱动程序。我们以NXP 的 IMX6来进行分析。
|
缓存 Linux API
Linux驱动分析之Uart驱动架构
UART设备驱动可以使用tty驱动的框架来实现,但是因为串口之间有共性,所以Linux在tty接口上封装了一层(serial core)。后面我们再拿一篇文章来解释tty驱动,tty其实就是各种终端设备,串口其实也是终端设备。
Linux驱动分析之Uart驱动架构
|
Linux 芯片
Linux驱动分析之SPI设备
前面我们对SPI控制器驱动进行了分析,接下来来分析SPI设备驱动。我们以DS1302驱动作为分析对象。DS1302是一款RTC芯片,估计很多人在学单片机时用到过。RTC芯片算是比较简单的,也方便分析理解。
Linux驱动分析之SPI设备
|
存储 芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
390 0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
UART子系统(十一)UART驱动情景分析_write
UART子系统(十一)UART驱动情景分析_write
143 0
UART子系统(十一)UART驱动情景分析_write
UART子系统(九)UART驱动情景分析_open
UART子系统(九)UART驱动情景分析_open
101 0
UART子系统(九)UART驱动情景分析_open
UART子系统(八)UART驱动情景分析_注册
UART子系统(八)UART驱动情景分析_注册
56 1
UART子系统(八)UART驱动情景分析_注册