Linux&UVC驱动
+ -

LINUX&UVC控制请求VIDIOC_QUERYCAP设备功能属性信息v4l2_capability

2024-03-29 10 0

VIDIOC_QUERYCAP请求使用api函数ioctl,最终进行LINUX&UVC驱动中,根据设备节点的不同,执行的回调函数不同。

VIDIOC_QUERYCAP请求用于返回设备支持的功能属性信息,其对应的结构体v4l2_capability。

struct v4l2_capability
{
    u8 driver[16]; // 驱动名字
    u8 card[32]; // 设备名字
    u8 bus_info[32]; // 设备在系统中的位置
    u32 version;// 驱动版本号
    u32 capabilities;// 设备支持的操作
    u32 reserved[4]; // 保留字段
};

UVC驱动

LINUX&UVC驱动中,对于视频节点,其对应的函数为:

const struct v4l2_ioctl_ops uvc_ioctl_ops = {
    .vidioc_querycap = uvc_ioctl_querycap,
    ...
}

具体代码为:

static int uvc_ioctl_querycap(struct file *file, void *fh,
                  struct v4l2_capability *cap)
{
    struct video_device *vdev = video_devdata(file);
    struct uvc_fh *handle = file->private_data;
    struct uvc_video_chain *chain = handle->chain;
    struct uvc_streaming *stream = handle->stream;

    strscpy(cap->driver, "uvcvideo", sizeof(cap->driver));
    strscpy(cap->card, vdev->name, sizeof(cap->card));
    usb_make_path(stream->dev->udev, cap->bus_info, sizeof(cap->bus_info));
    cap->capabilities = V4L2_CAP_DEVICE_CAPS | V4L2_CAP_STREAMING | chain->caps;

    return 0;
}

对于metadata节点,对应的函数为:

static const struct v4l2_ioctl_ops uvc_meta_ioctl_ops = {
    .vidioc_querycap        = uvc_meta_v4l2_querycap,
...
}

具体代码为:

static int uvc_meta_v4l2_querycap(struct file *file, void *fh,
                  struct v4l2_capability *cap)
{
    struct v4l2_fh *vfh = file->private_data;
    struct uvc_streaming *stream = video_get_drvdata(vfh->vdev);
    struct uvc_video_chain *chain = stream->chain;

    strscpy(cap->driver, "uvcvideo", sizeof(cap->driver));
    strscpy(cap->card, vfh->vdev->name, sizeof(cap->card));
    usb_make_path(stream->dev->udev, cap->bus_info, sizeof(cap->bus_info));
    cap->capabilities = V4L2_CAP_DEVICE_CAPS | V4L2_CAP_STREAMING | chain->caps;

    return 0;
}

v4l2_capability

