深入探讨UVC驱动中的ioctl控制 - __uvc_query_ctrl详解
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); }
下一篇: 如何解决收不到多播包的疑难问题
推荐阅读
-
深入探讨UVC驱动中的ioctl控制 - __uvc_query_ctrl详解
-
Linux设备驱动开发详解——学习笔记-设备驱动来联系。在没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口。而在有操作系统的情况下,驱动的架构则由相应的操作系统来定义。驱动存在的意义就是给上层应用提供便利。 驱动针对的对象是存储器和外设。Linux将存储器和外设分为 3 个基础大类:字符设备、块设备、网络设备。 字符设备和块设备都被 Linux 映射到文件系统的文件和目录中,通过文件系统的接口(open、read、write、close等)来访问。其中,块设备可以通过类似 dd 命令对应的原始块设备来访问,也可以通过建立文件系统,以文件路径来访问。 学习 Linux 设备驱动,要求非常好的硬件基础、非常好的软件基础、一定的 Linux 内核基础和非常好的多任务并发控制和同步的基础。学习 Linux 设备驱动要将学习的函数、数据结构等放到整体架构中去理解,才能理清驱动中各组成部分之间的关系。 驱动设计的硬件基础 驱动工程师需要掌握 处理器、存储器、接口和总线、可编程门电路、原理图、硬件时序、芯片手册、仪器使用 等方面的内容。 处理器