I2C API——Linux内核文档中文翻译

【申明】:本文翻译自linux5.9官方文档,版权归本人所有,转载复制请注明出处

I2C和SMBus子系统

I2C(或写成2上标)是“ Inter-IC”总线(内部集成总线)的缩写,“ Inter-IC”总线是一种简单的总线协议,广泛用于低数据速率通信。由于它也是许可商标,因此某些供应商在同一总线上使用另一个名称(例如,“双线接口”,TWI)。I2C仅需要两个信号(用于时钟的SCL,用于数据的SDA),可以节省电路板空间并最小化信号质量问题。大多数I2C设备使用7位地址,并且总线速度高达400 kHz。高速扩展(3.4 MHz)尚未被广泛使用。I2C是多主机总线;开漏信令用于在主机之间进行仲裁,握手以及同步来自较慢客户端的时钟。

Linux I2C编程接口支持总线交互的主机端(master)和从属端(slave)。编程接口围绕两种驱动程序和两种设备构造。I2C“适配器驱动程序”将控制器硬件抽象化。它绑定到物理设备(可能是PCI设备或platform_device),并公开一个struct i2c_adapter 代表它管理的每个I2C总线段。在每个I2C总线段上将有一个I2C设备,用struct i2c_client表示。这些设备将绑定到struct i2c_driver,其应该遵循标准的Linux驱动程序模型。有执行各种I2C协议操作的功能。在撰写本文时,所有此类功能仅在任务上下文中可用。

系统管理总线(SMBus)是同级协议。大多数SMBus系统也符合I2C。电气约束对于SMBus更为严格,并且它标准化了特定的协议消息和习惯用语。支持I2C的控制器也可以支持大多数SMBus操作,但是SMBus控制器并不支持I2C控制器将支持的所有协议选项。有一些功能可以执行各种SMBus协议操作,可以使用I2C原语,也可以通过向不支持这些I2C操作的i2c_adapter设备发出SMBus命令。

… kernel-doc:: include/linux/i2c.h
… kernel-doc:: drivers/i2c/i2c-boardinfo.c
… kernel-doc:: drivers/i2c/i2c-core-base.c
… kernel-doc:: drivers/i2c/i2c-core-smbus.c

API参考

i2c_master_recv

int i2c_master_recv(const struct i2c_client * client, char * buf, int count)
在主机接收模式下发出单个I2C消息。issue a single I2C message in master receive mode
参量
const struct i2c_client * client
从属设备的句柄。Handle to slave device
char * buf
存储从从属端读取的数据
int count

描述
返回负数errno,否则返回读取的字节数。

i2c_master_recv_dmasafe

int i2c_master_recv_dmasafe(const struct i2c_client * client, char * buf, int count)
使用DMA安全缓冲区以主机接收模式发出单个I2C消息。issue a single I2C message in master receive mode using a DMA safe buffer
参量
const struct i2c_client * client
从属设备的句柄
char * buf
存储从从属端读取的数据,使用DMA时,必须安全
int count
要读取多少个字节,由于msg.len为 u16,因此必须小于64k
描述
返回负数errno,否则返回读取的字节数。

i2c_master_send

int i2c_master_send(const struct i2c_client * client, const char * buf, int count)
在主发送模式下发出单个I2C消息。issue a single I2C message in master transmit mode
参量
const struct i2c_client * client
从属设备
const char * buf
将要写入从属的数据
int count
由于msg.len为u16,因此要写入的字节数必须小于64k
描述
返回负数errno,否则返回写入的字节数。

i2c_master_send_dmasafe

int i2c_master_send_dmasafe(const struct i2c_client * client, const char * buf, int count)
使用DMA安全缓冲区在主发送模式下发出单个I2C消息。issue a single I2C message in master transmit mode using a DMA safe buffer
参量
const struct i2c_client * client
从属设备
const char * buf
将要写入从属的数据,必须与DMA一起安全使用
int count
由于msg.len为u16,因此要写入的字节数必须小于64k
描述
返回负数errno,否则返回写入的字节数。

i2c_device_identity

struct i2c_device_identity
i2c客户端设备标识

定义

struct i2c_device_identity {
  u16 manufacturer_id;
#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS                0;
#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS_1              1;
#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS_2              2;
#define I2C_DEVICE_ID_NXP_SEMICONDUCTORS_3              3;
#define I2C_DEVICE_ID_RAMTRON_INTERNATIONAL             4;
#define I2C_DEVICE_ID_ANALOG_DEVICES                    5;
#define I2C_DEVICE_ID_STMICROELECTRONICS                6;
#define I2C_DEVICE_ID_ON_SEMICONDUCTOR                  7;
#define I2C_DEVICE_ID_SPRINTEK_CORPORATION              8;
#define I2C_DEVICE_ID_ESPROS_PHOTONICS_AG               9;
#define I2C_DEVICE_ID_FUJITSU_SEMICONDUCTOR            10;
#define I2C_DEVICE_ID_FLIR                             11;
#define I2C_DEVICE_ID_O2MICRO                          12;
#define I2C_DEVICE_ID_ATMEL                            13;
#define I2C_DEVICE_ID_NONE                         0xffff;
  u16 part_id;
  u8 die_revision;
};

