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的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

es 三 安装 es 安装kibana
目录 安装7.3.0 版本 下载地址 一个比一个快 页面测试访问 安装kibana 下载 Config/kibana.yml 配置修改开启中文 页面访问 安装7.3.0 版本 下载地址 一个比一个快 Index of /elasticsearch/ 下载中心 - Elastic 中文社区 下载中心 - Elastic 中文社区 官网下载 开箱…...

牛客HJ43迷宫问题 - 创建智能体通过策略自己找路
文章目录 问题描述思路代码C 问题描述 描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁࿰…...

测试报告模板一
XX测试报告 文档作者: 编写日期: 项目经理: 批准日期: 文档修改纪录表 日期 制修人 修改内容描述 1. 测试项目描述 1.1 测试描述 项目名称...

抖音账号矩阵系统源码/技术开发搭建私有化部署开源
抖音SEO矩阵系统是基于抖音平台的搜索引擎优化技术的一种系统,其主要作用是通过一系列的技术手段,提高抖音视频的曝光和排名,使其获得更多的流量和粉丝。在本文中,我们将介绍抖音SEO矩阵系统的开发技术,包括系统设计、…...

OpenSSL加密解密文件
OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面介绍使用Openssl进行文件的对称加密操作。 一、Openssl支持的加密算法有: -aes-128-cbc…...

PAT A1070 Mooncake
1070 Mooncake 分数 25 作者 CHEN, Yue 单位 浙江大学 Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autumn Festival. Many types of fillings and crusts can be found in traditional mooncakes according to the regions culture. Now gi…...

MyBatis- plus
实战总结 1.批量插入性能 1.批量插入性能差的原因 使用saveBatch()方法时, MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入&a…...

Java --- 期末复习卷
一、单选题 1.所有Java应用程序主类必须有一个名叫( )的方法。[ ] A.method B.main() C.java() D.hello 2.编写并保存了一个Java程序文件之后,( )它。[ …...

File类与IO流相关面试知识(一)
一.java.io.File类 作用:它的作用是用来表示某个文件或文件夹(文件夹又称为目录) 如何用File类的对象表示一个文件或目录的呢? API文档中描述:文件和目录路径名的抽象表示形式 解释:如果要表示一个文件…...

009 - STM32学习笔记 - 中断
009 - STM32学习笔记 - 中断 这节的内容,野火的官方视频我反复看了好几次,但是感觉火哥在这块讲解的特别绕,理解起来很吃力,后来在看了一下其他老师的视频,结合一些书本资料和官方手册,才搞清楚STM32中断该…...