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.err
或 struct 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 驱动程序
描述
此函数同时注册 i2cdev 和 i3cdev,如果其中一个注册失败,则也会失败。这对于同时支持 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 驱动程序
描述
此函数注销 i3cdrv 和 i2cdrv。请注意,当未启用 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。