【驱动】I2C驱动分析(二)-驱动框架

I2C驱动框架简介

I2C 驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,系统的整体框架如下所示。

  • 最上层是应用层,在应用层用户可以直接用open read write对设备进行操作,
  • 往下是设备驱动层,这个就是外围的比如一些用I2C总线连接到SOC的传感器或者EEPROM的驱动程序,这个一般由普通驱动工程师负责,
  • 再往下的I2C-Core是核心层,这个是Linux内核源码里面本来就有的,这里面主要是一些驱动和设备的注册函数以及i2c_transfer函数,
  • 再往下就是I2C控制器驱动,这个一般是由芯片原厂的程序员负责编写,
  • 再往下就是具体的硬件了。

用户空间

/dev/i2c-*提供了用户空间与内核空间之间的接口,允许用户空间应用程序通过设备文件(如)与I2C驱动进行通信。用户空间应用程序可以使用标准的I2C系统调用(如ioctl())来发送和接收I2C消息。

在Linux内核代码文件/include/linux/i2c-dev.c中针对每个适配器生成一个主设备号为89的设备节点,实现了文件操作接口,用户空间可以通过i2c设备节点访问i2c适配器。适配器的编号从0开始,和适配器的设备节点的次设备号相同。

i2c适配器的设备节点是/dev/i2c-x,其中x是数字,代表适配器的编号。由于适配器编号是动态分配的(和注册次序有关),所以想了解哪一个适配器对应什么编号,可以查看/sys/class/i2c-dev/目录下的文件内容。

内核空间

I2C driver

I2C设备驱动层是Linux内核中负责管理和控制特定I2C设备的关键组件。它通过与I2C核心层协同工作,提供了与I2C设备进行通信、注册、注销、探测、移除等功能的接口。驱动程序负责初始化设备、处理设备的读写操作、响应中断事件等,以实现对I2C设备的控制和管理。通过I2C设备驱动层,用户空间应用程序和其他内核组件可以方便地与I2C设备进行交互,并实现各种应用需求。

下面详细介绍I2C设备驱动层的主要组成和功能:

  • 设备注册和注销:
    I2C设备驱动层提供了函数接口,允许驱动程序注册和注销I2C设备。注册过程中,驱动程序需要提供设备的描述信息,如设备名、设备地址等,以便核心层能够识别和管理设备。通过注册,驱动程序将设备与I2C总线关联起来,并为设备分配唯一的设备编号。注销过程中,驱动程序通知核心层不再需要管理该设备。

  • 设备探测和移除:
    当I2C总线上连接的设备被插入或移除时,I2C设备驱动层的探测和移除函数将被调用。探测函数负责初始化设备并准备设备进行通信。它接收一个i2c_client结构体指针作为参数,该结构体包含设备的地址、适配器指针等信息。探测函数通常会执行设备的初始化和配置操作,并将设备添加到设备模型中,以便其他组件可以访问设备。移除函数在设备被移除时执行,它负责清理设备和相关资源,并从设备模型中注销设备。

  • 设备操作接口:
    I2C设备驱动层提供了一组函数接口,允许用户空间应用程序或其他内核组件与I2C设备进行通信和操作。这些接口包括读取寄存器、写入寄存器、发送和接收数据等操作。驱动程序通过这些接口与设备进行交互,读取或写入设备的寄存器,发送和接收设备的数据。

  • 设备节点和文件系统接口:
    在Linux内核中,I2C设备通过设备节点(Device Node)在文件系统中表示。I2C设备驱动层负责创建和管理设备节点,使用户空间应用程序可以通过文件系统接口来访问和控制设备。设备节点通常位于/sys/bus/i2c/devices目录下,每个设备节点对应一个已注册的I2C设备。用户空间应用程序可以打开设备节点,并使用标准的读写操作来与设备进行通信。

  • 中断和工作队列:
    I2C设备驱动层还提供了处理中断和异步操作的机制,以满足实时性要求。当设备产生中断时,驱动程序可以注册中断处理函数来响应中断事件,并进行相应的处理。此外,驱动程序还可以使用工作队列(Work Queue)机制,在延迟执行的上下文中处理任务,以避免阻塞关键代码路径。

I2Ccore