成员:

manufacturer_id
0-4095,数据库由NXP维护
part_id
0-511,根据制造商(manufacturer)
die_revision
0-7,根据制造商

i2c_driver

struct i2c_driver
代表一个I2C设备驱动程序
定义:

struct i2c_driver {
  unsigned int class;
  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;
};

成员:

class
我们实例化哪种I2C设备(用于检测)
probe
设备绑定的回调-即将弃用
remove
取消绑定设备的回调
probe_new
设备绑定的新回调
shutdown
回调以关闭设备
alert
警报回调,例如SMBus警报协议
command
总线范围信令的回调(可选)Callback for bus-wide signaling (optional)
driver
设备驱动程序模型 驱动程序
id_table
该驱动程序支持的I2C设备列表
detect
回调以进行设备检测
address_list
要探查的I2C地址(用于检测)
clients
我们创建的检测到的客户端列表(仅适用于i2c-core)
描述
应该将driver.owner字段设置为该驱动程序的模块所有者。driver.name字段应设置为此驱动程序的名称。

对于自动设备检测,必须同时定义detect和address_list。还应该设置class,否则将仅创建带有模块参数的设备。检测功能必须至少填充成功检测到的i2c_board_info结构的名称字段,以及标志字段。

如果缺少检测,驱动程序对于枚举设备仍然可以正常工作。检测到的设备将完全不受支持。对于许多无法可靠检测到的I2C / SMBus器件,以及在实践中始终可以枚举的I2C / SMBus器件,这是可以预期的。

传递给检测回调的i2c_client结构不是真正的i2c_client。它刚完成一些初始化,以便您可以在其上调用i2c_smbus_read_byte_data和其他的东西。不要做任何其他事情。特别是,不允许在其上调用dev_dbg和某些。

i2c_client

struct i2c_client
代表一个I2C从属设备

定义

struct i2c_client {
  unsigned short flags;
#define I2C_CLIENT_PEC          0x04    ;
#define I2C_CLIENT_TEN          0x10    ;
#define I2C_CLIENT_SLAVE        0x20    ;
#define I2C_CLIENT_HOST_NOTIFY  0x40    ;
#define I2C_CLIENT_WAKE         0x80    ;
#define I2C_CLIENT_SCCB         0x9000  ;
  unsigned short addr;
  char name[I2C_NAME_SIZE];
  struct i2c_adapter *adapter;
  struct device dev;
  int init_irq;
  int irq;
  struct list_head detected;
#if IS_ENABLED(CONFIG_I2C_SLAVE);
  i2c_slave_cb_t slave_cb;
#endif;
};

成员
flags
请参阅I2C_CLIENT_ *了解可能的标志
addr
连接到父适配器的 I2C总线上使用的地址。
name
指示设备的类型,通常是芯片名称,其通用性足以隐藏second-sourcing和兼容的修订版。
adapter
管理 托管此I2C设备的总线段
dev
从属的驱动程序模型设备节点。
init_irq
初始化时设置的IRQ
irq
指示此设备生成的IRQ(如果有)
detected
i2c_driver.clients列表或i2c-core的userspace_devices列表的成员
slave_cb
使用适配器的I2C从属模式时的回调。适配器调用它以将从属事件传递给从属驱动程序。
描述:
i2c_client标识连接到i2c总线的单个设备(即芯片)。Linux公开的行为由管理设备的驱动程序定义。

i2c_board_info

struct i2c_board_info
创建设备的模板。template for device creation

定义:

struct i2c_board_info {
  char type[I2C_NAME_SIZE];
  unsigned short  flags;
  unsigned short  addr;
  const char      *dev_name;
  void *platform_data;
  struct device_node *of_node;
  struct fwnode_handle *fwnode;
  const struct property_entry *properties;
  const struct resource *resources;
  unsigned int    num_resources;
  int irq;
};

成员:

type
芯片类型,用于初始化i2c_client.name
flags
初始化i2c_client.flags
addr
存储在i2c_client.addr中
dev_name
如果设置,将覆盖默认的<busnr>-<addr> dev_name
platform_data
存储在i2c_client.dev.platform_data中
of_node
指向OpenFirmware设备节点的指针
fwnode
平台固件提供的设备节点
properties
设备的其他设备属性
resources
与设备关联的资源
num_resources
资源数组中的资源数量
irq
存储在i2c_client.irq中
描述

尽管控制器和设备可能 能够使用I2C_SMBUS_QUICK来告诉给定地址是否存在设备,但I2C实际上并不支持硬件探测。驱动程序通常需要更多信息,例如芯片类型,配置,关联的IRQ等。

