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

专栏文章目录传送门:返回专栏目录![]()
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驱动的关系紧密。

对于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);

注册流程图
从注册流程来看,最终会注册到一个TTY设备,将会在文件系统产生一个tty 设备,这样可以提供给应用程进行调用控制UART.
主要代码接口uart_register_driver
关于代码调用相关:
这里引用TTY 驱动设备创建过程:

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

通过 platform_driver_register 将 platform_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),每种线路规程实现了一种特定的数据处理方式或协议。

比如:
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子系统(二)
专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 目录 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视频技术助力图书馆安全与秩序管理
一、背景需求 随着信息技术的飞速发展,图书馆作为重要的知识传播场所,其安全管理也面临着新的挑战。为了确保图书馆内书籍的安全、维护读者的阅读环境以及应对突发事件,TSINGSEE青犀旭帆科技基于EasyCVR视频监控汇聚平台技术与AI视频智能分析…...
Go的数据结构与实现【LinkedList】
介绍 所谓链表(Linked List),就是按线性次序排列的一组数据节点。每个节点都是一个对象,它通过一个引用指向对应的数据元素,同时还通过一个引用next指向下一节点。 实现 逻辑方法 我们定义链表的结构体:…...
Ubuntu22.04安装CUDA+CUDNN+Conda+PyTorch
步骤: 1、安装显卡驱动; 2、安装CUDA; 3、安装CUDNN; 4、安装Conda; 5、安装Pytorch。 一、系统和硬件信息 1、Ubuntu 22.04 2、显卡:4060Ti 二、安装显卡驱动 (已经安装的可以跳过&a…...
当“广撒网”遇上“精准定点”的鱼叉式网络钓鱼
批量网络钓鱼电子邮件活动倾向于针对大量受众,它们通常使用笼统的措辞和简单的格式,其中不乏各种拼写错误。而有针对性的攻击往往需要付出更大的努力,攻击者会伪装成雇主或客户向目标发送包含个人详细信息的个性化消息。在更大范围内采用这种…...
svn ldap认证临时切换到本地认证
当前的svn是在CentOS 7 下 SVN、 Apache 对接 LDAP 服务实现用户账号管理和权限认证,本文模拟ldap数据丢失如何恢复svn,方法是临时将认证切换到本地认证 编辑subversion.conf文件 vi /etc/httpd/conf.d/subversion.conf 注释ldap-status #<Locati…...
极狐GitLab如何配置使用独立数据库?
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…...
TCP状态转换详解
1.什么是TCP的状态转换 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中,连接的状态会随着不同阶段的通信而发生变化,这些变化被称为状…...
SimMIM:一个类BERT的计算机视觉的预训练框架
1、前言 呃…好久没有写博客了,主要是最近时间比较少。今天来做一期视频博客的内容。本文主要讲SimMIM,它是一个将计算机视觉(图像)进行自监督训练的框架。 原论文:SimMIM:用于掩码图像建模的简单框架 (a…...
数据精度丢失
js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题,现总结一下 在开发过程中,发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查,怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…...
Element UI DatePicker选择日期范围区间默认显示前一个月和本月
要求:点击el-date-picker选择时间范围时,默认展开当月和上个月。 但是Element UI的组件默认展开的是本月和下一个月,如下图所示: 改为 <span click"changeInitCalendarRange"><el-date-picker v-model"r…...
C++:聚合类、嵌套类、局部类、union类详细介绍与分析
聚合类 (1)What(什么是聚合类) 本质是一个自定义类型的数据结构(结构体或类),但聚合类有以下特性: 所有的成员都是public没有任何构造函数没有基类类内部没有初始值 (2)Why(聚合类的作用&…...
MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统
MKS流量计软件MFC通讯驱动使用于C和P系列MFC控制USB接口W10系统...
C++:左值/右值引用、移动语义/std::move、万能引用/完美转发std::forward 详解
你能学到 左值 与 右值左值引用 与 右值引用 基本用法与作用拷贝构造函数 与 移动构造函数移动语义 与 std::move万能引用 与 引用折叠完美转发:std::forward 前言 本文代码片段中变量命名规则如下: 小写字母:一般类型的变量(非…...
蜂窝物联云平台:一站式服务,智能生活从此开始!
蜂窝云平台 一、PC端展示与管理 GIS地图整合 在GIS地图上精确展示地块,轻松点选查看详细设备信息、实时监控和控制功能,以及基地的全方位介绍。 个性化定制界面 界面布局与功能展示均可按需求定制,打造独一无二的用户体验。 数据集中看板 将…...
【中项】系统集成项目管理工程师-第3章 信息技术服务-3.3服务生命周期
前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…...
【iOS】——消息传递底层实现
消息传递是什么 Objective-C是一种动态类型语言,这意味着在编译时并不确定对象的具体类型,而是在运行时决定。消息传递机制允许程序在运行时向对象发送消息,对象再决定如何响应这些消息。 当你通过对象调用方法时,例如像这样[ob…...
PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表
PostgreSQL数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…...
AnuPpuccin主题:面向Obsidian用户的可定制化视觉框架
AnuPpuccin主题:面向Obsidian用户的可定制化视觉框架 【免费下载链接】AnuPpuccin Personal theme for Obsidian 项目地址: https://gitcode.com/gh_mirrors/an/AnuPpuccin Obsidian作为一款功能强大的知识管理工具,其原生界面在视觉体验方面存在…...
英文论文降AI全靠同义词替换?错!3款“结构级”辅助工具实测,稳过Turnitin
这两天帮朋友看海外项目的英文稿,发现大家全卡在了 Turnitin 的高疑似度上。熬夜手敲的长篇英文,一查AI率高的吓人,直接让人血压飙升。 为了提升文本表达的原创度,很多人疯狂寻找免费降ai率的方法。其实现在的海外检测早就进化了&…...
OpenCrow:自托管多智能体AI平台的架构解析与实战部署指南
1. 项目概述:一个能自我进化的多智能体AI平台如果你和我一样,对AI智能体的潜力感到兴奋,但又对市面上那些要么功能单一、要么部署复杂的平台感到头疼,那么OpenCrow的出现,可能就是我们一直在等的那个“瑞士军刀”。这不…...
Pearcleaner终极指南:5步实现Mac应用彻底卸载,释放宝贵存储空间
Pearcleaner终极指南:5步实现Mac应用彻底卸载,释放宝贵存储空间 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 还在为Mac存储空间不…...
别再踩坑了!Ubuntu 20.04下用Docker一键编译OLLVM 4.0(附完整Dockerfile)
基于Docker的OLLVM 4.0高效编译指南:Ubuntu 20.04最佳实践 在移动安全与逆向工程领域,OLLVM作为代码混淆的黄金标准工具链,其环境搭建一直是开发者面临的痛点。传统源码编译方式需要处理复杂的依赖关系、版本冲突和系统污染风险,而…...
ARM缓存控制器架构解析与性能优化实践
1. ARM缓存控制器架构概述 在现代处理器设计中,缓存控制器作为CPU与主存之间的关键桥梁,其设计优劣直接影响系统整体性能。ARM架构的缓存控制器采用分层设计理念,通过数据RAM、标签RAM和脏RAM三大核心组件的协同工作,实现了高效的…...
Excel数据分析工具库 vs. Python手动计算:手把手教你搞定一元线性回归的全部检验
Excel与Python双视角解析:一元线性回归的实战检验指南 当市场部的同事递给你一份用户行为数据,指着"页面停留时间"和"转化率"两列问你"这两个指标到底有没有关系"时,你会选择打开Excel的回归分析工具一键生成报…...
具身单月狂揽了200亿?!
点击下方卡片,关注“具身智能之心”公众号具身智能领域的投资人,现在大概是全中国最焦虑、也最亢奋的一群人。刚刚过去的4月,这个赛道丢下了两颗足以震动行业的“深水炸弹”:它石智航官宣完成4.55亿美金Pre-A轮融资,一…...
AI记忆系统健康管理:行为数据驱动的OpenClaw记忆污染解决方案
1. 项目概述:为AI记忆系统装上“听诊器”如果你正在用OpenClaw,或者任何类似的AI智能体开发框架,那你肯定对它的记忆系统又爱又恨。爱的是,它能记住你项目里的关键代码片段、常用指令,下次对话时能直接调出来用&#x…...
AI API中转服务全解析:从概念到实战,轻松接入GPT-4与Claude
1. 项目概述:一个关于AI API服务的开源项目最近在GitHub上闲逛,发现了一个挺有意思的项目,名字叫“-chatgpt4.0-api-key”。点进去一看,这其实是一个围绕“云雾API”服务的资源汇总和指南仓库。说白了,它不是一个能直接…...
