2.2.5 V4L2 device instance

每个设备实例都由struct v4l2_device表示。非常简单的设备只需要分配此结构,但大多数情况下你会在更大的结构里嵌入这个结构体。必须通过调用v4l2_device_register (dev, v4l2_dev)来注册设备实例。
注册将初始化v4l2_device结构。如果dev->driver_data字段为NULL,则将链接到v4l2_dev参数。
希望与媒体设备框架集成的驱动程序需要手动将dev->driver_data设置为指向嵌入struct v4l2_device实例的特定驱动程序结构。在注册V4L2设备实例之前,可以通过dev_set_drvdata()调用来实现此目的。它们还必须将struct v4l2_device mdev字段设置为指向已正确初始化和注册的media_device实例。
如果v4l2_dev->name为空,则会设置为从dev中派生的值(确切地说是驱动程序名称后跟bus_id)。如果你在调用v4l2_device_register()之前设置它,则它将保持不变。如果dev为NULL,则必须在调用v4l2_device_register()之前设置v4l2_dev->name。
可以使用v4l2_device_set_name()基于驱动程序名称和驱动程序全局atomic_t实例来设置名称。这将生成类似于ivtv0、ivtv1等的名称。如果名称以数字结尾,则会插入破折号:cx18-0、cx18-1等。此函数返回实例编号。
第一个dev参数通常是pci_dev、usb_interface或platform_device的struct device指针。dev为NULL很少见,但在ISA设备或一个设备创建多个PCI设备时会出现这种情况,因此无法将v4l2_dev与特定父设备关联起来。
你还可以提供一个notify()回调,可由子设备调用以通知你事件。是否需要设置这个取决于子设备。任何子设备支持的通知都必须在include/media/subdevice.h头文件中定义。
调用v4l2_device_unregister()(v4l2_dev)即可注销V4L2设备。如果dev->driver_data字段指向v4l2_dev,则它将被重置为NULL。注销还将自动从设备注销所有子设备。
如果你有一个可热插拔的设备(例如USB设备),那么当断开连接时父设备将变为无效。由于v4l2_device有一个指向该父设备的指针,因此也必须清除它以标记父项已消失。要做到这一点,请调用v4l2_device_disconnect()(v4l2_dev)。
这不会注销子设备,因此你仍然需要为此调用v4l2_device_unregister()函数。如果你的驱动程序不支持热插拔,则无需调用v4l2_device_disconnect()。
有时你需要迭代特定驱动程序注册的所有设备。这通常是因为多个设备驱动程序使用相同的硬件而产生的。例如,ivtvfb驱动程序是使用ivtv硬件的帧缓冲驱动程序。对于alsa驱动程序也是如此。
你可以按以下方式迭代所有已注册的设备:

static int callback(struct device *dev, void *p)
{
struct v4l2_device *v4l2_dev = dev_get_drvdata(dev);
/* test if this device was inited */
if (v4l2_dev == NULL)
return 0;
...
return 0;
}
int iterate(void *p)
{
struct device_driver *drv;
int err;
/* Find driver 'ivtv' on the PCI bus.
pci_bus_type is a global. For USB buses use usb_bus_type. */
drv = driver_find("ivtv", &pci_bus_type);
/* iterate over all ivtv device instances */
err = driver_for_each_device(drv, NULL, p, callback);
put_driver(drv);
return err;
}

有时需要保持设备实例的运行计数器。这通常用于将设备实例映射到模块选项数组的索引。
推荐的方法如下:

static atomic_t drv_instance = ATOMIC_INIT(0);
static int drv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
{
...
state->instance = atomic_inc_return(&drv_instance) - 1;
}

如果你有多个设备节点,则很难知道何时可以安全地为可热插拔设备注销v4l2_device。为此,v4l2_device具有引用计数支持。每次调用video_register_device()时增加计数,释放该设备节点时减小计数。当引用计数达到零时,则会调用v4l2_device_release()回调。你可以在那里进行最终清理。
如果创建了其他设备节点(例如ALSA),则也可以通过调用以下方式手动增加和减少引用计数:
v4l2_device_get()(v4l2_dev)。
或:
v4l2_device_put()(v4l2_dev)。
由于初始引用计数为1,因此还需要在disconnect()回调(对于USB设备)或remove()回调(例如PCI设备)中调用v4l2_device_put(),否则引用计数永远不会达到0。
2.2.5.1 v4l2_device functions and data structures
struct v4l2_device

