IMX6ULL平台I2C数据结构分析
IMX6ULL平台I2C数据结构分析
文章目录
- IMX6ULL平台I2C数据结构分析
- i2c_client
- i2c_adapter
- imx_i2c_struct
- imx_i2c_hwdata
- imx_i2c_dma
在 i.MX 平台的 I2C 驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下:
struct i2c_client:表示一个 I2C 从设备的结构体,用于描述从设备的信息。它包含了从设备的地址、名称、适配器等信息,并提供与从设备进行通信和交互的接口。
struct i2c_adapter:表示一个 I2C 控制器适配器的结构体,用于管理 I2C 控制器的相关信息。它提供了控制器的配置、数据传输和中断处理等功能。struct i2c_adapter 中包含了 struct i2c_client 的列表,用于存储该适配器上已检测到的从设备。
struct imx_i2c_dma:在 i.MX 平台上,用于描述 I2C 控制器的 DMA 相关信息的结构体。它包含了 DMA 的通道号、描述符链表等信息,用于实现 I2C 数据的 DMA 传输。
struct imx_i2c_hwdata:在 i.MX 平台上,用于描述 I2C 控制器的硬件相关信息的结构体。它包含了寄存器的物理地址、时钟频率、中断号等信息,用于与硬件进行直接的寄存器访问。
struct imx_i2c_struct:在 i.MX 平台上,用于描述 I2C 控制器的主要数据结构。它包含了控制器的状态、配置、传输缓冲区等信息,并提供了与 I2C 控制器进行交互的接口函数。struct imx_i2c_struct 中包含了 struct i2c_adapter、struct imx_i2c_dma 和 struct imx_i2c_hwdata,用于与控制器的适配器、DMA 和硬件相关信息进行交互和管理。
这些结构体在 i.MX 平台的 I2C 驱动中协同工作,通过它们之间的联系,实现了对 I2C 控制器和从设备的管理、配置、数据传输和中断处理等功能。
i2c_client
struct i2c_client {//描述一个从设备的信息,不需要在代码中创建,i2c adapter帮我们创建unsigned short flags; /* div., see below */unsigned short addr;//从设备地址,来自于设备树中<reg>/* chip address - NOTE: 7bit *//* addresses are stored in the *//* _LOWER_ 7 bits */char name[I2C_NAME_SIZE];//用于i2c driver进行匹配,来自于设备树中compatiblestruct i2c_adapter *adapter;//指向当前从设备所存在的i2c_adapter/* the adapter we sit on */struct device dev; //继承了父类/* the device structure */int irq; //设备申请的中断号/* irq issued by device */struct list_head detected;//设备申请的中断号
#if IS_ENABLED(CONFIG_I2C_SLAVE)i2c_slave_cb_t slave_cb; /* callback for slave mode */
#endif
};
struct i2c_client 是在 I2C 驱动中表示从设备的结构体,用于描述一个从设备的信息。
以下是该结构体的各个字段的作用:
flags:标志位,用于存储一些标志和属性信息。
addr:从设备的地址,通常是 7 位地址。
name:从设备的名称,用于与驱动程序进行匹配。
adapter:指向当前从设备所存在的 I2C 适配器(i2c_adapter)的指针。
dev:继承自 struct device 的设备结构体,用于管理设备的相关信息。
irq:设备申请的中断号。
detected:已检测到的从设备列表。
slave_cb:在从设备模式下使用的回调函数(仅在启用 I2C 从设备支持时可用)。
通过使用 struct i2c_client,驱动程序可以获取从设备的地址、名称、适配器和中断等信息,并与从设备进行通信和交互。
i2c_adapter
struct i2c_adapter {//描述一个i2c控制器struct module *owner;//模块计数unsigned int class; //允许探测的驱动类型/* classes to allow probing for */const struct i2c_algorithm *algo;//算法,指向适配器的驱动程序/* the algorithm to access the bus */void *algo_data; //指向适配器的私有数据,根据不同的情况使用方法不同/* data fields that are valid for all devices */struct rt_mutex bus_lock;//对总线进行操作时,将获得总线锁int timeout; /* in jiffies */int retries;struct device dev; //继承父类,也会加入到i2c bus/* the adapter device */int nr;//标号char name[48];//适配器名称struct completion dev_released; //用于同步的完成量struct mutex userspace_clients_lock;struct list_head userspace_clients; //连接总线上的设备的链表struct i2c_bus_recovery_info *bus_recovery_info;const struct i2c_adapter_quirks *quirks;
};
这个结构体描述了一个I2C控制器适配器。
结构体成员的含义如下:
owner: 模块计数,用于引用计数,追踪使用该适配器的模块。
class: 允许探测的驱动类型,表示该适配器支持的I2C驱动类型。
algo: 算法,指向适配器的驱动程序所实现的I2C算法,用于访问I2C总线。
algo_data: 指向适配器的私有数据,根据不同的情况使用方法不同,由驱动程序自行定义和使用。
bus_lock: 对总线进行操作时使用的互斥锁,用于保护对总线的并发访问。
timeout: I2C传输的超时时间,以jiffies为单位。
retries: I2C传输失败时的重试次数。
dev: 继承自struct device,表示适配器的设备结构。
nr: 适配器的标号,用于标识不同的适配器。
name: 适配器的名称,描述该适配器的唯一标识符。
dev_released: 用于同步的完成量,用于在设备释放时进行同步。
userspace_clients_lock: 用户空间客户端的互斥锁,用于保护对用户空间客户端列表的并发访问。
userspace_clients: 连接到该总线上的设备的链表,用于跟踪用户空间客户端。
bus_recovery_info: I2C总线恢复信息,包含了用于总线恢复的相关数据。
quirks: I2C适配器的特性,包含了适配器的特殊行为或限制。
该结构体用于描述一个I2C控制器适配器的属性和状态,包括所支持的驱动类型、算法、设备名称等信息。它也包含了用于同步访问和管理总线的锁和链表。通过这些成员,驱动程序可以正确地初始化、配置和操作I2C控制器适配器,并提供给用户空间的设备访问接口。
imx_i2c_struct
struct imx_i2c_struct {struct i2c_adapter adapter; // i2c_adapter结构体struct clk *clk; // 时钟void __iomem *base; // 基地址wait_queue_head_t queue; // 等待队列unsigned long i2csr; // I2CSR寄存器值unsigned int disable_delay; // 停止延迟int stopped; // 是否停止unsigned int ifdr; /* IMX_I2C_IFDR */ // I2C时钟分频器unsigned int cur_clk; // 当前时钟unsigned int bitrate; // 位速const struct imx_i2c_hwdata *hwdata; // I2C硬件数据struct imx_i2c_dma *dma; // DMA传输
};
该结构体定义了i.MX系列芯片上I2C控制器的相关信息。
结构体成员的含义如下:
adapter: i2c_adapter结构体,表示I2C适配器,包含了I2C总线的通用属性和操作函数。
clk: 时钟,表示I2C控制器使用的时钟。
base: 基地址,表示I2C控制器的寄存器基地址。
queue: 等待队列,用于进程等待I2C传输完成的等待队列头。
i2csr: I2CSR寄存器值,表示I2C控制和状态寄存器的值。
disable_delay: 停止延迟,表示在停止I2C传输后的延迟时间。
stopped: 是否停止,表示当前I2C传输是否停止。
ifdr: IMX_I2C_IFDR,表示I2C接口分频器寄存器的值,用于配置I2C时钟的分频。
cur_clk: 当前时钟,表示当前使用的I2C时钟频率。
bitrate: 位速,表示I2C总线的位速(通信速率)。
hwdata: I2C硬件数据,指向一个结构体imx_i2c_hwdata,包含了I2C控制器的硬件相关配置信息。
dma: DMA传输,指向一个结构体imx_i2c_dma,用于管理I2C控制器的DMA相关信息。
这个结构体的作用是在驱动程序中管理和控制I2C控制器的各种属性和状态。它包含了I2C适配器、时钟、寄存器地址、等待队列、传输状态、时钟分频器、位速等重要信息,以便驱动程序能够正确地配置和操作I2C控制器,并实现与外部设备的通信。此外,结构体中的成员还包括了硬件相关配置和DMA传输信息,以支持更高效和可靠的数据传输
imx_i2c_hwdata
struct imx_i2c_hwdata {enum imx_i2c_type devtype; // 设备类型unsigned regshift; // 寄存器偏移量struct imx_i2c_clk_pair *clk_div; // 分频器值和寄存器值对应关系unsigned ndivs; // 分频器值和寄存器值对应关系的数量unsigned i2sr_clr_opcode; // 清除INT标志的操作码unsigned i2cr_ien_opcode; // 启用模块的操作码
};
该结构体定义了i.MX系列芯片上I2C控制器的硬件相关数据。
结构体成员的含义如下:
devtype: 设备类型,表示I2C控制器的具体型号或类型。
regshift: 寄存器偏移量,表示寄存器地址的偏移量,用于计算具体寄存器的地址。
clk_div: 分频器值和寄存器值对应关系,是一个指向imx_i2c_clk_pair结构体的指针数组。该数组存储了分频器的值和对应的寄存器值的映射关系,用于设置I2C时钟频率。
ndivs: 分频器值和寄存器值对应关系的数量,表示clk_div数组中的元素个数。
i2sr_clr_opcode: 清除INT标志的操作码,表示执行清除I2C状态寄存器INT标志的操作码,用于清除中断状态。
i2cr_ien_opcode: 启用模块的操作码,表示执行启用I2C控制器模块的操作码,用于启用I2C控制器。
这个结构体的作用是在驱动程序中存储和管理I2C控制器的硬件相关数据。通过使用这些数据,驱动程序可以正确配置和操作I2C控制器,并与外部设备进行通信。结构体中的成员提供了关于设备类型、寄存器地址、时钟频率等重要信息,以便驱动程序能够正确地配置和控制I2C控制器的行为。
imx_i2c_dma
struct imx_i2c_dma {struct dma_chan *chan_tx; // 传输通道(发送)struct dma_chan *chan_rx; // 传输通道(接收)struct dma_chan *chan_using; // 正在使用的传输通道struct completion cmd_complete; // 命令完成标志dma_addr_t dma_buf; // DMA缓冲区地址unsigned int dma_len; // DMA传输长度enum dma_transfer_direction dma_transfer_dir; // DMA传输方向enum dma_data_direction dma_data_dir; // DMA数据方向
};
该结构体定义了i.MX系列芯片上I2C控制器使用的DMA相关信息。
结构体成员的含义如下:
chan_tx
: 传输通道(发送),表示用于I2C发送数据的DMA通道。
chan_rx
: 传输通道(接收),表示用于I2C接收数据的DMA通道。
chan_using
: 正在使用的传输通道,表示当前正在使用的DMA通道。
cmd_complete
: 命令完成标志,是一个completion类型的变量,用于标记DMA传输是否完成。
dma_buf
: DMA缓冲区地址,表示用于DMA传输的数据缓冲区的物理地址。
dma_len
: DMA传输长度,表示要传输的数据的长度。
dma_transfer_dir
: DMA传输方向,表示DMA数据传输的方向,可以是从内存到外设(DMA_MEM_TO_DEV)或从外设到内存(DMA_DEV_TO_MEM)。
dma_data_dir
: DMA数据方向,表示DMA传输数据的方向,可以是从内存读取数据(DMA_FROM_DEVICE)或向内存写入数据(DMA_TO_DEVICE)。
这个结构体的作用是在驱动程序中管理和控制I2C控制器与DMA传输的相关信息。DMA可以提高数据传输的效率和性能,通过使用这些DMA相关的数据,驱动程序可以配置和管理DMA传输通道,并将数据从内存传输到外设或从外设传输到内存。结构体中的成员提供了DMA传输通道、缓冲区地址、传输长度、传输方向等重要信息,以便驱动程序能够正确地进行DMA传输操作,并实现高效的数据传输。
相关文章:

