2.22. V4L2 异步 kAPI

enum v4l2_async_match_type

用于标识匹配的异步子设备逻辑的类型

常量

V4L2_ASYNC_MATCH_TYPE_I2C

匹配将检查 I2C 适配器 ID 和地址

V4L2_ASYNC_MATCH_TYPE_FWNODE

匹配将使用固件节点

描述

此枚举由异步连接逻辑使用,以定义将用于匹配异步设备的算法。

struct v4l2_async_match_desc

异步连接匹配信息

定义:

struct v4l2_async_match_desc {
    enum v4l2_async_match_type type;
    union {
        struct fwnode_handle *fwnode;
        struct {
            int adapter_id;
            unsigned short address;
        } i2c;
    };
};

成员

type

将要使用的匹配类型

{unnamed_union}

匿名

fwnode

指向要匹配的 struct fwnode_handle 的指针。如果 match_typeV4L2_ASYNC_MATCH_TYPE_FWNODE,则使用。

i2c

带有要匹配的 I2C 参数的嵌入结构。match.i2c.adapter_idmatch.i2c.address 都应匹配。如果 match_typeV4L2_ASYNC_MATCH_TYPE_I2C,则使用。

i2c.adapter_id

要匹配的 I2C 适配器 ID。如果 match_typeV4L2_ASYNC_MATCH_TYPE_I2C,则使用。

i2c.address

要匹配的 I2C 地址。如果 match_typeV4L2_ASYNC_MATCH_TYPE_I2C,则使用。

struct v4l2_async_connection

子设备连接描述符,桥接器已知

定义:

struct v4l2_async_connection {
    struct v4l2_async_match_desc match;
    struct v4l2_async_notifier *notifier;
    struct list_head asc_entry;
    struct list_head asc_subdev_entry;
    struct v4l2_subdev *sd;
};

成员

match

匹配类型和每个总线类型的匹配数据集合的结构

notifier

连接相关的异步通知器

asc_entry

用于将 struct v4l2_async_connection 对象添加到通知器的 waiting_listdone_list

asc_subdev_entry

在 struct v4l2_async_subdev.asc_list 列表中的条目

sd

相关的子设备

描述

当此结构用作驱动程序特定结构中的成员时,驱动程序特定结构应将 struct v4l2_async_connection 作为其第一个成员。

struct v4l2_async_notifier_operations

异步 V4L2 通知器操作

定义:

struct v4l2_async_notifier_operations {
    int (*bound)(struct v4l2_async_notifier *notifier,struct v4l2_subdev *subdev, struct v4l2_async_connection *asc);
    int (*complete)(struct v4l2_async_notifier *notifier);
    void (*unbind)(struct v4l2_async_notifier *notifier,struct v4l2_subdev *subdev, struct v4l2_async_connection *asc);
    void (*destroy)(struct v4l2_async_connection *asc);
};

成员

bound

子设备已由给定的连接绑定

complete

所有连接已成功绑定。complete 回调仅针对根通知器执行。

unbind

子设备正在离开

destroy

asc 即将被释放

struct v4l2_async_notifier

v4l2_device 通知器数据

定义:

struct v4l2_async_notifier {
    const struct v4l2_async_notifier_operations *ops;
    struct v4l2_device *v4l2_dev;
    struct v4l2_subdev *sd;
    struct v4l2_async_notifier *parent;
    struct list_head waiting_list;
    struct list_head done_list;
    struct list_head notifier_entry;
};

成员

ops

通知器操作

v4l2_dev

根通知器的 v4l2_device,否则为 NULL

sd

注册通知器的子设备,否则为 NULL

parent

父通知器

waiting_list

等待其驱动程序的 struct v4l2_async_connection 的列表

done_list

已探测的 struct v4l2_subdev 的列表

notifier_entry

全局通知器列表中的成员

struct v4l2_async_subdev_endpoint

子设备的 fwnode 列表中的条目

定义:

struct v4l2_async_subdev_endpoint {
    struct list_head async_subdev_endpoint_entry;
    struct fwnode_handle *endpoint;
};

成员

async_subdev_endpoint_entry

struct v4l2_subdev 的 async_subdev_endpoint_list 中的条目

endpoint

要匹配子设备的端点 fwnode

void v4l2_async_debug_init(struct dentry *debugfs_dir)

初始化调试工具。

参数

struct dentry *debugfs_dir

指向父 debugfs struct dentry 的指针

void v4l2_async_nf_init(struct v4l2_async_notifier *notifier, struct v4l2_device *v4l2_dev)

初始化通知器。

参数

struct v4l2_async_notifier *notifier

指向 struct v4l2_async_notifier 的指针

struct v4l2_device *v4l2_dev

指向 struct v4l2_device 的指针

描述

此函数初始化通知器 asc_entry。必须先调用此函数,然后才能使用以下函数之一向通知器添加子设备:v4l2_async_nf_add_fwnode_remote()v4l2_async_nf_add_fwnode()v4l2_async_nf_add_i2c()

void v4l2_async_subdev_nf_init(struct v4l2_async_notifier *notifier, struct v4l2_subdev *sd)

初始化一个子设备通知器。

参数

struct v4l2_async_notifier *notifier

指向 struct v4l2_async_notifier 的指针

struct v4l2_subdev *sd

指向 struct v4l2_subdev 的指针

描述

