[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 3/7] usb-uvc: Fix all checkpatch style issues.
From: |
Brad Hards |
Subject: |
[Qemu-devel] [PATCH 3/7] usb-uvc: Fix all checkpatch style issues. |
Date: |
Thu, 2 Jun 2011 15:41:06 +1000 |
Signed-off-by: Brad Hards <address@hidden>
---
hw/usb-uvc.c | 1917 +++++++++++++++++++++++++++++-----------------------------
1 files changed, 945 insertions(+), 972 deletions(-)
diff --git a/hw/usb-uvc.c b/hw/usb-uvc.c
index c9c8f77..20ac23e 100644
--- a/hw/usb-uvc.c
+++ b/hw/usb-uvc.c
@@ -27,12 +27,12 @@
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
-// V4L2 ioctls
+
+/* V4L2 ioctls */
#include <sys/ioctl.h>
#include <linux/videodev2.h>
-// #define DEBUG_UVC
-
+/* #define DEBUG_UVC */
#ifdef DEBUG_UVC
#define DPRINTF(fmt, ...) \
do { printf("usb-uvc: " fmt , ## __VA_ARGS__); } while (0)
@@ -41,26 +41,26 @@ do { printf("usb-uvc: " fmt , ## __VA_ARGS__); } while (0)
#endif
/* USB Video Class Request codes */
-#define USB_UVC_RC_UNDEFINED 0x00
-#define USB_UVC_SET_CUR 0x01
-#define USB_UVC_GET_CUR 0x81
-#define USB_UVC_GET_MIN 0x82
-#define USB_UVC_GET_MAX 0x83
-#define USB_UVC_GET_RES 0x84
-#define USB_UVC_GET_LEN 0x85
-#define USB_UVC_GET_INFO 0x86
-#define USB_UVC_GET_DEF 0x87
+#define USB_UVC_RC_UNDEFINED 0x00
+#define USB_UVC_SET_CUR 0x01
+#define USB_UVC_GET_CUR 0x81
+#define USB_UVC_GET_MIN 0x82
+#define USB_UVC_GET_MAX 0x83
+#define USB_UVC_GET_RES 0x84
+#define USB_UVC_GET_LEN 0x85
+#define USB_UVC_GET_INFO 0x86
+#define USB_UVC_GET_DEF 0x87
/* USB Video Class Request types */
-#define UVCSetVideoControl 0x2100
-#define UVCSetVideoStreaming 0x2200
-#define UVCGetVideoControl 0xA100
-#define UVCGetVideoStreaming 0xA200
+#define UVCSetVideoControl 0x2100
+#define UVCSetVideoStreaming 0x2200
+#define UVCGetVideoControl 0xA100
+#define UVCGetVideoStreaming 0xA200
typedef struct USBUVCState {
USBDevice dev;
- char current_input;
- char *v4l2_device;
+ char current_input;
+ char *v4l2_device;
} USBUVCState;
static int v4l2_fd;
@@ -73,1001 +73,974 @@ static int frame_remaining_bytes;
static int frame_max_length;
static const uint8_t qemu_uvc_dev_descriptor[] = {
- 0x12, /* u8 bLength; */
- 0x01, /* u8 bDescriptorType; Device */
- 0x00, 0x02, /* u16 bcdUSB; v2.0 */
-
- 0xEF, /* u8 bDeviceClass; */
- 0x02, /* u8 bDeviceSubClass; */
- 0x01, /* u8 bDeviceProtocol; [ low/full speeds only ] */
- 0x08, /* u8 bMaxPacketSize0; 8 Bytes */
-
- /* Vendor and product id are arbitrary. */
- 0x00, 0x00, /* u16 idVendor; */
- 0x00, 0x00, /* u16 idProduct; */
- 0x00, 0x00, /* u16 bcdDevice */
-
- 0x01, /* u8 iManufacturer; */
- 0x02, /* u8 iProduct; */
- 0x00, /* u8 iSerialNumber; */
- 0x01 /* u8 bNumConfigurations; */
+ 0x12, /* u8 bLength; */
+ 0x01, /* u8 bDescriptorType; Device */
+ 0x00, 0x02, /* u16 bcdUSB; v2.0 */
+
+ 0xEF, /* u8 bDeviceClass; */
+ 0x02, /* u8 bDeviceSubClass; */
+ 0x01, /* u8 bDeviceProtocol; [ low/full speeds only ] */
+ 0x08, /* u8 bMaxPacketSize0; 8 Bytes */
+
+ /* Vendor and product id are arbitrary. */
+ 0x00, 0x00, /* u16 idVendor; */
+ 0x00, 0x00, /* u16 idProduct; */
+ 0x00, 0x00, /* u16 bcdDevice */
+
+ 0x01, /* u8 iManufacturer; */
+ 0x02, /* u8 iProduct; */
+ 0x00, /* u8 iSerialNumber; */
+ 0x01 /* u8 bNumConfigurations; */
};
static const uint8_t qemu_uvc_config_descriptor[] = {
-
- /* one configuration */
- 0x09, /* u8 bLength; */
- 0x02, /* u8 bDescriptorType; Configuration */
- 0xB7, 0x00, /* u16 wTotalLength; */
- 0x02, /* u8 bNumInterfaces; (2) */
- 0x01, /* u8 bConfigurationValue; */
- 0x00, /* u8 iConfiguration; */
- 0x80, /* u8 bmAttributes;
- Bit 7: must be set,
- 6: Self-powered,
- 5: Remote wakeup,
- 4..0: resvd */
- 0xFA, /* u8 MaxPower; */
-
- /* interface association */
- 0x08, /* u8 ifa_bLength; */
- 0x0B, /* u8 ifa_bDescriptorType; Interface Association */
- 0x00, /* u8 ifa_bFirstInterface; */
- 0x02, /* u8 ifa_bInterfaceCount; */
- 0x0E, /* u8 ifa_bFunctionClass; CC_VIDEO */
- 0x03, /* u8 ifa_bFunctionSubClass;
SS_VIDEO_INTERFACE_COLLECTION */
- 0x00, /* u8 ifa_bFunctionProtocol; unused */
- 0x02, /* u8 ifa_iFunction; */
-
- /* video control interface */
- 0x09, /* u8 if_bLength; */
- 0x04, /* u8 if_bDescriptorType; Interface */
- 0x00, /* u8 if_bInterfaceNumber; */
- 0x00, /* u8 if_bAlternateSetting; */
- 0x01, /* u8 if_bNumEndpoints; */
- 0x0E, /* u8 if_bInterfaceClass; CC_VIDEO */
- 0x01, /* u8 if_bInterfaceSubClass; SC_VIDEOCONTROL */
- 0x00, /* u8 if_bInterfaceProtocol; unused */
- 0x02, /* u8 if_iInterface; */
-
- /* class specific vc interface descriptor */
- 0x0D, /* u8 cif_bLength; */
- 0x24, /* u8 cif_bDescriptorType; CS_INTERFACE */
- 0x01, /* u8 cif_bDescriptorSubType; VC_HEADER */
- 0x00, 0x01, /* u16 cif_bcdUVC; 1.0 */
- 0x42, 0x00, /* u16 cif_wTotalLength */
- 0x80, 0x8D, /* u32 cif_dwClockFrequency; Deprecated, 6Mhz */
- 0x5B, 0x00,
- 0x01, /* u8 cif_bInCollection; */
- 0x01, /* u8 cif_baInterfaceNr; */
-
- /* input terminal descriptor */
- 0x11, /* u8 itd_bLength; */
- 0x24, /* u8 itd_bDescriptorType; CS_INTERFACE */
- 0x02, /* u8 itd_bDescriptorSubtype; VC_INPUT_TERMINAL */
- 0x01, /* u8 itd_bTerminalID; */
- 0x01, 0x02, /* u16 itd_wTerminalType; ITT_CAMERA */
- 0x00, /* u8 itd_bAssocTerminal; No association */
- 0x00, /* u8 itd_iTerminal; Unused */
- 0x00, 0x00, /* u16 itd_wObjectiveFocalLengthMin; No optical zoom */
- 0x00, 0x00, /* u16 itd_wObjectiveFocalLengthMax; No optical zoom */
- 0x00, 0x00, /* u16 itd_wOcularFocalLength; No optical zoom */
- 0x02, /* u8 itd_bControlSize; No controls implemented */
- 0x00, 0x00, /* u16 itd_bmControls; No controls supported */
-
- 0x08, /* u8 itd_bLength; */
- 0x24, /* u8 itd_bDescriptorType; CS_INTERFACE */
- 0x02, /* u8 itd_bDescriptorSubtype;
VC_INPUT_TERMINAL */
- 0x02, /* u8 itd_bTerminalID; */
- 0x01, 0x04, /* u16 itd_wTerminalType; ITT_COMPOSITE */
- 0x00, /* u8 itd_bAssocTerminal; */
- 0x00, /* u8 itd_iTerminal; */
-
- /* output terminal descriptor */
- 0x09, /* u8 otd_bLength; */
- 0x24, /* u8 otd_bDescriptorType; CS_INTERFACE */
- 0x03, /* u8 otd_bDescriptorSubtype;
VC_OUTPUT_TERMINAL */
- 0x03, /* u8 otd_bTerminalID; */
- 0x01, 0x01, /* u16 otd_wTerminalType; TT_STREAMING */
- 0x00, /* u8 otd_bAssocTerminal; No association */
- 0x05, /* u8 otd_bSourceID; */
- 0x00, /* u8 otd_iTerminal; */
-
- /* selector unit descriptor */
- 0x08, /* u8 sud_bLength; */
- 0x24, /* u8 sud_bDescriptorType; CS_INTERFACE */
- 0x04, /* u8 sud_bDescriptorSubtype;
VC_SELECTOR_UNIT */
- 0x04, /* u8 sud_bUnitID; */
- 0x02, /* u8 sud_bNrInPins; */
- 0x01, /* u8 sud_baSourceID; */
- 0x02,
- 0x00, /* u8 sud_iSelector; */
-
- /* processing unit descriptor */
- 0x0B, /* u8 pud_bLength; */
- 0x24, /* u8 pud_bDescriptorType; CS_INTERFACE */
- 0x05, /* u8 pud_bDescriptorSubtype;
VC_PROCESSING_UNIT */
- 0x05, /* u8 pud_bUnitID; */
- 0x04, /* u8 pud_bSourceID; */
- 0x00, 0x00, /* u16 pud_wMaxMultiplier; */
- 0x02, /* u8 pud_bControlSize; */
- 0x01, 0x00, /* u16 pud_bmControls; Brightness control
supported */
- 0x00, /* u8 pud_iProcessing; */
-
- /* standard interrupt endpoint */
- 0x07, /* u8 ep_bLenght; */
- 0x05, /* u8 ep_bDescriptorType; Endpoint */
- 0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
- 0x03, /* u8 ep_bmAttributes; Interrupt */
- 0x08, 0x00, /* u8 ep_wMaxPacketSize; 8 bytes */
- 0xFF, /* u8 ep_bInterval; 32ms */
-
- /* class-specific interrupt endpoint */
- 0x05, /* u8 ep_bLenght; */
- 0x25, /* u8 ep_bDescriptorType; CS_ENDPOINT */
- 0x03, /* u8 ep_bmAttributes; EP_INTERRUPT */
- 0x08, 0x00, /* u8 ep_wMaxPacketSize; 8 bytes */
-
- /* standard vs interface descriptor alternate 0 */
- 0x09, /* u8 bLength; */
- 0x04, /* u8 bDescriptorType; INTERFACE */
- 0x01, /* u8 bInterfaceNumber; */
- 0x00, /* u8 bAlternateSetting; */
- 0x01, /* u8 bNumEndpoints; */
- 0x0E, /* u8 bInterfaceClass; CC_VIDEO */
- 0x02, /* u8 bInterfaceSubClass; SC_VIDEO_STREAMING
*/
- 0x00, /* u8 bInterfaceProtocol;
PC_PROTOCOL_UNDEFINED */
- 0x00, /* u8 iInterface; Unused */
-
- /* class-specific vs header descriptor input alternate 0 */
- 0x0E, /* u8 bLength; */
- 0x24, /* u8 bDescriptorType; CS_INTERFACE */
- 0x01, /* u8 bDescriptorSubtype; VS_INPUT_HEADER */
- 0x01, /* u8 bNumFormats; */
- 0x46, 0x00, /* u8 wTotalLength; */
- 0x82, /* u8 bEndpointAddress; */
- 0x00, /* u8 bmInfo; */
- 0x03, /* u8 bTerminalLink; */
- 0x00, /* u8 bStillCaptureMethod; */
- 0x00, /* u8 bTriggerSupport; */
- 0x00, /* u8 bTriggerUsage; */
- 0x01, /* u8 bControlSize; */
- 0x00, /* u8 bmaControls; */
-
- /* class-specific vs format descriptor alternate 0 */
- 0x0B, /* u8 bLength; */
- 0x24, /* u8 bDescriptorType; CS_INTERFACE */
- 0x06, /* u8 bDescriptorSubtype; VS_FORMAT_MJPEG */
- 0x01, /* u8 bFormatIndex; */
- 0x01, /* u8 bNumFrameDescriptors; */
- 0x01, /* u8 bmFlags; */
- 0x01, /* u8 bDefaultFrameIndex; */
- 0x00, /* u8 bAspectRatioX; */
- 0x00, /* u8 bAspectRatioY; */
- 0x02, /* u8 bmInterlaceFlags; */
- 0x00, /* u8 bCopyProtect; */
-
- /* class-specific vs frame descriptor alternate 0 */
- 0x26, /* u8 bLength; */
- 0x24, /* u8 bDescriptorType; CS_INTERFACE */
- 0x07, /* u8 bDescriptorSubtype; VS_FRAME_MJPEG */
- 0x01, /* u8 bFrameIndex; */
- 0x01, /* u8 bmCapabilities; */
- 0x40, 0x01, /* u8 wWidth; 320 */
- 0xF0, 0x00, /* u8 wHeight; 240 */
- 0x00, 0xEC,
- 0x0D, 0x00, /* u32 dwMinBitRate; */
- 0x00, 0xEC,
- 0x0D, 0x00, /* u32 dwMaxBitRate; */
- 0x72, 0xCE,
- 0x00, 0x00, /* u32 dwMaxVideoFrameBufSize; */
- 0x2A, 0x2C,
- 0x0A, 0x00, /* u32 dwDefaultFrameInterval; */
- 0x00, /* u8 bFrameIntervalType; */
- 0x2A, 0x2C,
- 0x0A, 0x00, /* u32 dwMinFrameInterval; */
- 0x2A, 0x2C,
- 0x0A, 0x00, /* u32 dwMaxFrameInterval; */
- 0x00, 0x00,
- 0x00, 0x00, /* u32 dwFrameIntervalStep; */
-
- /* standard vs isochronous video data endpoint descriptor */
- 0x07, /* u8 bLength; */
- 0x05, /* u8 bDescriptorType; */
- 0x82, /* u8 bEndpointAddress; IN endpoint 2 */
- 0x02, /* u8 bmAttributes; Isochronous transfer,
asynchronous sync */
- 0x40, 0x00, /* u16 wMaxPacketSize; 510 bytes */
- 0x00 /* u8 bInterval; */
+
+ /* one configuration */
+ 0x09, /* u8 bLength; */
+ 0x02, /* u8 bDescriptorType; Configuration */
+ 0xB7, 0x00, /* u16 wTotalLength; */
+ 0x02, /* u8 bNumInterfaces; (2) */
+ 0x01, /* u8 bConfigurationValue; */
+ 0x00, /* u8 iConfiguration; */
+ 0x80, /* u8 bmAttributes;
+ Bit 7: must be set,
+ 6: Self-powered,
+ 5: Remote wakeup,
+ 4..0: resvd */
+ 0xFA, /* u8 MaxPower; */
+
+ /* interface association */
+ 0x08, /* u8 ifa_bLength; */
+ 0x0B, /* u8 ifa_bDescriptorType; Interface Association */
+ 0x00, /* u8 ifa_bFirstInterface; */
+ 0x02, /* u8 ifa_bInterfaceCount; */
+ 0x0E, /* u8 ifa_bFunctionClass; CC_VIDEO */
+ 0x03, /* u8 ifa_bFunctionSubClass; SS_VIDEO_INTERFACE_COLLECTION */
+ 0x00, /* u8 ifa_bFunctionProtocol; unused */
+ 0x02, /* u8 ifa_iFunction; */
+
+ /* video control interface */
+ 0x09, /* u8 if_bLength; */
+ 0x04, /* u8 if_bDescriptorType; Interface */
+ 0x00, /* u8 if_bInterfaceNumber; */
+ 0x00, /* u8 if_bAlternateSetting; */
+ 0x01, /* u8 if_bNumEndpoints; */
+ 0x0E, /* u8 if_bInterfaceClass; CC_VIDEO */
+ 0x01, /* u8 if_bInterfaceSubClass; SC_VIDEOCONTROL */
+ 0x00, /* u8 if_bInterfaceProtocol; unused */
+ 0x02, /* u8 if_iInterface; */
+
+ /* class specific vc interface descriptor */
+ 0x0D, /* u8 cif_bLength; */
+ 0x24, /* u8 cif_bDescriptorType; CS_INTERFACE */
+ 0x01, /* u8 cif_bDescriptorSubType; VC_HEADER */
+ 0x00, 0x01, /* u16 cif_bcdUVC; 1.0 */
+ 0x42, 0x00, /* u16 cif_wTotalLength */
+ 0x80, 0x8D, /* u32 cif_dwClockFrequency; Deprecated, 6Mhz */
+ 0x5B, 0x00,
+ 0x01, /* u8 cif_bInCollection; */
+ 0x01, /* u8 cif_baInterfaceNr; */
+
+ /* input terminal descriptor */
+ 0x11, /* u8 itd_bLength; */
+ 0x24, /* u8 itd_bDescriptorType; CS_INTERFACE */
+ 0x02, /* u8 itd_bDescriptorSubtype; VC_INPUT_TERMINAL */
+ 0x01, /* u8 itd_bTerminalID; */
+ 0x01, 0x02, /* u16 itd_wTerminalType; ITT_CAMERA */
+ 0x00, /* u8 itd_bAssocTerminal; No association */
+ 0x00, /* u8 itd_iTerminal; Unused */
+ 0x00, 0x00, /* u16 itd_wObjectiveFocalLengthMin; No optical zoom */
+ 0x00, 0x00, /* u16 itd_wObjectiveFocalLengthMax; No optical zoom */
+ 0x00, 0x00, /* u16 itd_wOcularFocalLength; No optical zoom */
+ 0x02, /* u8 itd_bControlSize; No controls implemented */
+ 0x00, 0x00, /* u16 itd_bmControls; No controls supported */
+
+ 0x08, /* u8 itd_bLength; */
+ 0x24, /* u8 itd_bDescriptorType; CS_INTERFACE */
+ 0x02, /* u8 itd_bDescriptorSubtype; VC_INPUT_TERMINAL */
+ 0x02, /* u8 itd_bTerminalID; */
+ 0x01, 0x04, /* u16 itd_wTerminalType; ITT_COMPOSITE */
+ 0x00, /* u8 itd_bAssocTerminal; */
+ 0x00, /* u8 itd_iTerminal; */
+
+ /* output terminal descriptor */
+ 0x09, /* u8 otd_bLength; */
+ 0x24, /* u8 otd_bDescriptorType; CS_INTERFACE */
+ 0x03, /* u8 otd_bDescriptorSubtype; VC_OUTPUT_TERMINAL */
+ 0x03, /* u8 otd_bTerminalID; */
+ 0x01, 0x01, /* u16 otd_wTerminalType; TT_STREAMING */
+ 0x00, /* u8 otd_bAssocTerminal; No association */
+ 0x05, /* u8 otd_bSourceID; */
+ 0x00, /* u8 otd_iTerminal; */
+
+ /* selector unit descriptor */
+ 0x08, /* u8 sud_bLength; */
+ 0x24, /* u8 sud_bDescriptorType; CS_INTERFACE */
+ 0x04, /* u8 sud_bDescriptorSubtype; VC_SELECTOR_UNIT */
+ 0x04, /* u8 sud_bUnitID; */
+ 0x02, /* u8 sud_bNrInPins; */
+ 0x01, /* u8 sud_baSourceID; */
+ 0x02,
+ 0x00, /* u8 sud_iSelector; */
+
+ /* processing unit descriptor */
+ 0x0B, /* u8 pud_bLength; */
+ 0x24, /* u8 pud_bDescriptorType; CS_INTERFACE */
+ 0x05, /* u8 pud_bDescriptorSubtype; VC_PROCESSING_UNIT */
+ 0x05, /* u8 pud_bUnitID; */
+ 0x04, /* u8 pud_bSourceID; */
+ 0x00, 0x00, /* u16 pud_wMaxMultiplier; */
+ 0x02, /* u8 pud_bControlSize; */
+ 0x01, 0x00, /* u16 pud_bmControls; Brightness control supported */
+ 0x00, /* u8 pud_iProcessing; */
+
+ /* standard interrupt endpoint */
+ 0x07, /* u8 ep_bLenght; */
+ 0x05, /* u8 ep_bDescriptorType; Endpoint */
+ 0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
+ 0x03, /* u8 ep_bmAttributes; Interrupt */
+ 0x08, 0x00, /* u8 ep_wMaxPacketSize; 8 bytes */
+ 0xFF, /* u8 ep_bInterval; 32ms */
+
+ /* class-specific interrupt endpoint */
+ 0x05, /* u8 ep_bLenght; */
+ 0x25, /* u8 ep_bDescriptorType; CS_ENDPOINT */
+ 0x03, /* u8 ep_bmAttributes; EP_INTERRUPT */
+ 0x08, 0x00, /* u8 ep_wMaxPacketSize; 8 bytes */
+
+ /* standard vs interface descriptor alternate 0 */
+ 0x09, /* u8 bLength; */
+ 0x04, /* u8 bDescriptorType; INTERFACE */
+ 0x01, /* u8 bInterfaceNumber; */
+ 0x00, /* u8 bAlternateSetting; */
+ 0x01, /* u8 bNumEndpoints; */
+ 0x0E, /* u8 bInterfaceClass; CC_VIDEO */
+ 0x02, /* u8 bInterfaceSubClass; SC_VIDEO_STREAMING */
+ 0x00, /* u8 bInterfaceProtocol; PC_PROTOCOL_UNDEFINED */
+ 0x00, /* u8 iInterface; Unused */
+
+ /* class-specific vs header descriptor input alternate 0 */
+ 0x0E, /* u8 bLength; */
+ 0x24, /* u8 bDescriptorType; CS_INTERFACE */
+ 0x01, /* u8 bDescriptorSubtype; VS_INPUT_HEADER */
+ 0x01, /* u8 bNumFormats; */
+ 0x46, 0x00, /* u8 wTotalLength; */
+ 0x82, /* u8 bEndpointAddress; */
+ 0x00, /* u8 bmInfo; */
+ 0x03, /* u8 bTerminalLink; */
+ 0x00, /* u8 bStillCaptureMethod; */
+ 0x00, /* u8 bTriggerSupport; */
+ 0x00, /* u8 bTriggerUsage; */
+ 0x01, /* u8 bControlSize; */
+ 0x00, /* u8 bmaControls; */
+
+ /* class-specific vs format descriptor alternate 0 */
+ 0x0B, /* u8 bLength; */
+ 0x24, /* u8 bDescriptorType; CS_INTERFACE */
+ 0x06, /* u8 bDescriptorSubtype; VS_FORMAT_MJPEG */
+ 0x01, /* u8 bFormatIndex; */
+ 0x01, /* u8 bNumFrameDescriptors; */
+ 0x01, /* u8 bmFlags; */
+ 0x01, /* u8 bDefaultFrameIndex; */
+ 0x00, /* u8 bAspectRatioX; */
+ 0x00, /* u8 bAspectRatioY; */
+ 0x02, /* u8 bmInterlaceFlags; */
+ 0x00, /* u8 bCopyProtect; */
+
+ /* class-specific vs frame descriptor alternate 0 */
+ 0x26, /* u8 bLength; */
+ 0x24, /* u8 bDescriptorType; CS_INTERFACE */
+ 0x07, /* u8 bDescriptorSubtype; VS_FRAME_MJPEG */
+ 0x01, /* u8 bFrameIndex; */
+ 0x01, /* u8 bmCapabilities; */
+ 0x40, 0x01, /* u8 wWidth; 320 */
+ 0xF0, 0x00, /* u8 wHeight; 240 */
+ 0x00, 0xEC,
+ 0x0D, 0x00, /* u32 dwMinBitRate; */
+ 0x00, 0xEC,
+ 0x0D, 0x00, /* u32 dwMaxBitRate; */
+ 0x72, 0xCE,
+ 0x00, 0x00, /* u32 dwMaxVideoFrameBufSize; */
+ 0x2A, 0x2C,
+ 0x0A, 0x00, /* u32 dwDefaultFrameInterval; */
+ 0x00, /* u8 bFrameIntervalType; */
+ 0x2A, 0x2C,
+ 0x0A, 0x00, /* u32 dwMinFrameInterval; */
+ 0x2A, 0x2C,
+ 0x0A, 0x00, /* u32 dwMaxFrameInterval; */
+ 0x00, 0x00,
+ 0x00, 0x00, /* u32 dwFrameIntervalStep; */
+
+ /* standard vs isochronous video data endpoint descriptor */
+ 0x07, /* u8 bLength; */
+ 0x05, /* u8 bDescriptorType; */
+ 0x82, /* u8 bEndpointAddress; IN endpoint 2 */
+ 0x02, /* u8 bmAttributes; Isochronous transfer, asynchronous sync
*/
+ 0x40, 0x00, /* u16 wMaxPacketSize; 510 bytes */
+ 0x00 /* u8 bInterval; */
};
static void get_frame_read(void)
{
- DPRINTF("Getting frame.\n");
- frame = frame_start;
- frame_length = read(v4l2_fd, frame, frame_max_length);
-
- if(frame_length == -1)
- {
- DPRINTF("Error while reading frame.\n");
- frame_length = 0;
- }
- else
- {
- frame_id = frame_id ^ 1;
- first_bulk_packet = 1;
- frame_remaining_bytes = frame_length;
- DPRINTF("Got a frame of %d bytes.\n", frame_length);
- }
-
- return;
+ DPRINTF("Getting frame.\n");
+ frame = frame_start;
+ frame_length = read(v4l2_fd, frame, frame_max_length);
+
+ if (frame_length == -1) {
+ DPRINTF("Error while reading frame.\n");
+ frame_length = 0;
+ } else {
+ frame_id = frame_id ^ 1;
+ first_bulk_packet = 1;
+ frame_remaining_bytes = frame_length;
+ DPRINTF("Got a frame of %d bytes.\n", frame_length);
+ }
+
+ return;
}
static void usb_uvc_handle_reset(USBDevice *dev)
{
- DPRINTF("Reset called\n");
+ DPRINTF("Reset called\n");
}
static int usb_uvc_handle_control(USBDevice *dev, USBPacket *p, int request,
int value, int index, int length,
uint8_t *data)
{
- int ret = 0;
- USBUVCState *s = (USBUVCState *)dev;
-
- DPRINTF("Control called\n");
- // DPRINTF("Request: 0x%08X\n", request);
- // DPRINTF("Value: 0x%08X\n", value);
- // DPRINTF("Index: 0x%08X\n", index);
- // DPRINTF("Length: 0x%08X\n", length);
-
- switch(request)
- {
- case DeviceRequest | USB_REQ_GET_STATUS:
- DPRINTF("USB Request: Get Status\n");
- data[0] = (1 << USB_DEVICE_SELF_POWERED) |
- (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
- data[1] = 0x00;
- ret = 2;
- break;
- case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
- DPRINTF("USB Request: Clear feature\n");
- if (value == USB_DEVICE_REMOTE_WAKEUP) {
- DPRINTF("USB Request: Unset remote wakeup\n");
- dev->remote_wakeup = 0;
- } else {
- goto fail;
- }
- ret = 0;
- break;
- case DeviceOutRequest | USB_REQ_SET_FEATURE:
- DPRINTF("USB Request: Set feature\n");
- if (value == USB_DEVICE_REMOTE_WAKEUP) {
- DPRINTF("USB Request: Set remote wakeup\n");
- dev->remote_wakeup = 1;
- } else {
- goto fail;
- }
- ret = 0;
- break;
- case DeviceOutRequest | USB_REQ_SET_ADDRESS:
- DPRINTF("USB Request: Set address to 0x%08X\n", value);
- dev->addr = value;
- ret = 0;
- break;
- case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
- DPRINTF("USB Request: Get descriptor\n");
- switch(value >> 8) {
- case USB_DT_DEVICE:
- DPRINTF("USB Request: Get device
descriptor\n");
- memcpy(data, qemu_uvc_dev_descriptor,
-
sizeof(qemu_uvc_dev_descriptor));
- ret = sizeof(qemu_uvc_dev_descriptor);
- break;
- case USB_DT_CONFIG:
- DPRINTF("USB Request: Get configuration
descriptor\n");
- memcpy(data, qemu_uvc_config_descriptor,
-
sizeof(qemu_uvc_config_descriptor));
- ret =
sizeof(qemu_uvc_config_descriptor);
- break;
- case USB_DT_STRING:
- DPRINTF("USB Request: Get device
strings\n");
- switch(value & 0xff) {
- case 0:
- DPRINTF("USB Request:
Get language IDs\n");
- /* language ids */
- data[0] = 4;
- data[1] = 3;
- data[2] = 0x09;
- data[3] = 0x04;
- ret = 4;
- break;
- case 1:
- /* vendor description */
- DPRINTF("USB Request:
Get vendor string\n");
- ret =
set_usb_string(data, "QEMU " QEMU_VERSION);
- break;
- case 2:
- /* product description
*/
- DPRINTF("USB Request:
Get product string\n");
- ret =
set_usb_string(data, "QEMU USB VIDEO CLASS 2");
- break;
- case 3:
- /* serial number */
- DPRINTF("USB Request:
Get serial number string\n");
- ret =
set_usb_string(data, "1");
- break;
- default:
- goto fail;
- }
- break;
- default:
- goto fail;
- }
- break;
- case DeviceRequest | USB_REQ_GET_CONFIGURATION:
- DPRINTF("USB Request: Get configuration\n");
- data[0] = 1;
- ret = 1;
- break;
- case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
- DPRINTF("USB Request: Set configuration\n");
- ret = 0;
- break;
- case DeviceRequest | USB_REQ_GET_INTERFACE:
- DPRINTF("USB Request: Get interface\n");
- data[0] = 0;
- ret = 1;
- break;
- case DeviceOutRequest | USB_REQ_SET_INTERFACE:
- DPRINTF("USB Request: Set interface\n");
- ret = 0;
- break;
- case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
- DPRINTF("USB Request: Clear endpoint\n");
- ret = 0;
- break;
- case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
- DPRINTF("USB Request: Set interface\n");
- ret = 0;
- break;
- /* Class specific requests. */
- case UVCGetVideoControl | USB_UVC_GET_CUR:
- ret = 0;
-
- if((index&0xFF) == 0x01 && ((value&0xFF00) == 0x0100 ||
(value&0xFF00) == 0x0200))
- {
- DPRINTF("USB Request: Get video control current
setting attribute for interface %d\n", index&0xFF);
- if((value&0xFF00) == 0x0100)
- DPRINTF("\tVS_PROBE_CONTROL\n");
- else
- DPRINTF("\tVS_COMMIT_CONTROL\n");
-
- if(length != 26)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 26 bytes\n", length);
- goto fail;
- }
-
- data[0] = 0; // bmHint
- data[1] = 0;
- data[2] = 1; // bFormatIndex
- data[3] = 1; // bFrameIndex
- data[4] = 0x2A; // dwFrameInterval
- data[5] = 0x2C;
- data[6] = 0x0A;
- data[7] = 0x00;
- data[8] = 0; // wKeyFrameRate
- data[9] = 0;
- data[10] = 0; // wPFrameRate
- data[11] = 0;
- data[12] = 0; // wCompQuality
- data[13] = 0;
- data[14] = 1; // wCompWindowSize
- data[15] = 0;
- data[16] = 0x20; // wDelay
- data[17] = 0;
- data[18] = 0x72; // dwMaxVideoFrameSize
- data[19] = 0xCE;
- data[20] = 0x00;
- data[21] = 0x00;
- data[22] = 0x72; // dwMaxPayloadTransferSize
- data[23] = 0xCE;
- data[24] = 0x00;
- data[25] = 0x00;
- ret = 26;
- }
- else if((index&0xFF00) == 0x0400 && (value&0xFF00) ==
0x0100) // Setting input
- {
- DPRINTF("USB Request: Asking for current
input\n");
- if(length != 1)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 1 byte\n", length);
- goto fail;
- }
-
- data[0] = s->current_input;
- ret = 1;
- }
- else if((index&0xFF00) == 0x0500 && (value&0xFF00) ==
0x0200) // PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT
- {
- DPRINTF("USB Resquest: Asking for current
brightness\n");
- if(length != 2)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 2 bytes\n", length);
- goto fail;
- }
-
- data[0] = 1;
- data[1] = 0;
- ret = 2;
- }
- else
- goto fail;
- break;
- case UVCGetVideoControl | USB_UVC_GET_MIN:
- ret = 0;
-
- if((index&0xFF) == 0x01 && ((value&0xFF00) == 0x0100 ||
(value&0xFF00) == 0x0200))
- {
- DPRINTF("USB Request: Get video control minimum
setting attribute for interface %d\n", index&0xFF);
-
- if(length != 26)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 26 bytes\n", length);
- goto fail;
- }
-
- data[0] = 0; // bmHint
- data[1] = 0;
- data[2] = 1; // bFormatIndex
- data[3] = 1; // bFrameIndex
- data[4] = 0x2A; // dwFrameInterval
- data[5] = 0x2C;
- data[6] = 0x0A;
- data[7] = 0x00;
- data[8] = 0; // wKeyFrameRate
- data[9] = 0;
- data[10] = 0; // wPFrameRate
- data[11] = 0;
- data[12] = 0; // wCompQuality
- data[13] = 0;
- data[14] = 1; // wCompWindowSize
- data[15] = 0;
- data[16] = 0x20; // wDelay
- data[17] = 0;
- data[18] = 0x72; // dwMaxVideoFrameSize
- data[19] = 0xCE;
- data[20] = 0x00;
- data[21] = 0x00;
- data[22] = 0x72; // dwMaxPayloadTransferSize
- data[23] = 0xCE;
- data[24] = 0x00;
- data[25] = 0x00;
- ret = 26;
- }
- else if((index&0xFF00) == 0x0400 && (value&0xFF00) ==
0x0100) // Setting input
- {
- DPRINTF("USB Request: Asking for minimum
input\n");
- if(length != 1)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 1 byte\n", length);
- goto fail;
- }
-
- data[0] = 0;
- ret = 1;
- }
- else if((index&0xFF00) == 0x0500 && (value&0xFF00) ==
0x0200) // PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT
- {
- DPRINTF("USB Resquest: Asking for minimum
brightness\n");
- if(length != 2)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 2 bytes\n", length);
- goto fail;
- }
-
- data[0] = 1;
- data[1] = 0;
- ret = 2;
- }
- else
- goto fail;
- break;
- case UVCGetVideoControl | USB_UVC_GET_MAX:
- if((index&0xFF) == 0x01 && ((value&0xFF00) == 0x0100 ||
(value&0xFF00) == 0x0200))
- {
- DPRINTF("USB Request: Get video control maximum
setting attribute for interface %d\n", index&0xFF);
-
- if(length != 26)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 26 bytes\n", length);
- goto fail;
- }
-
- data[0] = 0; // bmHint
- data[1] = 0;
- data[2] = 1; // bFormatIndex
- data[3] = 1; // bFrameIndex
- data[4] = 0x2A; // dwFrameInterval
- data[5] = 0x2C;
- data[6] = 0x0A;
- data[7] = 0x00;
- data[8] = 0; // wKeyFrameRate
- data[9] = 0;
- data[10] = 0; // wPFrameRate
- data[11] = 0;
- data[12] = 0; // wCompQuality
- data[13] = 0;
- data[14] = 1; // wCompWindowSize
- data[15] = 0;
- data[16] = 0x20; // wDelay
- data[17] = 0;
- data[18] = 0x72; // dwMaxVideoFrameSize
- data[19] = 0xCE;
- data[20] = 0x00;
- data[21] = 0x00;
- data[22] = 0x72; // dwMaxPayloadTransferSize
- data[23] = 0xCE;
- data[24] = 0x00;
- data[25] = 0x00;
- ret = 26;
- }
- else if((index&0xFF00) == 0x0400 && (value&0xFF00) ==
0x0100) // Setting input
- {
- DPRINTF("USB Request: Asking maximum input\n");
- if(length != 1)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 1 byte\n", length);
- goto fail;
- }
-
- data[0] = 1;
- ret = 1;
- }
- else if((index&0xFF00) == 0x0500 && (value&0xFF00) ==
0x0200) // PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT
- {
- DPRINTF("USB Resquest: Asking for maximum
brightness\n");
- if(length != 2)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 2 bytes\n", length);
- goto fail;
- }
-
- data[0] = 1;
- data[1] = 0;
- ret = 2;
- }
- else
- goto fail;
- break;
- case UVCGetVideoControl | USB_UVC_GET_DEF:
- if((index&0xFF) == 0x01 && ((value&0xFF00) == 0x0100 ||
(value&0xFF00) == 0x0200))
- {
- DPRINTF("USB Request: Get video control default
setting attribute for interface %d\n", index&0xFF);
-
- if(length != 26)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 26 bytes\n", length);
- goto fail;
- }
-
- data[0] = 0; // bmHint
- data[1] = 0;
- data[2] = 1; // bFormatIndex
- data[3] = 1; // bFrameIndex
- data[4] = 0x2A; // dwFrameInterval
- data[5] = 0x2C;
- data[6] = 0x0A;
- data[7] = 0x00;
- data[8] = 0; // wKeyFrameRate
- data[9] = 0;
- data[10] = 0; // wPFrameRate
- data[11] = 0;
- data[12] = 0; // wCompQuality
- data[13] = 0;
- data[14] = 1; // wCompWindowSize
- data[15] = 0;
- data[16] = 0x20; // wDelay
- data[17] = 0;
- data[18] = 0x72; // dwMaxVideoFrameSize
- data[19] = 0xCE;
- data[20] = 0x00;
- data[21] = 0x00;
- data[22] = 0x72; // dwMaxPayloadTransferSize
- data[23] = 0xCE;
- data[24] = 0x00;
- data[25] = 0x00;
- ret = 26;
- }
- else if((index&0xFF00) == 0x0400 && (value&0xFF00) ==
0x0100) // Setting input
- {
- DPRINTF("USB Request: Asking for default
input\n");
- if(length != 1)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 1 byte\n", length);
- goto fail;
- }
-
- data[0] = 0;
- ret = 1;
- }
- else if((index&0xFF00) == 0x0500 && (value&0xFF00) ==
0x0200) // PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT
- {
- DPRINTF("USB Resquest: Asking for default
brightness\n");
- if(length != 2)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 2 bytes\n", length);
- goto fail;
- }
-
- data[0] = 1;
- data[1] = 0;
- ret = 2;
- }
- else
- goto fail;
- break;
- case UVCSetVideoControl | USB_UVC_SET_CUR:
- DPRINTF("USB Request: Set video control setting
attribute for interface %d\n", index&0xFF);
-
- ret = 0;
-
- if((index&0xFF) == 0x01 && ((value&0xFF00) == 0x0100 ||
(value&0xFF00) == 0x0200))
- {
- if((value&0xFF00) == 0x0100)
- DPRINTF("\tVS_PROBE_CONTROL\n");
- else
- DPRINTF("\tVS_COMMIT_CONTROL\n");
-
- if(length != 26)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 26 bytes\n", length);
- goto fail;
- }
-
- DPRINTF("\tbmHint = 0x%02X%02X\n", data[1],
data[0]);
- DPRINTF("\tbFormatIndex = %d\n", data[2]);
- DPRINTF("\tbFrameIndex = %d\n", data[3]);
- DPRINTF("\tdwFrameInterval =
0x%02X%02X%02X%02X\n", data[7], data[6], data[5], data[4]);
- DPRINTF("\twKeyFrameRate = 0x%02X%02X\n",
data[9], data[8]);
- DPRINTF("\twPFrameRate = 0x%02X%02X\n",
data[11], data[10]);
- DPRINTF("\twCompQuality = 0x%02X%02X\n",
data[13], data[12]);
- DPRINTF("\twCompWindowSize = 0x%02X%02X\n",
data[15], data[14]);
- DPRINTF("\twDelay = 0x%02X%02X\n", data[17],
data[16]);
- DPRINTF("\tdwMaxVideoFrameSize=
0x%02X%02X%02X%02X\n", data[21], data[20], data[19], data[18]);
- DPRINTF("\tdwMaxPayloadTransferSize=
0x%02X%02X%02X%02X\n", data[25], data[24], data[23], data[22]);
-
- frame = frame_start;
- frame_remaining_bytes = frame_length;
- first_bulk_packet = 1;
-
- ret = 26;
- }
- else if((index&0xFF00) == 0x0400 && (value&0xFF00) ==
0x0100) // Setting input
- {
- DPRINTF("Setting input to %d\n", data[0]);
- if(length != 1)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 1 byte\n", length);
- goto fail;
- }
-
- s->current_input = data[0];
- ret = 1;
- }
- else if((index&0xFF00) == 0x0500 && (value&0xFF00) ==
0x0200) // PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT
- {
- DPRINTF("USB Resquest: Setting brightness,
value stays the same\n");
- if(length != 2)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 2 bytes\n", length);
- goto fail;
- }
-
- ret = 2;
- }
- else
- goto fail;
- break;
- case UVCGetVideoControl | USB_UVC_GET_RES:
- if((index&0xFF00) == 0x0500 && (value&0xFF00) ==
0x0200) // PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT
- {
- DPRINTF("USB Resquest: Asking for brightness
resolution\n");
- if(length != 2)
- {
- DPRINTF("USB Request: Requested %d
bytes, expected 2 bytes\n", length);
- goto fail;
- }
-
- data[0] = 1;
- data[1] = 0;
- ret = 2;
- }
- else
- goto fail;
- break;
- default:
- fail:
- DPRINTF("USB Request: Unhandled control request\n");
- DPRINTF("\tRequest: 0x%08X\n", request);
- DPRINTF("\tValue: 0x%08X\n", value);
- DPRINTF("\tIndex: 0x%08X\n", index);
- DPRINTF("\tLength: 0x%08X\n", length);
- ret = USB_RET_STALL;
- break;
+ int ret = 0;
+ USBUVCState *s = (USBUVCState *)dev;
+
+ DPRINTF("Control called\n");
+ /* DPRINTF("Request: 0x%08X\n", request);
+ DPRINTF("Value: 0x%08X\n", value);
+ DPRINTF("Index: 0x%08X\n", index);
+ DPRINTF("Length: 0x%08X\n", length); */
+
+ switch (request) {
+ case DeviceRequest | USB_REQ_GET_STATUS:
+ DPRINTF("USB Request: Get Status\n");
+ data[0] = (1 << USB_DEVICE_SELF_POWERED) |
+ (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
+ data[1] = 0x00;
+ ret = 2;
+ break;
+ case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
+ DPRINTF("USB Request: Clear feature\n");
+ if (value == USB_DEVICE_REMOTE_WAKEUP) {
+ DPRINTF("USB Request: Unset remote wakeup\n");
+ dev->remote_wakeup = 0;
+ } else {
+ goto fail;
+ }
+ ret = 0;
+ break;
+ case DeviceOutRequest | USB_REQ_SET_FEATURE:
+ DPRINTF("USB Request: Set feature\n");
+ if (value == USB_DEVICE_REMOTE_WAKEUP) {
+ DPRINTF("USB Request: Set remote wakeup\n");
+ dev->remote_wakeup = 1;
+ } else {
+ goto fail;
+ }
+ ret = 0;
+ break;
+ case DeviceOutRequest | USB_REQ_SET_ADDRESS:
+ DPRINTF("USB Request: Set address to 0x%08X\n", value);
+ dev->addr = value;
+ ret = 0;
+ break;
+ case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
+ DPRINTF("USB Request: Get descriptor\n");
+ switch (value >> 8) {
+ case USB_DT_DEVICE:
+ DPRINTF("USB Request: Get device descriptor\n");
+ memcpy(data, qemu_uvc_dev_descriptor,
+ sizeof(qemu_uvc_dev_descriptor));
+ ret = sizeof(qemu_uvc_dev_descriptor);
+ break;
+ case USB_DT_CONFIG:
+ DPRINTF("USB Request: Get configuration descriptor\n");
+ memcpy(data, qemu_uvc_config_descriptor,
+ sizeof(qemu_uvc_config_descriptor));
+ ret = sizeof(qemu_uvc_config_descriptor);
+ break;
+ case USB_DT_STRING:
+ DPRINTF("USB Request: Get device strings\n");
+ switch (value & 0xff) {
+ case 0:
+ DPRINTF("USB Request: Get language IDs\n");
+ /* language ids */
+ data[0] = 4;
+ data[1] = 3;
+ data[2] = 0x09;
+ data[3] = 0x04;
+ ret = 4;
+ break;
+ case 1:
+ /* vendor description */
+ DPRINTF("USB Request: Get vendor string\n");
+ ret = set_usb_string(data, "QEMU " QEMU_VERSION);
+ break;
+ case 2:
+ /* product description */
+ DPRINTF("USB Request: Get product string\n");
+ ret = set_usb_string(data, "QEMU USB VIDEO CLASS 2");
+ break;
+ case 3:
+ /* serial number */
+ DPRINTF("USB Request: Get serial number string\n");
+ ret = set_usb_string(data, "1");
+ break;
+ default:
+ goto fail;
+ }
+ break;
+ default:
+ goto fail;
+ }
+ break;
+ case DeviceRequest | USB_REQ_GET_CONFIGURATION:
+ DPRINTF("USB Request: Get configuration\n");
+ data[0] = 1;
+ ret = 1;
+ break;
+ case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
+ DPRINTF("USB Request: Set configuration\n");
+ ret = 0;
+ break;
+ case DeviceRequest | USB_REQ_GET_INTERFACE:
+ DPRINTF("USB Request: Get interface\n");
+ data[0] = 0;
+ ret = 1;
+ break;
+ case DeviceOutRequest | USB_REQ_SET_INTERFACE:
+ DPRINTF("USB Request: Set interface\n");
+ ret = 0;
+ break;
+ case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
+ DPRINTF("USB Request: Clear endpoint\n");
+ ret = 0;
+ break;
+ case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
+ DPRINTF("USB Request: Set interface\n");
+ ret = 0;
+ break;
+ /* Class specific requests. */
+ case UVCGetVideoControl | USB_UVC_GET_CUR:
+ ret = 0;
+
+ if (((index & 0xFF) == 0x01) && (((value & 0xFF00) == 0x0100) ||
+ ((value & 0xFF00) == 0x0200))) {
+ DPRINTF("USB Request: Get video control current setting "
+ "attribute for interface %d\n", index & 0xFF);
+ if ((value & 0xFF00) == 0x0100) {
+ DPRINTF("\tVS_PROBE_CONTROL\n");
+ } else {
+ DPRINTF("\tVS_COMMIT_CONTROL\n");
+ }
+ if (length != 26) {
+ DPRINTF("USB Request: Requested %d bytes, expected 26 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 0; /* bmHint */
+ data[1] = 0;
+ data[2] = 1; /* bFormatIndex */
+ data[3] = 1; /* bFrameIndex */
+ data[4] = 0x2A; /* dwFrameInterval */
+ data[5] = 0x2C;
+ data[6] = 0x0A;
+ data[7] = 0x00;
+ data[8] = 0; /* wKeyFrameRate */
+ data[9] = 0;
+ data[10] = 0; /* wPFrameRate */
+ data[11] = 0;
+ data[12] = 0; /* wCompQuality */
+ data[13] = 0;
+ data[14] = 1; /* wCompWindowSize */
+ data[15] = 0;
+ data[16] = 0x20; /* wDelay */
+ data[17] = 0;
+ data[18] = 0x72; /* dwMaxVideoFrameSize */
+ data[19] = 0xCE;
+ data[20] = 0x00;
+ data[21] = 0x00;
+ data[22] = 0x72; /* dwMaxPayloadTransferSize */
+ data[23] = 0xCE;
+ data[24] = 0x00;
+ data[25] = 0x00;
+ ret = 26;
+ } else if (((index & 0xFF00) == 0x0400) &&
+ ((value & 0xFF00) == 0x0100)) {
+ /* Setting input */
+ DPRINTF("USB Request: Asking for current input\n");
+ if (length != 1) {
+ DPRINTF("USB Request: Requested %d bytes, expected 1 "
+ "byte\n", length);
+ goto fail;
+ }
+
+ data[0] = s->current_input;
+ ret = 1;
+ } else if (((index & 0xFF00) == 0x0500) &&
+ ((value & 0xFF00) == 0x0200)) {
+ /* PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT */
+ DPRINTF("USB Resquest: Asking for current brightness\n");
+ if (length != 2) {
+ DPRINTF("USB Request: Requested %d bytes, expected 2 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 1;
+ data[1] = 0;
+ ret = 2;
+ } else {
+ goto fail;
+ }
+ break;
+ case UVCGetVideoControl | USB_UVC_GET_MIN:
+ ret = 0;
+
+ if (((index & 0xFF) == 0x01) && (((value & 0xFF00) == 0x0100) ||
+ ((value & 0xFF00) == 0x0200))) {
+ DPRINTF("USB Request: Get video control minimum setting "
+ "attribute for interface %d\n", index&0xFF);
+
+ if (length != 26) {
+ DPRINTF("USB Request: Requested %d bytes, expected 26 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 0; /* bmHint */
+ data[1] = 0;
+ data[2] = 1; /* bFormatIndex */
+ data[3] = 1; /* bFrameIndex */
+ data[4] = 0x2A; /* dwFrameInterval */
+ data[5] = 0x2C;
+ data[6] = 0x0A;
+ data[7] = 0x00;
+ data[8] = 0; /* wKeyFrameRate */
+ data[9] = 0;
+ data[10] = 0; /* wPFrameRate */
+ data[11] = 0;
+ data[12] = 0; /* wCompQuality */
+ data[13] = 0;
+ data[14] = 1; /* wCompWindowSize */
+ data[15] = 0;
+ data[16] = 0x20; /* wDelay */
+ data[17] = 0;
+ data[18] = 0x72; /* dwMaxVideoFrameSize */
+ data[19] = 0xCE;
+ data[20] = 0x00;
+ data[21] = 0x00;
+ data[22] = 0x72; /* dwMaxPayloadTransferSize */
+ data[23] = 0xCE;
+ data[24] = 0x00;
+ data[25] = 0x00;
+ ret = 26;
+ } else if ((index&0xFF00) == 0x0400 && (value&0xFF00) == 0x0100) {
+ /* Setting input */
+ DPRINTF("USB Request: Asking for minimum input\n");
+ if (length != 1) {
+ DPRINTF("USB Request: Requested %d bytes, expected 1 "
+ "byte\n", length);
+ goto fail;
+ }
+
+ data[0] = 0;
+ ret = 1;
+ } else if ((index&0xFF00) == 0x0500 && (value&0xFF00) == 0x0200) {
+ /* PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT */
+ DPRINTF("USB Resquest: Asking for minimum brightness\n");
+ if (length != 2) {
+ DPRINTF("USB Request: Requested %d bytes, expected 2 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 1;
+ data[1] = 0;
+ ret = 2;
+ } else {
+ goto fail;
+ }
+ break;
+ case UVCGetVideoControl | USB_UVC_GET_MAX:
+ if (((index & 0xFF) == 0x01) && (((value & 0xFF00) == 0x0100) ||
+ ((value & 0xFF00) == 0x0200))) {
+ DPRINTF("USB Request: Get video control maximum setting "
+ "attribute for interface %d\n", index & 0xFF);
+
+ if (length != 26) {
+ DPRINTF("USB Request: Requested %d bytes, expected 26 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 0; /* bmHint */
+ data[1] = 0;
+ data[2] = 1; /* bFormatIndex */
+ data[3] = 1; /* bFrameIndex */
+ data[4] = 0x2A; /* dwFrameInterval */
+ data[5] = 0x2C;
+ data[6] = 0x0A;
+ data[7] = 0x00;
+ data[8] = 0; /* wKeyFrameRate */
+ data[9] = 0;
+ data[10] = 0; /* wPFrameRate */
+ data[11] = 0;
+ data[12] = 0; /* wCompQuality */
+ data[13] = 0;
+ data[14] = 1; /* wCompWindowSize */
+ data[15] = 0;
+ data[16] = 0x20; /* wDelay */
+ data[17] = 0;
+ data[18] = 0x72; /* dwMaxVideoFrameSize */
+ data[19] = 0xCE;
+ data[20] = 0x00;
+ data[21] = 0x00;
+ data[22] = 0x72; /* dwMaxPayloadTransferSize */
+ data[23] = 0xCE;
+ data[24] = 0x00;
+ data[25] = 0x00;
+ ret = 26;
+ } else if (((index & 0xFF00) == 0x0400) &&
+ ((value & 0xFF00) == 0x0100)) {
+ /* Setting input (*/
+ DPRINTF("USB Request: Asking maximum input\n");
+ if (length != 1) {
+ DPRINTF("USB Request: Requested %d bytes, expected 1 "
+ "byte\n", length);
+ goto fail;
+ }
+
+ data[0] = 1;
+ ret = 1;
+ } else if ((index&0xFF00) == 0x0500 && (value&0xFF00) == 0x0200) {
+ /* PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT */
+ DPRINTF("USB Resquest: Asking for maximum brightness\n");
+ if (length != 2) {
+ DPRINTF("USB Request: Requested %d bytes, expected 2 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 1;
+ data[1] = 0;
+ ret = 2;
+ } else {
+ goto fail;
+ }
+ break;
+ case UVCGetVideoControl | USB_UVC_GET_DEF:
+ if (((index & 0xFF) == 0x01) &&
+ ((value & 0xFF00) == 0x0100 || (value & 0xFF00) == 0x0200)) {
+ DPRINTF("USB Request: Get video control default setting "
+ "attribute for interface %d\n", index&0xFF);
+
+ if (length != 26) {
+ DPRINTF("USB Request: Requested %d bytes, expected 26 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 0; /* bmHint */
+ data[1] = 0;
+ data[2] = 1; /* bFormatIndex */
+ data[3] = 1; /* bFrameIndex */
+ data[4] = 0x2A; /* dwFrameInterval */
+ data[5] = 0x2C;
+ data[6] = 0x0A;
+ data[7] = 0x00;
+ data[8] = 0; /* wKeyFrameRate */
+ data[9] = 0;
+ data[10] = 0; /* wPFrameRate */
+ data[11] = 0;
+ data[12] = 0; /* wCompQuality */
+ data[13] = 0;
+ data[14] = 1; /* wCompWindowSize */
+ data[15] = 0;
+ data[16] = 0x20; /* wDelay */
+ data[17] = 0;
+ data[18] = 0x72; /* dwMaxVideoFrameSize */
+ data[19] = 0xCE;
+ data[20] = 0x00;
+ data[21] = 0x00;
+ data[22] = 0x72; /* dwMaxPayloadTransferSize */
+ data[23] = 0xCE;
+ data[24] = 0x00;
+ data[25] = 0x00;
+ ret = 26;
+ } else if ((index&0xFF00) == 0x0400 && (value&0xFF00) == 0x0100) {
+ /* Setting input */
+ DPRINTF("USB Request: Asking for default input\n");
+ if (length != 1) {
+ DPRINTF("USB Request: Requested %d bytes, expected 1 "
+ "byte\n", length);
+ goto fail;
+ }
+
+ data[0] = 0;
+ ret = 1;
+ } else if ((index&0xFF00) == 0x0500 && (value&0xFF00) == 0x0200) {
+ /* PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT */
+ DPRINTF("USB Resquest: Asking for default brightness\n");
+ if (length != 2) {
+ DPRINTF("USB Request: Requested %d bytes, expected 2 "
+ "bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 1;
+ data[1] = 0;
+ ret = 2;
+ } else {
+ goto fail;
+ }
+ break;
+ case UVCSetVideoControl | USB_UVC_SET_CUR:
+ DPRINTF("USB Request: Set video control setting attribute for "
+ "interface %d\n", index & 0xFF);
+
+ ret = 0;
+
+ if (((index & 0xFF) == 0x01) &&
+ ((value & 0xFF00) == 0x0100 || (value & 0xFF00) == 0x0200)) {
+ if ((value & 0xFF00) == 0x0100) {
+ DPRINTF("\tVS_PROBE_CONTROL\n");
+ } else {
+ DPRINTF("\tVS_COMMIT_CONTROL\n");
+ }
+ if (length != 26) {
+ DPRINTF("USB Request: Requested %d bytes, "
+ "expected 26 bytes\n", length);
+ goto fail;
+ }
+
+ DPRINTF("\tbmHint = 0x%02X%02X\n", data[1], data[0]);
+ DPRINTF("\tbFormatIndex = %d\n", data[2]);
+ DPRINTF("\tbFrameIndex = %d\n", data[3]);
+ DPRINTF("\tdwFrameInterval = 0x%02X%02X%02X%02X\n",
+ data[7], data[6], data[5], data[4]);
+ DPRINTF("\twKeyFrameRate = 0x%02X%02X\n", data[9], data[8]);
+ DPRINTF("\twPFrameRate = 0x%02X%02X\n", data[11], data[10]);
+ DPRINTF("\twCompQuality = 0x%02X%02X\n", data[13], data[12]);
+ DPRINTF("\twCompWindowSize = 0x%02X%02X\n", data[15], data[14]);
+ DPRINTF("\twDelay = 0x%02X%02X\n", data[17], data[16]);
+ DPRINTF("\tdwMaxVideoFrameSize= 0x%02X%02X%02X%02X\n",
+ data[21], data[20], data[19], data[18]);
+ DPRINTF("\tdwMaxPayloadTransferSize= 0x%02X%02X%02X%02X\n",
+ data[25], data[24], data[23], data[22]);
+
+ frame = frame_start;
+ frame_remaining_bytes = frame_length;
+ first_bulk_packet = 1;
+
+ ret = 26;
+ } else if ((index&0xFF00) == 0x0400 && (value&0xFF00) == 0x0100) {
+ /* Setting input */
+ DPRINTF("Setting input to %d\n", data[0]);
+ if (length != 1) {
+ DPRINTF("USB Request: Requested %d bytes, "
+ "expected 1 byte\n", length);
+ goto fail;
+ }
+
+ s->current_input = data[0];
+ ret = 1;
+ } else if ((index&0xFF00) == 0x0500 && (value&0xFF00) == 0x0200) {
+ /* PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT */
+ DPRINTF("USB Request: Setting brightness, "
+ "value stays the same\n");
+ if (length != 2) {
+ DPRINTF("USB Request: "
+ "Requested %d bytes, expected 2 bytes\n", length);
+ goto fail;
+ }
+
+ ret = 2;
+ } else {
+ goto fail;
+ }
+ break;
+ case UVCGetVideoControl | USB_UVC_GET_RES:
+ if ((index&0xFF00) == 0x0500 && (value&0xFF00) == 0x0200) {
+ /* PU_BRIGHTNESS_CONTROL of PROCESSING_UNIT */
+ DPRINTF("USB Resquest: Asking for brightness resolution\n");
+ if (length != 2) {
+ DPRINTF("USB Request: Requested %d bytes, "
+ "expected 2 bytes\n", length);
+ goto fail;
+ }
+
+ data[0] = 1;
+ data[1] = 0;
+ ret = 2;
+ } else {
+ goto fail;
+ }
+ break;
+ default:
+fail:
+ DPRINTF("USB Request: Unhandled control request\n");
+ DPRINTF("\tRequest: 0x%08X\n", request);
+ DPRINTF("\tValue: 0x%08X\n", value);
+ DPRINTF("\tIndex: 0x%08X\n", index);
+ DPRINTF("\tLength: 0x%08X\n", length);
+ ret = USB_RET_STALL;
+ break;
}
-
- return ret;
+
+ return ret;
}
static int usb_uvc_handle_data(USBDevice *dev, USBPacket *p)
{
- int ret = 0;
-
- //DPRINTF("Data called\n");
- //DPRINTF("Packet ID: %d\n", p->pid);
- //DPRINTF("Device address: %d\n", p->devaddr);
- //DPRINTF("Device endpoint: %d\n", p->devep);
- //DPRINTF("Data length: %d\n", p->len);
-
- switch (p->pid)
- {
- case USB_TOKEN_OUT:
- DPRINTF("USB Data Out requested.\n");
- break;
- case USB_TOKEN_IN:
- if(p->devep == 1) // IN endpoint 1 (hardware button)
- {
- p->data[0] = 2;
- p->data[1] = 1;
- p->data[2] = 0;
- p->data[3] = 0;
- }
- else if(p->devep == 2) // IN endpoint 2 (video data)
- {
- if(first_bulk_packet)
- {
- p->data[0] = 2;
- p->data[1] = 0x82 | frame_id;
- memcpy((p->data)+2,frame,62);
- ret = 64;
- first_bulk_packet=0;
- frame = frame + 62;
- frame_remaining_bytes =
frame_remaining_bytes - 62;
- }
- else if(frame_remaining_bytes<64)
- {
-
memcpy(p->data,frame,frame_remaining_bytes);
- ret = frame_remaining_bytes;
- get_frame_read();
- }
- else if(frame_remaining_bytes==64)
- {
-
memcpy(p->data,frame,frame_remaining_bytes);
- ret = frame_remaining_bytes;
- frame_remaining_bytes = 0;
- }
- else if(frame_remaining_bytes==0)
- {
- ret = 0;
- get_frame_read();
- }
- else
- {
- memcpy(p->data,frame,64);
- frame = frame+64;
- frame_remaining_bytes =
frame_remaining_bytes-64;
- ret = 64;
- }
- }
- else
- {
- DPRINTF("USB Data In requested.\n");
- DPRINTF("Requested data from endpoint %02X\n",
p->devep);
- }
- break;
- default:
- DPRINTF("Bad token: %d\n", p->pid);
- //fail:
- ret = USB_RET_STALL;
- break;
+ int ret = 0;
+
+ /* DPRINTF("Data called\n");
+ DPRINTF("Packet ID: %d\n", p->pid);
+ DPRINTF("Device address: %d\n", p->devaddr);
+ DPRINTF("Device endpoint: %d\n", p->devep);
+ DPRINTF("Data length: %d\n", p->len);
+ */
+
+ switch (p->pid) {
+ case USB_TOKEN_OUT:
+ DPRINTF("USB Data Out requested.\n");
+ break;
+ case USB_TOKEN_IN:
+ if (p->devep == 1) { /* IN endpoint 1 (hardware button) */
+ p->data[0] = 2;
+ p->data[1] = 1;
+ p->data[2] = 0;
+ p->data[3] = 0;
+ } else if (p->devep == 2) { /* IN endpoint 2 (video data) */
+ if (first_bulk_packet) {
+ p->data[0] = 2;
+ p->data[1] = 0x82 | frame_id;
+ memcpy((p->data) + 2, frame, 62);
+ ret = 64;
+ first_bulk_packet = 0;
+ frame = frame + 62;
+ frame_remaining_bytes = frame_remaining_bytes - 62;
+ } else if (frame_remaining_bytes < 64) {
+ memcpy(p->data, frame, frame_remaining_bytes);
+ ret = frame_remaining_bytes;
+ get_frame_read();
+ } else if (frame_remaining_bytes == 64) {
+ memcpy(p->data, frame, frame_remaining_bytes);
+ ret = frame_remaining_bytes;
+ frame_remaining_bytes = 0;
+ } else if (frame_remaining_bytes == 0) {
+ ret = 0;
+ get_frame_read();
+ } else {
+ memcpy(p->data, frame, 64);
+ frame = frame + 64;
+ frame_remaining_bytes = frame_remaining_bytes - 64;
+ ret = 64;
+ }
+ } else {
+ DPRINTF("USB Data In requested.\n");
+ DPRINTF("Requested data from endpoint %02X\n", p->devep);
+ }
+ break;
+ default:
+ DPRINTF("Bad token: %d\n", p->pid);
+ /* fail: */
+ ret = USB_RET_STALL;
+ break;
}
-
+
return ret;
}
static void usb_uvc_handle_destroy(USBDevice *dev)
{
- DPRINTF("Destroy called\n");
- close(v4l2_fd);
+ DPRINTF("Destroy called\n");
+ close(v4l2_fd);
}
static int usb_uvc_initfn(USBDevice *dev)
{
- struct v4l2_capability capabilities;
- struct v4l2_input video_input;
- struct v4l2_format v_format;
- int video_input_index;
- int ret_err;
-
- DPRINTF("Init called\n");
-
- USBUVCState *s = (USBUVCState *)dev;
-
- s->current_input = 0;
- s->dev.speed = USB_SPEED_FULL;
-
- if (!s->v4l2_device) {
+ struct v4l2_capability capabilities;
+ struct v4l2_input video_input;
+ struct v4l2_format v_format;
+ int video_input_index;
+ int ret_err;
+
+ DPRINTF("Init called\n");
+
+ USBUVCState *s = (USBUVCState *)dev;
+
+ s->current_input = 0;
+ s->dev.speed = USB_SPEED_FULL;
+
+ if (!s->v4l2_device) {
error_report("V4L2 device specification needed.\n");
return -1;
+ } else {
+ DPRINTF("Trying to open %s\n.", s->v4l2_device);
+ }
+
+ v4l2_fd = open(s->v4l2_device, O_RDWR);
+
+ if (v4l2_fd == -1) {
+ switch (errno) {
+ case EACCES:
+ error_report("Access denied.");
+ break;
+ case EBUSY:
+ error_report("Device busy.");
+ break;
+ case ENXIO:
+ error_report("Device does not exist.");
+ break;
+ case ENOMEM:
+ error_report("Not enough memory to open device.");
+ break;
+ case EMFILE:
+ error_report("Process reached maximum files opened.");
+ break;
+ case ENFILE:
+ error_report("System reached maximum files opened.");
+ break;
+ default:
+ error_report("Unknown error %d opening device.", errno);
+ break;
+ }
+
+ return -1;
+ }
+
+ DPRINTF("Device opened correctly.\n");
+
+ DPRINTF("Querying capabilities.\n");
+
+ ret_err = ioctl(v4l2_fd, VIDIOC_QUERYCAP, &capabilities);
+
+ if (ret_err == -1) {
+ switch (errno) {
+ case EINVAL:
+ error_report("Device is not V4L2 device.\n");
+ break;
+ default:
+ error_report("Device returned unknown error %d.\n", errno);
+ break;
+ }
+
+ return -1;
+ }
+
+ DPRINTF("Device driver: %s\n", capabilities.driver);
+ DPRINTF("Device name: %s\n", capabilities.card);
+ DPRINTF("Device bus: %s\n", capabilities.bus_info);
+ DPRINTF("Driver version: %u.%u.%u\n", (capabilities.version >> 16) & 0xFF,
+ (capabilities.version >> 8) & 0xFF,
+ capabilities.version & 0xFF);
+ DPRINTF("Device capabilities: 0x%08X\n", capabilities.capabilities);
+
+ DPRINTF("Enumerating video inputs.\n");
+ memset(&video_input, 0, sizeof(video_input));
+ video_input.index = 0;
+ while ((ioctl(v4l2_fd, VIDIOC_ENUMINPUT, &video_input) == 0)) {
+ if (video_input.type == V4L2_INPUT_TYPE_CAMERA) {
+ video_input_index = video_input.index;
+ break;
+ }
+
+ video_input.index++;
+ }
+
+ DPRINTF("Setting video input to index %d\n", video_input_index);
+ ret_err = ioctl(v4l2_fd, VIDIOC_S_INPUT, &video_input_index);
+
+ if (ret_err == -1) {
+ switch (errno) {
+ case EINVAL:
+ error_report("Incorrect video input selected.\n");
+ break;
+ case EBUSY:
+ error_report("Input cannot be switched.\n");
+ break;
+ default:
+ error_report("Unknown error %d.\n", errno);
+ break;
+ }
+
+ return -1;
}
- else
- {
- DPRINTF("Trying to open %s\n.", s->v4l2_device);
- }
-
- v4l2_fd = open(s->v4l2_device, O_RDWR);
-
- if(v4l2_fd==-1)
- {
- switch(errno)
- {
- case EACCES:
- error_report("Access denied.");
- break;
- case EBUSY:
- error_report("Device busy.");
- break;
- case ENXIO:
- error_report("Device does not exist.");
- break;
- case ENOMEM:
- error_report("Not enough memory to open
device.");
- break;
- case EMFILE:
- error_report("Process reached maximum files
opened.");
- break;
- case ENFILE:
- error_report("System reached maximum files
opened.");
- break;
- default:
- error_report("Unknown error %d opening
device.", errno);
- break;
- }
-
- return -1;
- }
-
- DPRINTF("Device opened correctly.\n");
-
- DPRINTF("Querying capabilities.\n");
-
- ret_err = ioctl(v4l2_fd, VIDIOC_QUERYCAP, &capabilities);
-
- if(ret_err==-1)
- {
- switch(errno)
- {
- case EINVAL:
- error_report("Device is not V4L2 device.\n");
- break;
- default:
- error_report("Device returned unknown error
%d.\n", errno);
- break;
- }
-
- return -1;
- }
-
- DPRINTF("Device driver: %s\n", capabilities.driver);
- DPRINTF("Device name: %s\n", capabilities.card);
- DPRINTF("Device bus: %s\n", capabilities.bus_info);
- DPRINTF("Driver version: %u.%u.%u\n",(capabilities.version >> 16) &
0xFF,(capabilities.version >> 8) & 0xFF, capabilities.version & 0xFF);
- DPRINTF("Device capabilities: 0x%08X\n", capabilities.capabilities);
-
- DPRINTF("Enumerating video inputs.\n");
- memset(&video_input, 0, sizeof(video_input));
- video_input.index=0;
- while((ioctl(v4l2_fd, VIDIOC_ENUMINPUT, &video_input)==0))
- {
- if(video_input.type == V4L2_INPUT_TYPE_CAMERA)
- {
- video_input_index = video_input.index;
- break;
- }
-
- video_input.index++;
- }
-
- DPRINTF("Setting video input to index %d\n", video_input_index);
- ret_err = ioctl(v4l2_fd, VIDIOC_S_INPUT, &video_input_index);
-
- if(ret_err==-1)
- {
- switch(errno)
- {
- case EINVAL:
- error_report("Incorrect video input
selected.\n");
- break;
- case EBUSY:
- error_report("Input cannot be switched.\n");
- break;
- default:
- error_report("Unknown error %d.\n", errno);
- break;
- }
-
- return -1;
- }
-
- ioctl(v4l2_fd, VIDIOC_G_INPUT, &ret_err);
-
- if(ret_err==video_input_index)
- DPRINTF("Video input correctly set.\n");
- else
- {
- error_report("Some error happened while setting video
input.\n");
- return -1;
- }
-
- DPRINTF("Trying to set 320x240 MJPEG.\n");
- memset(&v_format, 0, sizeof(v_format));
- v_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- v_format.fmt.pix.width = 320;
- v_format.fmt.pix.height = 240;
- v_format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
- v_format.fmt.pix.field = V4L2_FIELD_INTERLACED;
-
- ret_err = ioctl (v4l2_fd, VIDIOC_S_FMT, &v_format);
-
- if(ret_err == -1)
- {
- switch(errno)
- {
- case EBUSY:
- error_report("Device busy while changing
format.\n");
- break;
- case EINVAL:
- error_report("Invalid format.\n");
- break;
- default:
- error_report("Unknown error %d while changing
format.\n", errno);
- break;
- }
-
- return -1;
- }
-
- frame_max_length = v_format.fmt.pix.sizeimage;
-
- DPRINTF("Format correctly set.\n");
- DPRINTF("Maximum image size: %d bytes.\n", frame_max_length);
-
- DPRINTF("Allocating memory for frames.\n");
- frame = malloc(frame_max_length);
- frame_start = frame;
-
- frame_id = 1;
-
- get_frame_read();
-
+
+ ioctl(v4l2_fd, VIDIOC_G_INPUT, &ret_err);
+
+ if (ret_err == video_input_index) {
+ DPRINTF("Video input correctly set.\n");
+ } else {
+ error_report("Some error happened while setting video input.\n");
+ return -1;
+ }
+
+ DPRINTF("Trying to set 320x240 MJPEG.\n");
+ memset(&v_format, 0, sizeof(v_format));
+ v_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ v_format.fmt.pix.width = 320;
+ v_format.fmt.pix.height = 240;
+ v_format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
+ v_format.fmt.pix.field = V4L2_FIELD_INTERLACED;
+
+ ret_err = ioctl(v4l2_fd, VIDIOC_S_FMT, &v_format);
+
+ if (ret_err == -1) {
+ switch (errno) {
+ case EBUSY:
+ error_report("Device busy while changing format.\n");
+ break;
+ case EINVAL:
+ error_report("Invalid format.\n");
+ break;
+ default:
+ error_report("Unknown error %d while changing format.\n", errno);
+ break;
+ }
+
+ return -1;
+ }
+
+ frame_max_length = v_format.fmt.pix.sizeimage;
+
+ DPRINTF("Format correctly set.\n");
+ DPRINTF("Maximum image size: %d bytes.\n", frame_max_length);
+
+ DPRINTF("Allocating memory for frames.\n");
+ frame = malloc(frame_max_length);
+ frame_start = frame;
+
+ frame_id = 1;
+
+ get_frame_read();
+
return 0;
}
static USBDevice *usb_uvc_init(const char *filename)
{
USBDevice *dev;
-
+
dev = usb_create(NULL /* FIXME */, "usb-uvc-webcam");
qdev_init_nofail(&dev->qdev);
-
- DPRINTF("Filename: %s\n.", filename);
-
- if (!*filename) {
+
+ DPRINTF("Filename: %s\n.", filename);
+
+ if (!*filename) {
error_report("character device specification needed");
return NULL;
}
-
+
return dev;
}
@@ -1076,7 +1049,7 @@ static struct USBDeviceInfo usb_uvc_info = {
.qdev.name = "usb-uvc-webcam",
.qdev.desc = "QEMU USB Video Class Device",
.usbdevice_name = "uvc-webcam",
- .usbdevice_init = usb_uvc_init,
+ .usbdevice_init = usb_uvc_init,
.qdev.size = sizeof(USBUVCState),
.init = usb_uvc_initfn,
.handle_packet = usb_generic_handle_packet,
@@ -1084,10 +1057,10 @@ static struct USBDeviceInfo usb_uvc_info = {
.handle_control = usb_uvc_handle_control,
.handle_data = usb_uvc_handle_data,
.handle_destroy = usb_uvc_handle_destroy,
- .qdev.props = (Property[]) {
- DEFINE_PROP_STRING("device", USBUVCState, v4l2_device),
- DEFINE_PROP_END_OF_LIST(),
- },
+ .qdev.props = (Property[]) {
+ DEFINE_PROP_STRING("device", USBUVCState, v4l2_device),
+ DEFINE_PROP_END_OF_LIST()
+ },
};
static void usb_uvc_register_devices(void)
--
1.7.4.1
- [Qemu-devel] [0/7] USB UVC updates, Brad Hards, 2011/06/02
- [Qemu-devel] [PATCH 1/7] usb: Turn off debug output by default., Brad Hards, 2011/06/02
- [Qemu-devel] [PATCH 2/7] usb-uvc: compile fix, Brad Hards, 2011/06/02
- [Qemu-devel] [PATCH 4/7] usb-uvc: fix some spelling issues., Brad Hards, 2011/06/02
- [Qemu-devel] [PATCH 3/7] usb-uvc: Fix all checkpatch style issues.,
Brad Hards <=
- [Qemu-devel] [PATCH 5/7] usb-uvc: Add spaces around &, Brad Hards, 2011/06/02
- [Qemu-devel] [PATCH 6/7] usb-uvc: Fix a couple of typos, Brad Hards, 2011/06/02
- [Qemu-devel] [PATCH 7/7] usb-uvc: Use qemu_malloc(), Brad Hards, 2011/06/02
- Re: [Qemu-devel] [0/7] USB UVC updates, Natalia Portillo, 2011/06/06