当前位置: 首页 > news >正文

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 驱动中&#xff0c;存在多个相关的结构体&#xff0c;它们之间的联系和在内核中的作用如下&#xff1a; struct i2c_client…...

实时时钟 RTC(2)

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

弄懂局部变量

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

倾斜摄影三维模型数据的高程偏差修正的几何纠正技术方法探讨

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

怎么发表CCF期刊?CCF期刊有什么不同之处? - 易智编译EaseEditing

发表CCF期刊&#xff0c;可以参考一下步骤&#xff1a; 选择目标期刊&#xff1a; 首先选择一个适合自己的目标期刊&#xff0c;可以是CCF推荐的高水平期刊&#xff0c;也可以是其他被广泛认可的期刊。 撰写论文&#xff1a; 根据目标期刊的要求&#xff0c;撰写论文。确保论…...

feat:使用企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)

背景&#xff1a;企业微信应用使用企业微信JS-SDK的分享接口实现分享样式自定义 原生&#xff1a; 需要实现成&#xff1a; 企业微信JS-SDK 是企业微信面向网页开发者提供的 基于企业微信内 的网页开发工具包。 通过使用企业微信JS-SDK&#xff0c;网页开发者 可借助企业微信…...

Java键盘事件处理及监听机制解析

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

Git详解——安装、使用、搭建、IDEA集成

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

【JavaSE】Java基础语法(二十一):内部类

文章目录 1. 内部类的基本使用2. 成员内部类3. 局部内部类4. 匿名内部类5. 匿名内部类在开发中的使用&#xff08;应用&#xff09; 1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例&#xff1a;在一个类A的内部定义一个类B&#xff0c;类B就被称为内部类 内部类定…...

Ceph应用

//存储类型 块存储 一对一&#xff0c;只能被一个主机挂载使用&#xff0c;数据以块为单位进行存储&#xff0c;典型代表: 硬盘 文件存储 一对多&#xff0c;能被多个主机同时挂载使用&#xff0c;数据以文件的形式存储的(元数据和实际数据是分开存储的)&#xff0c;并且有…...

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题&#xff1a;二叉树的直径 题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也…...

springboot+vue+java旅行旅游景点酒店预订出行订票系统eaog5

线上旅行信息管理系统要求实现以下功能&#xff1a; a.景点管理&#xff0c;展示景点的基础信息&#xff0c;介绍等信息。 b.酒店管理,展示酒店的基础信息&#xff0c;介绍等信息。 c.评价管理&#xff0c;可以查看景点或酒店的相关评价信息&#xff0c;客户消费完&#xff0c;…...

Linux :: 【基础指令篇 :: 用户管理:(2)】::设置用户密码(及本地Xshell 登录云服务器操作演示) :: passwd

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 目录索引&am…...

img[:, :, ::-1] 通俗理解

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;工作总结链接&#xff1a;https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c…...

基于springboot+vue+elementui的健身房会员管理系统的

为了帮助用户更好的了解和理解程序的开发流程与相关内容&#xff0c;本文将通过六个章节进行内容阐述。 第一章&#xff1a;描述了程序的开发背景&#xff0c;程序运用于现实生活的目的与意义&#xff0c;以及程序文档的结构安排信息&#xff1b; 第二章&#xff1a;描述了程序…...

在酒店房间中的数据库索引

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

Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程

1、客户端API操作 1.1 IDEA 环境搭建 前提&#xff1a;保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程&#xff1a;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&#xff08;&#xff09; 3.4 pop() 3.5 peek() 3.6 empty() 3.7 szie() 4. 栈的应用 1. 概念 栈&#xff08;Stack&#xff09;是一种数据结构&…...

CSDN中如何获得铁粉(用心篇)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

es 三 安装 es 安装kibana

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

牛客HJ43迷宫问题 - 创建智能体通过策略自己找路

文章目录 问题描述思路代码C 问题描述 描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; 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, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0…...

测试报告模板一

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

抖音账号矩阵系统源码/技术开发搭建私有化部署开源

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

OpenSSL加密解密文件

OpenSSL是一个开源的用以实现SSL协议的产品&#xff0c;它主要包括了三个部分&#xff1a;密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面介绍使用Openssl进行文件的对称加密操作。 一、Openssl支持的加密算法有&#xff1a; -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()方法时&#xff0c; MySQL JDBC驱动在默认情况下会无视executeBatch()语句&#xff0c;把我们期望批量执行的一组sql语句拆散&#xff0c;一条一条地发给MySQL数据库&#xff0c;批量插入实际上是单条插入&a…...

Java --- 期末复习卷

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

File类与IO流相关面试知识(一)

一.java.io.File类 作用&#xff1a;它的作用是用来表示某个文件或文件夹&#xff08;文件夹又称为目录&#xff09; 如何用File类的对象表示一个文件或目录的呢&#xff1f; API文档中描述&#xff1a;文件和目录路径名的抽象表示形式 解释&#xff1a;如果要表示一个文件…...

009 - STM32学习笔记 - 中断

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