当前位置: 首页 > news >正文

NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)

62348318f81043abb7388ce3bd435859.png

专栏文章目录传送门:返回专栏目录5ceabff517714259aba8c604e56841b4.png

Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】


目录

1. Linux 串口驱动

1.1 Uart 驱动注册流程

1.2 uart 操作函数

1.3 line discipline

2. Linux tty应用层使用

2.1 UART 操作步骤

2.2 UART 使用注意要点

3. 总结


本章节主要对Linux 下tty 相关设备,以serial进行一些分析;

  • cpu: i.mx8mq

  • OS:Android 11

  • Kernel version:kernel 5.10

根据上一章节对TTY的整个框架有一些简单了解,常说的串口驱动也一并进行简单说明,对tty调用至串口相关的整个流程进行讲解。

1. Linux 串口驱动

Linux 串口整个驱动在嵌入式中使用率是非常非常高的一个部分,常用用于打印调试。先查看串口驱动的整个层次结构情况,主要是串口驱动与tty驱动的关系紧密。

a8f7def04d4548ac8ef6b7e2f84d53f0.png

对于TTY Core 层中,已经在Linux tty子系统介绍(一)已经有大致提到,主要是为用户层提供相关接口,为下层各种不一样的tty 进行管理;

Serial Core 层:Serial Core 层提供了一个抽象层,用于表示和处理串口设备。它定义了一组通用的接口和数据结构,使得不同类型的串口设备能够在同一接口上进行交互。

Uart driver 层:UART Driver Layer 提供了一个硬件抽象层,允许不同型号和厂商的 UART 控制器以统一的方式与 Linux 内核交互。这种抽象层使得 Linux 内核能够适应各种不同的硬件实现。

1.1 Uart 驱动注册流程

串口驱动的注册主要包含:UART驱动注册,platform 平台注册

UART驱动注册:

uart_register_driver(&imx_uart_uart_driver);

ee448c22c88b4bd78c1c1fd2d0fa41f7.png

注册流程图

从注册流程来看,最终会注册到一个TTY设备,将会在文件系统产生一个tty 设备,这样可以提供给应用程进行调用控制UART.

主要代码接口uart_register_driver

关于代码调用相关:

这里引用TTY 驱动设备创建过程:

313f84b30a33457c88d1dbb0f277eee0.png

platform 平台注册:

platform_driver_register(&imx_uart_platform_driver);

这一步注册了一个平台驱动。imx_uart_platform_driver 是一个 platform_driver 结构体的实例,它定义了平台驱动的属性和操作函数,包括匹配、探测、移除等操作。平台驱动负责与具体的硬件平台进行交互。

主要用于总线匹配:

d604533abf9c433f9a0384140806d032.png

通过 platform_driver_registerplatform_driver 结构体注册到内核,内核因此知道有一个新的平台驱动可以处理特定的平台设备。

1.2 uart 操作函数

串口驱动的 uart_ops 结构体包含了uart 的操作函数。在不同平台SoC需要实现该操作函数。

static const struct uart_ops imx_uart_pops = {.tx_empty       = imx_uart_tx_empty,      // 检查发送缓冲区是否为空.set_mctrl      = imx_uart_set_mctrl,     // 设置调制解调器控制信号.get_mctrl      = imx_uart_get_mctrl,     // 获取调制解调器控制信号.stop_tx        = imx_uart_stop_tx,       // 停止发送数据.start_tx       = imx_uart_start_tx,      // 开始发送数据.stop_rx        = imx_uart_stop_rx,       // 停止接收数据.enable_ms      = imx_uart_enable_ms,     // 启用调制解调器状态中断.break_ctl      = imx_uart_break_ctl,     // 控制串口的断点信号.startup        = imx_uart_startup,       // 启动串口.shutdown       = imx_uart_shutdown,      // 关闭串口.flush_buffer   = imx_uart_flush_buffer,  // 刷新发送和接收缓冲区.set_termios    = imx_uart_set_termios,   // 设置串口的参数(波特率、数据位、停止位等).type           = imx_uart_type,          // 获取串口类型.config_port    = imx_uart_config_port,   // 配置串口端口.verify_port    = imx_uart_verify_port,   // 验证串口端口
#if defined(CONFIG_CONSOLE_POLL).poll_init      = imx_uart_poll_init,     // 初始化轮询模式.poll_get_char  = imx_uart_poll_get_char, // 在轮询模式下获取字符.poll_put_char  = imx_uart_poll_put_char, // 在轮询模式下发送字符
#endif
};

假如在RK3588平台,同样需要实现uart_ops的操作函数。

1.3 line discipline

在架构图中可以发现有一个line discipline,这个作用是什么?

line discipline是线路规划意思,是TTY子系统中的一个比较重要概念,它在字符设备和用户空间之间扮演了一个中间层的角色,处理从用户空间传入的数据和从硬件传出的数据。它的主要作用是提供一个可插拔的处理机制,使得不同的协议和数据处理方式可以方便地集成到串口驱动中。

