0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C子系统几个主要的结构体

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-22 16:04 次阅读

I2C Data Structure

我们要搞懂一个 Linux 子系统,必须研究它的数据结构,搞懂每个结构体存储了什么东西,才能梳理清楚该子系统的架构。

I2C 子系统有几个主要的结构体:

I2C 控制器:i2c_adapter、i2c_algorithm、mtk_i2c

I2C 设备驱动:i2c_client、i2c_driver

I2C 传输:i2c_msg

i2c_adapter:i2c-core 层描述一个 I2C 控制器,假如一个芯片有 8 路 I2C bus,则有 8 个 i2c_adapter。请详细看博主对 code 的注释说明。

struct i2c_adapter {
 struct module *owner;
 unsigned int class; /* 该 I2C bus 支持哪些类型的从设备 */
 const struct i2c_algorithm *algo; /* the algorithm to access the bus */
 void *algo_data;

 /* data fields that are valid for all devices */
 const struct i2c_lock_operations *lock_ops;
 struct rt_mutex bus_lock;
 struct rt_mutex mux_lock;

 int timeout;/* 超过该时间无法重发 */
 int retries;/* I2C发送失败重试次数 */
 struct device dev;  /* the adapter device */
 unsigned long locked_flags; /* owned by the I2C core */
#define I2C_ALF_IS_SUSPENDED  0
#define I2C_ALF_SUSPEND_REPORTED 1

 int nr;/*I2C bus id*/
 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;

 struct irq_domain *host_notify_domain;
 struct regulator *bus_regulator;
};

i2c_algorithm:I2C 传输函数合集,其中 master_xfer 是真正的传输函数 ,芯片原厂写 I2C 控制器驱动时必须实现。functionality 函数会返回该 I2C 控制器支持什么通信协议,也需要实现,其他的函数即便 Linux 规定了,芯片原厂也可以不实现,因为不常用。

struct i2c_algorithm {
 int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);
 int (*master_xfer_atomic)(struct i2c_adapter *adap,struct i2c_msg *msgs, int num);
 int (*smbus_xfer)(struct i2c_adapter *adap, u16 addr,unsigned short flags, char read_write,u8 command, int size, union i2c_smbus_data *data);
 int (*smbus_xfer_atomic)(struct i2c_adapter *adap, u16 addr,unsigned short flags, char read_write,u8 command, int size, union i2c_smbus_data *data);

 /* To determine what the adapter supports */
 u32 (*functionality)(struct i2c_adapter *adap);

#if IS_ENABLED(CONFIG_I2C_SLAVE)
 int (*reg_slave)(struct i2c_client *client);
 int (*unreg_slave)(struct i2c_client *client);
#endif
};

MTK 只实现了其中两个图片

图片

i2c_client:描述设备信息

struct i2c_client {
 unsigned short flags;/* I2C 传输标志位如下*/
#define I2C_CLIENT_PEC  0x04 /* Use Packet Error Checking */
#define I2C_CLIENT_TEN  0x10 /* we have a ten bit chip address */
/* Must equal I2C_M_TEN below */
#define I2C_CLIENT_SLAVE 0x20 /* we are the slave */
#define I2C_CLIENT_HOST_NOTIFY 0x40 /* We want to use I2C host notify */
#define I2C_CLIENT_WAKE  0x80 /* for board_info; true iff can wake */
#define I2C_CLIENT_SCCB  0x9000 /* Use Omnivision SCCB protocol */
     /* Must match I2C_M_STOP|IGNORE_NAK */

 unsigned short addr;  /* chip address - NOTE: 7bit */
     /* addresses are stored in the */
     /* _LOWER_ 7 bits  */
 char name[I2C_NAME_SIZE];
 struct i2c_adapter *adapter;/* 所处的那一路 I2C bus */
 struct device dev;  /* the device structure  */
 int init_irq;   /* irq set at initialization */
 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
 void *devres_group_id;  /* ID of probe devres group */
};

i2c_driver:普通驱动工程师写驱动时,必须实现其中的 probe 函数和 remove 函数,其余的函数一般用不到。

struct i2c_driver {
 unsigned int class;

 /* Standard driver model interfaces */
 int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
 int (*remove)(struct i2c_client *client);

 int (*probe_new)(struct i2c_client *client);
 void (*shutdown)(struct i2c_client *client);
 void (*alert)(struct i2c_client *client, enum i2c_alert_protocol protocol,unsigned int data);
 int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);

 struct device_driver driver;
 const struct i2c_device_id *id_table;

 int (*detect)(struct i2c_client *client, struct i2c_board_info *info);
 const unsigned short *address_list;
 struct list_head clients;
};

mtk_i2c:MTK 平台用该结构体表示 I2C 控制器,定义在/kernel-5.10/drivers/i2c/busses/i2c-mt65xx.c

