最近在测试曝光模式的时候遇到了一个问题:当通过V4L2接口控制产品的曝光模式为自动曝光和手动曝光的时候,可以将其设置成手动曝光,但将其设置成自动曝光却失败了。
设置其他参数的时候就是没有问题的,在设置自动曝光的时候会返回一个 invalid param 错误,也就是说我传入的自动曝光模式参数有误。于是找到我当前电脑上的linux内核版本对应的UVC驱动的源码,通过源码可以看到,我们外部传入的参数1,2会被映射成驱动内部具体曝光模式对应的值,见如下结构体实例:
static const struct uvc_menu_info exposure_auto_controls[] = {
{ 2, "Auto Mode" },
{ 1, "Manual Mode" },
{ 4, "Shutter Priority Mode" },
{ 8, "Aperture Priority Mode" },
};
可以看到,我们传入的参数0,1,2,3最终会对应到这些项。
但是我传入参数 0 时,按照其默认这些选项来说应该是不会报invalid param错误的,除非在连接到video设备时,设备告知了主机其不支持某些选项,于是主机中UVC驱动将这些选项屏蔽了(这个具体实现还没在代码中找到,但是通过下面的USB抓包数据可以确定)。
于是我通过USB抓包工具抓取设备连接时的与主机的所有交互数据,其中一条数据如下:
对照UVC1.5协议对其进行分析可以发现,这是一条主机向设备通过GET_RES请求查询其曝光所支持的模式的数据,第二条为设备返回的数据,值为 0x05,我们找到UVC1.5协议中曝光模式相关规定,如下图所示:
可以看到,将0x05转换成二进制为 : 0101,按照这个表来对照的话是不支持自动曝光模式的,但是这个产品实际是支持自动曝光的,于是我找到产品代码,在其UVC相关代码中找到了返回曝光模式的GET_RES请求的代码,果然返回的是0x05,最后将这个改了应该就好用了