linux 的uart驱动框架分析
文章目录
- 一、底层串行硬件驱动程序
- 二、Console支持
- 三、锁支持
- 四、核心数据结构
- 1、struct uart_driver
- 2、struct uart_port
- 3、struct uart_ops
- 四、常用API总结
- 五、uart驱动示例剖析
- 1、原厂设计的uart驱动
- 2、8250标准uart驱动
- 六、总结
🔺【linux内核系列文章】
👉对一些文章内容进行了勘误,本系列文章长期不定时更新,希望能分享出优质的文章!
- 1、《linux内核数据结构分析之哈希表》
- 2、《一文总结linux内核通知链》
- 3、《linux内核中的debugfs》
- 4、《linux内核数据结构分析之链表》
- 5、《linux media子系统分析之media控制器设备》
- 6、《V4L2-PCI驱动程序样例分析(上)》
- 7、《v4l2框架分析之v4l2_fh》
- 8、《 v4l2框架分析之v4l2_subdev》
- 9、《 v4l2框架分析之v4l2_device》
- 10、《v4l2框架分析之video_device》
- 11、《linux内核重要函数 | do_initcalls》
- 12、《Linux设备驱动模型 | bus》
- 13、《linux内核裁剪随想》
- 14、《基于ARM64分析linux内核的链接脚本vmlinux.lds.S》
- 15、《linux内核start_kernel函数的早期操作》
- 16、《start_kernel函数详解系列之proc_caches_init》
- 17、《start_kernel函数详解系列之fork_init》
- 18、《start_kernel函数详解系列之rcu_init》
- 19、《start_kernel函数详解系列之proc_root_init》
- 20、《start_kernel详解系列之【setup_arch】》
- 21、《linux内核如何启动用户空间进程(上)》
- 22、《linux内核如何启动用户空间进程(下)》
- 23、《一文总结linux内核的完成量机制》
- 24、《一文总结linux内核设备驱动的注册和卸载》
- 25、《linux内核的启动加载程序的总结》
- 26、《linux内核入口:head.o》
- 27、《挂载根文件系统之rootfs》
- 28、《mount系统调用剖析》
- 29、《devtmpfs文件系统分析》
- 30、《linux内核的kthreadd线程》
- 31、《linux内核的进程调度—调度策略》
- 32、《linux系统调用实践(Arm架构)》
- 33、《对linux内核__init机制的实践》
- 34、《linux 内核中EXPORT_SYMBOL()分析与实践》
- 35、《linux内核如何挂载根文件系统》
- 36、《linux内核如何唤醒线程》
- 37、《linux内核的init线程》
- 38、《linux内核伪文件系统—sysfs分析》
- 39、《linux 内核设备模型的初始化(上)》
- 40、《linux 内核设备模型的初始化(下)》
- 41、《linux内核伪文件系统—proc分析》
- 42、《linux中断管理—workqueue工作队列》
- 43、《linux中断管理—软中断》
- 44、《linux中断管理 | tasklet》
- 45、《linux中断管理 | 中断管理框架(01)》
- 46、《linux内存管理 | 分配物理内存页面》
- 47、《linux内存管理 | 释放内存页面》
- 48、《对linux内核设备的注册机制和查找机制分析》
- 49、《linux内核设备驱动的注册机制》
linux源码相关文件:
- serial-core.c
- include/linux/serial_core.h
一、底层串行硬件驱动程序
底层串行硬件的驱动程序负责向serial核心驱动程序提供由struct uart_port
定义的端口信息和一组由struct uart_ops
定义的控制方法,底层驱动程序还负责处理端口的中断,并提供对控制台的支持。
二、Console支持
serial核心提供了一些助手函数:
uart_get_console()
识别正确的端口结构。uart_parse_options()
解析命令行参数。uart_console_write()
用于执行逐字符写入,将换行符转换为CRLF序列。在驱动程序编写的时候建议使用此函数,而不是实现新的写入接口。
三、锁支持
底层硬件驱动程序负责使用port->lock
执行必要的锁定。支持两把锁:一个是端口自旋锁,另一个是overall
信号量。从uart核心驱动程序的角度来看,port->lock
用于锁定以下的数据:
port->mctrl
port->icount
port->state->xmit.head (circ_buf->head)
port->state->xmit.tail (circ_buf->tail)
底层驱动程序可以自由地使用该锁来实现额外的锁定,port_mutex
互斥量用于防止在不适当的时间添加、删除或重新配置端口。
四、核心数据结构
1、struct uart_driver
struct uart_driver
结构表示具体UART驱动。该结构定义如下(/include/linux/serial_core.h):
struct uart_driver {struct module *owner; //驱动模块的拥有者const char *driver_name; //驱动名称const char *dev_name; //设备名称int major; //主设备号int minor; //从设备号int nr;struct console *cons; //console/** these are private; the low level driver should not* touch these; they should be initialised to NULL*/struct uart_state *state; //uart状态struct tty_driver *tty_driver; //描述ttydriver
};
2、struct uart_port
struct uart_port
表示一个具体的port,该结构定义如下(include/linux/serial_core.h):
struct uart_port {spinlock_t lock; /* port 锁 */unsigned long iobase; /* 输入/输出地址 */unsigned char __iomem *membase; /* read/write[bwl] */unsigned int (*serial_in)(struct uart_port *, int);void (*serial_out)(struct uart_port *, int, int);void (*set_termios)(struct uart_port *,struct ktermios *new,struct ktermios *old);void (*set_mctrl)(struct uart_port *, unsigned int);int (*startup)(struct uart_port *port);void (*shutdown)(struct uart_port *port);void (*throttle)(struct uart_port *port);void (*unthrottle)(struct uart_port *port);int (*handle_irq)(struct uart_port *);void (*pm)(struct uart_port *, unsigned int state,unsigned int old);void (*handle_break)(struct uart_port *);int (*rs485_config)(struct uart_port *,struct serial_rs485 *rs485);unsigned int irq; /* irq number */unsigned long irqflags; /* irq flags */unsigned int uartclk; /* base uart clock */unsigned int fifosize; /* tx fifo size */unsigned char x_char; /* xon/xoff char */unsigned char regshift; /* reg offset shift */unsigned char iotype; /* io access style */unsigned char unused1;unsigned int read_status_mask; /* driver specific */unsigned int ignore_status_mask; /* driver specific */struct uart_state *state; /* 指向父状态的指针 */struct uart_icount icount; /* 通信信息 */struct console *cons; /* struct console, if any */
#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)unsigned long sysrq; /* sysrq timeout */
#endif/* flags must be updated while holding port mutex */upf_t flags;#if __UPF_CHANGE_MASK > ASYNC_FLAGS
#error Change mask not equivalent to userspace-visible bit defines
#endif/** Must hold termios_rwsem, port mutex and port lock to change;* can hold any one lock to read.*/upstat_t status;int hw_stopped; /* sw-assisted CTS flow state */unsigned int mctrl; /* 当前调制解调器CTRL设置 */
相关文章:
linux 的uart驱动框架分析
文章目录 一、底层串行硬件驱动程序二、Console支持三、锁支持四、核心数据结构1、struct uart_driver2、struct uart_port3、struct uart_ops四、常用API总结五、uart驱动示例剖析1、原厂设计的uart驱动2、8250标准uart驱动六、总结🔺【linux内核系列文章】 👉对一些文章内…...

头歌答案HTML——基础
目录 HTML——基础 第1关:初识HTML:简单的Hello World网页制作 任务描述 第2关:HTML结构:自我简介网页 任务描述 HTML——基本标签 第1关:创建第一个 HTML 标签 任务描述 第2关:创建 任务描述 …...

【数据结构——队列的实现(单链表)】
数据结构——队列的实现(单链表) 一.队列1.1队列的概念及结构 二.队列的实现2.1 头文件的实现——(Queue.h)2.2 源文件的实现—— (Queue.c)2.3 源文件的实现—— (test.c) 三.队列的…...
《LeetCode力扣练习》代码随想录——链表(移除链表元素---Java)
《LeetCode力扣练习》代码随想录——链表(移除链表元素—Java) 刷题思路来源于 代码随想录 203. 移除链表元素 虚拟头结点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* …...

linux 安装 mini conda,linux下安装 Miniconda
下载地址 https://docs.conda.io/projects/miniconda/en/latest/index.html 安装conda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/mini…...
机器人 Null impedance(零阻抗)梳理
"Null impedance"(零阻抗)是指机器人系统在特定情境下被设计成对外部力或运动表现出极小的阻抗。这意味着机器人系统在受到外部作用力时,几乎不会提供阻抗或阻力,使其能够灵活地适应外部环境的变化。零阻抗的设计旨在让…...

MDM9205开发环境搭建与编译调试
前言 如题,这篇文章说的是高通mdm9205这颗物联网芯片,从官方资源的获取(包括文档、代码、软件工具等等)到如何编译出可运行固件的方法。 对经历了不止一次这颗芯片开发的我来说,在过程中遇到问题,除了寄希望于可能在工作日第二天凌晨得到的case回复,有一篇最新的有指导方…...

Linux操作系统使用及C高级编程-D3Linux shell命令(权限、输入输出)
Shell 是一种应用程序,用以完成用户与内核之间的交互 一个功能强大的编程语言(C语言) 一个解释执行的脚本语言,不需要编译,写完直接执行 目前Linux 乌班图的Shell默认是bash 查看当前提供的Shell:cat /…...

无线充,大功率小家电,智能家居,无人机快速充电等产品供电 LDR6328S芯片TYUPE-C PD诱骗电压 USB-C解决PD电源取电问题
LDR6328S 是乐得瑞科技有限公司开发的一款兼容 USB PD、QC 和 AFC 协议的 Sink 控制器。 LDR6328S 从支持 USB PD、QC 和 AFC 协议的适配器取电,然后供电给设备。比如可以配置适配器输 出需要的功率,给无线充电器设备供电。LDR6328S 也兼容传统 USB 电源…...

2023数字科技生态大会-数字安全论坛 学习笔记
监管合规->价值创造的方向,在安全领域的发展方向-安全运营服务型 ICT->数字->数据 数字安全:网络安全数据安全 传统信息化以计算为核心,数字化以数据为核心 数字安全技术发展十大趋势: 一、 数字安全技术政策环境将不…...

玩转ChatGPT:ARIMA模型定制GPT-1.0
一、写在前面 好久不更新咯! OpenAI又推出了GPT的一系列重大更新,其中GPTs深得我心啊。 GPTs允许用户创建自定义的ChatGPT版本,以满足自己各种特定需求。其核心理念在于,用户可以为不同的场景和任务创建定制化的ChatGPT。这意味…...

CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)
版本说明 当前版本号[20231112]。 版本修改说明20231112初版 目录 文章目录 版本说明目录字符串相乘题目解题思路代码思路补充说明参考代码 子集题目解题思路代码思路参考代码 删除链表的倒数第 N 个结点题目解题思路代码思路参考代码 字符串相乘 题目 给定两个以字符串形…...
PostgreSQL 判断JSONB数组是否包含特定的元素
文章目录 前言Integer类型的数组char类型的数组 前言 要判断一个JSONB数组是否包含特定的元素,可以使用>操作符。 Integer类型的数组 -- 是否包含数字3 SELECT [1, 2, 3, 4, 5]::jsonb > [3]::jsonb; -- true -- 是否包含数字3 SELECT [1, 2, 13, 4, 5]::js…...