I2C core是Linux内核中负责管理和控制I2C总线的基础层,提供了一组API和数据结构,用于注册、注销和管理I2C控制器、适配器以及与其连接的I2C设备。

  • I2C控制器注册:I2C核心层允许I2C控制器驱动程序在系统启动时注册。控制器驱动程序通过向I2C核心层提供适当的信息和回调函数来完成注册过程。一旦注册成功,核心层将管理该控制器的状态并提供相应的接口。

  • I2C适配器管理:I2C核心层负责管理系统中的所有I2C适配器。它提供了适配器的注册和注销接口,以便适配器驱动程序可以将适配器添加到系统中或将其移除。核心层还维护了适配器的状态信息,例如适配器的名称、地址范围等。

  • I2C设备注册和管理:I2C核心层允许I2C设备驱动程序注册与I2C总线连接的设备。设备驱动程序通过提供设备地址、设备ID等信息来完成注册过程。一旦注册成功,核心层将为该设备分配一个唯一的设备编号,并提供一组函数接口,使驱动程序能够与该设备进行通信。

  • I2C消息传输:I2C核心层提供了用于发送和接收I2C消息的函数接口。驱动程序可以使用这些接口来创建和配置I2C消息,包括设备地址、寄存器地址、数据等信息,并通过适配器驱动程序将消息发送到I2C总线上。核心层还处理I2C消息的ACK/NACK响应,并提供错误处理机制。

  • I2C设备节点:I2C核心层通过/sys/bus/i2c/devices目录下的设备节点来表示已注册的I2C设备。每个设备节点包含设备的唯一编号、设备地址等信息,驱动程序可以使用这些设备节点来访问和控制对应的I2C设备。

I2C algorithm

I2C algorithm是在软件层面上实现I2C总线通信的一系列步骤和流程。它通过初始化、发起通信、传输数据、等待应答、终止通信等操作来实现与I2C设备的通信和控制。在Linux内核中,I2C算法提供了通用的接口和函数,使驱动程序可以方便地使用和扩展I2C功能。

以下是I2C算法的主要步骤和流程:

  • 初始化:
    在使用I2C总线之前,需要初始化I2C控制器和相关的硬件资源。这包括设置I2C控制器的时钟频率、配置引脚和电气特性等。在Linux内核中,通常通过I2C子系统的初始化函数来完成这些操作。

  • 选择总线:
    在多个I2C总线存在的情况下,需要选择要使用的I2C总线。通常,每个I2C总线都由一个独立的控制器和相关的硬件资源管理。选择总线的方法可以是根据硬件连接关系,或者根据设备的地址范围等。

  • 发起通信:
    在进行I2C通信之前,需要发起通信请求。通信请求包括设备地址、读写操作、寄存器地址(如果适用)以及数据长度等信息。在Linux内核中,可以使用i2c_transfer()函数发起通信请求。

  • 生成起始信号:
    为了开始一次I2C通信,主设备(通常是控制器)需要发送起始信号。起始信号表示一次新的通信开始,并引导设备进行相应的响应。

  • 传输数据:
    在I2C通信中,数据传输通过时钟信号和数据信号线进行。主设备通过时钟信号控制数据的传输速率,而数据信号线上的电平则表示传输的二进制数据。主设备和从设备通过时钟同步进行数据的传输。

  • 等待应答:
    在主设备发送数据字节后,它会等待从设备的应答信号。应答信号可以是从设备拉低数据线,表示准备接收下一个字节;或者释放数据线,表示拒绝接收数据。

  • 终止通信:
    在完成一次I2C通信后,需要发送终止信号来结束通信。终止信号表示一次通信的结束,并将总线释放给其他设备。

  • 错误处理:
    在I2C通信过程中,可能会发生错误,如设备无响应、数据传输失败等。在Linux内核中,I2C算法提供了相应的错误处理机制,允许驱动程序检测和处理通信错误。

I2C adapter

I2C适配器是一种硬件设备,用于在计算机系统中提供I2C总线的物理接口和信号转换功能。它充当I2C主控制器的角色,负责管理和控制连接在I2C总线上的从设备。适配器提供物理接口、信号转换、主控制器功能、多总线支持等特点和功能,通过相应的驱动程序与操作系统进行通信。简单来说,一根i2c总线就是一个I2C adapter。