i2c_board_info用于构建列出存在的I2C设备的信息表。此信息用于增长驱动程序模型树。对于主板,这是通过i2c_register_board_info()静态方式完成的;总线号标识 尚不可用的适配器。对于附加板, i2c_new_client_device()使用已知的适配器动态地执行此操作。

I2C_BOARD_INFO

I2C_BOARD_INFO(dev_type, dev_addr)
用于列出i2c设备及其地址的宏。macro used to list an i2c device and its address

参量
dev_type
识别设备类型
dev_addr
总线上的设备地址。
描述

该宏初始化 结构i2c_board_info 的基本字段,声明在特定板上提供的内容。使用常规语法提供了可选字段(例如,关联的irq或特定于设备的platform_data)。

i2c_algorithm

struct i2c_algorithm

表示I2C传输方法

定义:

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);
  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;
};

成员:

master_xfer
向 由msgs数组定义的 给定I2C适配器 发出一组i2c事务,其中num条消息可通过adap指定的适配器进行传输。
master_xfer_atomic
与master_xfer相同。但是,仅使用原子上下文,例如PMIC可以在关机前很晚才访问。可选的。
smbus_xfer
将smbus事务发布到给定的I2C适配器。如果不存在,则总线层将尝试将SMBus调用转换为I2C传输。
smbus_xfer_atomic
与smbus_xfer相同。但是,仅使用原子上下文,例如PMIC可以在关机前很晚才访问。可选的。
functionality
从标志中返回此算法/适配器对支持的I2C_FUNC_*标志。
reg_slave
将给定的客户端注册到此适配器的I2C从属模式
unreg_slave
从此适配器的I2C从属模式注销给定的客户端

描述:

以下结构适用于那些希望实现新总线驱动程序的人员:i2c_algorithm是一类硬件解决方案的接口,可以使用相同的总线算法(例如,bit-banging或PCF8584)来解决这两种最常见的算法。

master_xfer{_atomic}字段的返回代码应指示在传输过程中发生的错误代码的类型,如内核文档文件Documentation / i2c / fault-codes.rst中所述。

i2c_lock_operations

struct i2c_lock_operations
表示I2C锁定操作。represent I2C locking operations

定义

struct i2c_lock_operations {
  void (*lock_bus)(struct i2c_adapter *adapter, unsigned int flags);
  int (*trylock_bus)(struct i2c_adapter *adapter, unsigned int flags);
  void (*unlock_bus)(struct i2c_adapter *adapter, unsigned int flags);
};

成员:

lock_bus
获得对I2C总线网段的独占访问权
trylock_bus
尝试获得对I2C总线网段的独占访问权
unlock_bus
释放对I2C总线段的专有访问权
描述
主要操作由i2c_lock_bus和i2c_unlock_bus包装。

i2c_timings

struct i2c_timings
I2C时序信息

定义:

struct i2c_timings {
  u32 bus_freq_hz;
  u32 scl_rise_ns;
  u32 scl_fall_ns;
  u32 scl_int_delay_ns;
  u32 sda_fall_ns;
  u32 sda_hold_ns;
  u32 digital_filter_width_ns;
  u32 analog_filter_cutoff_freq_hz;
};

成员:
bus_freq_hz
总线频率(Hz)
scl_rise_ns
SCL信号花费的时间以ns为单位; I2C规范中的t(r)
scl_fall_ns
SCL信号花费的时间以ns为单位;I2C规范中的t(f)
scl_int_delay_ns
IP内核还需要以ns为单位设置SCL
sda_fall_ns
SDA信号花费的时间 以ns为单位; I2C规范中的t(f)
sda_hold_ns
IP核还需要以ns为单位保持SDA
digital_filter_width_ns
IP核心数字滤波器可以滤除的i2c线上的尖峰宽度(ns)
analog_filter_cutoff_freq_hz
低通IP内核模拟滤波器的阈值频率

i2c_bus_recovery_info

struct i2c_bus_recovery_info
I2C总线恢复信息。I2C bus recovery information

定义

struct i2c_bus_recovery_info {
  int (*recover_bus)(struct i2c_adapter *adap);
  int (*get_scl)(struct i2c_adapter *adap);
  void (*set_scl)(struct i2c_adapter *adap, int val);
  int (*get_sda)(struct i2c_adapter *adap);
  void (*set_sda)(struct i2c_adapter *adap, int val);
  int (*get_bus_free)(struct i2c_adapter *adap);
  void (*prepare_recovery)(struct i2c_adapter *adap);
  void (*unprepare_recovery)(struct i2c_adapter *adap);
  struct gpio_desc *scl_gpiod;
  struct gpio_desc *sda_gpiod;
  struct pinctrl *pinctrl;
  struct pinctrl_state *pins_default;
  struct pinctrl_state *pins_gpio;
};

