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 相关的知识,主要对串口驱动注册流程,一些重要操作函数进行简单分析,对于应用层来说是一个非常通用的用法,不过在遇到一些通信不上的时候,通过一些排查手法进行查看问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/380741.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 DHT11 温湿度传感器】使用STC89C51读取发送到串口、通过时序图编写C语言

文章目录 DHT11 温湿度传感器概述接线数据传送通讯过程时序图检测模块是否存在 代码实现总结对tmp tmp << 1;的理解对sendByte(datas[0]/10 0x30);的理解 DHT11 温湿度传感器 使用80C51单片机通过读取HDT11温湿度传感的数据&#xff0c;发送到串口。 通过时序图编写相应…

2024-07-18 Unity插件 Odin Inspector8 —— Type Specific Attributes

文章目录 1 说明2 特定类型特性2.1 AssetList2.2 AssetSelector2.3 ChildGameObjectsOnly2.4 ColorPalette2.5 DisplayAsString2.6 EnumPaging2.7 EnumToggleButtons2.8 FilePath2.9 FolderPath2.10 HideInInlineEditors2.11 HideInTables2.12 HideMonoScript2.13 HideReferenc…

STM32学习(3)--GPIO输入

GPIO输入 3.1GPIO输入1.按键介绍2.传感器模块介绍3.硬件电路4.C语言知识点补充&#xff08;1&#xff09;C语言数据类型&#xff08;2&#xff09;C语言宏定义&#xff08;3&#xff09;C语言typedef(4)C语言结构体&#xff08;5&#xff09;C语言枚举 3.2按键控制LED代码1.mai…

Python爬虫(基本流程)

1. 确定目标和范围 明确需求&#xff1a;确定你需要从哪些网站抓取哪些数据。合法性&#xff1a;检查目标网站的robots.txt文件&#xff0c;了解哪些内容可以被抓取。数据范围&#xff1a;确定爬取数据的起始和结束点&#xff0c;比如时间范围、页面数量等。 2. 选择合适的工…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

pyspark使用 graphframes创建和查询图的方法

1、安装graphframes的步骤 1.1 查看 spark 和 scala版本 在终端输入&#xff1a; spark-shell --version 查看spark 和scala版本 1.2 在maven库中下载对应版本的graphframes https://mvnrepository.com/artifact/graphframes/graphframes 我这里需要的是spark 2.4 scala 2.…

(南京观海微电子)——电感的电路原理及应用区别

电感 电感是导线内通过交流电流时&#xff0c;在导线的内部及其周围产生交变磁通&#xff0c;导线的磁通量与生产此磁通的电流之比。 当电感中通过直流电流时&#xff0c;其周围只呈现固定的磁力线&#xff0c;不随时间而变化&#xff1b;可是当在线圈中通过交流电流时&am…

linux内核中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中&#xff0c;校园招聘会的出现&#xff0c;为学生们提供了一个展示自我、探寻职业道路的舞台&#xff0c;同时也为企业搭建了一座直面未来之星的桥梁。这一功能&#xff0c;凭借其独特的优势与前沿的技术&#xff0c;正在重新定义校园与职场之间的过…

react Jsx基础概念和本质

什么是jsx jsx是JavaScript和XML(HTML)的缩写&#xff0c;表示在js代码中编写HTML模板结构&#xff0c;它是react中编写UI模板的方式 const message this is message function App(){return (<div><h1>this is title</h1>{message}</div>) } jsx优…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

持续集成08--Jenkins邮箱发送构建信息及测试报告

前言 在持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;的自动化流程中&#xff0c;及时通知团队成员关于构建的成功或失败是至关重要的。Jenkins&#xff0c;作为强大的CI/CD工具&#xff0c;提供了多种通知机制&#xff0c;其中邮件通知是最常用且有…

Java小技能:多级组织机构排序并返回树结构(包含每个层级的子节点和业务数据集合)

文章目录 引言I 实体定义1.1 部门1.2 用户组织机构中间表1.3 树状DTOII 抽取组织机构排序方法2.1 树状排序方法2.2 案例III 查询条件构建3.1 根据部门进行权限控制3.2 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…

浅谈Canal原理

canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据 订阅 和 消费。应该是阿里云DTS&#xff08;Data Transfer Service&#xff09;的开源版本。 Canal与DTS提供的功能基本相似&#xff1a; 基于…

大模型实战—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

网络编程中的TCP和UDP

什么是TCP协议 TCP( Transmission control protocol )即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 &#xff1a;数据传输之前客户端和服务器端必须建立连…

计算机体系结构||指令的调度和延迟分布(3)

实验3 指令的调度和延迟分布 3.1实验目的 &#xff08;1&#xff09;加深对指令调度技术的理解。 &#xff08;2&#xff09;加深对延迟分支技术的理解。 &#xff08;3&#xff09;熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。 &#xff08;4&#xff09;进一…

最新版kubeadm搭建k8s(已成功搭建)

kubeadm搭建k8s&#xff08;已成功搭建&#xff09; 环境配置 主节点 k8s-master&#xff1a;4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10.16.64.67&#xff09; 从节点 k8s-node1&#xff1a; 4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10…

【Word】——小技巧

1.PDF相关转换word PDF转换成Word在线转换器 - 免费 - CleverPDF 2. word插入公式 1.软件推荐&#xff08;免费&#xff09; 可直接将图片&#xff0c;截屏公式转为word标准规范形式 2.网址推荐 在线LaTeX公式编辑器-编辑器 &#xff08;每天有免费使次数&#xff09; 3.…

机器学习——降维算法PCA和SVD(sklearn)

目录 一、基础认识 1. 介绍 2. 认识 “ 维度 ” &#xff08;1&#xff09;数组和Series &#xff08;2&#xff09;DataFrame 表 &#xff08;3&#xff09;图像 3. 降维思想 4. 降维步骤 二、降维算法&#xff08;PCA&#xff09; 1. PCA实现 &#xff08;1&#…