欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入探讨UVC驱动中的ioctl控制 - __uvc_query_ctrl详解

最编程 2024-02-19 08:58:08
...

uvc_ioctl_g_input->uvc_query_ctrl->__uvc_query_ctrl

函数 __uvc_query_ctrl 用于向 UVC 设备发送控制命令,并通过 USB 控制传输进行通信。

函数的参数包括:

dev:UVC 设备结构体指针。

query:查询类型,表示对控制进行何种操作,例如获取当前值、获取默认值等。

unit:控制单元的 ID。

intfnum:接口号。

cs:控制选择器的 ID。

data:用于存储查询结果的缓冲区指针。

size:缓冲区大小。

timeout:超时时间。

函数的主要步骤如下:

根据查询类型 query 的最高位判断是发送还是接收控制消息,设置对应的 USB 类型 type 和管道 pipe。如果最高位为1,则表示接收控制消息,使用 usb_rcvctrlpipe 获取接收管道;否则,表示发送控制消息,使用 usb_sndctrlpipe 获取发送管道。

根据查询类型 query 的最高位设置 USB 方向,将 USB 类型 type 的最低位设置为 USB_DIR_IN(接收)或 USB_DIR_OUT(发送)。

调用 usb_control_msg 函数向 UVC 设备发送 USB 控制消息。该函数会发送控制请求并等待设备的响应。

返回函数 usb_control_msg 的返回值,表示控制消息的传输结果。

总的来说,__uvc_query_ctrl 函数通过 USB 控制传输与 UVC 设备进行通信。根据查询类型的不同,该函数会发送或接收控制消息,并等待设备的响应。函数使用 USB 控制传输的管道和方向进行通信,将查询结果存储在指定的缓冲区中,并返回控制传输的结果。

// 查询UVC控制器
// dev: UVC设备
// query: 查询类型
// unit: 单元
// intfnum: 接口编号
// cs: 控制选择
// data: 数据
// size: 数据大小
// timeout: 超时时间
static int __uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
            __u8 intfnum, __u8 cs, void *data, __u16 size,
            int timeout)
{
    // USB类型为类和接口
    __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;
    unsigned int pipe;
    // 根据查询类型设置管道
    pipe = (query & 0x80) ? usb_rcvctrlpipe(dev->udev, 0)
                  : usb_sndctrlpipe(dev->udev, 0);
    // 根据查询类型设置USB方向
    type |= (query & 0x80) ? USB_DIR_IN : USB_DIR_OUT;
    // 发送控制消息
    return usb_control_msg(dev->udev, pipe, query, type, cs << 8,
            unit << 8 | intfnum, data, size, timeout);
}