I3C 设备驱动 API

enum i3c_error_code

I3C 错误代码

常量

I3C_ERROR_UNKNOWN

未知错误,通常意味着该错误与 I3C 无关

I3C_ERROR_M0

M0 错误

I3C_ERROR_M1

M1 错误

I3C_ERROR_M2

M2 错误

描述

这些是 I3C 规范定义的标准错误代码。当 i3c_device_do_priv_xfers() 或 i3c_device_send_hdr_cmds() 返回 -EIO 时,可以在 struct_i3c_priv_xfer.errstruct i3c_hdr_cmd.err 中检查错误代码,以便更好地了解哪里出错了。

enum i3c_hdr_mode

HDR 模式 ID

常量

I3C_HDR_DDR

DDR 模式

I3C_HDR_TSP

TSP 模式

I3C_HDR_TSL

TSL 模式

struct i3c_priv_xfer

I3C SDR 私有传输

定义:

struct i3c_priv_xfer {
    u8 rnw;
    u16 len;
    u16 actual_len;
    union {
        void *in;
        const void *out;
    } data;
    enum i3c_error_code err;
};

成员

rnw

编码传输方向。读取为 true,写入为 false

len

传输的字节长度

actual_len

控制器传输的实际字节长度

data

输入/输出缓冲区

data.in

输入缓冲区。必须指向可 DMA 的缓冲区

data.out

输出缓冲区。必须指向可 DMA 的缓冲区

err

I3C 错误代码

enum i3c_dcr

I3C DCR 值

常量

I3C_DCR_GENERIC_DEVICE

通用 I3C 设备

struct i3c_device_info

I3C 设备信息

定义:

struct i3c_device_info {
    u64 pid;
    u8 bcr;
    u8 dcr;
    u8 static_addr;
    u8 dyn_addr;
    u8 hdr_cap;
    u8 max_read_ds;
    u8 max_write_ds;
    u8 max_ibi_len;
    u32 max_read_turnaround;
    u16 max_read_len;
    u16 max_write_len;
};

成员

pid

配置的 ID

bcr

总线特征寄存器

dcr

设备特征寄存器

static_addr

静态/I2C 地址

dyn_addr

动态地址

hdr_cap

支持的 HDR 模式

max_read_ds

最大读取速度信息

max_write_ds

最大写入速度信息

max_ibi_len

最大 IBI 有效负载长度

max_read_turnaround

最大读取转换时间(以微秒为单位)

max_read_len

最大私有 SDR 读取长度(以字节为单位)

max_write_len

最大私有 SDR 写入长度(以字节为单位)

描述

这些是 I3C 设备应该通告的所有基本信息。其中一些是可选的,具体取决于设备类型和设备功能。对于每个通过 i3c_master_add_i3c_dev_locked() 连接到主机的 I3C 从机,内核将发送相关的 CCC 命令来检索这些数据。

struct i3c_driver

I3C 设备驱动程序

定义:

struct i3c_driver {
    struct device_driver driver;
    int (*probe)(struct i3c_device *dev);
    void (*remove)(struct i3c_device *dev);
    const struct i3c_device_id *id_table;
};

成员

driver

继承自 device_driver

probe

I3C 设备探测方法

remove

I3C 设备移除方法

id_table

I3C 设备匹配表。框架将使用它来决定将哪个设备绑定到此驱动程序

dev_to_i3cdev

dev_to_i3cdev (__dev)

返回包含 dev 的 I3C 设备

参数

__dev

设备对象

返回

指向 I3C 设备对象的指针。

module_i3c_driver

module_i3c_driver (__drv)

注册提供 I3C 驱动程序的模块

参数

__drv

要注册的 I3C 驱动程序

描述

提供通用的 init/exit 函数,这些函数只是简单地注册/注销 I3C 驱动程序。任何不需要额外 init/cleanup 步骤的驱动程序都应该使用它。

int i3c_i2c_driver_register(struct i3c_driver *i3cdrv, struct i2c_driver *i2cdrv)

注册 i2c 和 i3c 驱动程序

参数

struct i3c_driver *i3cdrv

要注册的 I3C 驱动程序

struct i2c_driver *i2cdrv

要注册的 I2C 驱动程序

描述

此函数同时注册 i2cdevi3cdev,如果其中一个注册失败,则也会失败。这对于同时支持 I2C 和 I3C 模式的设备特别有用。请注意,当未启用 CONFIG_I3C 时,此函数仅注册 I2C 驱动程序。

返回

如果两个注册都成功,则为 0,否则为负错误代码。

void i3c_i2c_driver_unregister(struct i3c_driver *i3cdrv, struct i2c_driver *i2cdrv)

注销 i2c 和 i3c 驱动程序

参数

struct i3c_driver *i3cdrv

要注册的 I3C 驱动程序

struct i2c_driver *i2cdrv

要注册的 I2C 驱动程序

描述

此函数注销 i3cdrvi2cdrv。请注意,当未启用 CONFIG_I3C 时,此函数仅注销 i2cdrv

module_i3c_i2c_driver

module_i3c_i2c_driver (__i3cdrv, __i2cdrv)

注册提供 I3C 和 I2C 驱动程序的模块

参数

__i3cdrv

要注册的 I3C 驱动程序

__i2cdrv

要注册的 I3C 驱动程序

描述

