UVC摄像头技术笔记
+ -

Linux系统V4L2访问UVC摄像头扩展单元命令

2022-05-11 24 0
原文转自:https://blog.csdn.net/qq_37363702/article/details/11899270

欢迎加入官方QQ群:952873936或联系站长进行技术交流。

我们可以通过IOCTL访问扩展单元,调用方法如下:

ioctl(fd, UVCIOC_CTRL_QUERY, struct uvc_xu_control_query *);

访问不同的扩展命令只需要修改uvc_xu_control_query 结构体里面内容即可。

uvc_xu_control_query 结构体如下:

struct uvc_xu_control_query {
    __u8 unit;//扩展单元ID
    __u8 selector;//扩展命令ID
    __u8 query;//特定请求,如UVC_GET_CUR
                /* defined in linux/usb/video.h A.8.  */
    __u16 size;//数据长度
    __u8 *data;//数据buf
};

假如我们访问失败,可能有一下几个原因:

1.扩展单元描述符中没有打开该命令,扩展单元协议可参照http://www.usbzh.com/article/detail-36.html

2.该扩展命令不支持GET_INFO或者GET_LEN

3.该扩展命令支持GET_LEN,但是返回的长度和我们定义的长度不一致

在开发过程中还遇到通过libuvc能够调用成功,但是v4l2调用失败,这是因为libuvc并不是严格按照UVC协议。

写了段示例代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>   
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>
#include <linux/videodev2.h>
#include <linux/uvcvideo.h>
#include <linux/usb/video.h>
#include <errno.h>

#define UVC_EU1_ID 0x06
#define EU1_TEST_CMD 0x3b
#define EU1_TEST_CMD_LEN 0x01

int main(int argc,char **argv){
    int fd = open("/dev/video0",O_RDWR);
    if(fd <= 0)
    {
        printf("open failed!\n");
        return -1;
    }
    unsigned char buf[EU1_TEST_CMD_LEN];
    struct uvc_xu_control_query xu_ctrl_query =
    {
        .unit     = UVC_EU1_ID,
        .selector = EU1_TEST_CMD,
        .query    = UVC_GET_CUR,
        .size     = EU1_TEST_CMD_LEN,
        .data     = buf,
    };    
    int ret = ioctl(fd, UVCIOC_CTRL_QUERY, &xu_ctrl_query);
    if(ret < 0)
    {
        printf("query fail!\n");
        printf("%s\n",strerror(errno));
    }else{    
        printf("query success!\n");
        int i;
        printf("data:");
        for(i = 0;i < EU1_TEST_CMD_LEN;i++)
        {
            printf("%#x ",buf[i]);
        }
        printf("\n");
    }
    close(fd);
    return 0;
}

原文作者:老吕丶 http://www.usbzh.com/article/detail-743.html

0 篇笔记 写笔记

