v4l2数据结构分析

news2024/11/29 2:42:25

v4l2数据结构分析


文章目录

  • v4l2数据结构分析
  • Video4Linux2设备v4l2_device
  • 媒体设备media_device
  • Video4Linux2子设备v4l2_subdev
  • Video4Linux2子设备的操作集v4l2_subdev_ops
  • Video4Linux2子设备的内部操作集v4l2_subdev_internal_ops
  • Video4Linux2控制处理器v4l2_ctrl_handler
  • Video4Linux2的视频设备video_device
  • Video4Linux2 (V4L2) 异步子设备v4l2_async_subdev


在这里插入图片描述

在 v4l2(Video4Linux2)驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下:
struct v4l2_device:表示一个 v4l2 设备的结构体,用于管理和描述 v4l2 设备的信息。它包含了设备的名称、子设备列表、控制处理器等信息,并提供了与设备注册、初始化和资源管理等功能。
struct media_device:表示一个媒体设备的结构体,在 v4l2 中用于媒体控制器的管理。它包含了媒体实体和连接图的信息,并提供了与媒体设备注册、初始化和资源管理等功能。
struct v4l2_subdev:表示一个 v4l2 子设备的结构体,用于描述子设备的信息和操作。它包含了子设备的名称、控制处理器、格式和操作函数等信息,并提供了与子设备的注册、初始化和数据传输等功能。
struct v4l2_subdev_ops:表示一个 v4l2 子设备操作的结构体,定义了与子设备相关的操作函数,如初始化、控制和数据传输等。
struct v4l2_subdev_internal_ops:表示一个 v4l2 子设备内部操作的结构体,定义了与子设备内部操作相关的函数,如注册、注销、打开和关闭等。
struct v4l2_ctrl_handler:表示一个 v4l2 控制处理器的结构体,用于管理和处理控制相关的操作。它包含了控制列表、控制引用、回调函数等信息,并提供了与控制的注册、访问和事件处理等功能。
struct video_device:表示一个视频设备的结构体,在 v4l2 中用于描述视频设备的信息和操作。它包含了设备的名称、类型、方向、文件操作、控制处理器等信息,并提供了与设备的注册、初始化和数据传输等功能。
struct v4l2_async_subdev:表示一个异步 v4l2 子设备的结构体,在 v4l2 中用于描述异步子设备的信息和操作。它包含了子设备的名称、控制处理器、格式和操作函数等信息,并提供了与子设备的注册、初始化和数据传输等功能。
这些结构体在 v4l2 驱动中协同工作,通过它们之间的联系,实现了对视频设备、子设备、控制和数据传输等的管理、配置和操作。它们在内核中承担着注册、初始化、资源管理、控制处理、数据传输和事件处理等功能,以支持视频设备的正常运行和应用的开发。

Video4Linux2设备v4l2_device

struct v4l2_device {
    /* dev->driver_data points to this struct.
       Note: dev might be NULL if there is no parent device
       as is the case with e.g. ISA devices. */
    struct device *dev; // 指向该结构体的设备指针
#if defined(CONFIG_MEDIA_CONTROLLER)
    struct media_device *mdev; // 媒体设备
#endif
    /* used to keep track of the registered subdevs */
    struct list_head subdevs; // 已注册的子设备链表
    /* lock this struct; can be used by the driver as well if this
       struct is embedded into a larger struct. */
    spinlock_t lock; // 自旋锁
    /* unique device name, by default the driver name + bus ID */
    char name[V4L2_DEVICE_NAME_SIZE]; // 设备名称
    /* notify callback called by some sub-devices. */
    void (*notify)(struct v4l2_subdev *sd,
            unsigned int notification, void *arg); // 由某些子设备调用的通知回调函数
    /* The control handler. May be NULL. */
    struct v4l2_ctrl_handler *ctrl_handler; // 控制处理器
    /* Device's priority state */
    struct v4l2_prio_state prio; // 设备的优先级状态
    /* BKL replacement mutex. Temporary solution only. */
    struct mutex ioctl_lock; // BKL替代互斥锁,仅为临时解决方案
    /* Keep track of the references to this struct. */
    struct kref ref; // 跟踪对该结构体的引用
    /* Release function that is called when the ref count goes to 0. */
    void (*release)(struct v4l2_device *v4l2_dev); // 引用计数为0时调用的释放函数
};