是V4L2设备驱动程序的主要结构体。
定义:

struct v4l2_device {
struct device *dev;
struct media_device *mdev;
struct list_head subdevs;
spinlock_t lock;
char name[V4L2_DEVICE_NAME_SIZE];
void (*notify)(struct v4l2_subdev *sd, unsigned int notification, void *arg);
struct v4l2_ctrl_handler *ctrl_handler;
struct v4l2_prio_state prio;
struct kref ref;
void (*release)(struct v4l2_device *v4l2_dev);
};

它包含以下成员变量:
dev:指向 struct device 的指针。
mdev:指向 struct media_device 的指针,可以为 NULL。
subdevs:用于跟踪已注册的子设备。
lock:锁定该结构体;如果该结构体嵌入到更大的结构体中,则驱动程序也可以使用它。
name:唯一设备名称,默认为驱动程序名称 + 总线 ID。
notify:由某些子设备调用的通知操作。
ctrl_handler:控制处理程序。可能为NULL。
prio:设备的优先级状态。
ref:跟踪对此结构体的引用。
release:当引用计数归零时调用的释放函数。
每个 V4L2 设备实例都应创建 v4l2_device 结构体,可以作为独立结构体或嵌入到更大的结构体中。它允许轻松访问子设备(请参见v4l2-subdev.h)并提供基本的V4L2设备级支持。
有两点需要注意:
1)dev->driver_data 指向此结构体。
2)如果没有父设备,则dev可能为空。
v4l2_device name举个例子:
v4l2_device的name成员变量是唯一设备名称,默认为驱动程序名称 + 总线 ID。举个例子,如果使用的是“my_usb_camera”驱动程序,总线ID为“1-1.2”,则该设备的名称将是“my_usb_camera 1-1.2”。
void v4l2_device_get(struct v4l2_device *v4l2_dev)
函数功能:获取V4L2设备的引用计数
参数:
* struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针
描述:这是一个辅助函数,旨在增加由v4l2_dev指向的struct v4l2_device的使用量。
int v4l2_device_put(struct v4l2_device *v4l2_dev)
函数功能:释放V4L2设备的引用计数。
参数:
* struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针
描述:这是一个辅助函数,旨在减少由v4l2_dev指向的struct v4l2_device的使用量。
int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
函数功能:初始化v4l2_dev并使dev->driver_data指向v4l2_dev。
参数:
- struct device *dev:指向struct device的指针。
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
描述:此函数用于初始化v4l2_dev,并将dev->driver_data指向v4l2_dev。v4l2_dev应该在使用之前已经被初始化,并且至少有一个字符名称作为其成员。dev可以为空,在一些罕见的情况下(ISA设备)会出现这种情况。在这种情况下,调用者必须在调用此函数之前填写v4l2_dev->name字段。该函数成功时返回0,失败时返回一个负错误代码。
int v4l2_device_set_name(struct v4l2_device *v4l2_dev, const char *basename, atomic_t *instance)
函数功能:初始化struct v4l2_device的名称字段。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
- const char *basename:设备名称的基本名称。
- atomic_t *instance:指向静态atomic_t变量的指针,该变量用于记录设备实例的使用情况。
描述:v4l2_device_set_name()函数使用驱动程序名称和驱动程序全局的atomic_t实例来初始化struct v4l2_device的名称字段。这个函数将增加实例计数器,并返回在名称中使用的实例值。第一次调用此函数时,名称字段将被设置为foo0,并返回0。如果名称以数字结尾(例如cx18),那么名称将被设置为cx18-0,因为cx180看起来真的很奇怪。该函数成功时返回使用的实例值,失败时返回一个负错误代码。
举例:

static atomic_t drv_instance = ATOMIC_INIT(0);
…
instance = v4l2_device_set_name(&v4l2_dev, “foo”, &drv_instance);