IMX6ULL平台I2C数据结构分析
IMX6ULL平台I2C数据结构分析 文章目录 IMX6ULL平台I2C数据结构分析i2c_clienti2c_adapterimx_i2c_structimx_i2c_hwdataimx_i2c_dma 在 i.MX 平台的 I2C 驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下: struct i2c_client…...

实时时钟 RTC(2)
RTC 使能与停止 RTC 上电后立即启动,不可关闭,软件应在32K 晶体振荡器完全起振后再设置当前时间;在晶体振荡器起振之前芯片使用内部环振计时,偏差较大。 RTC 时间设置 软件可以在任意时刻直接设置RTC 时间寄存器;由于…...

弄懂局部变量
成员变量和局部变量的区别 多个线程调用同一个对象的同一个方法时: 如果方法里无成员变量,那么不受任何影响 如果方法里有成员变量,只有读操作,不受影响 存在写操作,考虑多线程影响值 多线程调用…...

倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨
倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨 倾斜摄影是一种先进的数字摄影技术,可以生成高分辨率、高精度的三维模型数据。然而,在倾斜摄影中,由于相机的倾斜角度和地形的高程差异,可能会出现高程偏差问题。为了…...

怎么发表CCF期刊?CCF期刊有什么不同之处? - 易智编译EaseEditing
发表CCF期刊,可以参考一下步骤: 选择目标期刊: 首先选择一个适合自己的目标期刊,可以是CCF推荐的高水平期刊,也可以是其他被广泛认可的期刊。 撰写论文: 根据目标期刊的要求,撰写论文。确保论…...

