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函数
相关文章
|
6月前
|
存储 安全 NoSQL
【干货满满】API安全加固指南:签名防篡改+Access Token管理最佳实践
API 安全关乎业务与用户隐私,签名机制防篡改、伪造请求,Access Token 管理身份与权限。本文详解签名生成、Token 类型与管理、常见安全问题及最佳实践,助开发者构建安全可靠的 API 体系。
|
7月前
|
人工智能 安全 语音技术
幼师必备AI教学神器:AI大模型赋能幼儿园课堂
输入幼儿年龄、性别、个案情况概述等关键内容,一键快速生成五大领域评价、幼儿发展评价、幼儿区域活动评价、幼儿游戏评价等评价内容,助力教师高效科学开展幼儿评价工作。
|
前端开发 JavaScript Java
如何捕获和处理HTTP GET请求的异常
如何捕获和处理HTTP GET请求的异常
|
机器学习/深度学习 算法 PyTorch
Pytorch-SGD算法解析
SGD(随机梯度下降)是机器学习中常用的优化算法,特别适用于大数据集和在线学习。与批量梯度下降不同,SGD每次仅使用一个样本来更新模型参数,提高了训练效率。本文介绍了SGD的基本步骤、Python实现及PyTorch中的应用示例。
1028 0
|
机器学习/深度学习 数据采集 算法
Python实现SSA智能麻雀搜索算法优化支持向量机分类模型(SVC算法)项目实战
Python实现SSA智能麻雀搜索算法优化支持向量机分类模型(SVC算法)项目实战
|
数据可视化 算法
Simulink-Simscape仿真环境配置
Simulink-Simscape仿真环境配置
461 1
|
缓存 监控 Linux
Linux系统的tty架构及UART驱动详解
Linux系统的tty架构及UART驱动详解
2605 0
【ZYNQ】Petalinux 编译工程报错
【ZYNQ】Petalinux 编译工程报错
343 0
|
jenkins Shell 持续交付
自动化部署:使用Jenkins和Docker实现CI/CD
【8月更文挑战第31天】 本文旨在引导读者了解如何通过Jenkins和Docker来实现持续集成和持续部署(CI/CD),从而优化开发流程,提升工作效率。文章将详细介绍配置Jenkins服务器、创建Docker镜像以及设置自动化构建和部署的步骤。通过实际操作案例,我们将展示如何将代码变更快速部署到测试或生产环境,确保软件质量与发布速度的双重保障。
1889 0
|
网络协议
wireshark过滤条件
wireshark过滤条件
1466 0