提供通用的 init/exit 函数,这些函数只是简单地注册/注销 I3C 和 I2C 驱动程序。即使禁用 CONFIG_I3C,也可以使用此宏,在这种情况下,将仅注册 I2C 驱动程序。任何不需要额外 init/cleanup 步骤的驱动程序都应该使用它。

struct i3c_ibi_setup

IBI 设置对象

定义:

struct i3c_ibi_setup {
    unsigned int max_payload_len;
    unsigned int num_slots;
    void (*handler)(struct i3c_device *dev, const struct i3c_ibi_payload *payload);
};

成员

max_payload_len

与 IBI 关联的有效负载的最大长度。如果一个 IBI 的有效负载似乎大于此数字,则该 IBI 将被拒绝。

num_slots

预分配的 IBI 插槽数量。应该选择此值,以使系统永远不会耗尽 IBI 插槽,否则您将丢失 IBI。

handler

IBI 处理程序,每次收到 IBI 时都会调用此处理程序。此处理程序在工作队列上下文中调用。它允许休眠并在总线上发送新消息,但建议尽可能快地完成此处执行的处理,以避免延迟处理同一工作队列上排队的其他消息。

描述

用于将信息传递给 i3c_device_request_ibi() 的临时结构。此对象可以在堆栈上分配,因为 i3c_device_request_ibi() 复制每一位信息,并且在 i3c_device_request_ibi() 返回后不使用它。

int i3c_device_do_priv_xfers(struct i3c_device *dev, struct i3c_priv_xfer *xfers, int nxfers)

执行定向到特定设备的 I3C SDR 私有传输

参数

struct i3c_device *dev

执行传输的设备

struct i3c_priv_xfer *xfers

传输数组

int nxfers

传输数量

描述

使用 dev 发起一个或多个私有 SDR 传输。

此函数可能会休眠,因此不能在原子上下文中调用。

返回

成功时返回 0,否则返回负错误代码。
-EAGAIN: 控制器丢失地址仲裁。目标

(IBI、HJ 或控制器角色请求)赢得总线。客户端驱动程序需要在稍后重新发送 ‘xfers’。请参阅 I3C 规范 ver 1.1.1 2021 年 6 月 9 日。章节:5.1.2.2.3。

int i3c_device_do_setdasa(struct i3c_device *dev)

使用静态地址执行 I3C 动态地址分配

参数

struct i3c_device *dev

执行 DAA 的设备

返回

成功时返回 0,否则返回负错误代码。

void i3c_device_get_info(const struct i3c_device *dev, struct i3c_device_info *info)

获取 I3C 设备信息

参数

const struct i3c_device *dev

我们要获取信息的设备

struct i3c_device_info *info

要填充的信息对象

描述

检索 I3C 设备信息。

int i3c_device_disable_ibi(struct i3c_device *dev)

禁用来自特定设备的 IBI

参数

struct i3c_device *dev

应该禁用 IBI 的设备

描述

此函数禁用来自特定设备的 IBI,并等待所有挂起的 IBI 被处理。

返回

成功时返回 0,否则返回负错误代码。

int i3c_device_enable_ibi(struct i3c_device *dev)

启用来自特定设备的 IBI

参数

struct i3c_device *dev

应该启用 IBI 的设备

描述

此函数启用来自特定设备的 IBI,并等待所有挂起的 IBI 被处理。应该在 i3c_device_request_ibi() 成功完成的设备上调用此函数。

请注意,此设备发送的 IBI 可能会在此函数返回给调用者之前收到。

返回

成功时返回 0,否则返回负错误代码。

int i3c_device_request_ibi(struct i3c_device *dev, const struct i3c_ibi_setup *req)

请求 IBI

参数

struct i3c_device *dev

我们应该为哪些设备启用 IBI

const struct i3c_ibi_setup *req

为此 IBI 请求的设置

描述

此函数负责预先分配处理来自 dev 的 IBI 所需的所有资源。当此函数返回时,在调用 i3c_device_enable_ibi() 之前,IBI 不会启用。

返回

成功时返回 0,否则返回负错误代码。

void i3c_device_free_ibi(struct i3c_device *dev)

释放 IBI 处理所需的所有资源

参数

struct i3c_device *dev

您要释放 IBI 资源的设备

描述

此函数负责释放之前由 i3c_device_request_ibi() 分配的资源。应在使用 i3c_device_disable_ibi() 禁用 IBI 后调用此函数。

struct device *i3cdev_to_dev(struct i3c_device *i3cdev)

返回嵌入在 i3cdev 中的设备

参数

struct i3c_device *i3cdev

I3C 设备

返回

指向设备对象的指针。

const struct i3c_device_id *i3c_device_match_id(struct i3c_device *i3cdev, const struct i3c_device_id *id_table)

返回与 i3cdev 匹配的 i3c_device_id 条目

参数

struct i3c_device *i3cdev

I3C 设备

const struct i3c_device_id *id_table

I3C 设备匹配表

返回

指向 i3c_device_id 对象的指针,如果没有匹配项,则为 NULL。

int i3c_driver_register_with_owner(struct i3c_driver *drv, struct module *owner)

注册 I3C 设备驱动程序

参数

struct i3c_driver *drv

要注册的驱动程序

struct module *owner

拥有此驱动程序的模块

描述

drv 注册到核心。

返回

成功时返回 0,否则返回负错误代码。

void i3c_driver_unregister(struct i3c_driver *drv)

注销 I3C 设备驱动程序

参数

struct i3c_driver *drv

要注销的驱动程序

描述

注销 drv