成员:

recover_bus
恢复routine。pass驱动程序的recover_bus()routine 或i2c_generic_scl_recovery()。
get_scl
这将获得SCL线的当前值。强制进行通用SCL恢复。在内部填充以进行通用GPIO恢复。
set_scl
这将设置/清除SCL线。强制进行通用SCL恢复。在内部填充以进行通用GPIO恢复。
get_sda
这将获得SDA线的当前值。对于常规SCL恢复,此或set_sda()是必需的。如果sda_gpio是有效的GPIO,则在内部填充,以进行通用GPIO恢复。
set_sda
这将设置/清除SDA线。此或get_sda()对于常规SCL恢复是必需的。如果sda_gpio是有效的GPIO,则在内部填充,以进行通用GPIO恢复。
get_bus_free
如果IP内核具有比读取SDA更复杂的内部逻辑,则返回从IP内核看到的总线free状态。可选的。
prepare_recovery
开始恢复之前将调用此方法。平台可以在此处 为SDA / SCL线或他们想要的其他 配置padmux。
unprepare_recovery
恢复完成后将调用此方法。平台可以在此处 为SDA / SCL线或他们想要的其他 配置padmux。
scl_gpiod
SCL线的gpiod。仅对于GPIO恢复是必需的。
sda_gpiod
SDA系列的产品。仅对于GPIO恢复是必需的。
pinctrl
GPIO恢复用于更改I2C引脚状态的pinctrl。可选的。
pins_default
将SCL / SDA线分配给I2C总线时的默认pinctrl状态。可选的。如果找到名称为PINCTRL_STATE_DEFAULT的状态且pinctrl有效,则在内部填充以进行GPIO恢复。
pins_gpio
当它们用作GPIO时,SCL / SDA线的恢复pinctrl状态。可选的。如果此状态称为“ gpio”或“ recovery”且pinctrl有效,则内部填充以进行GPIO恢复。

i2c_adapter_quirks

struct i2c_adapter_quirks
描述i2c适配器的缺陷。describe flaws of an i2c adapter

定义

struct i2c_adapter_quirks {
  u64 flags;
  int max_num_msgs;
  u16 max_write_len;
  u16 max_read_len;
  u16 max_comb_1st_msg_len;
  u16 max_comb_2nd_msg_len;
};

成员:

flags
请参阅I2C_AQ_ *了解可能的标志
max_num_msgs
每次传输的最大消息数
max_write_len
写消息的最大长度
max_read_len
读消息的最大长度
max_comb_1st_msg_len
组合消息中第一个msg的最大长度
max_comb_2nd_msg_len
组合消息中第二个味精的最大长度

描述:
关于组合消息的注意事项:某些I2C控制器每次传输只能发送一条消息,外加一些称为组合消息或先写后读的消息。(通常)这是一条小的写消息,后跟一条读消息,仅够访问基于寄存器的设备(如EEPROM)。有一个标志支持此模式。这意味着max_num_msg = 2 并使用max_comb_*_len进行长度检查,因为组合消息模式通常具有其自身的局限性。由于采用硬件实现,因此某些控制器实际上可以执行“先写后写”或其他变型。为了支持这一点,先写后读被分解为较小的位,例如写优先和读第二,可以根据需要进行组合。

i2c_lock_bus

void i2c_lock_bus(struct i2c_adapter * adapter, unsigned int flags)
获得对I2C总线网段的独占访问权

参量
struct i2c_adapter * adapter
目标I2C总线段
unsigned int flags
I2C_LOCK_ROOT_ADAPTER锁定根i2c适配器,I2C_LOCK_SEGMENT仅锁定适配器树中的此分支

int i2c_trylock_bus(struct i2c_adapter * adapter, unsigned int flags)
尝试获得对I2C总线网段的独占访问权
参量
struct i2c_adapter * adapter
目标I2C总线段
unsigned int flags
I2C_LOCK_ROOT_ADAPTER尝试锁定根i2c适配器,I2C_LOCK_SEGMENT尝试仅锁定适配器树中的该分支
返回
如果I2C总线段已锁定,则为true,否则为false

void i2c_unlock_bus(struct i2c_adapter * adapter, unsigned int flags)
释放对I2C总线段的专有访问权

参量

struct i2c_adapter * adapter
目标I2C总线段
unsigned int flags
I2C_LOCK_ROOT_ADAPTER解锁根i2c适配器,I2C_LOCK_SEGMENT仅解锁适配器树中的此分支

i2c_mark_adapter_suspended

void i2c_mark_adapter_suspended(struct i2c_adapter * adap)
向核心报告适配器的挂起状态