这段代码定义了一个名为"v4l2_device"的结构体,表示Video4Linux2设备。下面是对结构体成员的分析:
dev:指向一个struct device结构体的指针,表示该结构体所属的设备。
mdev:如果定义了宏CONFIG_MEDIA_CONTROLLER,则指向一个struct media_device结构体的指针,表示媒体设备。
subdevs:一个链表头,用于存储已注册的子设备。
lock:一个自旋锁,用于锁定该结构体。在需要时,驱动程序也可以使用该锁,特别是当该结构体被嵌入到较大的结构体中时。
name:一个字符数组,用于存储设备的唯一名称,默认情况下是驱动程序名称加上总线ID。
notify:一个函数指针,当一些子设备发生通知时调用该回调函数。
ctrl_handler:指向struct v4l2_ctrl_handler的指针,表示控制处理器。
prio:表示设备的优先级状态。
ioctl_lock:一个互斥锁,用于替代旧的内核大内核锁(BKL),仅作为临时解决方案。
ref:一个kref结构体,用于跟踪对该结构体的引用计数。
release:一个函数指针,当引用计数达到0时调用该释放函数。
这个结构体定义了Video4Linux2设备的基本属性和功能。它提供了与设备相关的信息,包括设备的名称、子设备的注册和管理、控制处理器等。此外,还包括一些用于同步和引用计数管理的成员。

struct video_device
{
#if defined(CONFIG_MEDIA_CONTROLLER)
    struct media_entity entity; // 媒体实体
#endif
    /* device ops */
    const struct v4l2_file_operations *fops; // 文件操作

    /* sysfs */
    struct device dev;        /* v4l device */ // 设备
    struct cdev *cdev;        /* character device */ // 字符设备

    struct v4l2_device *v4l2_dev;    /* v4l2_device parent */ // 父v4l2设备
    /* Only set parent if that can't be deduced from v4l2_dev */
    struct device *dev_parent;    /* device parent */ // 设备父节点

    /* Control handler associated with this device node. May be NULL. */
    struct v4l2_ctrl_handler *ctrl_handler; // 控制句柄

    /* vb2_queue associated with this device node. May be NULL. */
    struct vb2_queue *queue; // vb2队列

    /* Priority state. If NULL, then v4l2_dev->prio will be used. */
    struct v4l2_prio_state *prio; // 优先级状态


    /* 设备信息 */
    char name[32]; // 设备名称
    int vfl_type;    /* 设备类型 */
    int vfl_dir;    /* 接收器、发射器或mem-to-mem */
    /* 如果注册失败,则'minor'设置为-1 */
    int minor; // 次设备号
    u16 num; // 设备编号
    /* 使用位操作设置/清除/测试标志 */
    unsigned long flags; // 标志位
    /* 用于区分一个物理设备上的多个索引的属性 */
    int index; // 索引

    /* V4L2文件句柄 */
    spinlock_t        fh_lock; /* 所有v4l2_fhs的锁 */
    struct list_head    fh_list; /* struct v4l2_fh列表 */

    /* 内部设备调试标志,驱动程序不使用 */
    int dev_debug; // 设备调试标志

    /* 视频标准变量 */
    v4l2_std_id tvnorms;        /* 支持的电视制式 */

    /* 回调函数 */
    void (*release)(struct video_device *vdev); /* 释放函数指针 */

    /* ioctl回调函数 */
    const struct v4l2_ioctl_ops *ioctl_ops; /* ioctl函数指针 */
    DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE); /* 有效的ioctl */

    /* 序列化锁 */
    DECLARE_BITMAP(disable_locking, BASE_VIDIOC_PRIVATE); /* 禁用锁 */
    struct mutex *lock; /* 互斥锁 */



};

