2008-06-30 22:04:50 +04:00
# ifndef _USB_VIDEO_H_
# define _USB_VIDEO_H_
# include <linux/kernel.h>
# include <linux/videodev2.h>
2010-11-21 23:15:44 +03:00
# ifndef __KERNEL__
/*
* This header provides binary compatibility with applications using the private
* uvcvideo API . This API is deprecated and will be removed in 2.6 .42 .
* Applications should be recompiled against the public linux / uvcvideo . h header .
*/
# warn "The uvcvideo.h header is deprecated, use linux / uvcvideo.h instead."
2008-06-30 22:04:50 +04:00
/*
* Dynamic controls
*/
/* Data types for UVC control data */
# define UVC_CTRL_DATA_TYPE_RAW 0
# define UVC_CTRL_DATA_TYPE_SIGNED 1
# define UVC_CTRL_DATA_TYPE_UNSIGNED 2
# define UVC_CTRL_DATA_TYPE_BOOLEAN 3
# define UVC_CTRL_DATA_TYPE_ENUM 4
# define UVC_CTRL_DATA_TYPE_BITMASK 5
/* Control flags */
# define UVC_CONTROL_SET_CUR (1 << 0)
# define UVC_CONTROL_GET_CUR (1 << 1)
# define UVC_CONTROL_GET_MIN (1 << 2)
# define UVC_CONTROL_GET_MAX (1 << 3)
# define UVC_CONTROL_GET_RES (1 << 4)
# define UVC_CONTROL_GET_DEF (1 << 5)
# define UVC_CONTROL_RESTORE (1 << 6)
# define UVC_CONTROL_AUTO_UPDATE (1 << 7)
# define UVC_CONTROL_GET_RANGE (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \
UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \
UVC_CONTROL_GET_DEF )
2010-02-18 22:38:52 +03:00
struct uvc_menu_info {
__u32 value ;
__u8 name [ 32 ] ;
} ;
2008-06-30 22:04:50 +04:00
struct uvc_xu_control_mapping {
__u32 id ;
__u8 name [ 32 ] ;
__u8 entity [ 16 ] ;
__u8 selector ;
__u8 size ;
__u8 offset ;
2010-10-03 02:10:16 +04:00
__u32 v4l2_type ;
2008-06-30 22:04:50 +04:00
__u32 data_type ;
2010-02-18 22:38:52 +03:00
struct uvc_menu_info __user * menu_info ;
__u32 menu_count ;
__u32 reserved [ 4 ] ;
2008-06-30 22:04:50 +04:00
} ;
2010-11-21 23:15:44 +03:00
# endif
struct uvc_xu_control_info {
__u8 entity [ 16 ] ;
__u8 index ;
2008-06-30 22:04:50 +04:00
__u8 selector ;
__u16 size ;
2010-11-21 23:15:44 +03:00
__u32 flags ;
2008-06-30 22:04:50 +04:00
} ;
2010-11-21 23:15:44 +03:00
struct uvc_xu_control_mapping_old {
__u8 reserved [ 64 ] ;
} ;
struct uvc_xu_control {
2010-10-03 02:10:16 +04:00
__u8 unit ;
__u8 selector ;
__u16 size ;
__u8 __user * data ;
} ;
2010-11-21 23:15:44 +03:00
# ifndef __KERNEL__
2008-06-30 22:04:50 +04:00
# define UVCIOC_CTRL_ADD _IOW('U', 1, struct uvc_xu_control_info)
2010-02-18 22:38:52 +03:00
# define UVCIOC_CTRL_MAP_OLD _IOWR('U', 2, struct uvc_xu_control_mapping_old)
2008-06-30 22:04:50 +04:00
# define UVCIOC_CTRL_MAP _IOWR('U', 2, struct uvc_xu_control_mapping)
# define UVCIOC_CTRL_GET _IOWR('U', 3, struct uvc_xu_control)
# define UVCIOC_CTRL_SET _IOW('U', 4, struct uvc_xu_control)
2010-11-21 23:15:44 +03:00
# else
# define __UVCIOC_CTRL_ADD _IOW('U', 1, struct uvc_xu_control_info)
# define __UVCIOC_CTRL_MAP_OLD _IOWR('U', 2, struct uvc_xu_control_mapping_old)
# define __UVCIOC_CTRL_MAP _IOWR('U', 2, struct uvc_xu_control_mapping)
# define __UVCIOC_CTRL_GET _IOWR('U', 3, struct uvc_xu_control)
# define __UVCIOC_CTRL_SET _IOW('U', 4, struct uvc_xu_control)
# endif
2008-06-30 22:04:50 +04:00
# ifdef __KERNEL__
# 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>
2010-01-21 11:39:47 +03:00
# include <media/media-device.h>
# include <media/v4l2-device.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 , \
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 }
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
/* ------------------------------------------------------------------------
* 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-06-30 22:04:50 +04:00
/* Maximum number of video buffers. */
# define UVC_MAX_VIDEO_BUFFERS 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
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
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 ;
struct uvc_control_info * ctrl ;
__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
__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 .
*/
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 . */
__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 {
unsigned long vma_use_count ;
struct list_head stream ;
/* Touched by interrupt handler. */
struct v4l2_buffer buf ;
struct list_head queue ;
wait_queue_head_t wait ;
enum uvc_buffer_state state ;
2010-06-17 13:52:37 +04:00
unsigned int error ;
2008-06-30 22:04:50 +04:00
} ;
# define UVC_QUEUE_STREAMING (1 << 0)
# define UVC_QUEUE_DISCONNECTED (1 << 1)
2010-06-17 13:52:37 +04:00
# define UVC_QUEUE_DROP_CORRUPTED (1 << 2)
2008-06-30 22:04:50 +04:00
struct uvc_video_queue {
2008-12-29 04:32:29 +03:00
enum v4l2_buf_type type ;
2008-06-30 22:04:50 +04:00
void * mem ;
unsigned int flags ;
unsigned int count ;
unsigned int buf_size ;
2008-12-29 04:32:29 +03:00
unsigned int buf_used ;
2008-06-30 22:04:50 +04:00
struct uvc_buffer buffer [ UVC_MAX_VIDEO_BUFFERS ] ;
struct mutex mutex ; /* protects buffers and mainqueue */
spinlock_t irqlock ; /* protects irqqueue */
struct list_head mainqueue ;
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 */
2009-07-02 03:24:47 +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 ;
struct uvc_format * cur_format ;
struct uvc_frame * cur_frame ;
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
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 ;
} ;
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 ;
2009-05-19 17:08:03 +04:00
atomic_t 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 {
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_IOCTL (1 << 6)
# 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)
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
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. */
2008-12-29 04:32:29 +03:00
extern void uvc_queue_init ( struct uvc_video_queue * queue ,
2010-06-17 13:52:37 +04:00
enum v4l2_buf_type type , int drop_corrupted ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_alloc_buffers ( struct uvc_video_queue * queue ,
unsigned int nbuffers , unsigned int buflength ) ;
extern int uvc_free_buffers ( struct uvc_video_queue * queue ) ;
extern int uvc_query_buffer ( struct uvc_video_queue * queue ,
struct v4l2_buffer * v4l2_buf ) ;
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 )
{
return queue - > flags & UVC_QUEUE_STREAMING ;
}
/* V4L2 interface */
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 ) ;
extern int uvc_video_resume ( struct uvc_streaming * stream ) ;
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 ) ;
2009-06-28 15:37:50 +04:00
extern int uvc_commit_video ( struct uvc_streaming * stream ,
2008-11-09 01:14:50 +03:00
struct uvc_streaming_control * ctrl ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_query_ctrl ( struct uvc_device * dev , __u8 query , __u8 unit ,
__u8 intfnum , __u8 cs , void * data , __u16 size ) ;
/* Status */
extern int uvc_status_init ( struct uvc_device * dev ) ;
extern void uvc_status_cleanup ( struct uvc_device * dev ) ;
2009-05-19 17:08:03 +04:00
extern int uvc_status_start ( struct uvc_device * dev ) ;
extern void uvc_status_stop ( struct uvc_device * dev ) ;
2008-06-30 22:04:50 +04:00
extern int uvc_status_suspend ( struct uvc_device * dev ) ;
extern int uvc_status_resume ( struct uvc_device * dev ) ;
/* Controls */
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 ) ;
extern int uvc_ctrl_resume_device ( struct uvc_device * dev ) ;
2009-07-02 03:24:47 +04:00
extern int uvc_ctrl_begin ( struct uvc_video_chain * chain ) ;
extern int __uvc_ctrl_commit ( struct uvc_video_chain * chain , int rollback ) ;
static inline int uvc_ctrl_commit ( struct uvc_video_chain * chain )
2008-06-30 22:04:50 +04:00
{
2009-07-02 03:24:47 +04:00
return __uvc_ctrl_commit ( chain , 0 ) ;
2008-06-30 22:04:50 +04:00
}
2009-07-02 03:24:47 +04:00
static inline int uvc_ctrl_rollback ( struct uvc_video_chain * chain )
2008-06-30 22:04:50 +04:00
{
2009-07-02 03:24:47 +04:00
return __uvc_ctrl_commit ( chain , 1 ) ;
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 ) ;
# endif /* __KERNEL__ */
# endif