参量
struct i2c_adapter * adap
标记该适配器为已暂停
描述:
当使用该helper将适配器标记为已暂停时,核心将拒绝进一步传输到该适配器。此帮助程序的使用是可选的,但建议用于具有用于系统挂起和运行时挂起的不同处理程序的设备。更复杂的设备可以自由实施自定义解决方案,以在挂起时拒绝传输。

i2c_mark_adapter_resumed

void i2c_mark_adapter_resumed(struct i2c_adapter * adap)
向核心报告适配器的恢复状态
参量
struct i2c_adapter * adap
标记该适配器为已恢复
描述
使用此帮助程序将适配器标记为已恢复时,核心将允许进一步传输到该适配器。另请参阅的注释 i2c_mark_adapter_suspended()。

i2c_check_quirks

bool i2c_check_quirks(struct i2c_adapter * adap, u64 quirks)
用于检查i2c适配器中的quirk标志的功能
参量
struct i2c_adapter * adap
i2c适配器
u64 quirks
quirk flags
返回
如果适配器具有所有指定的quirk flags,则为true;否则为false

module_i2c_driver

module_i2c_driver(__i2c_driver)
用于注册模块化I2C驱动程序的Helper宏
参量
__i2c_driver
i2c_driver结构
描述
I2C驱动程序的帮助程序宏,在模块初始化/退出过程中不做任何特殊处理。这消除了很多样板。每个模块只能使用一次此宏,并调用它替换module_init()和module_exit()

builtin_i2c_driver

builtin_i2c_driver(__i2c_driver)
用于注册内置I2C驱动程序的Helper宏
参量

__i2c_driver

__i2c_driver
i2c_driver结构
描述
I2C驱动程序的帮助程序宏,这些驱动程序的init不需要做任何特殊的事情。这消除了很多样板。每个驱动程序只能使用一次此宏,并且调用它会替换device_initcall()。

i2c_register_board_info

int i2c_register_board_info(int busnum, struct i2c_board_info const * info, unsigned len)
静态声明I2C设备
参量
int busnum
标识这些设备所属的总线
struct i2c_board_info const * info
i2c设备描述符的vector
unsigned len
vector中有多少个描述符;可以为零 以保留指定的总线号。
描述
使用Linux I2C驱动程序堆栈的系统可以在初始化时声明板子信息表。在注册任何I2C适配器驱动程序之前,应在arch_initcall()时间附近或等效的时间附近以特定于板的初始化代码完成此操作。例如,主板初始化代码可以定义多个设备,主板堆栈中每个子板的初始化代码也可以定义。

在注册了相关总线的适配器之后,将稍后创建I2C设备。此后,将使用标准驱动程序模型工具将“新型” I2C驱动程序绑定到设备。使用此例程声明的任何设备的总线号均不可用于动态分配。

可以安全地通过传递的板信息为__initdata,但请注意嵌入式指针(用于platform_data,函数等),因为不会复制该指针。设备属性已被深复制(deep-copied)。

i2c_verify_client

struct i2c_client * i2c_verify_client(struct device * dev)
返回参数为 i2c_client或NULL
参量
struct device * dev
设备,可能来自某些驱动程序模型迭代器
描述
在遍历驱动程序模型树时,也许使用像device_for_each_child()那样的驱动程序模型迭代器,你不能期待找到很多的节点。使用此功能可以避免 因将某些非I2C设备错误地视为i2c_client而引起的操作。

i2c_new_client_device

struct i2c_client * i2c_new_client_device(struct i2c_adapter * adap, struct i2c_board_info const * info)
实例化i2c设备
参量
struct i2c_adapter * adap
管理设备的适配器
struct i2c_board_info const * info
描述了一种I2C设备;bus_num被忽略
上下文:
可以睡眠
描述:
创建一个i2c设备。绑定通过驱动程序模型probe()/ remove()方法进行处理。当我们从此函数返回时,或以后任何时候,驱动程序可能已绑定到该设备(例如,热插拔可能会加载驱动程序模块)。此调用不适用于主板初始化逻辑,主板初始化逻辑通常在arch_initcall()期间运行,远远早于任何i2c_adapter可能存在的时间。

这将返回新的i2c客户端,可以将其保存以供以后与i2c_unregister_device()一起使用 。或返回ERR_PTR描述错误。

i2c_unregister_device

void i2c_unregister_device(struct i2c_client * client)
i2c_new _ * _ device()的反向作用
参量
struct i2c_client * client
从i2c_new _ * _ device()返回的值
上下文:
可以睡眠

i2c_new_dummy_device

struct i2c_client * i2c_new_dummy_device(struct i2c_adapter * adapter, u16 address)
返回绑定到虚拟驱动程序的新i2c设备。return a new i2c device bound to a dummy driver
参量
struct i2c_adapter * adapter
管理设备的适配器
u16 address
要使用的七位地址
上下文:
可以睡眠
描述:
这将返回绑定到“虚拟”驱动程序的I2C客户端,该驱动程序旨在与使用多个地址的设备一起使用。此类芯片的示例包括各种EEPROM(如24c04和24c08型号)。