feat:使用企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)
背景:企业微信应用使用企业微信JS-SDK的分享接口实现分享样式自定义 原生: 需要实现成: 企业微信JS-SDK 是企业微信面向网页开发者提供的 基于企业微信内 的网页开发工具包。 通过使用企业微信JS-SDK,网页开发者 可借助企业微信…...

Java键盘事件处理及监听机制解析
文章目录 概念KeyEventKeyListener代码演示总结 概念 Java事件处理采用了委派事件模型。在这个模型中,当事件发生时,产生事件的对象将事件信息传递给事件的监听者进行处理。在Java中,事件源是产生事件的对象,比如窗口、按钮等&am…...

Git详解——安装、使用、搭建、IDEA集成
Git 看目录,篇幅挺长,越往后面越重要 目录一、git是什么?二、为什么要使用Git?三、版本控制工具四、git下载安装以及环境配置五、git基本命令六、git项目搭建七、远程仓库怎么搞?git,gitlab,github,gitee区别八、ide…...

【JavaSE】Java基础语法(二十一):内部类
文章目录 1. 内部类的基本使用2. 成员内部类3. 局部内部类4. 匿名内部类5. 匿名内部类在开发中的使用(应用) 1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定…...

Ceph应用
//存储类型 块存储 一对一,只能被一个主机挂载使用,数据以块为单位进行存储,典型代表: 硬盘 文件存储 一对多,能被多个主机同时挂载使用,数据以文件的形式存储的(元数据和实际数据是分开存储的),并且有…...
Oxford online English-Chair a Meeting 05/29
Part1-Welcoming attendees and starting the meeting Getting people’s attention If I could have your attention, please. Could I have your attention, please? Good afternoon, everyone. -> Good afternoon, everyone, could I have your attention, please?…...