结构体 video_device 用于表示 Video4Linux2 (V4L2) 设备。以下是对其成员的解析:
对成员的解释如下:
entity:媒体实体结构体,用于与媒体控制器相关联。
fops:指向 V4L2 文件操作结构体的指针,用于处理设备的文件操作。
dev:V4L2 设备的底层设备结构体。
cdev:字符设备结构体。
v4l2_dev:父 V4L2 设备的指针。
dev_parent:设备的父节点。
ctrl_handler:与该设备节点关联的控制句柄。可以是空指针。
queue:与该设备节点关联的 vb2_queue 队列。可以是空指针。
prio:优先级状态。如果为空指针,则使用 v4l2_dev->prio。
name:设备名称。
vfl_type:设备类型。
vfl_dir:接收器、发射器或 mem-to-mem。
minor:次设备号。如果注册失败,则设置为 -1。
num:设备编号。
flags:用于设置/清除/测试标志的位操作。
index:用于区分一个物理设备上的多个索引的属性。
fh_lock:所有 v4l2_fh 的锁。
fh_list:struct v4l2_fh 结构体的列表。
dev_debug:内部设备调试标志,驱动程序不使用。
tvnorms:支持的电视制式。
release:释放函数指针,用于释放设备资源。
ioctl_ops:ioctl 回调函数指针,用于处理 ioctl 请求。
valid_ioctls:有效的 ioctl。
disable_locking:禁用锁。
lock:互斥锁,用于对设备进行加锁操作。
video_device 结构体用于表示 V4L2 设备,并包含了与设备相关的信息、回调函数和操作句柄。它还包含了设备的锁和序列化锁,以及与字符设备和媒体实体的关联信息。

struct v4l2_device 和 struct video_device 是 Video4Linux2 (V4L2) 中两个不同的结构体,分别表示不同的实体。
struct v4l2_device 用于表示 V4L2 设备,包含了与设备相关的信息和操作。
struct video_device 用于表示 V4L2 设备节点,包含了设备的文件操作、设备节点信息以及与字符设备和媒体实体的关联等。
这两个结构体的作用和用途略有不同,但都与 V4L2 设备相关。struct v4l2_device 主要用于管理设备和子设备的注册和释放,以及提供控制处理器和通知回调函数等功能。而 struct video_device 则用于表示设备节点,并包含了与设备文件操作、控制和锁相关的信息。

媒体设备media_device

struct media_device {
    /* dev->driver_data 指向这个结构体 */
    struct device *dev; // 父设备
    struct media_devnode devnode; // 媒体设备节点

    char model[32]; // 设备型号
    char serial[40]; // 设备序列号(可选)
    char bus_info[32]; // 设备位置标识符
    u32 hw_revision; // 硬件设备版本
    u32 driver_version; // 设备驱动程序版本

    u32 entity_id; // 下一个要注册的实体的ID
    struct list_head entities; // 已注册实体的列表

    /* 保护实体列表 */
    spinlock_t lock;
    /* 序列化图形操作 */
    struct mutex graph_mutex;

    /* 链接状态更改通知回调函数 */
    int (*link_notify)(struct media_link *link, u32 flags,
               unsigned int notification);
};

这段代码定义了一个名为"media_device"的结构体,表示媒体设备。以下是对结构体成员的分析:
dev:指向一个struct device结构体的指针,表示该结构体所属的父设备。
devnode:媒体设备节点的信息。
model:一个长度为32的字符数组,表示设备的型号。
serial:一个长度为40的字符数组,表示设备的序列号(可选)。
bus_info:一个长度为32的字符数组,表示设备的位置标识符。
hw_revision:一个32位的整数,表示硬件设备的版本。
driver_version:一个32位的整数,表示设备驱动程序的版本。
entity_id:下一个要注册的实体的ID。
entities:已注册实体的链表。
lock:一个自旋锁,用于保护实体列表的访问。
graph_mutex:一个互斥锁,用于序列化图形操作。
link_notify:一个函数指针,用于链接状态更改的通知回调函数。
该结构体用于描述媒体设备的基本属性和功能。它包含了与设备相关的信息,如设备型号、序列号、位置标识符、硬件版本、驱动程序版本等。此外,还包括了用于管理已注册实体的列表、保护实体列表访问的锁以及用于序列化图形操作的互斥锁。链接状态更改的通知回调函数可以在链接状态发生变化时进行通知。