这些虚拟设备有两个主要用途。首先,大多数I2C和SMBus调用(除了i2c_transfer())都需要客户端句柄。虚拟设备就是那个句柄。其次,这可以防止将指定地址绑定到其他驱动程序。

这将返回新的i2c客户端,应将其保存以供以后与i2c_unregister_device()一起使用 。或返回ERR_PTR描述错误。

devm_i2c_new_dummy_device

struct i2c_client * devm_i2c_new_dummy_device(struct device * dev, struct i2c_adapter * adapter, u16 address)
返回绑定到虚拟驱动程序的新i2c设备
参量
struct device * dev
受管资源绑定到的设备
struct i2c_adapter * adapter
管理设备的适配器
u16 address
要使用的七位地址
上下文:
可以睡眠

描述
这是i2c_new_dummy_device的device-managed版本。它将返回新的i2c客户端 或ERR_PTR,如果发生错误。

i2c_new_ancillary_device

struct i2c_client * i2c_new_ancillary_device(struct i2c_client * client, const char * name, u16 default_addr)
帮助程序,获取实例化的辅助(secondary)地址并创建关联的设备。Helper to get the instantiated secondary address and create the associated device
参量
struct i2c_client * client
主客户端的句柄
const char * name
指定要获取哪个辅助地址的句柄
u16 default_addr
如果未指定辅助地址,则用作备用
上下文:
可以睡眠

描述:
I2C客户端可以由在单个组件中绑定在一起的多个I2C从属组成。然后,I2C客户端驱动程序绑定到 主I2C从属设备,并需要创建I2C虚拟客户端以与所有其他从设备进行通信。

此函数创建并返回一个I2C虚拟客户端,该客户端基于给定的从属名称从平台固件中检索其I2C地址。如果固件未指定地址,则使用default_addr。

在基于DT(设备树)的平台上,从“ reg”属性输入单元中检索地址,该单元的“ reg-names”值与从站名称匹配。

这将返回新的i2c客户端,应将其保存以供以后与i2c_unregister_device()一起使用 。或返回ERR_PTR描述错误。

i2c_verify_adapter

struct i2c_adapter * i2c_verify_adapter(struct device * dev)
返回参数为i2c_adapter或NULL
参量
struct device * dev
设备,可能来自某些驱动程序模型迭代器
描述
在遍历驱动程序模型树时,也许使用像device_for_each_child()那样的驱动程序模型迭代器,你不能期待找到很多的节点。使用此功能可以避免因将某些非I2C设备错误地视为i2c_adapter而引起的操作。

i2c_handle_smbus_host_notify

int i2c_handle_smbus_host_notify(struct i2c_adapter * adap, unsigned short addr)
将主机通知事件转发到正确的I2C客户端。Forward a Host Notify event to the correct I2C client.
参量
struct i2c_adapter * adap
适配器
unsigned short addr
通知设备的I2C地址
上下文:
不可以睡眠
描述
从I2C总线驱动程序的中断处理程序中调用 的辅助函数。它将调度Host Notify IRQ。

int i2c_add_adapter(struct i2c_adapter * adapter)
声明i2c适配器,使用动态总线号

参量
struct i2c_adapter * adapter
要添加的适配器
上下文:
可以睡眠

描述
当其总线编号无关紧要,或由dt别名指定其总线编号时,该例程用于声明I2C适配器。总线编号无关紧要的基础示例:USB链接或PCI插件卡动态添加的I2C适配器。

当它返回零时,将分配一个新的总线号并将其存储在adap-> nr中,并且指定的适配器可用于客户端。否则,将返回负的errno值。

i2c_add_numbered_adapter

int i2c_add_numbered_adapter(struct i2c_adapter * adap)
声明i2c适配器,使用静态总线号

参量
struct i2c_adapter * adap
要注册的适配器(adap-> nr已初始化)
上下文:
可以睡眠

描述:
当其总线号很重要时,此例程用于声明I2C适配器。例如,将其用于片上系统CPU的I2C适配器,或内置到系统主板中,并且i2c_board_info用于正确配置I2C设备。

如果请求的总线号设置为-1,则此函数的行为与i2c_add_adapter相同,并将动态分配总线号。

如果尚未为此总线声明任何设备,请确保在动态分配的设备之前先注册适配器。否则,可能无法使用所需的总线ID。

当它返回零时,指定的适配器可使用adap-> nr中提供的总线号供客户端使用。同样,将扫描使用i2c_register_board_info()预先声明的I2C设备表,并创建适当的驱动程序模型设备节点。否则,将返回负的errno值。

i2c_del_adapter

void i2c_del_adapter(struct i2c_adapter * adap)
注销I2C适配器
参量
struct i2c_adapter * adap
注销该适配器
上下文:
可以睡眠
描述
这将注销先前由i2c_add_adapter或i2c_add_numbered_adapter注册的I2C适配器。