line discipline代码中结构体 tty_ldisc_ops 代表不同的线路规程(line discipline),每种线路规程实现了一种特定的数据处理方式或协议。

734f4a7288464f0c9f24f5672913be6c.png

比如:

N_TTY:默认线路规划,用于标准的字符终端输入输出处理。它处理基本的控制字符(如回车、删除等),并提供行缓冲和行编辑功能。

N_PPP:用于点对点协议(PPP)处理,适用于通过串口进行的网络连接。它负责处理 PPP 的帧封装和解封装。

N_SLIP:用于串行线路互联网协议(SLIP)处理。SLIP 是一种简单的封装协议,用于在串行接口上传输 IP 数据报。

N_R3964:用于西门子的 R3964 协议,通常用于工业控制系统。它实现了西门子硬件设备的通信协议。

最常用的就是n_tty,源码路径:drivers/tty/n_tty.c

static struct tty_ldisc_ops n_tty_ops = {.magic           = TTY_LDISC_MAGIC,.name            = "n_tty",.open            = n_tty_open,.close           = n_tty_close,.flush_buffer    = n_tty_flush_buffer,.read            = n_tty_read,.write           = n_tty_write,.ioctl           = n_tty_ioctl,.set_termios     = n_tty_set_termios,.poll            = n_tty_poll,.receive_buf     = n_tty_receive_buf,.write_wakeup    = n_tty_write_wakeup,.receive_buf2    = n_tty_receive_buf2,
};

2. Linux tty应用层使用

对于TTY 应用层中的UART 来说,可以发现并没有像其他通信串口IIC,SPI具体设备驱动,关于具体设备一般都在应用层实现。对于 应用层中只有简单的一些操作。

2.1 UART 操作步骤

打开串口设备

配置串口参数

读写数据

关闭串口设备

这几个步骤 需要注意在配置串口举例子:

#include <termios.h>
​
struct termios options;
tcgetattr(fd, &options);  // 获取当前串口配置
​
// 设置波特率
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
​
// 设置控制模式
options.c_cflag |= (CLOCAL | CREAD);  // 允许接收数据
options.c_cflag &= ~PARENB;           // 无校验
options.c_cflag &= ~CSTOPB;           // 一位停止位
options.c_cflag &= ~CSIZE;            // 清除数据位掩码
options.c_cflag |= CS8;               // 数据位 8
​
// 设置输入模式
options.c_iflag &= ~(IXON | IXOFF | IXANY);  // 关闭软件流控制
​
// 设置输出模式
options.c_oflag &= ~OPOST;  // 原始输出模式
​
// 设置本地模式
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  // 原始输入模式
​
// 设置新的串口配置
tcsetattr(fd, TCSANOW, &options);

关于读写操作普通的write read等。

2.2 UART 使用注意要点

使用串口通信需要注意的是:

波特率的问题: 需要与通信接口的波特率一直既可。

阻塞和非阻塞模式:在阻塞模式下,读写操作会一直等待直到完成;在非阻塞模式下,读写操作会立即返回,应用程序需要使用轮询或其他方法来检查是否有数据可用或是否已经完成写入。

串口设备文件权限:确保应用程序对串口设备文件有足够的访问权限,否则可能无法打开串口。

3. 总结

本文主要以串口驱动去介绍TTY 相关的知识,主要对串口驱动注册流程,一些重要操作函数进行简单分析,对于应用层来说是一个非常通用的用法,不过在遇到一些通信不上的时候,通过一些排查手法进行查看问题。

相关文章:

NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Linux 串口驱动 1.1 Uart 驱动注册流程 1.2 uart 操作函数 1.3 line discipline 2. Linux tty应用层使用…...

FPGA资源容量

Kintex™ 7 https://www.amd.com/zh-tw/products/adaptive-socs-and-fpgas/fpga/kintex-7.html#product-table AMD Zynq™ 7000 SoC https://www.amd.com/en/products/adaptive-socs-and-fpgas/soc/zynq-7000.html#product-table AMD Zynq™ UltraScale™ RFSoC 第一代 AMD Z…...

Zabbix介绍和架构

目录 一.Zabbix简介 1.为什么需要监控 2.需要监控什么 3.常见的监控工具 4.Zabbix使用场景及系统概述 5.Zabbix 架构 6.Zabbix工作流程 7.Zabbix 术语 二. 部署安装zabbix 三.zabbix 配置文件 一.Zabbix简介 1.为什么需要监控 运维行业有句话:“无监控、不运维”&am…...

打造智慧图书馆:AI视频技术助力图书馆安全与秩序管理

一、背景需求 随着信息技术的飞速发展&#xff0c;图书馆作为重要的知识传播场所&#xff0c;其安全管理也面临着新的挑战。为了确保图书馆内书籍的安全、维护读者的阅读环境以及应对突发事件&#xff0c;TSINGSEE青犀旭帆科技基于EasyCVR视频监控汇聚平台技术与AI视频智能分析…...