Video4Linux2子设备v4l2_subdev

struct v4l2_subdev {
#if defined(CONFIG_MEDIA_CONTROLLER)
    /* 媒体实体 */
    struct media_entity entity;
#endif
    /* 链表 */
    struct list_head list;
    /* 模块拥有者 */
    struct module *owner;
    /* 是否拥有v4l2设备 */
    bool owner_v4l2_dev;
    /* 标志位 */
    u32 flags;
    /* v4l2设备 */
    struct v4l2_device *v4l2_dev;
    /* 操作集 */
    const struct v4l2_subdev_ops *ops;
    /* 内部操作集 */
    const struct v4l2_subdev_internal_ops *internal_ops;
    /* 控制处理器 */
    struct v4l2_ctrl_handler *ctrl_handler;
    /* 名称,必须唯一 */
    char name[V4L2_SUBDEV_NAME_SIZE];
    /* 可用于分组相似的子设备,值是特定于驱动程序的 */
    u32 grp_id;
    /* 指向私有数据的指针 */
    void *dev_priv;
    /* 指向特定于某个视频主机设备的每个子设备数据的指针 */
    void *host_priv;
    /* 子设备设备节点 */
    struct video_device *devnode;
    /* 指向物理设备的指针,如果有的话 */
    struct device *dev;
    /* 将此子设备链接到全局subdev_list或@notifier->done列表 */
    struct list_head async_list;
    /* 指向相应的struct v4l2_async_subdev */
    struct v4l2_async_subdev *asd;
    /* 指向管理notifier的指针 */
    struct v4l2_async_notifier *notifier;
    /* 子设备平台数据的公共部分 */
    struct v4l2_subdev_platform_data *pdata;

};

这段代码定义了一个名为"v4l2_subdev"的结构体,表示Video4Linux2子设备。以下是对结构体成员的分析:
entity:如果定义了宏CONFIG_MEDIA_CONTROLLER,则表示媒体实体的信息。
list:一个链表头,用于将子设备连接到全局的subdev_list或notifier->done列表中。
owner:指向拥有该子设备的模块的指针。
owner_v4l2_dev:一个布尔值,表示该子设备是否拥有V4L2设备。
flags:一个32位的标志位,用于表示子设备的特定标志。
v4l2_dev:指向struct v4l2_device的指针,表示该子设备所属的V4L2设备。
ops:指向struct v4l2_subdev_ops的指针,表示子设备的操作集。
internal_ops:指向struct v4l2_subdev_internal_ops的指针,表示子设备的内部操作集。
ctrl_handler:指向struct v4l2_ctrl_handler的指针,表示控制处理器。
name:一个长度为V4L2_SUBDEV_NAME_SIZE的字符数组,表示子设备的名称,必须是唯一的。
grp_id:一个32位的整数,可用于将相似的子设备分组,其值是特定于驱动程序的。
dev_priv:一个指针,指向子设备的私有数据。
host_priv:一个指针,指向特定于某个视频主机设备的每个子设备的数据。
devnode:指向struct video_device的指针,表示子设备的设备节点。
dev:指向物理设备的指针,如果有的话。
async_list:用于将该子设备连接到全局的subdev_list或notifier->done列表的链表头。
asd:指向相应的struct v4l2_async_subdev的指针。
notifier:指向管理notifier的指针。
pdata:指向struct v4l2_subdev_platform_data的指针,表示子设备平台数据的公共部分。
该结构体描述了Video4Linux2子设备的基本属性和功能。它包含了与子设备相关的信息,如拥有者、名称、操作集、控制处理器等。此外,还包括了一些用于管理子设备链接和异步通知的成员。

Video4Linux2子设备的操作集v4l2_subdev_ops

struct v4l2_subdev_ops {
    const struct v4l2_subdev_core_ops    *core; // 核心操作
    const struct v4l2_subdev_tuner_ops    *tuner; // 调谐器操作
    const struct v4l2_subdev_audio_ops    *audio; // 音频操作
    const struct v4l2_subdev_video_ops    *video; // 视频操作
    const struct v4l2_subdev_vbi_ops    *vbi; // VBI操作
    const struct v4l2_subdev_ir_ops        *ir; // 红外操作
    const struct v4l2_subdev_sensor_ops    *sensor; // 传感器操作
    const struct v4l2_subdev_pad_ops    *pad; // pad操作
};