i2c_parse_fw_timings

void i2c_parse_fw_timings(struct device * dev, struct i2c_timings * t, bool use_defaults)
从固件获取与I2C相关的时序参数
参量
struct device * dev
扫描该设备的I2C时序属性
struct i2c_timings * t
要填充值的i2c_timings结构
bool use_defaults
在找不到属性时使用从I2C规范派生的合理默认布尔值,否则不更新
描述
在设备上扫描通用的I2C属性,以描述信号的时序参数,并在结果中填充给定的结构。如果未找到属性且use_defaults为true,则假定最大时序是从I2C规范派生的。如果未使用use_defaults,则结果将与以前一样,因此驱动程序可以在调用此帮助程序之前应用其自己的默认值。后者主要是为了避免要切换到此功能的现有驱动程序的回归。新驱动程序几乎总是应该使用默认值。

i2c_del_driver

void i2c_del_driver(struct i2c_driver * driver)
注销I2C驱动程序
参量
struct i2c_driver * driver
注销该驱动程序
上下文:
可以睡眠

__i2c_transfer

int __i2c_transfer(struct i2c_adapter * adap, struct i2c_msg * msgs, int num)
解锁的i2c_transfer风格。unlocked flavor of i2c_transfer

参量
struct i2c_adapter * adap
I2C总线的句柄
struct i2c_msg * msgs
在发出STOP终止操作之前要执行的一条或多条消息;每条消息均以START开头。
int num
要执行的消息数。
描述
返回负数errno,否则返回执行的消息数。

调用此函数时,必须保持适配器锁定。没有调试日志记录发生。adap-> algo-> master_xfer是否存在未检查。

i2c_transfer

int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg * msgs, int num)
执行单个或组合的I2C消息
参量
struct i2c_adapter * adap
I2C总线的句柄
struct i2c_msg * msgs
在发出STOP终止操作之前要执行的一条或多条消息;每条消息均以START开头。
int num
要执行的消息数。
描述
返回负数errno,否则返回执行的消息数。
请注意,尽管这是最常见的模型,但并不要求将每个消息都发送到相同的从属地址。

i2c_transfer_buffer_flags

int i2c_transfer_buffer_flags(const struct i2c_client * client, char * buf, int count, u16 flags)
发出一条I2C消息来 to/from 缓冲区传输数据

参量
const struct i2c_client * client
从属设备的句柄
char * buf
数据存储位置
int count
由于msg.len为u16,因此要传输的字节数必须小于64k
u16 flags
用于消息的标志,例如用于读取的I2C_M_RD
描述
返回负数errno,否则返回传输的字节数。

i2c_get_device_id

int i2c_get_device_id(const struct i2c_client * client, struct i2c_device_identity * id)
获取设备的制造商,部件ID和模具修订。get manufacturer, part id and die revision of a device
参量
const struct i2c_client * client
要查询的设备
struct i2c_device_identity * id
查询信息
描述
错误返回负errno,成功返回零。

i2c_get_dma_safe_msg_buf

u8 * i2c_get_dma_safe_msg_buf(struct i2c_msg * msg, unsigned int threshold)
获取给定i2c_msg的DMA安全缓冲区。get a DMA safe buffer for the given i2c_msg

参量
struct i2c_msg * msg
要检查的消息
unsigned int threshold
使用DMA有意义的最小字节数。至少应为1。
返回
如果未获得DMA安全缓冲区,则为NULL。将msg-> buf与PIO一起使用。
或与DMA一起使用的有效指针。使用后,通过调用i2c_put_dma_safe_msg_buf()释放它。
描述
该函数只能从程序上下文中调用!

i2c_put_dma_safe_msg_buf

void i2c_put_dma_safe_msg_buf(u8 * buf, struct i2c_msg * msg, bool xferred)
释放DMA安全缓冲区并与i2c_msg同步。release DMA safe buffer and sync with i2c_msg
参量
u8 * buf
从i2c_get_dma_safe_msg_buf()获得的缓冲区。可能为NULL。
struct i2c_msg * msg
缓冲区对应的消息
bool xferred
布尔表明消息是否已转移

i2c_smbus_read_byte

s32 i2c_smbus_read_byte(const struct i2c_client * client)
SMBus“接收字节”协议。SMBus “receive byte” protocol
参量
const struct i2c_client * client
从属设备的句柄
描述:
这将执行SMBus“接收字节”协议,返回负errno,否则返回从设备接收的字节。

i2c_smbus_write_byte

s32 i2c_smbus_write_byte(const struct i2c_client * client, u8 value)
SMBus“发送字节”协议。SMBus “send byte” protocol
参量
const struct i2c_client * client
从属设备的句柄
u8 value
要发送的字节
描述:
这将执行SMBus“发送字节”协议,成功时返回负errno,否则返回零。