UVC 扩展单元描述符
扩展单元描述符允许硬件设计者定义任意一组控制接口,使类驱动程序可以在设备与供应商提供的主机软件之间进行通讯控制。扩展单元描述符ID由bUnitID字段中的值唯一标识描述符。同一视频功能内的任何其他单元或终端不得具有相同的功能ID。guidExtensionCode字段包含特定于供应商的代码,该代......
Linux V4L2 UVC摄像头框架浅析
V4L2 :video for linux version 2 ,是 Linux 里一套标准的视频驱动,它支持 UVC 标准的摄像头。本文来分析一下它的核心框架。整个v4l2的框架分为三层:在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行数据捕......
linux下UsbMon-WireShark之USB协议抓取分析
usbmon配置使用usbmon抓包分的,是需要 内核开启CONFIG_USB_MON=m, 重新编译内核, 编译ko :make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- CONFIG_USB_MON=m M=./drivers/usb/ ......
UVC摄像头扩展单元功能的开发步骤是什么?
写在扩展单元的题外话本人在开发支持UVC扩展单元的directShow应用时,必现并不需要注册接口,只需要在其源过滤器参照后续的代码枚举相关的接口如IKsControl,IKsTopologyInfo定位到指定的扩展单元接口后,直接使用其对应的IKsControl::KsProperty即可实现扩展......
Linux支持的UVC视频格式
Linux支持的UVC视频格式位于linux-5.6.11linux-5.6.11driversmediausbuvcuvc_driver.c文件下:其数组结构定义如下:static struct uvc_format_desc uvc_fmts[] = { { .n......
Linux源码分析UVC摄像头的初始化流程分析
UVC摄像头的初始化发生在硬件被接入USB集线器中,设备初USB驱动识别为摄像头的后续初始化流程。和Windows的AddDevice驱动函数一样,Linux设备的创建和侦测是通过int uvc_probe函数实现的。其函数的调用关系如下://linux/v5.11.11/source/driver......
ubuntu下使用usbmon进行usb抓包
开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包。 在ubuntu下使用步骤如下:1 运行命令 sudo mount -t debugfs none /sys/kernel/debug ,如果提示已经挂载,则下次抓包就可以不运行这个命令了。表示系统默认会挂载。 2 ......
UVC 扩展单元控制请求
扩展单元控制请求设置或读取扩展单元内的视频控件.bmRequestTypebRequestwValue(2)wIndexwLengthData00100001SET_CUR选择子扩展单元ID参数长度参数块bmRequestTypebRequestwValue(2)wIndexwLengthData1......
Linux源码分析UVC摄像头的打开流程及抓包分析
和关闭摄像头类似,Linux使用uvc_video_start_streaming函数打开摄像头int uvc_video_start_streaming(struct uvc_streaming *stream){ int ret; ret = uvc_video_clock_init......
V4L2访问摄像头扩展单元命令
我们可以通过IOCTL访问扩展单元,调用方法如下:ioctl(fd, UVCIOC_CTRL_QUERY, struct uvc_xu_control_query *);访问不同的扩展命令只需要修改uvc_xu_control_query 结构体里面内容即可。uvc_xu_control_qu......
用XU打造UVC命令行调试工具
在给客户交付UVC固件之后,有时客户会反馈问题,需要客户查看固件的打印信息或者执行一些命令辅助定位问题。如果有一个工具可以通过USB线连接到设备,直接在电脑上查看打印信息,执行命令就好了。有想法就要行动起来,行动才能解决问题。目前该功能已经实现了,说一下实现的方法吧。上位机OS Windows设......
UVC摄像头扩展单元调试工具-临江仙版
UVC摄像头的开发者为了实现一些私有定制协议的通讯,通常使用UVC自带的扩展单元来实现。通常是自定义一个扩展单元,再定义一些相应的选择子,然后再通过特定类请求实现与固件的通讯。 本站现提供一个Windows环境下,使用DirectShow开发的UVC扩展单元调试工具.UVC摄像头扩展单元工具来自......
UVC PTZ和扩展单元XU的过滤与分发调试笔记
在写这篇文章之前,我得首先感谢微软,感谢你的不严格,让我可以有空子可钻,不至于太过狼狈…记得看过一句话,开局一张图,内容全告编。我多么希望自己在UVC摄像头的调试过程中也可以瞎编乱造,这样不至于身心疲惫。至少保持着愉快的心情,吹吹牛,也是一件很开心的事。今日有一个需求,对UVC摄像头的请求进行......
UVC摄像头驱动装调试总结
前几天发表了一篇文章 UVC PTZ和扩展单元的过滤与分发调试笔记,原文见: http://www.usbzh.com/article/detail-517.html ,本来想着应该没啥问题了,可没想到上周五在实际测试过程中,还是出现了问题:经过长时间的UVC摄像头工作,突然驱动显示了大量数据包错误......
windows上面通过dshow接口访问uvc摄像头扩展单元,只能访问0x01-0x1F命令问题
最近在给客户做一个修改摄像头数据的工具,在通过dshow接口发送扩展命令的时候发现0x01-0x1F命令都可以发送成功,0x20及以上定义的命令都发送失败,并且返回错误码0x80070490。谷歌百度查了很久终于在windows官网文档中找到了答案,原来是USB 视频类驱动程序对UVC扩展单元实现......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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