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数据库从入门到精通系列之十:表空间、索引表空间、创建表空间、创建索引空间、创建分区表、创建分区表的分区、创建指定表空间、索引表空间的分区表 一、数据库表空间和数据库之间的关系二、索引表空间和数据库之间的关系三、创建角色四、创建表空间目录五、创建表空…...
恶补,先验分布,后验分布 ,似然估计
恶补,打一遍增加印象 先验分布后验分布,似然估计 声明:仅记录个人学习,并无其他用途。 先验分布 后验分布, 似然估计 隔壁小哥的故事: 隔壁小哥要去15公里外的一个公园里玩,小哥可以选择步行…...
JS之数组中的reduce方法
文章目录 基本语法:callbackFn 的参数:例子1. 数组求和2. 数组求积3. 扁平化数组4. 数组元素计数5. 使用对象解构和展开运算符合并数组中的对象6. 求最大值和最小值 函数组合异步操作中的 reduce总结 reduce 是 JavaScript 中 Array 对象的一个方法,非常…...
在win10上通过WSL和docker安装Ubuntu子系统,并配置Ubuntu可成功使用宿主机GPU
本文主要记录win10系统上,通过WSL的Ubuntu系统以及Docker使用GPU的全部过程。 文章目录 1、 启用hyper-v2、 安装docker3、 安装WSL3.1 安装WSL23.1.1 检查是否安装了WSL23.1.1 安装和配置 WSL 23.2 安装Ubuntu 子系统3.3 检查并修改WSL版本4、docker配置ubuntu20.04 LTS5、下…...
python需要掌握那些语法
1-list数据类型 内置方法查看长度len(list) 2.array数据类型 查看形状 3.tuple 取出元组 t (1, 2, 3, 4, 5) # 取出第一个元素 2first_element t[0] 3print(first_element) # 输出:1 4 5# 取出第三个元素 6third_element t[2] 7pr…...
CentOS Mysql8 数据库安装
添加mysql yum仓库 这里安装的是8.0版本,如需其他版本在此查看mysql版本列表 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm安装mysql sudo yum install mysql-server …...
新手教程---python-函数(新添加)
一、递归函数 在Python中,递归函数是指一个函数调用自身的过程。递归函数一般包括两个部分:基本情况和递归情况。 基本情况是指在递归过程中终止递归的条件。如果不满足基本情况,递归函数将进入递归情况,调用自身,并缩…...
Windows tasklist命令详解,Windows查看进程
「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 tasklist 可以…...
数据结构——线性表(循环链表)
一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一 个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…...
深度剖析机构号矩阵系统:如何根据业务需求做出明智选择
在数字化营销的浪潮中,短视频平台如抖音、快手等已成为品牌传播和用户互动的重要渠道。为了更高效地管理这些平台的账号,机构号矩阵系统应运而生。本文将深度剖析机构号矩阵系统,并探讨如何根据业务需求做出明智的选择。 机构号矩阵系统概述…...
go语言的基础语法
基础语法 与python、vue等类似,go语言也分常量和变量等,常量用const(不可变)和变量var(可变)定义 常量 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型,值不可更改,表达式只支…...
分销平台网站建设桂林/微信广告投放平台
1、安装cron工具:apt-getinstall cron 2、开启定时任务:crontab –e 定时任务语句格式为:执行周期命令。 周期有5个域,分别是分,时,日(day of month),月(month of year)&…...
从网址怎么看网站的域名/品牌设计公司
这几天做了下美团校招的一些套题。(只写了编程,这两天慢慢更新吧)这套题还是蛮简单的。。我暴力了好几个都能过。一个小时多一点差不多能写完。4、棋子翻转题意:在4*4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),…...
做淘宝美工客服兼职的网站/网络优化论文
这次试一试发布一个操作数据库的项目。seam带的例子booking。1、先试一试能不能在jboss自带的hsql数据库上正常运行:2、用以前的办法,用/p20080422/examples/booking/build.xml文件编译项目。浏览地址http://127.0.0.1:8080/seam-booking/home.seam。OK&…...
soho怎么做网站/sem扫描电镜
表单验证 验证路径:<form action"" method"post"> 1、(非空验证) <input type"text" name"uid" id"uid" οnblur"Check()" /> 文本框输入 <input type"…...
wordpress 搜索 插件/网站编辑怎么做
解决方法: 将数据类型改为bigint类型即可 更改数据类型语句: alter table table_name modify column column_name 数据类型;...
网站建设业务员好做吗/开封网络推广公司
我们都知道在使用电脑的过程中,有时候可能会遇到过电脑网络出现红叉怎么修复的情况,出现这种现象该怎么办呢?下面笔者就和大家具体介绍下该问题的解决方法,希望可以帮助大家~1、首先按下winr键打开运行窗口,输入“serv…...