void v4l2_device_disconnect(struct v4l2_device *v4l2_dev)
函数功能:将V4L2设备的状态更改为已断开连接。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
描述:当USB父设备断开连接时应该调用此函数。由于父设备消失,这能确保v4l2_dev没有无效的父指针。注意:此函数将v4l2_dev->dev设置为NULL。在调用此函数之后,如需重新使用v4l2_dev,需要重新注册它。该函数没有返回值。
void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
函数功能:注销所有与v4l2_dev相关的子设备和其他资源。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
描述:此函数用于注销与v4l2_dev相关的所有子设备和其他资源。该函数会构造出一个包含v4l2_dev结构体的列表,并使用此列表反向遍历device_list,以确保在注销v4l2_dev之前任何依赖于它的子设备或驱动程序都已被注销。在注销v4l2_dev时,首先会解除dev->driver_data对v4l2_dev的引用,然后释放v4l2_dev的内存,并递减v4l2_get_minor_index()的返回值。该函数没有返回值。
int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev, struct v4l2_subdev *sd)
函数功能:向V4L2设备注册子设备。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
- struct v4l2_subdev *sd:指向struct v4l2_subdev的指针。
描述:当一个子设备被注册到一个V4L2设备时,该子设备模块将被标记为正在使用中。如果该模块已被卸载,任何尝试注册它的操作都会返回错误。该函数首先会调用v4l2_subdev_init()函数对子设备进行初始化,并为其设置驱动程序的名称和父V4L2设备指针。然后,它会检查设备状态以确保设备处于“注册”状态,并将子设备添加到v4l2_dev->subdevs列表中。最后,该函数会增加v4l2_dev的引用计数并返回0(成功),如果出现错误则返回负错误代码。
void v4l2_device_unregister_subdev(struct v4l2_subdev *sd)
函数功能:从V4L2设备中注销子设备。
参数:
- struct v4l2_subdev *sd:指向struct v4l2_subdev的指针。
描述:当一个子设备被注销时,该子设备模块将被标记为不在使用中。该函数首先会从sd->dev->v4l2_dev->subdevs列表中删除该子设备,并将其状态设置为“未注册”。然后,如果该子设备当前处于使用状态,则会将其状态设置为“未使用”。最后,该函数会递减v4l2_get_minor_index()的返回值。如果该子设备未被注册,则该函数不会进行任何操作。
int __v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev, bool read_only)
函数功能:为所有在V4L2设备中标记了V4L2_SUBDEV_FL_HAS_DEVNODE标志的子设备注册设备节点。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
- bool read_only:子设备只读标志。如果为true,则在只读模式下注册子设备设备节点;如果为false,则允许完全访问子设备用户空间API。
描述:该函数用于为所有在V4L2设备中标记了V4L2_SUBDEV_FL_HAS_DEVNODE标志的子设备注册相应的设备节点。该函数会遍历v4l2_dev->subdevs列表,检查每个子设备的标志,如果包含V4L2_SUBDEV_FL_HAS_DEVNODE标志,则会调用v4l2_subdev_create_v4l2_devnode()函数为其创建设备节点并将其添加到系统的/dev目录中。如果创建设备节点失败,则该函数会记录错误并返回负错误代码。否则,该函数将继续注册后续子设备的设备节点,直到列表遍历完成或出现错误。最后,该函数将返回0(成功)或负错误代码。
int v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev)
函数功能:以不受限制的方式向子设备用户空间操作注册子设备设备节点。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
描述:该函数调用__v4l2_device_register_subdev_nodes()函数,以不受限制的方式为所有在V4L2设备中标记了V4L2_SUBDEV_FL_HAS_DEVNODE标志的子设备注册相应的设备节点。这意味着用户可以完全访问子设备用户空间API,并能够对其执行读取和写入操作。具体实现细节请参阅__v4l2_device_register_subdev_nodes()函数的文档。
int v4l2_device_register_ro_subdev_nodes(struct v4l2_device *v4l2_dev)
函数功能:以只读模式注册子设备设备节点。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
描述:该函数调用__v4l2_device_register_subdev_nodes()函数,以只读模式为所有在V4L2设备中标记了V4L2_SUBDEV_FL_HAS_DEVNODE标志的子设备注册相应的设备节点。这意味着用户对子设备API的访问将被限制为只读操作,不能执行任何写入操作。具体实现细节请参阅__v4l2_device_register_subdev_nodes()函数的文档。
void v4l2_subdev_notify(struct v4l2_subdev *sd, unsigned int notification, void *arg)
函数功能:向V4L2设备发送通知。
参数:
- struct v4l2_subdev *sd:指向struct v4l2_subdev的指针。
- unsigned int notification:通知类型。请注意,通知类型是特定于驱动程序的。
- void *arg:通知的参数。这些参数对于每个通知类型都是特定的。
描述:该函数用于向V4L2设备发送通知。通知类型和参数是特定于驱动程序的,可以通过notification和arg参数传递。具体实现细节取决于驱动程序的实现。
bool v4l2_device_supports_requests(struct v4l2_device *v4l2_dev)
函数功能:测试是否支持请求。
参数:
- struct v4l2_device *v4l2_dev:指向struct v4l2_device的指针。
描述:该函数用于测试V4L2设备是否支持请求。如果支持,将返回true;否则,将返回false。请求是一种机制,允许用户从V4L2设备中获取视频帧以进行处理,并将这些帧发送回设备以进行传输。该函数在设备注册时被调用,以确定是否支持请求,并且驱动程序必须明确地支持请求才能通过请求API与设备进行交互。
v4l2_device_for_each_subdev(sd, v4l2_dev)
函数功能:迭代给定V4L2设备的所有子设备的帮助宏。
参数:
- sd:指针,在宏中将被填充为所有struct v4l2_subdev指针,用作循环的迭代器。
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
描述:该宏用于迭代给定V4L2设备的所有子设备。它充当for循环迭代器,并执行下一个语句以使sd变量依次指向每个子设备。在迭代过程中,可以使用sd指针来访问每个子设备的属性和方法。具体实现细节可以参考宏定义。
__v4l2_device_call_subdevs_p(v4l2_dev, sd, cond, o, f, args…)
函数功能:对所有与条件匹配的子设备调用指定操作。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- sd:指针,在宏中将被填充为所有struct v4l2_subdev指针,用作循环的迭代器。
- cond:要匹配的条件。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
描述:该宏用于对所有与条件匹配的子设备调用指定操作。可以在给定条件下匹配一个或多个子设备,并且将调用与操作函数名称相对应的操作函数。操作函数通常用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考宏定义。
__v4l2_device_call_subdevs(v4l2_dev, cond, o, f, args…)
函数功能:对所有与条件匹配的子设备调用指定操作。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- cond:要匹配的条件。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
描述:该宏用于对所有与条件匹配的子设备调用指定操作。可以在给定条件下匹配一个或多个子设备,并且将调用与操作函数名称相对应的操作函数。操作函数通常用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考宏定义。
__v4l2_device_call_subdevs_until_err_p(v4l2_dev, sd, cond, o, f, args…)
函数功能:对所有与条件匹配的子设备调用指定操作,如果有任何一个子设备返回非0或-ENOIOCTLCMD错误,则终止并返回该错误码,否则返回0。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- sd:指针,在宏中将被填充为所有struct v4l2_subdev指针,用作循环的迭代器。
- cond:要匹配的条件。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
返回值:如果有任何一个子设备返回非0或-ENOIOCTLCMD错误,则返回该错误码,否则返回0。
描述:该宏用于对所有与条件匹配的子设备调用指定操作,并且只要有一个子设备返回错误,则立即停止迭代并返回错误代码。操作函数可以用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考宏定义。
__v4l2_device_call_subdevs_until_err(v4l2_dev, cond, o, f, args…)
函数功能:对所有与条件匹配的子设备调用指定的操作函数,如果任何一个子设备返回非0或-ENOIOCTLCMD错误,则立即停止迭代并返回该错误码,否则返回0。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- cond:要匹配的条件。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
返回值:如果有任何一个子设备返回非0或-ENOIOCTLCMD错误,则返回该错误码,否则返回0。
描述:该宏用于对所有与条件匹配的子设备调用指定操作函数,并且只要有一个子设备返回错误,则立即停止迭代并返回错误代码。操作函数可以用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考宏定义。
v4l2_device_call_all(v4l2_dev, grpid, o, f, args…)
函数功能:对所有与v4l2_subdev.grp_id匹配的子设备调用指定的操作函数,忽略任何错误。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- grpid:要匹配的v4l2_subdev.grp_id。使用0可以匹配所有子设备。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
返回值:无,忽略所有错误。
描述:该函数用于对所有与v4l2_subdev.grp_id匹配的子设备调用指定的操作函数,忽略任何错误。操作函数可以用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考函数定义。
v4l2_device_call_until_err(v4l2_dev, grpid, o, f, args…)
函数功能:对所有与v4l2_subdev.grp_id匹配的子设备调用指定的操作函数,直到发生错误为止。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- grpid:要匹配的v4l2_subdev.grp_id。使用0可以匹配所有子设备。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
返回值:如果有任何一个子设备返回非0或-ENOIOCTLCMD错误,则返回该错误码,否则返回0。
描述:该函数用于对所有与v4l2_subdev.grp_id匹配的子设备调用指定的操作函数,并且只要有一个子设备返回错误,则立即停止迭代并返回错误代码。操作函数可以用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考函数定义。
v4l2_device_mask_call_all(v4l2_dev, grpmsk, o, f, args…)
函数功能:对所有与指定位掩码匹配的子设备调用指定的操作函数,忽略任何错误。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- grpmsk:要检查的位掩码,用于匹配struct v4l2_subdev->grp_id组ID。使用0可以匹配所有子设备。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
返回值:无,忽略所有错误。
描述:该函数用于对所有与指定位掩码匹配的子设备调用指定的操作函数,忽略任何错误。操作函数可以用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考函数定义。
v4l2_device_mask_call_until_err(v4l2_dev, grpmsk, o, f, args…)
函数功能:对所有与指定位掩码匹配的子设备调用指定的操作函数,直到发生错误为止。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- grpmsk:要检查的位掩码,用于匹配struct v4l2_subdev->grp_id组ID。使用0可以匹配所有子设备。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,将调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
- args…:f的参数。
返回值:如果有任何一个子设备返回非0或-ENOIOCTLCMD错误,则返回该错误码,否则返回0。
描述:该函数用于对所有与指定位掩码匹配的子设备调用指定的操作函数,并且只要有一个子设备返回错误,则立即停止迭代并返回错误代码。操作函数可以用于设置或获取与子设备相关的属性。需要注意的是,在迭代子设备列表时无法添加或删除子设备。具体的操作和实现细节可以参考函数定义。
v4l2_device_has_op(v4l2_dev, grpid, o, f)
函数功能:检查与指定组ID匹配的任何子设备是否具有给定的操作。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- grpid:要匹配的struct v4l2_subdev->grp_id组ID。使用0可以匹配所有子设备。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,则调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
返回值:如果至少有一个与指定组ID匹配的子设备具有指定的操作,则返回1,否则返回0。
描述:该函数用于检查与指定组ID匹配的任何子设备是否具有给定的操作。如果至少有一个子设备具有指定的操作,则返回1,否则返回0。该函数可以用于检测特定类型的子设备是否可用,并在需要时执行相应的操作。具体的操作和实现细节可以参考函数定义。
v4l2_device_mask_has_op(v4l2_dev, grpmsk, o, f)
函数功能:检查与指定组ID掩码匹配的子设备是否具有给定的操作。
参数:
- v4l2_dev:拥有要迭代的子设备的struct v4l2_device。
- grpmsk:要检查的位掩码,用于匹配struct v4l2_subdev->grp_id组ID。使用0可以匹配所有子设备。
- o:在struct v4l2_subdev_ops中包含f的元素的名称。每个元素将一组操作函数分组。
- f:如果cond匹配,则调用的操作函数。操作函数根据struct v4l2_subdev_ops中的每个元素进行定义。
返回值:如果至少有一个与指定组ID掩码匹配的子设备具有指定的操作,则返回1,否则返回0。
描述:该函数用于检查与指定组ID掩码匹配的子设备是否具有给定的操作。如果至少有一个子设备具有指定的操作,则返回1,否则返回0。该函数可用于检测是否存在特定类型的子设备,并在需要时执行相应的操作。具体的操作和实现细节可以参考函数定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值