2008-06-30 22:04:50 +04:00
# ifndef _USB_VIDEO_H_
# define _USB_VIDEO_H_
2010-11-21 23:15:44 +03:00
# ifndef __KERNEL__
2011-07-30 23:19:49 +04:00
# error "The uvcvideo.h header is deprecated, use linux / uvcvideo.h instead."
# endif /* __KERNEL__ */
2008-06-30 22:04:50 +04:00
2011-07-30 23:19:49 +04:00
# include <linux/kernel.h>
2008-06-30 22:04:50 +04:00
# include <linux/poll.h>
2010-01-21 11:39:52 +03:00
# include <linux/usb.h>
2009-06-26 19:15:38 +04:00
# include <linux/usb/video.h>
2010-11-21 23:15:44 +03:00
# include <linux/uvcvideo.h>
2011-07-30 23:19:49 +04:00
# include <linux/videodev2.h>
2010-01-21 11:39:47 +03:00
# include <media/media-device.h>
# include <media/v4l2-device.h>
2012-04-08 19:59:51 +04:00
# include <media/v4l2-event.h>
# include <media/v4l2-fh.h>
2011-10-24 18:53:59 +04:00
# include <media/videobuf2-core.h>
2008-06-30 22:04:50 +04:00
/* --------------------------------------------------------------------------
* UVC constants
*/
# define UVC_TERM_INPUT 0x0000
# define UVC_TERM_OUTPUT 0x8000
2009-11-25 18:00:22 +03:00
# define UVC_TERM_DIRECTION(term) ((term)->type & 0x8000)
2008-06-30 22:04:50 +04:00
# define UVC_ENTITY_TYPE(entity) ((entity)->type & 0x7fff)
# define UVC_ENTITY_IS_UNIT(entity) (((entity)->type & 0xff00) == 0)
# define UVC_ENTITY_IS_TERM(entity) (((entity)->type & 0xff00) != 0)
# define UVC_ENTITY_IS_ITERM(entity) \
2009-07-02 03:24:47 +04:00
( UVC_ENTITY_IS_TERM ( entity ) & & \
( ( entity ) - > type & 0x8000 ) = = UVC_TERM_INPUT )
2008-06-30 22:04:50 +04:00
# define UVC_ENTITY_IS_OTERM(entity) \
2009-07-02 03:24:47 +04:00
( UVC_ENTITY_IS_TERM ( entity ) & & \
( ( entity ) - > type & 0x8000 ) = = UVC_TERM_OUTPUT )
2008-06-30 22:04:50 +04:00
/* ------------------------------------------------------------------------
* GUIDs
*/
# define UVC_GUID_UVC_CAMERA \
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 }
# define UVC_GUID_UVC_OUTPUT \
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 }
# define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 }
# define UVC_GUID_UVC_PROCESSING \
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x01 }
# define UVC_GUID_UVC_SELECTOR \
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , \
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x02 }
# define UVC_GUID_FORMAT_MJPEG \
{ ' M ' , ' J ' , ' P ' , ' G ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_YUY2 \
{ ' Y ' , ' U ' , ' Y ' , ' 2 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2009-12-12 20:57:17 +03:00
# define UVC_GUID_FORMAT_YUY2_ISIGHT \
{ ' Y ' , ' U ' , ' Y ' , ' 2 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x38 , 0x9b , 0x71 }
2008-06-30 22:04:50 +04:00
# define UVC_GUID_FORMAT_NV12 \
{ ' N ' , ' V ' , ' 1 ' , ' 2 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_YV12 \
{ ' Y ' , ' V ' , ' 1 ' , ' 2 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_I420 \
{ ' I ' , ' 4 ' , ' 2 ' , ' 0 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_UYVY \
{ ' U ' , ' Y ' , ' V ' , ' Y ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_Y800 \
{ ' Y ' , ' 8 ' , ' 0 ' , ' 0 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
2012-07-29 02:49:14 +04:00
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_Y8 \
{ ' Y ' , ' 8 ' , ' ' , ' ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_Y10 \
{ ' Y ' , ' 1 ' , ' 0 ' , ' ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_Y12 \
{ ' Y ' , ' 1 ' , ' 2 ' , ' ' , 0x00 , 0x00 , 0x10 , 0x00 , \
2008-06-30 22:04:50 +04:00
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2010-04-12 17:41:22 +04:00
# define UVC_GUID_FORMAT_Y16 \
{ ' Y ' , ' 1 ' , ' 6 ' , ' ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2008-06-30 22:04:50 +04:00
# define UVC_GUID_FORMAT_BY8 \
{ ' B ' , ' Y ' , ' 8 ' , ' ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2014-02-20 11:12:51 +04:00
# define UVC_GUID_FORMAT_BA81 \
{ ' B ' , ' A ' , ' 8 ' , ' 1 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_GBRG \
{ ' G ' , ' B ' , ' R ' , ' G ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_GRBG \
{ ' G ' , ' R ' , ' B ' , ' G ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
# define UVC_GUID_FORMAT_RGGB \
{ ' R ' , ' G ' , ' G ' , ' B ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2011-03-06 14:32:04 +03:00
# define UVC_GUID_FORMAT_RGBP \
{ ' R ' , ' G ' , ' B ' , ' P ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2011-05-11 16:56:20 +04:00
# define UVC_GUID_FORMAT_M420 \
{ ' M ' , ' 4 ' , ' 2 ' , ' 0 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2008-06-30 22:04:50 +04:00
2011-01-28 22:38:58 +03:00
# define UVC_GUID_FORMAT_H264 \
{ ' H ' , ' 2 ' , ' 6 ' , ' 4 ' , 0x00 , 0x00 , 0x10 , 0x00 , \
0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }
2008-06-30 22:04:50 +04:00
/* ------------------------------------------------------------------------
* Driver specific constants .
*/
2011-06-25 20:50:37 +04:00
# define DRIVER_VERSION "1.1.1"
2008-06-30 22:04:50 +04:00
/* Number of isochronous URBs. */
# define UVC_URBS 5
2009-01-18 23:46:30 +03:00
/* Maximum number of packets per URB. */
# define UVC_MAX_PACKETS 32
2008-09-16 10:32:20 +04:00
/* Maximum status buffer size in bytes of interrupt URB. */
# define UVC_MAX_STATUS_SIZE 16
2008-06-30 22:04:50 +04:00
# define UVC_CTRL_CONTROL_TIMEOUT 300
2010-01-19 14:59:21 +03:00
# define UVC_CTRL_STREAMING_TIMEOUT 5000
2008-06-30 22:04:50 +04:00
2010-09-08 11:15:23 +04:00
/* Maximum allowed number of control mappings per device */
# define UVC_MAX_CONTROL_MAPPINGS 1024
2011-11-30 01:32:25 +04:00
# define UVC_MAX_CONTROL_MENU_ENTRIES 32
2010-09-08 11:15:23 +04:00
2008-06-30 22:04:50 +04:00
/* Devices quirks */
# define UVC_QUIRK_STATUS_INTERVAL 0x00000001
# define UVC_QUIRK_PROBE_MINMAX 0x00000002
# define UVC_QUIRK_PROBE_EXTRAFIELDS 0x00000004
# define UVC_QUIRK_BUILTIN_ISIGHT 0x00000008
# define UVC_QUIRK_STREAM_NO_FID 0x00000010
# define UVC_QUIRK_IGNORE_SELECTOR_UNIT 0x00000020
2009-02-16 23:41:52 +03:00
# define UVC_QUIRK_FIX_BANDWIDTH 0x00000080
2009-07-20 01:39:56 +04:00
# define UVC_QUIRK_PROBE_DEF 0x00000100
2010-09-16 19:37:26 +04:00
# define UVC_QUIRK_RESTRICT_FRAME_RATE 0x00000200
2014-03-13 16:38:48 +04:00
# define UVC_QUIRK_RESTORE_CTRLS_ON_INIT 0x00000400
2014-08-07 00:50:49 +04:00
# define UVC_QUIRK_FORCE_Y8 0x00000800
2008-06-30 22:04:50 +04:00
/* Format flags */
# define UVC_FMT_FLAG_COMPRESSED 0x00000001
# define UVC_FMT_FLAG_STREAM 0x00000002
/* ------------------------------------------------------------------------
* Structures .
*/
struct uvc_device ;
/* TODO: Put the most frequently accessed fields at the beginning of
* structures to maximize cache efficiency .
*/
struct uvc_control_info {
struct list_head mappings ;
__u8 entity [ 16 ] ;
2010-09-20 12:53:21 +04:00
__u8 index ; /* Bit index in bmControls */
2008-06-30 22:04:50 +04:00
__u8 selector ;
__u16 size ;
__u32 flags ;
} ;
struct uvc_control_mapping {
struct list_head list ;
2012-04-08 19:59:51 +04:00
struct list_head ev_subs ;
2008-06-30 22:04:50 +04:00
__u32 id ;
__u8 name [ 32 ] ;
__u8 entity [ 16 ] ;
__u8 selector ;
__u8 size ;
__u8 offset ;
enum v4l2_ctrl_type v4l2_type ;
__u32 data_type ;
struct uvc_menu_info * menu_info ;
__u32 menu_count ;
2008-12-16 12:46:32 +03:00
2012-04-08 19:59:52 +04:00
__u32 master_id ;
__s32 master_manual ;
__u32 slave_ids [ 2 ] ;
2008-12-16 12:46:32 +03:00
__s32 ( * get ) ( struct uvc_control_mapping * mapping , __u8 query ,
const __u8 * data ) ;
void ( * set ) ( struct uvc_control_mapping * mapping , __s32 value ,
__u8 * data ) ;
2008-06-30 22:04:50 +04:00
} ;
struct uvc_control {
struct uvc_entity * entity ;
2010-09-29 23:00:08 +04:00
struct uvc_control_info info ;
2008-06-30 22:04:50 +04:00
__u8 index ; /* Used to match the uvc_control entry with a
uvc_control_info . */
2010-09-29 23:00:08 +04:00
__u8 dirty : 1 ,
loaded : 1 ,
modified : 1 ,
cached : 1 ,
initialized : 1 ;
2008-06-30 22:04:50 +04:00
2010-06-18 18:31:24 +04:00
__u8 * uvc_data ;
2008-06-30 22:04:50 +04:00
} ;
struct uvc_format_desc {
char * name ;
__u8 guid [ 16 ] ;
__u32 fcc ;
} ;
/* The term 'entity' refers to both UVC units and UVC terminals.
*
* The type field is either the terminal type ( wTerminalType in the terminal
* descriptor ) , or the unit type ( bDescriptorSubtype in the unit descriptor ) .
* As the bDescriptorSubtype field is one byte long , the type value will
* always have a null MSB for units . All terminal types defined by the UVC
* specification have a non - null MSB , so it is safe to use the MSB to
* differentiate between units and terminals as long as the descriptor parsing
* code makes sure terminal types have a non - null MSB .
*
* For terminals , the type ' s most significant bit stores the terminal
* direction ( either UVC_TERM_INPUT or UVC_TERM_OUTPUT ) . The type field should
* always be accessed with the UVC_ENTITY_ * macros and never directly .
*/
2012-08-03 11:35:10 +04:00
# define UVC_ENTITY_FLAG_DEFAULT (1 << 0)
2008-06-30 22:04:50 +04:00
struct uvc_entity {
struct list_head list ; /* Entity as part of a UVC device. */
struct list_head chain ; /* Entity as part of a video device
* chain . */
2012-08-03 11:35:10 +04:00
unsigned int flags ;
2008-06-30 22:04:50 +04:00
__u8 id ;
__u16 type ;
char name [ 64 ] ;
2010-01-21 11:39:52 +03:00
/* Media controller-related fields. */
2010-01-21 14:56:19 +03:00
struct video_device * vdev ;
2010-01-21 11:39:52 +03:00
struct v4l2_subdev subdev ;
unsigned int num_pads ;
unsigned int num_links ;
struct media_pad * pads ;
2008-06-30 22:04:50 +04:00
union {
struct {
__u16 wObjectiveFocalLengthMin ;
__u16 wObjectiveFocalLengthMax ;
__u16 wOcularFocalLength ;
__u8 bControlSize ;
__u8 * bmControls ;
} camera ;
struct {
__u8 bControlSize ;
__u8 * bmControls ;
__u8 bTransportModeSize ;
__u8 * bmTransportModes ;
} media ;
struct {
} output ;
struct {
__u16 wMaxMultiplier ;
__u8 bControlSize ;
__u8 * bmControls ;
__u8 bmVideoStandards ;
} processing ;
struct {
} selector ;
struct {
__u8 guidExtensionCode [ 16 ] ;
__u8 bNumControls ;
__u8 bControlSize ;
__u8 * bmControls ;
__u8 * bmControlsType ;
} extension ;
} ;
2009-11-25 18:00:30 +03:00
__u8 bNrInPins ;
__u8 * baSourceID ;
2008-06-30 22:04:50 +04:00
unsigned int ncontrols ;
struct uvc_control * controls ;
} ;
struct uvc_frame {
__u8 bFrameIndex ;
__u8 bmCapabilities ;
__u16 wWidth ;
__u16 wHeight ;
__u32 dwMinBitRate ;
__u32 dwMaxBitRate ;
__u32 dwMaxVideoFrameBufferSize ;
__u8 bFrameIntervalType ;
__u32 dwDefaultFrameInterval ;
__u32 * dwFrameInterval ;
} ;
struct uvc_format {
__u8 type ;
__u8 index ;
__u8 bpp ;
__u8 colorspace ;
__u32 fcc ;
__u32 flags ;
char name [ 32 ] ;
unsigned int nframes ;
struct uvc_frame * frame ;
} ;
struct uvc_streaming_header {
__u8 bNumFormats ;
__u8 bEndpointAddress ;
__u8 bTerminalLink ;
__u8 bControlSize ;
__u8 * bmaControls ;
/* The following fields are used by input headers only. */
__u8 bmInfo ;
__u8 bStillCaptureMethod ;
__u8 bTriggerSupport ;
__u8 bTriggerUsage ;
} ;
enum uvc_buffer_state {
2009-01-04 01:12:40 +03:00
UVC_BUF_STATE_IDLE = 0 ,
UVC_BUF_STATE_QUEUED = 1 ,
UVC_BUF_STATE_ACTIVE = 2 ,
2009-12-17 03:20:45 +03:00
UVC_BUF_STATE_READY = 3 ,
UVC_BUF_STATE_DONE = 4 ,
UVC_BUF_STATE_ERROR = 5 ,
2008-06-30 22:04:50 +04:00
} ;
struct uvc_buffer {
2011-10-24 18:53:59 +04:00
struct vb2_buffer buf ;
2008-06-30 22:04:50 +04:00
struct list_head queue ;
2011-10-24 18:53:59 +04:00
2008-06-30 22:04:50 +04:00
enum uvc_buffer_state state ;
2010-06-17 13:52:37 +04:00
unsigned int error ;
2011-10-24 18:49:19 +04:00
void * mem ;
unsigned int length ;
unsigned int bytesused ;
2011-09-24 17:46:55 +04:00
u32 pts ;
2008-06-30 22:04:50 +04:00
} ;
2011-10-24 18:53:59 +04:00
# define UVC_QUEUE_DISCONNECTED (1 << 0)
# define UVC_QUEUE_DROP_CORRUPTED (1 << 1)
2008-06-30 22:04:50 +04:00
struct uvc_video_queue {
2011-10-24 18:53:59 +04:00
struct vb2_queue queue ;
struct mutex mutex ; /* Protects queue */
2008-12-29 04:32:29 +03:00
2008-06-30 22:04:50 +04:00
unsigned int flags ;
2008-12-29 04:32:29 +03:00
unsigned int buf_used ;
2008-06-30 22:04:50 +04:00
2011-10-24 18:53:59 +04:00
spinlock_t irqlock ; /* Protects irqqueue */
2008-06-30 22:04:50 +04:00
struct list_head irqqueue ;
} ;
2009-07-02 03:24:47 +04:00
struct uvc_video_chain {
struct uvc_device * dev ;
struct list_head list ;
2009-11-25 18:00:22 +03:00
struct list_head entities ; /* All entities */
2009-07-02 03:24:47 +04:00
struct uvc_entity * processing ; /* Processing unit */
struct uvc_entity * selector ; /* Selector unit */
2010-10-02 16:04:53 +04:00
struct mutex ctrl_mutex ; /* Protects ctrl.info */
2012-08-29 01:38:58 +04:00
2012-08-29 03:29:56 +04:00
struct v4l2_prio_state prio ; /* V4L2 priority state */
2012-08-29 01:38:58 +04:00
u32 caps ; /* V4L2 chain-wide caps */
2009-07-02 03:24:47 +04:00
} ;
2011-11-03 18:40:08 +04:00
struct uvc_stats_frame {
unsigned int size ; /* Number of bytes captured */
unsigned int first_data ; /* Index of the first non-empty packet */
unsigned int nb_packets ; /* Number of packets */
unsigned int nb_empty ; /* Number of empty packets */
unsigned int nb_invalid ; /* Number of packets with an invalid header */
unsigned int nb_errors ; /* Number of packets with the error bit set */
2011-11-03 19:30:17 +04:00
unsigned int nb_pts ; /* Number of packets with a PTS timestamp */
unsigned int nb_pts_diffs ; /* Number of PTS differences inside a frame */
unsigned int last_pts_diff ; /* Index of the last PTS difference */
bool has_initial_pts ; /* Whether the first non-empty packet has a PTS */
bool has_early_pts ; /* Whether a PTS is present before the first non-empty packet */
u32 pts ; /* PTS of the last packet */
unsigned int nb_scr ; /* Number of packets with a SCR timestamp */
unsigned int nb_scr_diffs ; /* Number of SCR.STC differences inside a frame */
u16 scr_sof ; /* SCR.SOF of the last packet */
u32 scr_stc ; /* SCR.STC of the last packet */
2011-11-03 18:40:08 +04:00
} ;
struct uvc_stats_stream {
struct timespec start_ts ; /* Stream start timestamp */
struct timespec stop_ts ; /* Stream stop timestamp */
unsigned int nb_frames ; /* Number of frames */
unsigned int nb_packets ; /* Number of packets */
unsigned int nb_empty ; /* Number of empty packets */
unsigned int nb_invalid ; /* Number of packets with an invalid header */
unsigned int nb_errors ; /* Number of packets with the error bit set */
2011-11-03 19:30:17 +04:00
unsigned int nb_pts_constant ; /* Number of frames with constant PTS */
unsigned int nb_pts_early ; /* Number of frames with early PTS */
unsigned int nb_pts_initial ; /* Number of frames with initial PTS */
unsigned int nb_scr_count_ok ; /* Number of frames with at least one SCR per non empty packet */
unsigned int nb_scr_diffs_ok ; /* Number of frames with varying SCR.STC */
unsigned int scr_sof_count ; /* STC.SOF counter accumulated since stream start */
unsigned int scr_sof ; /* STC.SOF of the last packet */
unsigned int min_sof ; /* Minimum STC.SOF value */
unsigned int max_sof ; /* Maximum STC.SOF value */
2011-11-03 18:40:08 +04:00
} ;
2009-06-28 15:37:50 +04:00
struct uvc_streaming {
struct list_head list ;
2008-06-30 22:04:50 +04:00
struct uvc_device * dev ;
struct video_device * vdev ;
2009-07-02 03:24:47 +04:00
struct uvc_video_chain * chain ;
2008-06-30 22:04:50 +04:00
atomic_t active ;
2009-06-28 15:37:50 +04:00
struct usb_interface * intf ;
int intfnum ;
__u16 maxpsize ;
2008-06-30 22:04:50 +04:00
2009-06-28 15:37:50 +04:00
struct uvc_streaming_header header ;
enum v4l2_buf_type type ;
unsigned int nformats ;
struct uvc_format * format ;
2008-06-30 22:04:50 +04:00
2009-06-28 15:37:50 +04:00
struct uvc_streaming_control ctrl ;
2012-08-29 01:38:58 +04:00
struct uvc_format * def_format ;
2009-06-28 15:37:50 +04:00
struct uvc_format * cur_format ;
struct uvc_frame * cur_frame ;
2014-09-09 11:42:43 +04:00
2010-11-21 19:36:34 +03:00
/* Protect access to ctrl, cur_format, cur_frame and hardware video
* probe control .
*/
2009-06-28 15:37:50 +04:00
struct mutex mutex ;
2008-06-30 22:04:50 +04:00
2011-10-24 18:53:59 +04:00
/* Buffers queue. */
2009-06-28 15:37:50 +04:00
unsigned int frozen : 1 ;
struct uvc_video_queue queue ;
void ( * decode ) ( struct urb * urb , struct uvc_streaming * video ,
2008-06-30 22:04:50 +04:00
struct uvc_buffer * buf ) ;
/* Context data used by the bulk completion handler. */
struct {
__u8 header [ 256 ] ;
unsigned int header_size ;
int skip_payload ;
__u32 payload_size ;
__u32 max_payload_size ;
} bulk ;
struct urb * urb [ UVC_URBS ] ;
char * urb_buffer [ UVC_URBS ] ;
2008-07-04 07:36:21 +04:00
dma_addr_t urb_dma [ UVC_URBS ] ;
unsigned int urb_size ;
2008-06-30 22:04:50 +04:00
2010-10-02 18:06:05 +04:00
__u32 sequence ;
2008-06-30 22:04:50 +04:00
__u8 last_fid ;
2011-11-03 16:39:37 +04:00
/* debugfs */
struct dentry * debugfs_dir ;
2011-11-03 18:40:08 +04:00
struct {
struct uvc_stats_frame frame ;
struct uvc_stats_stream stream ;
} stats ;
2011-09-24 17:46:55 +04:00
/* Timestamps support. */
struct uvc_clock {
struct uvc_clock_sample {
u32 dev_stc ;
u16 dev_sof ;
struct timespec host_ts ;
u16 host_sof ;
} * samples ;
unsigned int head ;
unsigned int count ;
unsigned int size ;
u16 last_sof ;
u16 sof_offset ;
spinlock_t lock ;
} clock ;
2008-06-30 22:04:50 +04:00
} ;
enum uvc_device_state {
UVC_DEV_DISCONNECTED = 1 ,
} ;
struct uvc_device {
struct usb_device * udev ;
struct usb_interface * intf ;
2008-11-09 01:14:50 +03:00
unsigned long warnings ;
2008-06-30 22:04:50 +04:00
__u32 quirks ;
int intfnum ;
char name [ 32 ] ;
enum uvc_device_state state ;
2013-04-26 05:28:51 +04:00
struct mutex lock ; /* Protects users */
unsigned int users ;
2010-09-08 11:15:23 +04:00
atomic_t nmappings ;
2008-06-30 22:04:50 +04:00
/* Video control interface */
2010-01-21 11:39:47 +03:00
# ifdef CONFIG_MEDIA_CONTROLLER
struct media_device mdev ;
# endif
struct v4l2_device vdev ;
2008-06-30 22:04:50 +04:00
__u16 uvc_version ;
__u32 clock_frequency ;
struct list_head entities ;
2009-07-02 03:24:47 +04:00
struct list_head chains ;
2008-06-30 22:04:50 +04:00
2009-06-28 15:37:50 +04:00
/* Video Streaming interfaces */
struct list_head streams ;
2009-09-30 04:07:19 +04:00
atomic_t nstreams ;
2009-06-28 15:37:50 +04:00
2008-06-30 22:04:50 +04:00
/* Status Interrupt Endpoint */
struct usb_host_endpoint * int_ep ;
struct urb * int_urb ;
2008-09-16 10:32:20 +04:00
__u8 * status ;
2008-06-30 22:04:50 +04:00
struct input_dev * input ;
2009-01-22 18:45:10 +03:00
char input_phys [ 64 ] ;
2008-06-30 22:04:50 +04:00
} ;
enum uvc_handle_state {
UVC_HANDLE_PASSIVE = 0 ,
UVC_HANDLE_ACTIVE = 1 ,
} ;
struct uvc_fh {
2012-04-08 19:59:51 +04:00
struct v4l2_fh vfh ;
2009-07-02 03:24:47 +04:00
struct uvc_video_chain * chain ;
2009-06-28 15:37:50 +04:00
struct uvc_streaming * stream ;
2008-06-30 22:04:50 +04:00
enum uvc_handle_state state ;
} ;
struct uvc_driver {
struct usb_driver driver ;
} ;
/* ------------------------------------------------------------------------
* Debugging , printing and logging
*/
# define UVC_TRACE_PROBE (1 << 0)
# define UVC_TRACE_DESCR (1 << 1)
# define UVC_TRACE_CONTROL (1 << 2)
# define UVC_TRACE_FORMAT (1 << 3)
# define UVC_TRACE_CAPTURE (1 << 4)
# define UVC_TRACE_CALLS (1 << 5)
# define UVC_TRACE_FRAME (1 << 7)
# define UVC_TRACE_SUSPEND (1 << 8)
# define UVC_TRACE_STATUS (1 << 9)
2009-08-06 18:41:17 +04:00
# define UVC_TRACE_VIDEO (1 << 10)
2011-11-03 18:40:08 +04:00
# define UVC_TRACE_STATS (1 << 11)
2011-09-24 17:46:55 +04:00
# define UVC_TRACE_CLOCK (1 << 12)
2008-06-30 22:04:50 +04:00
2008-11-09 01:14:50 +03:00
# define UVC_WARN_MINMAX 0
# define UVC_WARN_PROBE_DEF 1
2010-09-30 16:04:03 +04:00
# define UVC_WARN_XU_GET_RES 2
2008-11-09 01:14:50 +03:00
2009-12-10 04:57:48 +03:00
extern unsigned int uvc_clock_param ;
2008-12-06 22:25:14 +03:00
extern unsigned int uvc_no_drop_param ;
2008-06-30 22:04:50 +04:00
extern unsigned int uvc_trace_param ;
2009-10-10 03:55:23 +04:00
extern unsigned int uvc_timeout_param ;
2008-06-30 22:04:50 +04:00
# define uvc_trace(flag, msg...) \
do { \
if ( uvc_trace_param & flag ) \
printk ( KERN_DEBUG " uvcvideo: " msg ) ; \
} while ( 0 )
2008-11-09 01:14:50 +03:00
# define uvc_warn_once(dev, warn, msg...) \
do { \
if ( ! test_and_set_bit ( warn , & dev - > warnings ) ) \
printk ( KERN_INFO " uvcvideo: " msg ) ; \
} while ( 0 )
2008-06-30 22:04:50 +04:00
# define uvc_printk(level, msg...) \
printk ( level " uvcvideo: " msg )
/* --------------------------------------------------------------------------
* Internal functions .
*/
/* Core driver */
extern struct uvc_driver uvc_driver ;
2010-01-21 11:39:52 +03:00
extern struct uvc_entity * uvc_entity_by_id ( struct uvc_device * dev , int id ) ;
2008-06-30 22:04:50 +04:00
/* Video buffers queue management. */
2012-09-26 14:30:34 +04:00
extern int uvc_queue_init ( struct uvc_video_queue * queue ,
2010-06-17 13:52:37 +04:00
enum v4l2_buf_type type , int drop_corrupted ) ;
2014-10-21 23:07:15 +04:00
extern void uvc_queue_release ( struct uvc_video_queue * queue ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_alloc_buffers ( struct uvc_video_queue * queue ,
2011-10-24 18:53:59 +04:00
struct v4l2_requestbuffers * rb ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_query_buffer ( struct uvc_video_queue * queue ,
struct v4l2_buffer * v4l2_buf ) ;
2014-01-29 20:13:52 +04:00
extern int uvc_create_buffers ( struct uvc_video_queue * queue ,
struct v4l2_create_buffers * v4l2_cb ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_queue_buffer ( struct uvc_video_queue * queue ,
struct v4l2_buffer * v4l2_buf ) ;
extern int uvc_dequeue_buffer ( struct uvc_video_queue * queue ,
struct v4l2_buffer * v4l2_buf , int nonblocking ) ;
extern int uvc_queue_enable ( struct uvc_video_queue * queue , int enable ) ;
extern void uvc_queue_cancel ( struct uvc_video_queue * queue , int disconnect ) ;
extern struct uvc_buffer * uvc_queue_next_buffer ( struct uvc_video_queue * queue ,
struct uvc_buffer * buf ) ;
2010-11-21 21:18:08 +03:00
extern int uvc_queue_mmap ( struct uvc_video_queue * queue ,
struct vm_area_struct * vma ) ;
2008-06-30 22:04:50 +04:00
extern unsigned int uvc_queue_poll ( struct uvc_video_queue * queue ,
struct file * file , poll_table * wait ) ;
2011-04-29 14:11:35 +04:00
# ifndef CONFIG_MMU
extern unsigned long uvc_queue_get_unmapped_area ( struct uvc_video_queue * queue ,
unsigned long pgoff ) ;
# endif
2009-06-04 16:26:39 +04:00
extern int uvc_queue_allocated ( struct uvc_video_queue * queue ) ;
2008-06-30 22:04:50 +04:00
static inline int uvc_queue_streaming ( struct uvc_video_queue * queue )
{
2011-10-24 18:53:59 +04:00
return vb2_is_streaming ( & queue - > queue ) ;
2008-06-30 22:04:50 +04:00
}
/* V4L2 interface */
2010-09-30 17:17:54 +04:00
extern const struct v4l2_ioctl_ops uvc_ioctl_ops ;
2008-12-30 12:58:20 +03:00
extern const struct v4l2_file_operations uvc_fops ;
2008-06-30 22:04:50 +04:00
2010-01-21 11:39:52 +03:00
/* Media controller */
extern int uvc_mc_register_entities ( struct uvc_video_chain * chain ) ;
extern void uvc_mc_cleanup_entity ( struct uvc_entity * entity ) ;
2008-06-30 22:04:50 +04:00
/* Video */
2009-06-28 15:37:50 +04:00
extern int uvc_video_init ( struct uvc_streaming * stream ) ;
extern int uvc_video_suspend ( struct uvc_streaming * stream ) ;
2011-07-16 07:51:00 +04:00
extern int uvc_video_resume ( struct uvc_streaming * stream , int reset ) ;
2009-06-28 15:37:50 +04:00
extern int uvc_video_enable ( struct uvc_streaming * stream , int enable ) ;
extern int uvc_probe_video ( struct uvc_streaming * stream ,
2008-06-30 22:04:50 +04:00
struct uvc_streaming_control * probe ) ;
extern int uvc_query_ctrl ( struct uvc_device * dev , __u8 query , __u8 unit ,
__u8 intfnum , __u8 cs , void * data , __u16 size ) ;
2011-09-24 17:46:55 +04:00
void uvc_video_clock_update ( struct uvc_streaming * stream ,
struct v4l2_buffer * v4l2_buf ,
struct uvc_buffer * buf ) ;
2008-06-30 22:04:50 +04:00
/* Status */
extern int uvc_status_init ( struct uvc_device * dev ) ;
extern void uvc_status_cleanup ( struct uvc_device * dev ) ;
2013-04-26 05:28:51 +04:00
extern int uvc_status_start ( struct uvc_device * dev , gfp_t flags ) ;
2009-05-19 17:08:03 +04:00
extern void uvc_status_stop ( struct uvc_device * dev ) ;
2008-06-30 22:04:50 +04:00
/* Controls */
2012-04-08 19:59:51 +04:00
extern const struct v4l2_subscribed_event_ops uvc_ctrl_sub_ev_ops ;
2009-07-02 03:24:47 +04:00
extern int uvc_query_v4l2_ctrl ( struct uvc_video_chain * chain ,
2008-06-30 22:04:50 +04:00
struct v4l2_queryctrl * v4l2_ctrl ) ;
2010-11-21 13:58:54 +03:00
extern int uvc_query_v4l2_menu ( struct uvc_video_chain * chain ,
struct v4l2_querymenu * query_menu ) ;
2008-06-30 22:04:50 +04:00
2010-09-20 12:53:21 +04:00
extern int uvc_ctrl_add_mapping ( struct uvc_video_chain * chain ,
const struct uvc_control_mapping * mapping ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_ctrl_init_device ( struct uvc_device * dev ) ;
extern void uvc_ctrl_cleanup_device ( struct uvc_device * dev ) ;
2014-03-13 16:38:48 +04:00
extern int uvc_ctrl_restore_values ( struct uvc_device * dev ) ;
2008-06-30 22:04:50 +04:00
2009-07-02 03:24:47 +04:00
extern int uvc_ctrl_begin ( struct uvc_video_chain * chain ) ;
2012-04-08 19:59:51 +04:00
extern int __uvc_ctrl_commit ( struct uvc_fh * handle , int rollback ,
const struct v4l2_ext_control * xctrls ,
unsigned int xctrls_count ) ;
static inline int uvc_ctrl_commit ( struct uvc_fh * handle ,
const struct v4l2_ext_control * xctrls ,
unsigned int xctrls_count )
2008-06-30 22:04:50 +04:00
{
2012-04-08 19:59:51 +04:00
return __uvc_ctrl_commit ( handle , 0 , xctrls , xctrls_count ) ;
2008-06-30 22:04:50 +04:00
}
2012-04-08 19:59:51 +04:00
static inline int uvc_ctrl_rollback ( struct uvc_fh * handle )
2008-06-30 22:04:50 +04:00
{
2012-04-08 19:59:51 +04:00
return __uvc_ctrl_commit ( handle , 1 , NULL , 0 ) ;
2008-06-30 22:04:50 +04:00
}
2009-07-02 03:24:47 +04:00
extern int uvc_ctrl_get ( struct uvc_video_chain * chain ,
2008-06-30 22:04:50 +04:00
struct v4l2_ext_control * xctrl ) ;
2009-07-02 03:24:47 +04:00
extern int uvc_ctrl_set ( struct uvc_video_chain * chain ,
2008-06-30 22:04:50 +04:00
struct v4l2_ext_control * xctrl ) ;
2009-07-02 03:24:47 +04:00
extern int uvc_xu_ctrl_query ( struct uvc_video_chain * chain ,
2010-10-03 02:10:16 +04:00
struct uvc_xu_control_query * xqry ) ;
2008-06-30 22:04:50 +04:00
/* Utility functions */
extern void uvc_simplify_fraction ( uint32_t * numerator , uint32_t * denominator ,
unsigned int n_terms , unsigned int threshold ) ;
extern uint32_t uvc_fraction_to_interval ( uint32_t numerator ,
uint32_t denominator ) ;
extern struct usb_host_endpoint * uvc_find_endpoint (
struct usb_host_interface * alts , __u8 epaddr ) ;
/* Quirks support */
2009-06-28 15:37:50 +04:00
void uvc_video_decode_isight ( struct urb * urb , struct uvc_streaming * stream ,
2008-06-30 22:04:50 +04:00
struct uvc_buffer * buf ) ;
2011-11-03 18:40:08 +04:00
/* debugfs and statistics */
2011-11-03 16:39:37 +04:00
int uvc_debugfs_init ( void ) ;
void uvc_debugfs_cleanup ( void ) ;
int uvc_debugfs_init_stream ( struct uvc_streaming * stream ) ;
void uvc_debugfs_cleanup_stream ( struct uvc_streaming * stream ) ;
2011-11-03 18:40:08 +04:00
size_t uvc_video_stats_dump ( struct uvc_streaming * stream , char * buf ,
size_t size ) ;
2008-06-30 22:04:50 +04:00
# endif