LeetCode: 二叉树的直径(java)
二叉树的直径 leetcode 543题。原题链接题目描述解题代码二叉树专题 leetcode 543题。原题链接 543题:二叉树的直径 题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也…...

springboot+vue+java旅行旅游景点酒店预订出行订票系统eaog5
线上旅行信息管理系统要求实现以下功能: a.景点管理,展示景点的基础信息,介绍等信息。 b.酒店管理,展示酒店的基础信息,介绍等信息。 c.评价管理,可以查看景点或酒店的相关评价信息,客户消费完,…...

Linux :: 【基础指令篇 :: 用户管理:(2)】::设置用户密码(及本地Xshell 登录云服务器操作演示) :: passwd
前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 目录索引&am…...

img[:, :, ::-1] 通俗理解
👨💻个人简介: 深度学习图像领域工作者 🎉工作总结链接:https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结,每个链接都是一些常用demo,…...

基于springboot+vue+elementui的健身房会员管理系统的
为了帮助用户更好的了解和理解程序的开发流程与相关内容,本文将通过六个章节进行内容阐述。 第一章:描述了程序的开发背景,程序运用于现实生活的目的与意义,以及程序文档的结构安排信息; 第二章:描述了程序…...

在酒店房间中的数据库索引
如果你经常去酒店,你会看到一块类似下面的标牌,指引你到达房间。这能够帮助你方便快速地找到房间,特别是当酒店拥有许多房间时。 以一个有9层的酒店为例。你的房间号是917。第一步是找到你的房间在哪一层,通常第一个数字表示楼层…...

Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程
1、客户端API操作 1.1 IDEA 环境搭建 前提:保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程:Zookeeper 2、添加pom文件 <?xml version"1.0" encoding"UTF-8"?> <project …...

Stack 栈的实现与应用
目录 1. 概念 2. 常用的栈的方法 2.1 方法 2.2 代码 3. 自己实现栈 3.1 构造MyStack 3.2 push() 3.3 ensureCapacity() 3.4 pop() 3.5 peek() 3.6 empty() 3.7 szie() 4. 栈的应用 1. 概念 栈(Stack)是一种数据结构&…...

CSDN中如何获得铁粉(用心篇)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...