此函数初始化通知器 asc_list。必须先调用此函数,然后才能使用以下函数之一向通知器添加子设备:v4l2_async_nf_add_fwnode_remote()v4l2_async_nf_add_fwnode()v4l2_async_nf_add_i2c()

v4l2_async_nf_add_fwnode

v4l2_async_nf_add_fwnode (notifier, fwnode, type)

分配一个 fwnode 异步子设备并将其添加到通知器的主 asc_list 中。

参数

notifier

指向 struct v4l2_async_notifier 的指针

fwnode

要匹配的子设备的 fwnode 句柄,指向 struct fwnode_handle 的指针

type

驱动程序的异步子设备或连接结构的类型。struct v4l2_async_connection 应为驱动程序的异步结构的第一个成员,即两者都从相同的内存地址开始。

描述

分配一个大小为 asc_struct_size 的 fwnode 匹配的 asc,并将其添加到通知器的 asc_list 中。该函数还会获取对 fwnode 的引用,该引用将在通知器清理时释放。

v4l2_async_nf_add_fwnode_remote

v4l2_async_nf_add_fwnode_remote (notifier, ep, type)

分配一个 fwnode 远程异步子设备并将其添加到通知器的主 asc_list 中。

参数

notifier

指向 struct v4l2_async_notifier 的指针

ep

指向要匹配的远程连接的本地端点,指向 struct fwnode_handle 的指针

type

驱动程序的异步连接结构的类型。struct v4l2_async_connection 应为驱动程序的异步连接结构的第一个成员,即两者都从相同的内存地址开始。

描述

获取给定本地端点的远程端点,将其设置为 fwnode 匹配,并将异步连接添加到通知器的 asc_list 中。该函数还会获取对 fwnode 的引用,该引用将在通知器清理时释放。

这与 v4l2_async_nf_add_fwnode() 类似,但唯一的区别是 fwnode 指的是本地端点,而不是远程端点。

v4l2_async_nf_add_i2c

v4l2_async_nf_add_i2c (notifier, adapter, address, type)

分配一个 i2c 异步子设备并将其添加到通知器的主 asc_list 中。

参数

notifier

指向 struct v4l2_async_notifier 的指针

adapter

要匹配的 I2C 适配器 ID

address

要匹配的连接的 I2C 地址

type

驱动程序的异步连接结构的类型。struct v4l2_async_connection 应为驱动程序的异步连接结构的第一个成员,即两者都从相同的内存地址开始。

描述

v4l2_async_nf_add_fwnode() 相同,但用于 I2C 匹配的连接。

int v4l2_async_subdev_endpoint_add(struct v4l2_subdev *sd, struct fwnode_handle *fwnode)

将端点 fwnode 添加到异步子设备匹配列表

参数

struct v4l2_subdev *sd

子设备

struct fwnode_handle *fwnode

要匹配的端点 fwnode

描述

将 fwnode 添加到异步子设备的匹配列表。这允许从单个设备注册多个异步子设备。

请注意,如果端点已添加到子设备的 fwnode 匹配列表中,则作为子设备清理的一部分调用 v4l2_subdev_cleanup()

失败时返回错误,成功时返回 0。

struct v4l2_async_connection *v4l2_async_connection_unique(struct v4l2_subdev *sd)

为子设备返回唯一的 struct v4l2_async_connection

参数

struct v4l2_subdev *sd

子设备

描述

当只有一个子设备时,返回该子设备的异步连接。

int v4l2_async_nf_register(struct v4l2_async_notifier *notifier)

注册一个子设备异步通知器

参数

struct v4l2_async_notifier *notifier

指向 struct v4l2_async_notifier 的指针

void v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)

注销一个子设备异步通知器

参数

struct v4l2_async_notifier *notifier

指向 struct v4l2_async_notifier 的指针

void v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)

清理通知器资源

参数

struct v4l2_async_notifier *notifier

要清理其资源的通知器

描述

释放与通知器相关的内存资源,包括为通知器的目的而分配的异步连接,但不包括通知器本身。用户负责在调用 v4l2_async_nf_add_fwnode_remote()v4l2_async_nf_add_fwnode()v4l2_async_nf_add_i2c() 之后调用此函数来清理通知器。

在其他情况下调用 v4l2_async_nf_cleanup() 是没有害处的,只要它的内存在分配后已被清零。

v4l2_async_register_subdev

v4l2_async_register_subdev (sd)

将子设备注册到异步子设备框架

参数

sd

指向 struct v4l2_subdev 的指针

int v4l2_async_register_subdev_sensor(struct v4l2_subdev *sd)

将传感器子设备注册到异步子设备框架并解析设置与传感器相关的常用设备

参数

struct v4l2_subdev *sd

指向结构体 v4l2_subdev 的指针

描述

此函数与 v4l2_async_register_subdev() 类似,区别在于调用此函数还会使用 v4l2_async_nf_parse_fwnode_sensor() 解析固件接口以查找远程引用,并注册异步子设备。同样,可以通过调用 v4l2_async_unregister_subdev() 来注销子设备。

在注册期间,子设备模块会被标记为正在使用。

如果尝试注册模块时该模块不再加载,则会返回错误。

void v4l2_async_unregister_subdev(struct v4l2_subdev *sd)

从异步子设备框架注销一个子设备

参数

struct v4l2_subdev *sd

指向 struct v4l2_subdev 的指针