通过分析两个回调函数,可知:

  • 对应驱动名称,因其都是usb video class设备节点,故驱动使用的是”uvcvideo”,其对应MakeFile编译后的模块uvcvideo.o
  • 对于设备名称,则来源于usbCore的设备名称。

    int uvc_register_video_device(...)
    {
    ...
    strscpy(vdev->name, dev->name, sizeof(vdev->name));
    ...
    }
    
  • bus_info:其通过函数usb_make_path实现:

    static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size)
    {
      int actual;
      actual = snprintf(buf, size, "usb-%s-%s", dev->bus->bus_name,dev->devpath);
      return (actual >= (int)size) ? -1 : actual;
    }
    
  • capabilities:这里标识了设备的特征信息。其都包含V4L2_CAP_DEVICE_CAPS和V4L2_CAP_STREAMING,对于 chain->caps,则根据视频流描述符是输入还是输出设备不同而不同:

      if (stream->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
          stream->chain->caps |= V4L2_CAP_VIDEO_CAPTURE| V4L2_CAP_META_CAPTURE;
      else
          stream->chain->caps |= V4L2_CAP_VIDEO_OUTPUT;
    

其它相关的属性信息可详见:https://elixir.bootlin.com/linux/v5.5-rc2/source/include/uapi/linux/videodev2.h#L452

/* Values for 'capabilities' field */
#define V4L2_CAP_VIDEO_CAPTURE        0x00000001  /* Is a video capture device */
#define V4L2_CAP_VIDEO_OUTPUT        0x00000002  /* Is a video output device */
#define V4L2_CAP_VIDEO_OVERLAY        0x00000004  /* Can do video overlay */
#define V4L2_CAP_VBI_CAPTURE        0x00000010  /* Is a raw VBI capture device */
#define V4L2_CAP_VBI_OUTPUT        0x00000020  /* Is a raw VBI output device */
#define V4L2_CAP_SLICED_VBI_CAPTURE    0x00000040  /* Is a sliced VBI capture device */
#define V4L2_CAP_SLICED_VBI_OUTPUT    0x00000080  /* Is a sliced VBI output device */
#define V4L2_CAP_RDS_CAPTURE        0x00000100  /* RDS data capture */
#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY    0x00000200  /* Can do video output overlay */
#define V4L2_CAP_HW_FREQ_SEEK        0x00000400  /* Can do hardware frequency seek  */
#define V4L2_CAP_RDS_OUTPUT        0x00000800  /* Is an RDS encoder */

/* Is a video capture device that supports multiplanar formats */
#define V4L2_CAP_VIDEO_CAPTURE_MPLANE    0x00001000
/* Is a video output device that supports multiplanar formats */
#define V4L2_CAP_VIDEO_OUTPUT_MPLANE    0x00002000
/* Is a video mem-to-mem device that supports multiplanar formats */
#define V4L2_CAP_VIDEO_M2M_MPLANE    0x00004000
/* Is a video mem-to-mem device */
#define V4L2_CAP_VIDEO_M2M        0x00008000

#define V4L2_CAP_TUNER            0x00010000  /* has a tuner */
#define V4L2_CAP_AUDIO            0x00020000  /* has audio support */
#define V4L2_CAP_RADIO            0x00040000  /* is a radio device */
#define V4L2_CAP_MODULATOR        0x00080000  /* has a modulator */

#define V4L2_CAP_SDR_CAPTURE        0x00100000  /* Is a SDR capture device */
#define V4L2_CAP_EXT_PIX_FORMAT        0x00200000  /* Supports the extended pixel format */
#define V4L2_CAP_SDR_OUTPUT        0x00400000  /* Is a SDR output device */
#define V4L2_CAP_META_CAPTURE        0x00800000  /* Is a metadata capture device */

#define V4L2_CAP_READWRITE              0x01000000  /* read/write systemcalls */
#define V4L2_CAP_ASYNCIO                0x02000000  /* async I/O */
#define V4L2_CAP_STREAMING              0x04000000  /* streaming I/O ioctls */
#define V4L2_CAP_META_OUTPUT        0x08000000  /* Is a metadata output device */

#define V4L2_CAP_TOUCH                  0x10000000  /* Is a touch device */

#define V4L2_CAP_DEVICE_CAPS            0x80000000  /* sets device capabilities field */

0 篇笔记 写笔记

Hid.dll导出函数与IOCTL对应大全
Windows封装的HID相关系列API函数,其本质是通过WIN32 API函数DeviceIoControl函数来与内核进行通讯的,而DeviceIoControl中一个重要的参数就是dwIoControlCode,代表了该次通讯的功能。BOOLWINAPIDeviceIoControl(......
HID.DLL函数HidD_GetMsGenreDescriptor与IOCTL_HID_GET_MS_GENRE_DESCRIPTOR
HID.DLL导出HidD_GetMsGenreDescriptor函数,其使用IOCTL_HID_GET_MS_GENRE_DESCRIPTOR与HIDCLASS.SYS通讯。而HIDCLASS.SYS将此请求下发给设备,用于获取设备的类型信息。而在HIDUSB.SYS中,通过下发Functio......
hid.dll导出函数HidD_GetPhysicalDescriptor与IOCTL_GET_PHYSICAL_DESCRIPTOR
hid.dll导出函数HidD_GetPhysicalDescriptor用于获取HID物理描述符,其通过IOCTL_GET_PHYSICAL_DESCRIPTOR发送给HIDCLASS.SYS。HIDCLASS创建一个主功能号为IRP_MJ_INTERNAL_DEVICE_CONTROL,IOCT......
HIDCLASS.SYS对外支持的IOCTL
//// Macro for defining HID ioctls//#define HID_CTL_CODE(id) CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS)#defi......
HID设备电源控制IOCTL_GET_SYS_BUTTON_CAPS
IOCTL_GET_SYS_BUTTON_CAPS 用于获取HID支持的电源功能。在HID报告描述符USAGE_PAGE(0X01)中为:Usage IDUsage NameUsage TypesSection81System Power DownOSC4.582......
HIDCLASS电源事件IOCTL_GET_SYS_BUTTON_EVENT
系统应该是向HID设备发送一个IOCTL_GET_SYS_BUTTON_EVENT请求,该请求被HID设备Pending挂起,当有相关的Power Button报告时,完成该事件。#define FILE_DEVICE_BATTERY 0x00000029#define ......
复位USB端口设备IOCTL_USB_HUB_CYCLE_PORT
在设备管理器中通过设备的实例ID查找到设备后,然后确定设备端口中,再根据设备端口号获取其父设备即USB集本器,打开集线器,发送IOCTL_USB_HUB_CYCLE_PORT 请求来复位集线器端口达到复位设备。IOCTL_USB_HUB_CYCLE_PORT在Vista和Windows 7下不支持......
Windows判断USB设备工作在高速、全速还是低速模式代码示例
如果一个USB的设备管理器中bcdUSB值为0x200,那么它一定是高速吗?答案是否定的,因为USB2.0规范定义的是USB低速,全速和高速模式,所以说设备工作在那种模式,完全是由固件和硬件决定的。只是其满足USB2.0规范而已,所以USB2.0并不等于高速,但支持USB高速模式的肯定要满足USB2......
USBIP 获取集线器下游端口连接信息IOCTL_USB_GET_NODE_CONNECTION_INFORMATION
USB集线器其实支持3个IOCTL用于获取下游端口的连接信息。这两个IOCTL分别为IOCTL_USB_GET_NODE_CONNECTION_INFORMATION、IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX、IOCTL_USB_GET_NODE_CO......
使用usbioctl、setupapi和cfgmgr32与GUID头文件报错的问题处理
话不多说,直接使用可以正常运行的。#include #include #include #include #include #inclu......
Windows系统USB控制器百科
Windows系统下的USB控制器可以通过设备管理器来查看。具体方法是选择任意一USB设备,然后按连接显示。这样其上级为PCIE设备的就是USB控制器。如本人计算机中的USB控制器设备如下:USB控制器一般是挂在PCIE总线上,该控制器会有一个根USB集线器。本人计算机中的该USB控制器硬......
USBIP 复位集线器下游端口/IOCTL_INTERNAL_USB_RESET_PORT
向USB集线器下发的IOCTRL之一就是IOCTL_INTERNAL_USB_RESET_PORT。用于复位USB集线器的下游端口。static NTSTATUSstore_urbr_submit(PIRP irp, struct urb_req *urbr){... case IO......
USBIP 获取集线器端口设备描述符IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
static NTSTATUSstore_urbr_submit(PIRP irp, struct urb_req *urbr){... case IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION: status = store......
USBIP USB控制器驱动键名称DriverKeyName
IOCTL_GET_HCD_DRIVERKEY_NAME用于获取USB主机控制器驱动注册表键值的名称即DriverKeyName。PAGEABLE NTSTATUSvhci_ioctl_vhci(pvhci_dev_t vhci, PIO_STACK_LOCATION irpstack, ULO......
USB控制器驱动注册表键名称DriverKeyName
使用IOCTL_GET_HCD_DRIVERKEY_NAME获取USB驱动注册表键值名称。DriverKeyName是一个Windows驱动程序的注册表键名。在Windows操作系统中,驱动程序使用注册表来存储设备和驱动程序的相关信息。DriverKeyName指的是驱动程序在注册表中的键名,它通......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!