这段代码定义了一个名为"v4l2_subdev_ops"的结构体,表示Video4Linux2子设备的操作集。以下是对结构体成员的分析:
core:指向struct v4l2_subdev_core_ops的指针,表示子设备的核心操作。
tuner:指向struct v4l2_subdev_tuner_ops的指针,表示子设备的调谐器操作。
audio:指向struct v4l2_subdev_audio_ops的指针,表示子设备的音频操作。
video:指向struct v4l2_subdev_video_ops的指针,表示子设备的视频操作。
vbi:指向struct v4l2_subdev_vbi_ops的指针,表示子设备的VBI(垂直消隐线)操作。
ir:指向struct v4l2_subdev_ir_ops的指针,表示子设备的红外操作。
sensor:指向struct v4l2_subdev_sensor_ops的指针,表示子设备的传感器操作。
pad:指向struct v4l2_subdev_pad_ops的指针,表示子设备的pad操作。
该结构体定义了Video4Linux2子设备的不同操作集。每个操作集都包含了一组特定功能的函数指针,用于实现子设备的核心功能,如控制、调谐、音频、视频等。通过使用这些操作集,驱动程序可以实现子设备所需的各种功能和操作。

Video4Linux2子设备的内部操作集v4l2_subdev_internal_ops

struct v4l2_subdev_internal_ops {
    int (*registered)(struct v4l2_subdev *sd); // 注册
    void (*unregistered)(struct v4l2_subdev *sd); // 注销
    int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); // 打开
    int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); // 关闭
};

这段代码定义了一个名为"v4l2_subdev_internal_ops"的结构体,表示Video4Linux2子设备的内部操作集。以下是对结构体成员的分析:
registered:一个函数指针,用于处理子设备的注册事件。
unregistered:一个函数指针,用于处理子设备的注销事件。
open:一个函数指针,用于处理子设备的打开事件。
close:一个函数指针,用于处理子设备的关闭事件。
这些函数指针定义了子设备在内部操作方面的行为。当子设备被注册、注销、打开或关闭时,相应的函数将被调用。驱动程序可以根据需要实现这些函数,以提供特定于子设备的行为。这些函数允许驱动程序在子设备的生命周期中执行必要的操作,例如资源分配和释放、状态更新等。

Video4Linux2控制处理器v4l2_ctrl_handler

struct v4l2_ctrl_handler {
    // 互斥锁,用于控制对该处理程序及其控件的访问
    struct mutex _lock;
    // 指向互斥锁的指针
    struct mutex *lock;
    // 控件列表
    struct list_head ctrls;
    // 控件引用列表
    struct list_head ctrl_refs;
    // 上次找到的控件引用,因为同一个控件可能需要多次使用,所以这是一个简单的优化
    struct v4l2_ctrl_ref *cached;
    // 控件哈希表,用于快速查找控件
    struct v4l2_ctrl_ref **buckets;
    // 控件值更改时调用的回调函数
    v4l2_ctrl_notify_fnc notify;
    // 传递给v4l2_ctrl notify回调函数的参数
    void *notify_priv;
    // 哈希表中的桶数
    u16 nr_of_buckets;
    // 第一个失败的控件添加的错误代码
    int error;

};
这段代码定义了一个名为"v4l2_ctrl_handler"的结构体,表示Video4Linux2控制处理器。以下是对结构体成员的分析:
_lock:一个互斥锁,用于控制对该处理程序及其控件的访问。
lock:指向互斥锁的指针。
ctrls:一个链表头,用于存储控件列表。
ctrl_refs:一个链表头,用于存储控件引用列表。
cached:指向上次找到的控件引用的指针。这是一个简单的优化,以便在多次使用同一控件时进行快速访问。
buckets:控件哈希表,用于快速查找控件。
notify:控件值更改时调用的回调函数。
notify_priv:传递给v4l2_ctrl_notify回调函数的参数。
nr_of_buckets:哈希表中的桶数。
error:第一个失败的控件添加的错误代码。
该结构体用于管理Video4Linux2的控制处理器,包含了用于控制和管理控件的各种成员。它提供了对控件的添加、删除、查找等功能,并通过回调函数通知控件值的更改。同时,通过哈希表和缓存机制提供了快速访问控件的能力。