struct mtk_i2c {
 struct i2c_adapter adap; /* i2c host adapter */
 struct device *dev;
 struct completion msg_complete;

 /* set in i2c probe */
 void __iomem *base;  /* i2c base addr */
 void __iomem *pdmabase;  /* dma base address*/
 struct clk *clk_main;  /* main clock for i2c bus */
 struct clk *clk_dma;  /* DMA clock for i2c via DMA */
 struct clk *clk_pmic;  /* PMIC clock for i2c from PMIC */
 bool have_pmic;   /* can use i2c pins from PMIC */
 bool use_push_pull;  /* IO config push-pull mode */

 u16 irq_stat;   /* interrupt status */
 unsigned int clk_src_div;
 unsigned int speed_hz;  /* The speed in transfer */
 enum mtk_trans_op op;
 u16 timing_reg;
 u16 high_speed_reg;
 unsigned char auto_restart;
 bool ignore_restart_irq;
 const struct mtk_i2c_compatible *dev_comp;
};

i2c_msg:I2C 读写时,必须填充 i2c_msg。

标志位:写为 0 ,读为 I2C_M_RD,其他的 flag 大家可以参考。

I2C 单笔传输最大 64KB,len 的长度博主在注释中有说明。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1346

    浏览量

    120826
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750
  • 系统
    +关注

    关注

    1

    文章

    981

    浏览量

    21036
收藏 人收藏

    评论

    相关推荐

    I2C规范,I2C总线原理

    ................................................... 3518 F/S 模式I2C 总线系统的双向电平转换器
    发表于 04-09 18:34

    增强型I2C和SMbus主接口参考设计包括BOM及层图

    I2C 外设不支持 SMbus(...)主要特色支持 I2C 和 SMbus 主接口连接 PRU-ICSS动态块模式读取和写入传输包含用于定制的 PRU-ICSS 源代码I2C
    发表于 10-26 10:00

    到底什么是I2C

    )。TI的用于构建I2C树状图的产品组合可以分为三个功能,如图1所示:缓冲转换器、I / O扩展器和I2C开关。 图1:具有各种I2C功能设备的电
    发表于 07-23 04:45

    Linux的I2C体系结构

     在Linux 系统中,I2C 驱动由3 部分组成,即I2C 核心、I2C 总线驱动和I2C 设备驱动,
    发表于 08-06 06:53

    如何用dsp标准I2C接口接ADS1110?

    Structure'里有两个地址(如下):从机地址、数据地址,而ads1110只有从机地址。这个结构还不能修改,不知道怎么处理,能不能自己写一个结构,但数据不知道怎么接受。
    发表于 10-24 08:04

    HarmonyOS 驱动平台---I2C

    count做限制,其最大个数度由具体I2C控制器决定。本函数也不对每个消息结构中的数据长度做限制,同样由具体I2C控制器决定。本函数可能会引起系统
    发表于 09-16 18:54

    i2c不通的原因是什么

    I2C总线的拓扑结构I2C总线特征I2C总线协议I2C总线操作i2c不通的原因有两种
    发表于 03-02 06:52

    Core I2C主要应用有哪些?

    Core I2C的原理是什么?主要应用有哪些?
    发表于 04-08 06:19

    I2C协议以及I2C读写EEPROM

    2-3 数据有效性2-4 地址及数据方向2-5 响应三、STM32 的 I2C 架构剖析3-1 通讯引脚3-2 时钟控制逻辑3-3 整体控制
    发表于 08-23 08:25

    使用结构主要作用

    2.在我们单片机程序开发过程中,经常会遇到要初始化一个外设比如串口,它的初始化状态是由几个属性来决定的,比如串口号,波特率,极性,以及模式。对于这种情况,在我们没有学习结构的时候,我
    发表于 08-24 07:54

    EEPROM I2C协议的特点与基本读写过程

    STM32的I2C通讯过程主发送器主接收器I2C初始化结构和库函数I2C——读写EEPROMI2C
    发表于 01-21 08:57

    linux I2C子系统的相关资料分享

    文章目录linux I2C子系统框架在设备树中添加从设备信息,mpu5060I2C driver 程序的编写mpu6050 I2C程序具体实现linux
    发表于 02-10 06:06

    I2C设备驱动的相关资料下载

    文章目录1、简介2I2C总线、设备和驱动的结构定义2.1 结构定义--
    发表于 02-10 06:39

    I2c协议和时序的相关资料推荐

    文章目录I2c协议和时序I2c介绍I2c硬件连接I2c总线的信号I2c总线写时序I2c总线读时序
    发表于 02-10 06:51

    I2C通信简介

    i2c-dev.h打开文件/include/uapi/linux/i2c-dev.hi2c_rdwr_ioctl_data 结构代码如下所示/* This is the struct
    发表于 02-23 06:28