IMX6ULL平台I2C数据结构分析

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: IMX6ULL平台I2C数据结构分析

在 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传输操作,并实现高效的数据传输。

如果文章对您有帮助,点赞👍支持,感谢🤝


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
4月前
|
机器学习/深度学习 算法 Windows
数据结构中的几种时间复杂度分析方式
数据结构中的几种时间复杂度分析方式
57 0
|
3月前
|
存储 测试技术
【数据结构】手把手分析:链式二叉树的实现
【数据结构】手把手分析:链式二叉树的实现
27 5
|
4月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
42 1
|
3月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
32 0
|
3月前
|
算法 搜索推荐
数据结构和算法——表排序(算法概述、物理排序、复杂度分析,包含详细清晰图示过程)
数据结构和算法——表排序(算法概述、物理排序、复杂度分析,包含详细清晰图示过程)
24 0
|
4月前
|
算法 搜索推荐 Java
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
42 0
|
4月前
|
存储 索引
操作数栈的字节码指令执行分析
操作数栈的字节码指令执行分析
|
4月前
|
存储 算法 Java
22个常用数据结构实现与原理分析
前两天V哥跟一个老学员吃饭,聊起面试大厂的事,说为啥大厂面试第一看基本条件,第二就是考数据结构算法,其他高阶的内容会比较少,最近V哥也在跟大厂对接这一块业务,了解得多一些,这是因为考察基本功能力被放到了重要位置,大厂认为硬性条件,比如学历过关,基本功够扎实,那对于实际工作用的上层技能,内部培养就好,也就是相比你掌握了多少多少牛逼的高阶技术,他们更在乎你的基本功,所以,进大厂,基本功必须要搞稳,否则白扯,今天 V 哥把总结好的22个常用的数据结构实现原理,和示例分析分享给大家,希望对你有帮助,觉得内容有收获,请帮忙转发给更多需求的朋友,共同进步。
|
4月前
|
存储 消息中间件 算法
精华推荐 |【算法数据结构专题】「延时队列算法」史上非常详细分析和介绍如何通过时间轮(TimingWheel)实现延时队列的原理指南
精华推荐 |【算法数据结构专题】「延时队列算法」史上非常详细分析和介绍如何通过时间轮(TimingWheel)实现延时队列的原理指南
117 1
|
4月前
|
搜索推荐 算法 Shell
【数据结构】手撕排序(排序的概念及意义、直接插入和希尔排序的实现及分析)
【数据结构】手撕排序(排序的概念及意义、直接插入和希尔排序的实现及分析)