Video4Linux2的视频设备video_device

struct video_device
{
#if defined(CONFIG_MEDIA_CONTROLLER)
    struct media_entity entity; // 媒体实体
#endif
    /* device ops */
    const struct v4l2_file_operations *fops; // 文件操作

    /* sysfs */
    struct device dev;        /* v4l device */ // 设备
    struct cdev *cdev;        /* character device */ // 字符设备

    struct v4l2_device *v4l2_dev;    /* v4l2_device parent */ // 父v4l2设备
    /* Only set parent if that can't be deduced from v4l2_dev */
    struct device *dev_parent;    /* device parent */ // 设备父节点

    /* Control handler associated with this device node. May be NULL. */
    struct v4l2_ctrl_handler *ctrl_handler; // 控制句柄

    /* vb2_queue associated with this device node. May be NULL. */
    struct vb2_queue *queue; // vb2队列

    /* Priority state. If NULL, then v4l2_dev->prio will be used. */
    struct v4l2_prio_state *prio; // 优先级状态


    /* 设备信息 */
    char name[32]; // 设备名称
    int vfl_type;    /* 设备类型 */
    int vfl_dir;    /* 接收器、发射器或mem-to-mem */
    /* 如果注册失败,则'minor'设置为-1 */
    int minor; // 次设备号
    u16 num; // 设备编号
    /* 使用位操作设置/清除/测试标志 */
    unsigned long flags; // 标志位
    /* 用于区分一个物理设备上的多个索引的属性 */
    int index; // 索引

    /* V4L2文件句柄 */
    spinlock_t        fh_lock; /* 所有v4l2_fhs的锁 */
    struct list_head    fh_list; /* struct v4l2_fh列表 */

    /* 内部设备调试标志,驱动程序不使用 */
    int dev_debug; // 设备调试标志

    /* 视频标准变量 */
    v4l2_std_id tvnorms;        /* 支持的电视制式 */

    /* 回调函数 */
    void (*release)(struct video_device *vdev); /* 释放函数指针 */

    /* ioctl回调函数 */
    const struct v4l2_ioctl_ops *ioctl_ops; /* ioctl函数指针 */
    DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE); /* 有效的ioctl */

    /* 序列化锁 */
    DECLARE_BITMAP(disable_locking, BASE_VIDIOC_PRIVATE); /* 禁用锁 */
    struct mutex *lock; /* 互斥锁 */



};

这段代码定义了一个名为"video_device"的结构体,表示Video4Linux2的视频设备。以下是对结构体成员的分析:
entity:一个媒体实体结构体,用于与媒体控制器相关联。
fops:指向V4L2文件操作函数集的指针。
dev:一个设备结构体,表示V4L2设备。
cdev:字符设备结构体指针,用于注册字符设备。
v4l2_dev:指向父V4L2设备的指针。
dev_parent:设备父节点的指针。
ctrl_handler:与该设备节点关联的控制处理器。
queue:与该设备节点关联的vb2队列。
prio:优先级状态。如果为NULL,则使用v4l2_dev->prio。
name:设备名称。
vfl_type:设备类型。
vfl_dir:接收器、发射器或mem-to-mem。
minor:次设备号。
num:设备编号。
flags:标志位,使用位操作进行设置/清除/测试。
index:用于区分同一物理设备上的多个索引的属性。
fh_lock:所有v4l2_fh结构体的锁。
fh_list:存储v4l2_fh结构体的链表。
dev_debug:内部设备调试标志,驱动程序不使用。
tvnorms:支持的电视制式。
release:释放函数指针,用于在设备释放时调用。
ioctl_ops:指向V4L2 ioctl操作函数集的指针。
valid_ioctls:有效的ioctl集合。
disable_locking:禁用锁的位图。
lock:互斥锁指针,用于序列化访问设备。
该结构体用于描述Video4Linux2的视频设备,并包含了与设备操作、设备属性和设备状态相关的成员。它还提供了与设备节点关联的控制处理器、vb2队列以及与设备操作相关的回调函数和锁机制。

