.bDescriptorSubType = UVC_VC_INPUT_TERMINAL, .bTerminalID = 1, .wTerminalType = cpu_to_le16(0x0201), .bAssocTerminal = 0, .iTerminal = 0, .wObjectiveFocalLengthMin = cpu_to_le16(0), .wObjectiveFocalLengthMax = cpu_to_le16(0), .wOcularFocalLength = cpu_to_le16(0), .bControlSize = 3, .bmControls[0] = 2, .bmControls[1] = 0, .bmControls[2] = 0, }; static const struct uvc_processing_unit_descriptor uvc_processing = { .bLength = UVC_DT_PROCESSING_UNIT_SIZE(2), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VC_PROCESSING_UNIT, .bUnitID = 2, .bSourceID = 1, .wMaxMultiplier = cpu_to_le16(16*1024), .bControlSize = 2, .bmControls[0] = 1, .bmControls[1] = 0, .iProcessing = 0, }; static const struct uvc_output_terminal_descriptor uvc_output_terminal = { .bLength = UVC_DT_OUTPUT_TERMINAL_SIZE, .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VC_OUTPUT_TERMINAL,
static struct usb_function_instance *uvc_alloc_inst(void) { struct f_uvc_opts *opts; struct uvc_camera_terminal_descriptor *cd; struct uvc_processing_unit_descriptor *pd; struct uvc_output_terminal_descriptor *od; struct uvc_color_matching_descriptor *md; struct uvc_descriptor_header **ctl_cls; opts = kzalloc(sizeof(*opts), GFP_KERNEL); if (!opts) return ERR_PTR(-ENOMEM); opts->func_inst.free_func_inst = uvc_free_inst; mutex_init(&opts->lock); cd = &opts->uvc_camera_terminal; cd->bLength = UVC_DT_CAMERA_TERMINAL_SIZE(3); cd->bDescriptorType = USB_DT_CS_INTERFACE; cd->bDescriptorSubType = UVC_VC_INPUT_TERMINAL; cd->bTerminalID = 1; cd->wTerminalType = cpu_to_le16(0x0201); cd->bAssocTerminal = 0; cd->iTerminal = 0; cd->wObjectiveFocalLengthMin = cpu_to_le16(0); cd->wObjectiveFocalLengthMax = cpu_to_le16(0); cd->wOcularFocalLength = cpu_to_le16(0); cd->bControlSize = 3; cd->bmControls[0] = 2; cd->bmControls[1] = 0; cd->bmControls[2] = 0; pd = &opts->uvc_processing; pd->bLength = UVC_DT_PROCESSING_UNIT_SIZE(2); pd->bDescriptorType = USB_DT_CS_INTERFACE; pd->bDescriptorSubType = UVC_VC_PROCESSING_UNIT; pd->bUnitID = 2; pd->bSourceID = 1; pd->wMaxMultiplier = cpu_to_le16(16*1024); pd->bControlSize = 2; pd->bmControls[0] = 1; pd->bmControls[1] = 0; pd->iProcessing = 0; od = &opts->uvc_output_terminal; od->bLength = UVC_DT_OUTPUT_TERMINAL_SIZE; od->bDescriptorType = USB_DT_CS_INTERFACE; od->bDescriptorSubType = UVC_VC_OUTPUT_TERMINAL; od->bTerminalID = 3; od->wTerminalType = cpu_to_le16(0x0101); od->bAssocTerminal = 0; od->bSourceID = 2; od->iTerminal = 0; md = &opts->uvc_color_matching; md->bLength = UVC_DT_COLOR_MATCHING_SIZE; md->bDescriptorType = USB_DT_CS_INTERFACE; md->bDescriptorSubType = UVC_VS_COLORFORMAT; md->bColorPrimaries = 1; md->bTransferCharacteristics = 1; md->bMatrixCoefficients = 4; /* Prepare fs control class descriptors for configfs-based gadgets */ ctl_cls = opts->uvc_fs_control_cls; ctl_cls[0] = NULL; /* assigned elsewhere by configfs */ ctl_cls[1] = (struct uvc_descriptor_header *)cd; ctl_cls[2] = (struct uvc_descriptor_header *)pd; ctl_cls[3] = (struct uvc_descriptor_header *)od; ctl_cls[4] = NULL; /* NULL-terminate */ opts->fs_control = (const struct uvc_descriptor_header * const *)ctl_cls; /* Prepare hs control class descriptors for configfs-based gadgets */ ctl_cls = opts->uvc_ss_control_cls; ctl_cls[0] = NULL; /* assigned elsewhere by configfs */ ctl_cls[1] = (struct uvc_descriptor_header *)cd; ctl_cls[2] = (struct uvc_descriptor_header *)pd; ctl_cls[3] = (struct uvc_descriptor_header *)od; ctl_cls[4] = NULL; /* NULL-terminate */ opts->ss_control = (const struct uvc_descriptor_header * const *)ctl_cls; opts->streaming_interval = 1; opts->streaming_maxpacket = 1024; uvcg_attach_configfs(opts); return &opts->func_inst; }