idea中搭建Spring boot项目(借助Spring Initializer)
创建新项目 启动端口 在项目配置文件application.properties中写入 #启动端口server.port8088编写测试方法 创建控制类文件夹–>便于规范我们新建一个controller包–>建一个HelloWorld.class package com.example.hellospringboot.controller;import org.springframew…...
acwing算法基础之搜索与图论--染色法判断二分图
目录 1 基础知识2 模板3 工程化 1 基础知识 二分图:每条边连接的起点和终点,分别属于集合A和集合B。 一个图是二分图,当且仅当,图中不含奇数环(即,回环中的结点数目是奇数)。 染色法判定二分…...
塔式服务器是什么服务器?
在当今数字时代,数据的处理和存储需求不断增长,企业和组织需要强大而可靠的服务器来支持其业务运营和数据管理。塔式服务器作为一种常见的服务器架构,以其出色的性能、灵活性和可扩展性成为了许多企业和组织的首选。 塔式服务器的外观类似于…...
nodejs+express接口全局拦截和环境变量设置
前言: 本例中必须安装的依赖包有:express、cookie-parser(可以没有) 1. 接口全局拦截 新建一个文件intercept.ts,编写拦截过程 import express from "express"; import cookieParser from cookie-parserconst ssoRouter expre…...

深度学习之基于YoloV5的目标检测和双目测距系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 双目测距系统利用两个相机的图像来计算目标到相机的距离。通过对左右相机图像进行立体匹配,可以获得目标…...

如何显示标注的纯黑mask图
文章目录 前言一、二分类mask显示二、多分类mask显示 前言 通常情况下,使用标注软件标注的标签图看起来都是纯黑的,因为mask图为单通道的灰度图,而灰度图一般要像素值大于128后,才会逐渐显白,255为白色。而标注的时候…...

【算法每日一练]-图论(保姆级教程 篇1(模板篇)) #floyed算法 #dijkstra算法 #spfa算法
今天开始讲图论 目录 图的存储 算任意两点的最短路径: floyed算法: 算一个点到其他所有点的最短距离 dijkstra算法: spfa算法: 图的存储 其实:邻接矩阵和链式向前星都能存边的信息,vector只能存点的信息,再搭配上v[]…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...