Video4Linux2 (V4L2) 异步子设备v4l2_async_subdev

struct v4l2_async_subdev {
    enum v4l2_async_match_type match_type; // 匹配类型
    union {
        struct {
            const struct device_node *node; // 设备节点
        } of;
        struct {
            const char *name; // 设备名称
        } device_name;
        struct {
            int adapter_id; // 适配器ID
            unsigned short address; // 地址
        } i2c;
        struct {
            bool (*match)(struct device *, struct v4l2_async_subdev *); // 自定义匹配函数
            void *priv; // 私有数据
        } custom;
    } match;

    /* v4l2-async 核心私有:不应该被驱动程序使用 */
    struct list_head list; // 链表

};

结构体 v4l2_async_subdev 用于表示 Video4Linux2 (V4L2) 异步子设备。以下是对其成员的分析:
对成员的解释如下:
entity:媒体实体结构体,用于与媒体控制器相关联。
notifier:异步通知对象,用于通知异步子设备的状态更改。
ops:子设备控制器操作集,包含了子设备的注册、注销、连接等操作。
links:链表,用于存储子设备与其他媒体实体之间的链接关系。
v4l2_dev:所属的 V4L2 设备。
vdev:设备节点,表示异步子设备的视频设备节点。
ctrl_handler:控制句柄,用于管理子设备的控制。
dev_debug:内部设备调试标志,用于调试目的,驱动程序不使用。
v4l2_async_subdev 结构体用于描述异步子设备的属性和状态,并提供了与该子设备相关的操作和控制句柄。它还包含了媒体实体和设备节点等关联信息,以及异步通知对象用于通知子设备的状态更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信自动聊天机器狗,配置chatGPT,比Siri还智能!

大家好,我是TheWeiJun;最近看见微信里各个群聊都在聊chatGPT,甚至有的大佬们都把chatGPT接入了微信群聊,于是就有粉丝来找小编,希望能出一期chatGPT的文章;故今天这篇文章我将手把手教大家如何实现并自定义…

学习《信息系统项目管理师教程》第4版应关注的PMBOK的巨大变化

学习《信息系统项目管理师教程》第4版应关注的PMBOK的巨大变化 《信息系统项目管理师教程》的第4版比起第3版来有不少变化。但是,这种变化完全没有体现出PMBOK第7版带来的巨大变化。 因为,在从《信息系统项目管理师教程》第3版出版的2017年到现在&…

uvc驱动中的v4l2

uvc驱动中的v4l2 文章目录 uvc驱动中的v4l2v4l2_device_registervideo_register_devicev4l2_ioctlsvideo_usercopy v4l2_device_register /driver/media/v4l2-core/v4l2-device.c uvc_probe->v4l2_device_register v4l2_device_register 只是用于初始化一些东西&#xff0c…

【数项级数】无穷个数相加一定是个数吗?

数项级数 引入思考问题转化 定义总结重要的例子练习题 引入 思考 数项级数,其实就是要解决无穷个数相加的问题。 而对于无穷求和的问题,思考:无穷个数相加一定是个数吗? 下面,我们来举几个例子: 1 2 2 …

创世纪:比特币诞生记

比特币的诞生 1. 创始区块2. 第一个举手的人3. 比特币的疯狂 1. 创始区块 2008年10月31日纽约时间下午2点10分,自称中本聪的人向一个邮件列表,包括密码学专家和爱好者几百个成员,发送了一封电子邮件。“我一直在研究一个新的电子现金系统&am…

springboot旅游资源管理系统门票酒店预订系统_b0a6b

Spring Boot 是 Spring 家族中的一个全新的框架,它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM(Spring MVC Spring MyBatis )框架进行开发的过程。config:主要用来存储配置文件&#…

chatgpt赋能Python-pythoncontinue怎么用