I2C适配器的作用如下:

  • 物理接口:
    I2C适配器提供了计算机系统与I2C总线之间的物理接口。它通常包括多个I2C总线连接点,每个连接点可以连接一个或多个I2C设备。I2C适配器的物理接口可以是标准的I2C引脚,如SDA(Serial Data Line)和SCL(Serial Clock Line),也可以是其他物理接口,如GPIO(General Purpose Input/Output)引脚。

  • 信号转换:
    I2C适配器负责将计算机系统的电平和信号转换为符合I2C总线规范的电平和信号。它可以将计算机系统的电平转换为I2C总线所需的电平,如将3.3V或5V电平转换为I2C的标准电平(通常为3.3V)。此外,适配器还负责将计算机系统的时钟信号和数据信号转换为I2C总线所需的时钟和数据信号。

  • 主控制器功能:
    I2C适配器充当I2C总线的主控制器,负责发起和管理I2C通信。它可以向从设备发送读取和写入命令,接收从设备的应答信号,并控制数据的传输速率和时序。适配器还负责生成起始信号和终止信号,以标识一次通信的开始和结束。

  • 多总线支持:
    一些I2C适配器支持多个独立的I2C总线。这允许在同一个计算机系统上连接多个I2C总线,并通过适配器进行独立的控制和管理。每个总线可以具有不同的时钟频率、地址范围和连接设备。

  • 驱动程序支持:
    I2C适配器通常需要相应的驱动程序来与操作系统进行通信。驱动程序负责将适配器的功能暴露给操作系统,并提供对适配器的控制和配置接口。在Linux内核中,提供了一组通用的I2C适配器驱动程序接口,使开发人员能够编写适配器特定的驱动程序。

  • 软件工具支持:
    为了方便使用和调试,一些I2C适配器提供了相应的软件工具。这些工具可以用于扫描和探测已连接的I2C设备、读取和写入设备的寄存器、显示设备的状态和信息等。

硬件层

I2C device

I2C设备是连接在I2C总线上的从设备,通过I2C总线与主控制器进行通信和控制。每个设备都有一个唯一的地址,并支持读取和写入操作。设备具有寄存器和功能,可以存储配置参数、状态信息和数据。不同类型的设备具有不同的功能和特性,主控制器可以通过适当的驱动程序与设备进行交互。

在使用I2C设备时,主控制器通过发送设备地址、读取或写入命令以及相关的数据来与设备进行通信。设备根据接收到的命令和数据执行相应的操作,并将结果返回给主控制器。主控制器可以通过适当的软件驱动程序和库函数来管理和控制连接的I2C设备。

本文参考

https://blog.csdn.net/u013171226/article/details/131761869

https://zhuanlan.zhihu.com/p/645018040

https://www.zhihu.com/tardis/bd/ans/3056478847?source_id=1001

https://www.jianshu.com/p/6d162195f4a7

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

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

相关文章

Jenkins的环境部署,(打包、发布、部署、自动化测试)

一、Tomcat环境安装 1.安装JDK(Java环境) JDK下载地址:Java Downloads | Oracle 安装好后在系统环境变量里配置环境变量: ①添加JAVA_HOME 变量名:JAVA_HOME变量值:C:\Program Files\Java\jdk1.8.0_18…

CSS笔记II

CSS第二天笔记 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 三大特性继承性层叠性优先级优先级-叠加计算规则 Emmet写法 背景属性背景图平铺方式位置缩放固定复合属性 显示模式转换显示模式 复合选择器 定义:由两个或多个基础选择器,通…

LeetCode19:删除链表的倒数第N个结点

力扣题目链接 思路:由于本题有可能删除头结点,为保证删除头结点和其他结点的操作一致,因此首先创建一个虚拟头结点dummy。 其次,本题需要删除倒数第N个结点,由于单链表只有next指针,因此需要找到倒数第N1…

力扣精选算法100题——找到字符串中所有字母异位词(滑动窗口专题)

本题链接👉找到字符串中所有字母异位词 第一步:了解题意 给定2个字符串s和p,找到s中所有p的变位词的字串,就是p是"abc",在s串中找到与p串相等的字串,可以位置不同,但是字母必须相同,比…

橘子学K8S04之重新认识Docker容器