s32 i2c_smbus_read_byte_data(const struct i2c_client * client, u8 command)
SMBus“读取字节”协议。SMBus “read byte” protocol
参量
const struct i2c_client * client
从属设备句柄
u8 command
从属解释的字节。Byte interpreted by slave
描述:
这将执行SMBus“读字节”协议,返回负errno,否则返回从设备接收到的数据字节。

s32 i2c_smbus_write_byte_data(const struct i2c_client * client, u8 command, u8 value)
SMBus“写字节”协议。SMBus “write byte” protocol
参量
const struct i2c_client * client
从属设备句柄
u8 command
从属解释的字节。Byte interpreted by slave
u8 value
正在写入的字节
描述
这将执行SMBus“写字节”协议,成功时返回负errno,否则返回零。

s32 i2c_smbus_read_word_data(const struct i2c_client * client, u8 command)
SMBus“读字”协议。SMBus “read word” protocol
参量
const struct i2c_client * client
从属设备的句柄
u8 command
从属解释的字节。Byte interpreted by slave
描述
这将执行SMBus“读取字”协议,返回负errno,否则返回从设备接收到的16位无符号“字”。

s32 i2c_smbus_write_word_data(const struct i2c_client * client, u8 command, u16 value)
SMBus“写字”协议。SMBus “write word” protocol
参量
const struct i2c_client * client
从属设备的句柄
u8 command
从属解释的字节。Byte interpreted by slave
u16 value
正在写入16位“字”
描述
这将执行SMBus“写字”协议,成功时返回负errno,否则返回零。

s32 i2c_smbus_read_block_data(const struct i2c_client * client, u8 command, u8 * values)
SMBus“块读取”协议。SMBus “block read” protocol
参量
const struct i2c_client * client
从属设备的句柄
u8 command
从属解释的字节。Byte interpreted by slave
u8 * values
将读取数据的字节数组;足以容纳从属返回的数据。SMBus最多允许32个字节。
描述
这将执行SMBus“块读取”协议,返回负errno,否则将返回从设备响应中的数据字节数。

请注意,使用此功能要求客户端的适配器支持I2C_FUNC_SMBUS_READ_BLOCK_DATA功能。并非所有的适配器驱动程序都支持此功能。它通过I2C消息传递进行的仿真依赖于可能无法实现的特定机制(I2C_M_RECV_LEN)。

s32 i2c_smbus_write_block_data(const struct i2c_client * client, u8 command, u8 length, const u8 * values)
SMBus“块写入”协议
参量
u8 length
数据块大小;SMBus最多允许32个字节
const u8 * values
将要写入的字节数组。
描述
这将执行SMBus“块写入”协议,成功时返回负errno,否则返回零。

s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, char read_write, u8 command, int protocol, union i2c_smbus_data * data)
执行SMBus协议操作
参量
struct i2c_adapter * adapter
处理I2C总线
u16 addr
该总线上SMBus从属的地址
unsigned short flags
I2C_CLIENT_ *标志(通常为零或I2C_CLIENT_PEC)
char read_write
I2C_SMBUS_READ或I2C_SMBUS_WRITE
u8 command
从属解释的字节,用于使用此类字节的协议
int protocol
要执行的SMBus协议操作,例如I2C_SMBUS_PROC_CALL
union i2c_smbus_data * data
要读取或写入的数据
描述
这将执行SMBus协议操作,并返回负errno代码,否则返回零。

s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client * client, u8 command, u8 length, u8 * values)
读取块或模拟。read block or emulate

参量
u8 length
数据块大小;SMBus最多允许I2C_SMBUS_BLOCK_MAX字节
u8 * values
将读取数据的字节数组;足以容纳从站返回的数据。SMBus最多允许I2C_SMBUS_BLOCK_MAX字节。
描述
如果适配器支持,它将执行SMBus“块读取”协议。如果不支持块读取,则根据可用性使用字读取或字节读取协议对其进行仿真。

使用此功能访问的I2C从设备的地址必须映射到线性区域,以便块读取将具有与字节读取相同的效果。在使用此功能之前,必须仔细检查I2C从站是否确实支持将块传输与字节传输交换。

struct i2c_client * i2c_new_smbus_alert_device(struct i2c_adapter * adapter, struct i2c_smbus_alert_setup * setup)
获取ara客户端以获得SMBus警报支持
参量
struct i2c_adapter * adapter
目标适配器
struct i2c_smbus_alert_setup * setup
SMBus警报处理程序的设置数据
上下文:
可以睡眠
描述
在给定的I2C总线段上设置SMBus警报协议。
可以通过我们的IRQ处理程序或适配器(从其处理程序,定期轮询等方式)进行处理。
这将返回ara客户端,应将其保存以供以后与i2c_handle_smbus_alert()和最终使用i2c_unregister_device();或ERRPTR表示错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值