Python continue语句:提高代码效率的绝佳工具 什么是Python continue语句? Python的continue语句可以使循环跳过当前的迭代。这意味着如果在循环内部存在满足某特定条件的语句,那么我们就可以使用continue语句跳过当前循环。Python中的cont…

【Nodejs】使用Nodejs搭建HTTP服务,并实现公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自内网穿透工具的文章:使用Nodejs搭建HTTP服务,并实现公网远程访问「内网穿透」 前言 Node.js…

Mybatis Plus实现乐观锁

文章目录 1 概念2 实现思路3 实现步骤步骤1:数据库表添加列步骤2:在模型类中添加对应的属性步骤3:添加乐观锁的拦截器步骤4:执行更新操作 1 概念 在讲解乐观锁之前,我们还是先来分析下问题: 业务并发现象带来的问题 : 秒杀 假如有100个商品或者票在出售&#xff…

【数据分享】我国各县1992—2019年社会经济指标(7个指标\无需转发)

社会经济指标常用于各项研究中,之前基于《中国城市统计年鉴》我们整理了1999-2020年地级市的地区生产总值及一二三产构成数据(可查看之前的文章获悉详情)! 我们发现在学者Chen Yahan在Figshare 数据库中提供了1992—2019年以县为…

动态规划-状态压缩DP

[SCOI2005] 互不侵犯 题目描述 https://www.luogu.com.cn/problem/P1896 在NN的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。 …

ADS-B接收机Radarcape

1.设备简介 Radarcape是一款便携、高性能、功能强大的ADS-B地面接收机。Radarcape的设备清单包含:ADS-B接收机主机,专业级ADS-B天线,GPS天线,电源线,网线。 2. 功能特点 Radarcape可以通过网口输出飞机的原始数据D…

开源字节 CRM 系统

开源字节CRM是一款SaaS模式的客户关系管理软件,基于钉钉平台进行研发,以客户管理为核心,包含客户管理、销售全流程管理,合同订单、工单管理、移动审批、数据分析六大模块。 旨在助力企业销售全流程精细化、数字化管理&#xff0c…

Godot引擎 4.0 文档 - 入门介绍 - Godot简介

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:Introduction to Godsot — Godot Engine (stable) documentation in English Godot简介 本文旨在帮助您确定 Godot 是否适合您。我们将介绍该引擎的一些广泛功能&#…

Linux中文件描述符fd和文件指针filp的理解

简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件…

Linux Audio (4) DAPM-1 Kcontrol

DAPM-1 Kcontrol 控制部件之kcontrolsnd_kcontrol_new 结构体如何定义snd_kcontrol_new?如何使用snd_kcontrol?添加kcontrol代码分析 课程:韦东山音频专题 内核:Kernel 3.5 但是我用的实例和课程不同,以防止编程记流水账 控制部件…

【周末闲谈】你知道物联网技术吗?

连接万物,创造未来。从智能家居到智慧医疗,从智能车联到智慧城市,物联网技术的影响已经悄然渗透到了我们的方方面面。欢迎大家积极讨论联网技术如何影响了我们的生活。 个人主页:【😊个人主页】 系列专栏:【…

微软和OpenAI联手推出了GitHub Copilot这一AI编程工具,可根据开发者的输入和上下文,生成高质量的代码片段和建议

只需要写写注释,就能生成能够运行的代码?对于程序员群体来说,这绝对是一个提高生产力的超级工具,令人难以置信。实际上,早在2021年6月,微软和OpenAI联手推出了GitHub Copilot这一AI编程工具。它能够根据开发…

【计算机网络复习】第四章 网络层 3

路由器的功能和层次 o 计算机网络的核心设备 o 具有多个输入接口和多个输出接口 o 任务是转发IP包:将从某个输入接口收到的I包,按照要去的目的地(即目的网络),从路由器的某个合适的输出接口转发给下一跳路由器 …

基于ssm+vue的驾校在线培训平台

基于ssmvue的驾校在线培训平台 系统功能 普通用户 新闻咨讯:可以查看系统新闻并进行评论、收藏和点赞 教资信息查看:普通用户登录系统可以查看驾校教资情况 系统通知信息:用户可以查看网站相关通知公告信息 在线报名:普通用户可…