Go的数据结构与实现【LinkedList】

介绍 所谓链表&#xff08;Linked List&#xff09;&#xff0c;就是按线性次序排列的一组数据节点。每个节点都是一个对象&#xff0c;它通过一个引用指向对应的数据元素&#xff0c;同时还通过一个引用next指向下一节点。 实现 逻辑方法 我们定义链表的结构体&#xff1a…...

Ubuntu22.04安装CUDA+CUDNN+Conda+PyTorch

步骤&#xff1a; 1、安装显卡驱动&#xff1b; 2、安装CUDA&#xff1b; 3、安装CUDNN&#xff1b; 4、安装Conda&#xff1b; 5、安装Pytorch。 一、系统和硬件信息 1、Ubuntu 22.04 2、显卡&#xff1a;4060Ti 二、安装显卡驱动 &#xff08;已经安装的可以跳过&a…...

当“广撒网”遇上“精准定点”的鱼叉式网络钓鱼

批量网络钓鱼电子邮件活动倾向于针对大量受众&#xff0c;它们通常使用笼统的措辞和简单的格式&#xff0c;其中不乏各种拼写错误。而有针对性的攻击往往需要付出更大的努力&#xff0c;攻击者会伪装成雇主或客户向目标发送包含个人详细信息的个性化消息。在更大范围内采用这种…...

svn ldap认证临时切换到本地认证

当前的svn是在CentOS 7 下 SVN、 Apache 对接 LDAP 服务实现用户账号管理和权限认证&#xff0c;本文模拟ldap数据丢失如何恢复svn&#xff0c;方法是临时将认证切换到本地认证 编辑subversion.conf文件 vi /etc/httpd/conf.d/subversion.conf 注释ldap-status #<Locati…...

极狐GitLab如何配置使用独立数据库?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…...

TCP状态转换详解

1.什么是TCP的状态转换 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中&#xff0c;连接的状态会随着不同阶段的通信而发生变化&#xff0c;这些变化被称为状…...

SimMIM:一个类BERT的计算机视觉的预训练框架

1、前言 呃…好久没有写博客了&#xff0c;主要是最近时间比较少。今天来做一期视频博客的内容。本文主要讲SimMIM&#xff0c;它是一个将计算机视觉&#xff08;图像&#xff09;进行自监督训练的框架。 原论文&#xff1a;SimMIM&#xff1a;用于掩码图像建模的简单框架 (a…...

数据精度丢失

js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题&#xff0c;现总结一下 在开发过程中&#xff0c;发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查&#xff0c;怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…...

Element UI DatePicker选择日期范围区间默认显示前一个月和本月

要求&#xff1a;点击el-date-picker选择时间范围时&#xff0c;默认展开当月和上个月。 但是Element UI的组件默认展开的是本月和下一个月&#xff0c;如下图所示&#xff1a; 改为 <span click"changeInitCalendarRange"><el-date-picker v-model"r…...

C++:聚合类、嵌套类、局部类、union类详细介绍与分析

聚合类 (1)What&#xff08;什么是聚合类&#xff09; 本质是一个自定义类型的数据结构&#xff08;结构体或类&#xff09;&#xff0c;但聚合类有以下特性&#xff1a; 所有的成员都是public没有任何构造函数没有基类类内部没有初始值 (2)Why&#xff08;聚合类的作用&…...

MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统

MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统...

C++:左值/右值引用、移动语义/std::move、万能引用/完美转发std::forward 详解

你能学到 左值 与 右值左值引用 与 右值引用 基本用法与作用拷贝构造函数 与 移动构造函数移动语义 与 std::move万能引用 与 引用折叠完美转发&#xff1a;std::forward 前言 本文代码片段中变量命名规则如下&#xff1a; 小写字母&#xff1a;一般类型的变量&#xff08;非…...

蜂窝物联云平台:一站式服务,智能生活从此开始!

蜂窝云平台 一、PC端展示与管理 GIS地图整合 在GIS地图上精确展示地块&#xff0c;轻松点选查看详细设备信息、实时监控和控制功能&#xff0c;以及基地的全方位介绍。 个性化定制界面 界面布局与功能展示均可按需求定制&#xff0c;打造独一无二的用户体验。 数据集中看板 将…...

【中项】系统集成项目管理工程师-第3章 信息技术服务-3.3服务生命周期

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

【iOS】——消息传递底层实现

消息传递是什么 Objective-C是一种动态类型语言&#xff0c;这意味着在编译时并不确定对象的具体类型&#xff0c;而是在运行时决定。消息传递机制允许程序在运行时向对象发送消息&#xff0c;对象再决定如何响应这些消息。 当你通过对象调用方法时&#xff0c;例如像这样[ob…...

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表

PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...