IMX6ULL平台I2C数据结构分析

news2024/11/19 11:27:57

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进行匹配,来自于设备树中compatible
    struct 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传输操作,并实现高效的数据传输。

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

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

相关文章

CentOS 7 上安装 Anaconda

一、在 CentOS 7 上安装 Anaconda 的步骤如下&#xff1a; 在官网下载 Anaconda 的最新版本&#xff0c;链接&#xff1a;https://www.anaconda.com/products/distribution 打开终端&#xff0c;进入下载目录&#xff0c;使用以下命令来安装 Anaconda&#xff1a;# 也可直接在…

【JavaScript】线程和进程,JavaScript线程,事件队列,事件循环 ,微任务、宏任务

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 进程和线程JavaScript线程事件队列、事件循环微任务、宏任务面试题1面试题2 进程和线程 进程&a…

有符号定点小数的31bit问题

背景 定点小数就是小数位恒定的小数&#xff0c;在信号处理等领域应用广泛&#xff0c;它的表示格式类似于S1.7&#xff08;有符号&#xff0c;整数部分1bit&#xff0c;小数部分7bit&#xff09;、U0.8&#xff08;无符号&#xff0c;没有整数部分&#xff0c;小数部分8bit&a…

基于java的班级综合测评管理系统的设计与实现

背景 本系统的主要目的在于加速信息化进程&#xff0c;充分利用计算机技术和现代通讯的手段面向学校的服务。建立信息交流平台&#xff0c;方便信息资源的共享&#xff0c;加强各个部门之间的交流。提高整体的办公效率&#xff0c;为管理员以及教师提供辅助的班级综合测评管理…

Java如何远程调试线上项目

远程调试java项目 [Remote Debug JVM] 一、前提二、配置IntelliJ IDEA2.1、打开 IntelliJ IDEA 并打开您的 Java 项目2.2、单击 "Run" 菜单&#xff0c;然后选择 "Edit Configurations..."2.3、在 "Run/Debug Configurations" 对话框中&#xff…

c++ ffmpeg 开发之配置文件(1)

第一 目录结构 D:\work\c\ffmpeg //项目根目录 D:\work\c\ffmpeg\depend //ffmpeg ffmpeg c开发包点击下载 D:\work\c\ffmpeg\include D:\work\c\ffmpeg\depend\lib D:\work\c\ffmpeg\source //源码根目录 第二&#xff1a;测试源码&#xff0c;名字自己随意起…

AntDB数据库参加开源数据库技术沙龙,分享全栈业务能力

5月12日&#xff0c;由PostgreSQL中文社区和PolarDB开源数据库举办的开源数据库技术沙龙温州站于温州大学举办。此次活动邀请了众多数据库领域的专家和技术大咖&#xff0c;旨在促进数据库与温州产业界和学术界的交融发展与合作&#xff0c;共同探讨数据库产业未来的发展趋势&a…

Java高并发核心编程—CAS与JUC原子类

注&#xff1a;本笔记是阅读《Java高并发核心编程卷2》整理的笔记&#xff01; CAS原理 JUC原子类一Atomic 基本原子类 数组原子类 引用原子类 字段更新原子类 AtomicInteger 线程安全原理 引用类型原子类 属性更新原子类 ABA问题 提升高并发场景下CAS提作的性能 以空间换时间:…

idea 调试远程docker中的spring boot 项目

开发环境 idea-2023&#xff08;放心&#xff0c;旧版本也可以远程调试&#xff09; Java版本&#xff1a;17 生产环境 docker版本&#xff1a;23.0.3 Java版本1&#xff1a;openjdk:17.0.2&#xff08;基于Java17的项目&#xff09; Java版本2&#xff1a;adoptopenjdk:…

开源网安亮相粤港澳大湾区CIO高峰论坛,保障企业数字化安全转型

近日&#xff0c;由深圳市工业化与信息化局、深圳市科学技术协会指导&#xff0c;深圳市CIO协会主办的“2023中国(深圳)数字化转型大会暨粤港澳大湾区CIO高峰论坛”圆满完成。开源网安作为拥有软件安全领域全链条产品的厂商&#xff0c;携多年来打造的国产化软件安全替代方案&a…

EMC模式如何助力新能源服务商攻坚克难

01. 什么是合同能源管理&#xff1f; 合同能源管理(EMC-Energy Management Contract)是一种新型的市场化节能机制,其实质就是以减少的能源费用来支付节能项目全部成本的节能投资方式。&#xff1a;节能服务公司与用能单位以契约形式约定节能项目的节能目标&#xff0c;节能服务…

【Python脚本】视频稳像(Video Stabilization)

#【Python脚本】视频稳像(Video Stabilization) 参考&#xff1a;博客1 参考&#xff1a; 原文&#xff1a;https://blog.csdn.net/hjl240/article/details/52683738 开源&#xff1a;关键词 Video Stabilization 不错&#xff1a; https://github.com/yaochih/awesome-vide…

秒杀系统常见问题—如何避免库存超卖?

大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 以下是正文&#xff01; 先看问题 首先上一串代码 …

Linux SUID提权脏牛提权

SUID提权 suid就是set user id 。设置了SUID后&#xff0c;文件启动的时候就会以root的权限去运行。就是一个普通用户运行的时候&#xff0c;因为有SUID&#xff0c;所以用root权限去运行它。 加SUID权限chmod ux 这里开始复现。 上传Linux提权信息检测脚本LinEnum find …

堆及其实现

目录 一&#xff1a;堆的概念及结构 1.概念 2.堆的性质 二&#xff1a;堆的实现 1.堆的构建 2.堆的销毁 3.数据的交换 4.堆的插入 5.堆的判空 6.堆的删除 7.取堆顶的数据 8.堆的数据个数 9.示例 三&#xff1a;完整的代码 一&#xff…

十、数据仓库详细介绍(数据质量)理论与经验

数据质量管理是对数据从计划、收集、记录、存储、回收、分析和展示生命周期的每个阶段里可能引发的数据质量问题&#xff0c;进行识别、度量、监控、预警等一系列管理活动&#xff0c;并通过改善和提高组织的管理水平使得数据质量获得进一步提高。数据质量管理的终极目标是通过…

会声会影2023最新完整版免费下载

会声会影2023操作简单&#xff0c;功能同样强大&#xff01;会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具&#xff0c;如调色、遮罩、绿幕抠像、运动追踪、分屏创建器&#xff0c;满足更高标准的视频需求。这款软件上手操作简单易学&#xff0c;就算你在…

Linux之进程管理类命令

进程管理类命令 ps&#xff1a;查看当前系统进程状态 1&#xff09;基本语法 语法说明ps aux查看系统中所有进程ps -ef可以查看父子进程之间的关系 2&#xff09;选项说明 选项说明a列出带有终端的所有用户的进程x列出当前用户的所有进程&#xff0c;包括没有终端的进程u面…

C语言的一些杂记6

实现矩阵序号转置的三种方式 for (i 0; i < row * col; i)t[i / row][i % row] m[i % row][i / row];for (i 0; i < row; i)for (j 0; j < col; j)t[j][i] m[i][j];for (i 0; i < row; i)for (j 0; j < col; j)*(*(t j) i) *(*(m i) j); 变相数组 …

关于 arduino 中的 map(x, a, b,c,d)函数

函数名称&#xff1a;map() 包含形参&#xff1a; value&#xff1a;需要映射的值fromLow&#xff1a;输入值的最小值fromHigh&#xff1a;输入值的最大值toLow&#xff1a;输出值的最小值toHigh&#xff1a;输出值的最大值 功能&#xff1a;将一个值从一个范围映射到另一个…