我们之前分别从 Linux Namespace 的隔离能力、Linux Cgroups 的限制能力,以及基于 rootfs 的文件系统三个角度来理解了一下关于容器的核心实现原理。 这里一定注意说的是Linux环境,因为Linux Docker (namespaces cgroups rootfs) ! Docker on Mac (bas…

Mybatis面试题(一)

MyBatis 面试题 1、什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程…

在PyCharm中创建Flask项目

在 PyCharm 中创建 Flask 项目的步骤如下: 打开 PyCharm,并选择 "Create New Project"(新建项目)。在弹出的窗口中,选择左侧的 "Python" 选项,然后选择右侧的 "Flask" 项目…

【开发实践】前端jQuery+gif图片实现载入界面

一、需求分析 载入界面(Loading screen)是指在计算机程序或电子游戏中,当用户启动应用程序或切换到新的场景时,显示在屏幕上的过渡界面。它的主要作用是向用户传达程序正在加载或准备就绪的信息,以及提供一种视觉上的反…

(C语言)冒泡排序

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数&#xff1b; void buble_sort(int arr[], int sz) {//初始化变量值&#xff1b;int i 0;//嵌套循环冒泡排序&#xff1b;//外层循环&…

基于SSM的在线宠物商城设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

react native Gradle的原国外地址、本地下载、国内阿里腾讯镜像三种下载配置

一、国外地址&#xff1a;&#xff08;初始项目默认&#xff09; 下载地址&#xff1a;https://services.gradle.org/distributions/ 文件地址见下图&#xff1a; 注意&#xff1a;这个地址下载十次就有九次是连接超时&#xff0c;建议换另外两种方法 二、下载到本地&#x…

查看pip及Python版本

Python环境正确安装之后&#xff0c;按“WinR”组合键打开“运行”对话框&#xff0c;输入“cmd”&#xff0c;如下图 打开命令提示符窗口后&#xff0c;输入以下命令查看Python及pip的版本。 pip -V 如果命令提示符窗口能够正确显示pip及Python版本&#xff0c;则说明Python…

Mybatis之关联

一、一对多关联 eg&#xff1a;一个用户对应多个订单 建表语句 CREATE TABLE t_customer (customer_id INT NOT NULL AUTO_INCREMENT, customer_name CHAR(100), PRIMARY KEY (customer_id) ); CREATE TABLE t_order ( order_id INT NOT NULL AUTO_INCREMENT, order_name C…

【备战蓝桥杯】吃奶酪问题 / 超硬核,文附template拓展知识!

蓝桥杯备赛 | 洛谷做题打卡day9 文章目录 蓝桥杯备赛 | 洛谷做题打卡day9再来了解一下状压dp**简介(Introduction)****描述(Description)** - 吃奶酪题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定提示 * template拓展知识我的一些话 【引入】今天…

python数字图像处理基础(十)——背景建模

目录 背景建模背景消除-帧差法混合高斯模型 背景建模 背景建模是计算机视觉和图像处理中的一项关键技术&#xff0c;用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中&#xff0c;背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模&#xff…

如何设置Windows 11的WSL系统用作备用桌面环境

如何设置Windows 11的WSL系统用作开发环境&#xff08;含Astrill设置&#xff09; 如何设置Windows 11的WSL系统用作备用桌面环境 引子&#xff1a; 2023年末&#xff0c;公司突然遭遇网络攻击&#xff0c;调整了防火墙设置&#xff0c;连接VPN用来飞X软件&#xff0c;与原来…

GoZero微服务个人探究之路(零)个人对微服务产生原因的思考,对前三篇的补充

为什么产生了微服务架构--必要性 这里我觉得看GoZero作者写的博文就可以有很好的体会 具体的&#xff0c;他画了这一张图&#xff08;以电商后台系统为例子&#xff09; 所以&#xff0c;我个人产生了如下思考 1.业务逻辑越来越复杂&#xff0c;层层嵌套&#xff0c;分解成微…

渗透测试(14)- HTTP协议解析

HTTP(HyperText Transfer Protocol)即 超文本传输协议 &#xff0c;是一种详细规定了浏览器和 服务器之间互相通信的规则&#xff0c;它是万维网交换信息的基础&#xff0c;它允许将 HTML( 超文本标 记语言 ) 文档从 Web 服务器传送到Web 浏览器&#xff0c;用于客户端和服务器…

十二、Qt 操作PDF文件(2)

一、在《十、Qt 操作PDF文件-CSDN博客》中我们用Poppler类库打开了PDF文件&#xff0c;并显示到窗体上&#xff0c;但只能显示一页&#xff0c;功能还没完善&#xff0c;在本章节中&#xff0c;加入了&#xff1a; 通过选择框选择PDF文件并打开&#xff0c;默认打开第一页。通…