c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * CDDL HEADER START
c77a61a72b5ecdc507d6cf104142edd371a16c84yz *
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * The contents of this file are subject to the terms of the
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Common Development and Distribution License (the "License").
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * You may not use this file except in compliance with the License.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz *
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * or http://www.opensolaris.org/os/licensing.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * See the License for the specific language governing permissions
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * and limitations under the License.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz *
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * When distributing Covered Code, include this CDDL HEADER in each
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * If applicable, add the following below this CDDL HEADER, with the
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * fields enclosed by brackets "[]" replaced with your own identifying
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * information: Portions Copyright [yyyy] [name of copyright owner]
c77a61a72b5ecdc507d6cf104142edd371a16c84yz *
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * CDDL HEADER END
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
9e37f2b5d225bd6428d62c06655138fc78fd1ac0Raymond Chen * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Use is subject to license terms.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#ifndef _SYS_USB_USBVC_VAR_H
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define _SYS_USB_USBVC_VAR_H
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#ifdef __cplusplus
c77a61a72b5ecdc507d6cf104142edd371a16c84yzextern "C" {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#endif
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#include <sys/list.h>
5c5f137104b2d56181283389fa902220f2023809Richard Lowe#include <sys/sysmacros.h>
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#include <sys/usb/usba/usbai_private.h>
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#include <sys/videodev2.h>
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#include <sys/usb/clients/video/usbvc/usbvc.h>
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_state usbvc_state_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Power Management support
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_power {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz void *usbvc_state; /* points back to usbvc_state */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t usbvc_pwr_states; /* bit mask of device pwr states */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz int usbvc_pm_busy;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* Wakeup and power transistion capabilites of an interface */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t usbvc_pm_capabilities;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* flag to indicate if driver is about to raise power level */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz boolean_t usbvc_raise_power;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t usbvc_current_power;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t usbvc_wakeup_enabled;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_power_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Raw data buf from the USB cam */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_buf
c77a61a72b5ecdc507d6cf104142edd371a16c84yz{
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uchar_t *data;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint_t len; /* the length of the allocated memory of data */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint_t filled; /* number of bytes filled */
9e37f2b5d225bd6428d62c06655138fc78fd1ac0Raymond Chen uint_t len_read; /* bytes read */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uchar_t status; /* empty, filling done, read done */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* cookie used for memory mapping */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz ddi_umem_cookie_t umem_cookie;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz struct v4l2_buffer v4l2_buf;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz list_node_t buf_node; /* list */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_buf_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Group data buf related lists and other elements */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_buf_grp
c77a61a72b5ecdc507d6cf104142edd371a16c84yz{
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc list_t uv_buf_free;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz list_t uv_buf_done;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_buf_t *buf_filling;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint_t buf_cnt;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_buf_t *buf_head;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_buf_grp_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * UVC Spec: one format descriptor may be followed by sererval frame
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * descriptors, one still image descriptor and one color matching descriptor.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * It is called a format group. There might be several format groups follow
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * one input/output header.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_format_group {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_format_descr_t *format;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_frames_t *frames;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t frame_cnt;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* bytes per pix, used to calculate bytesperline */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t v4l2_bpp;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t v4l2_color;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint32_t v4l2_pixelformat; /* fcc, pixelformat */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_still_image_frame_t *still;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_color_matching_descr_t *color;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_frames_t *cur_frame;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_format_group_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* A stream interface may have several format groups */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_stream_if {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* The actual format groups we parsed for the stream interface */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t fmtgrp_cnt;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usb_if_data_t *if_descr;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_input_header_t *input_header;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_output_header_t *output_header;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_format_group_t *format_group;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_format_group_t *cur_format_group;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_vs_probe_commit_t ctrl_pc;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usb_ep_descr_t *curr_ep; /* current isoc ep descr */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usb_pipe_handle_t datain_ph; /* current isoc pipe handle */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint_t curr_alt; /* current alternate */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* The max payload that the isoc data EPs can support */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint32_t max_isoc_payload;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uchar_t start_polling; /* indicate if isoc polling started */
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen /*
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen * To flag if VIDIOC_STREAMON is executed, only used by STREAM mode
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen * for suspend/resume. If it's non-zero, we'll have to resume the
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen * device's isoc polling operation after resume.
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen */
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen uint8_t stream_on;
09dd0d6c99966261df3f1fee78347f66cae3235aRaymond Chen
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uchar_t fid; /* the MJPEG FID bit */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_buf_grp_t buf_read; /* buf used for read I/O */
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc uint8_t buf_read_num; /* desired buf num for read I/O */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_buf_grp_t buf_map; /* buf used for mmap I/O */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz list_node_t stream_if_node;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_stream_if_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* video interface collection */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_vic {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* bFirstInterface, the video control infterface num of this VIC */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t vctrl_if_num;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * bInterfaceCount -1, the total number of stream interfaces
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * belong to this VIC
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t vstrm_if_cnt;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_vic_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Macros */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_OPEN 0x00000001
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* For serialization. */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_SER_NOSIG B_FALSE
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_SER_SIG B_TRUE
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Masks for debug printing
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_ATTA 0x00000001
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_OPEN 0x00000002
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_CLOSE 0x00000004
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_READ 0x00000008
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_IOCTL 0x00000010
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_PM 0x00000020
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_CB 0x00000040
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_HOTPLUG 0x00000080
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_DEVCTRL 0x00000100
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_DEVMAP 0x00000200
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define PRINT_MASK_ALL 0xFFFFFFFF
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_MAX_PKTS 40
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc#define USBVC_DEFAULT_READ_BUF_NUM 3
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc#define USBVC_MAX_READ_BUF_NUM 40
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_MAX_MAP_BUF_NUM 40
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc/* According to UVC specs, the frame interval is in 100ns unit */
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc#define USBVC_FRAME_INTERVAL_DENOMINATOR 10000000
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Only D3...D0 are writable, Table 4-6, UVC Spec */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_POWER_MODE_MASK 0xf0;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yzenum usbvc_buf_status {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz USBVC_BUF_INIT = 0, /* Allocated, to be queued */
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc USBVC_BUF_MAPPED = 1, /* For map I/O only. Memory is mapped. */
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc USBVC_BUF_EMPTY = 2, /* not initialized, to be filled */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * buf is filled with a full frame without any errors,
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * it will be moved to full list.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc USBVC_BUF_DONE = 4,
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * buf is filled to full but no EOF bit is found at the end
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * of video data
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc USBVC_BUF_ERR = 8
c77a61a72b5ecdc507d6cf104142edd371a16c84yz};
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * This structure is used to map v4l2 controls to uvc controls. The structure
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * array is addressed by (V4L2_CID_BASE - V4L2_CID_*)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_v4l2_ctrl_map {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz char name[32];
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t selector; /* Control Selector */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t len; /* wLength, defined in uvc spec chp 4 for each ctrl */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* The xth bit in bmControls bitmap of processing unit descriptor */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t bit;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz enum v4l2_ctrl_type type;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_v4l2_ctrl_map_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yztypedef struct usbvc_v4l2_ctrl {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint8_t entity_id;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_v4l2_ctrl_map_t *ctrl_map;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz} usbvc_v4l2_ctrl_t;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * State structure
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yzstruct usbvc_state {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz dev_info_t *usbvc_dip; /* per-device info handle */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usb_client_dev_data_t *usbvc_reg; /* registration data */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz int usbvc_dev_state; /* USB device states. */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz int usbvc_drv_state; /* driver states. */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz kmutex_t usbvc_mutex;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz kcondvar_t usbvc_serial_cv;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz boolean_t usbvc_serial_inuse;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz boolean_t usbvc_locks_initialized;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_power_t *usbvc_pm;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usb_log_handle_t usbvc_log_handle; /* log handle */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usb_pipe_handle_t usbvc_default_ph; /* default pipe */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* Video ctrl interface header descriptor */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_vc_header_t *usbvc_vc_header;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz list_t usbvc_term_list;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz list_t usbvc_unit_list;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz list_t usbvc_stream_list;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_stream_if_t *usbvc_curr_strm;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz kcondvar_t usbvc_read_cv; /* wait for read buf done */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz kcondvar_t usbvc_mapio_cv; /* wait for mmap I/O buf done */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* current I/O type: read or mmap. */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uchar_t usbvc_io_type;
c77a61a72b5ecdc507d6cf104142edd371a16c84yz};
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Used in ioctl entry to copy an argument from kernel space (arg_name)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * to USER space (arg)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_COPYOUT(arg_name) \
c77a61a72b5ecdc507d6cf104142edd371a16c84yzif (ddi_copyout(&arg_name, (caddr_t)arg, sizeof (arg_name), mode)) { \
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc rv = EFAULT; \
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc break; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz}
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Used in ioctl entry to copy an argument from USER space (arg) to
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * KERNEL space (arg_name)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_COPYIN(arg_name) \
c77a61a72b5ecdc507d6cf104142edd371a16c84yzif (ddi_copyin((caddr_t)arg, &arg_name, sizeof (arg_name), mode)) { \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz rv = EFAULT; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz break; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz}
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Turn a little endian byte array to a uint32_t */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define LE_TO_UINT32(src, off, des) { \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint32_t tmp; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des = src[off + 3]; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des = des << 24; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz tmp = src[off + 2]; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des |= tmp << 16; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz tmp = src[off + 1]; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des |= tmp << 8; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des |= src[off]; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz }
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Turn a uint32_t to a little endian byte array */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define UINT32_TO_LE(src, off, des) { \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des[off + 0] = 0xff & src; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des[off + 1] = 0xff & (src >> 8); \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des[off + 2] = 0xff & (src >> 16); \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des[off + 3] = 0xff & (src >> 24); \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz }
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Turn a little endian byte array to a uint16_t */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define LE_TO_UINT16(src, off, des) \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des = src[off + 1]; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des = des << 8; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des |= src[off];
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Turn a uint16_t to alittle endian byte array */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define UINT16_TO_LE(src, off, des) { \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des[off + 0] = 0xff & src; \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz des[off + 1] = 0xff & (src >> 8); \
c77a61a72b5ecdc507d6cf104142edd371a16c84yz }
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define NELEM(a) (sizeof (a) / sizeof (*(a)))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Minimum length of class specific descriptors */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_C_HEAD_LEN_MIN 12 /* ctrl header */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_I_TERM_LEN_MIN 8 /* input term */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_O_TERM_LEN_MIN 9 /* output term */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_P_UNIT_LEN_MIN 8 /* processing unit */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_S_UNIT_LEN_MIN 5 /* selector unit */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_E_UNIT_LEN_MIN 22 /* extension unit */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_FRAME_LEN_MIN 26 /* Frame descriptor */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Length of the Frame descriptor which has continuous frame intervals */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define USBVC_FRAME_LEN_CON 38
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * According to usb2.0 spec (table 9-13), for all ep, bits 10..0 specify the
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * max pkt size; for high speed ep, bits 12..11 specify the number of
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * additional transaction opportunities per microframe.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#define HS_PKT_SIZE(pktsize) (pktsize & 0x07ff) * (1 + ((pktsize >> 11) & 3))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/*
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * warlock directives
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * _NOTE is an advice for locklint. Locklint checks lock use for deadlocks.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(MUTEX_PROTECTS_DATA(usbvc_state_t::usbvc_mutex, usbvc_state_t))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(DATA_READABLE_WITHOUT_LOCK(usbvc_state_t::{
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_dip
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_pm
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_log_handle
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_reg
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_default_ph
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_vc_header
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_term_list
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_unit_list
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_stream_list
c77a61a72b5ecdc507d6cf104142edd371a16c84yz}))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::datain_ph))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::curr_alt))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("USBA", usbvc_stream_if::curr_ep))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_buf::umem_cookie))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_buf::data))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_v4l2_ctrl))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", usbvc_v4l2_ctrl_map))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", buf))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_isoc_req))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_queryctrl))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_format))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_control))
61b2e298a43ac1155abb6369dd7c6a117fbeb473lc_NOTE(SCHEME_PROTECTS_DATA("unshared data", v4l2_streamparm))
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_open_isoc_pipe(usbvc_state_t *, usbvc_stream_if_t *);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_start_isoc_polling(usbvc_state_t *, usbvc_stream_if_t *, uchar_t);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_vc_set_ctrl(usbvc_state_t *, uint8_t, uint8_t,
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint16_t, uint16_t, mblk_t *);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_vc_get_ctrl(usbvc_state_t *, uint8_t, uint8_t,
c77a61a72b5ecdc507d6cf104142edd371a16c84yz uint16_t, uint16_t, mblk_t *);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_vs_set_probe_commit(usbvc_state_t *, usbvc_stream_if_t *,
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_vs_probe_commit_t *, uchar_t);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzvoid usbvc_free_map_bufs(usbvc_state_t *, usbvc_stream_if_t *);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_alloc_map_bufs(usbvc_state_t *, usbvc_stream_if_t *, int, int);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_vs_get_probe(usbvc_state_t *, usbvc_stream_if_t *,
c77a61a72b5ecdc507d6cf104142edd371a16c84yz usbvc_vs_probe_commit_t *, uchar_t);
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz/* Functions specific for V4L2 API */
c77a61a72b5ecdc507d6cf104142edd371a16c84yzuint8_t usbvc_v4l2_colorspace(uint8_t);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzuint32_t usbvc_v4l2_guid2fcc(uint8_t *);
c77a61a72b5ecdc507d6cf104142edd371a16c84yzint usbvc_v4l2_ioctl(usbvc_state_t *, int, intptr_t, int);
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#ifdef __cplusplus
c77a61a72b5ecdc507d6cf104142edd371a16c84yz}
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#endif
c77a61a72b5ecdc507d6cf104142edd371a16c84yz
c77a61a72b5ecdc507d6cf104142edd371a16c84yz#endif /* _SYS_USB_USBVC_VAR_H */