diff options
Diffstat (limited to 'drivers/media/video/pwc/pwc.h')
| -rw-r--r-- | drivers/media/video/pwc/pwc.h | 411 | 
1 files changed, 222 insertions, 189 deletions
| diff --git a/drivers/media/video/pwc/pwc.h b/drivers/media/video/pwc/pwc.h index e947766337d6..0e4e2d7b7872 100644 --- a/drivers/media/video/pwc/pwc.h +++ b/drivers/media/video/pwc/pwc.h @@ -29,7 +29,6 @@  #include <linux/usb.h>  #include <linux/spinlock.h>  #include <linux/wait.h> -#include <linux/version.h>  #include <linux/mutex.h>  #include <linux/mm.h>  #include <linux/slab.h> @@ -37,19 +36,16 @@  #include <linux/videodev2.h>  #include <media/v4l2-common.h>  #include <media/v4l2-ioctl.h> +#include <media/v4l2-ctrls.h> +#include <media/videobuf2-vmalloc.h>  #ifdef CONFIG_USB_PWC_INPUT_EVDEV  #include <linux/input.h>  #endif -#include "pwc-uncompress.h"  #include <media/pwc-ioctl.h>  /* Version block */ -#define PWC_MAJOR	10 -#define PWC_MINOR	0 -#define PWC_EXTRAMINOR	12 -#define PWC_VERSION_CODE KERNEL_VERSION(PWC_MAJOR,PWC_MINOR,PWC_EXTRAMINOR) -#define PWC_VERSION	"10.0.14" +#define PWC_VERSION	"10.0.15"  #define PWC_NAME 	"pwc"  #define PFX		PWC_NAME ": " @@ -81,9 +77,9 @@  #define PWC_DEBUG_LEVEL	(PWC_DEBUG_LEVEL_MODULE)  #define PWC_DEBUG(level, fmt, args...) do {\ -	  if ((PWC_DEBUG_LEVEL_ ##level) & pwc_trace) \ -	     printk(KERN_DEBUG PFX fmt, ##args); \ -	  } while(0) +	if ((PWC_DEBUG_LEVEL_ ##level) & pwc_trace) \ +		printk(KERN_DEBUG PFX fmt, ##args); \ +	} while (0)  #define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args)  #define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args) @@ -110,25 +106,21 @@  #define FEATURE_CODEC1			0x0002  #define FEATURE_CODEC2			0x0004 -/* Turn certain features on/off */ -#define PWC_INT_PIPE 0 -  /* Ignore errors in the first N frames, to allow for startup delays */  #define FRAME_LOWMARK 5  /* Size and number of buffers for the ISO pipe. */ -#define MAX_ISO_BUFS		2 +#define MAX_ISO_BUFS		3  #define ISO_FRAMES_PER_DESC	10  #define ISO_MAX_FRAME_SIZE	960  #define ISO_BUFFER_SIZE 	(ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE) -/* Frame buffers: contains compressed or uncompressed video data. */ -#define MAX_FRAMES		5  /* Maximum size after decompression is 640x480 YUV data, 1.5 * 640 * 480 */  #define PWC_FRAME_SIZE 		(460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE) -/* Absolute maximum number of buffers available for mmap() */ -#define MAX_IMAGES 		10 +/* Absolute minimum and maximum number of buffers available for mmap() */ +#define MIN_FRAMES		2 +#define MAX_FRAMES		16  /* Some macros to quickly find the type of a webcam */  #define DEVICE_USE_CODEC1(x) ((x)<675) @@ -136,149 +128,221 @@  #define DEVICE_USE_CODEC3(x) ((x)>=700)  #define DEVICE_USE_CODEC23(x) ((x)>=675) -/* The following structures were based on cpia.h. Why reinvent the wheel? :-) */ -struct pwc_iso_buf -{ -	void *data; -	int  length; -	int  read; -	struct urb *urb; -}; +/* from pwc-dec.h */ +#define PWCX_FLAG_PLANAR        0x0001 + +/* Request types: video */ +#define SET_LUM_CTL			0x01 +#define GET_LUM_CTL			0x02 +#define SET_CHROM_CTL			0x03 +#define GET_CHROM_CTL			0x04 +#define SET_STATUS_CTL			0x05 +#define GET_STATUS_CTL			0x06 +#define SET_EP_STREAM_CTL		0x07 +#define GET_EP_STREAM_CTL		0x08 +#define GET_XX_CTL			0x09 +#define SET_XX_CTL			0x0A +#define GET_XY_CTL			0x0B +#define SET_XY_CTL			0x0C +#define SET_MPT_CTL			0x0D +#define GET_MPT_CTL			0x0E + +/* Selectors for the Luminance controls [GS]ET_LUM_CTL */ +#define AGC_MODE_FORMATTER			0x2000 +#define PRESET_AGC_FORMATTER			0x2100 +#define SHUTTER_MODE_FORMATTER			0x2200 +#define PRESET_SHUTTER_FORMATTER		0x2300 +#define PRESET_CONTOUR_FORMATTER		0x2400 +#define AUTO_CONTOUR_FORMATTER			0x2500 +#define BACK_LIGHT_COMPENSATION_FORMATTER	0x2600 +#define CONTRAST_FORMATTER			0x2700 +#define DYNAMIC_NOISE_CONTROL_FORMATTER		0x2800 +#define FLICKERLESS_MODE_FORMATTER		0x2900 +#define AE_CONTROL_SPEED			0x2A00 +#define BRIGHTNESS_FORMATTER			0x2B00 +#define GAMMA_FORMATTER				0x2C00 + +/* Selectors for the Chrominance controls [GS]ET_CHROM_CTL */ +#define WB_MODE_FORMATTER			0x1000 +#define AWB_CONTROL_SPEED_FORMATTER		0x1100 +#define AWB_CONTROL_DELAY_FORMATTER		0x1200 +#define PRESET_MANUAL_RED_GAIN_FORMATTER	0x1300 +#define PRESET_MANUAL_BLUE_GAIN_FORMATTER	0x1400 +#define COLOUR_MODE_FORMATTER			0x1500 +#define SATURATION_MODE_FORMATTER1		0x1600 +#define SATURATION_MODE_FORMATTER2		0x1700 + +/* Selectors for the Status controls [GS]ET_STATUS_CTL */ +#define SAVE_USER_DEFAULTS_FORMATTER		0x0200 +#define RESTORE_USER_DEFAULTS_FORMATTER		0x0300 +#define RESTORE_FACTORY_DEFAULTS_FORMATTER	0x0400 +#define READ_AGC_FORMATTER			0x0500 +#define READ_SHUTTER_FORMATTER			0x0600 +#define READ_RED_GAIN_FORMATTER			0x0700 +#define READ_BLUE_GAIN_FORMATTER		0x0800 + +/* Formatters for the motorized pan & tilt [GS]ET_MPT_CTL */ +#define PT_RELATIVE_CONTROL_FORMATTER		0x01 +#define PT_RESET_CONTROL_FORMATTER		0x02 +#define PT_STATUS_FORMATTER			0x03  /* intermediate buffers with raw data from the USB cam */  struct pwc_frame_buf  { -   void *data; -   volatile int filled;		/* number of bytes filled */ -   struct pwc_frame_buf *next;	/* list */ -}; - -/* additionnal informations used when dealing image between kernel and userland */ -struct pwc_imgbuf -{ -	unsigned long offset;	/* offset of this buffer in the big array of image_data */ -	int   vma_use_count;	/* count the number of time this memory is mapped */ +	struct vb2_buffer vb;	/* common v4l buffer stuff -- must be first */ +	struct list_head list; +	void *data; +	int filled;		/* number of bytes filled */  };  struct pwc_device  { -   struct video_device *vdev; - -   /* Pointer to our usb_device */ -   struct usb_device *udev; - -   int type;                    /* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */ -   int release;			/* release number */ -   int features;		/* feature bits */ -   char serial[30];		/* serial number (string) */ -   int error_status;		/* set when something goes wrong with the cam (unplugged, USB errors) */ -   int usb_init;		/* set when the cam has been initialized over USB */ - -   /*** Video data ***/ -   int vopen;			/* flag */ -   int vendpoint;		/* video isoc endpoint */ -   int vcinterface;		/* video control interface */ -   int valternate;		/* alternate interface needed */ -   int vframes, vsize;		/* frames-per-second & size (see PSZ_*) */ -   int pixfmt;			/* pixelformat: V4L2_PIX_FMT_YUV420 or raw: _PWC1, _PWC2 */ -   int vframe_count;		/* received frames */ -   int vframes_dumped; 		/* counter for dumped frames */ -   int vframes_error;		/* frames received in error */ -   int vmax_packet_size;	/* USB maxpacket size */ -   int vlast_packet_size;	/* for frame synchronisation */ -   int visoc_errors;		/* number of contiguous ISOC errors */ -   int vcompression;		/* desired compression factor */ -   int vbandlength;		/* compressed band length; 0 is uncompressed */ -   char vsnapshot;		/* snapshot mode */ -   char vsync;			/* used by isoc handler */ -   char vmirror;		/* for ToUCaM series */ -	char unplugged; - -   int cmd_len; -   unsigned char cmd_buf[13]; - -   /* The image acquisition requires 3 to 4 steps: -      1. data is gathered in short packets from the USB controller -      2. data is synchronized and packed into a frame buffer -      3a. in case data is compressed, decompress it directly into image buffer -      3b. in case data is uncompressed, copy into image buffer with viewport -      4. data is transferred to the user process - -      Note that MAX_ISO_BUFS != MAX_FRAMES != MAX_IMAGES.... -      We have in effect a back-to-back-double-buffer system. -    */ -   /* 1: isoc */ -   struct pwc_iso_buf sbuf[MAX_ISO_BUFS]; -   char iso_init; - -   /* 2: frame */ -   struct pwc_frame_buf *fbuf;	/* all frames */ -   struct pwc_frame_buf *empty_frames, *empty_frames_tail;	/* all empty frames */ -   struct pwc_frame_buf *full_frames, *full_frames_tail;	/* all filled frames */ -   struct pwc_frame_buf *fill_frame;	/* frame currently being filled */ -   struct pwc_frame_buf *read_frame;	/* frame currently read by user process */ -   int frame_header_size, frame_trailer_size; -   int frame_size; -   int frame_total_size; /* including header & trailer */ -   int drop_frames; - -   /* 3: decompression */ -   void *decompress_data;		/* private data for decompression engine */ - -   /* 4: image */ -   /* We have an 'image' and a 'view', where 'image' is the fixed-size image -      as delivered by the camera, and 'view' is the size requested by the -      program. The camera image is centered in this viewport, laced with -      a gray or black border. view_min <= image <= view <= view_max; -    */ -   int image_mask;			/* bitmask of supported sizes */ -   struct pwc_coord view_min, view_max;	/* minimum and maximum viewable sizes */ -   struct pwc_coord abs_max;            /* maximum supported size with compression */ -   struct pwc_coord image, view;	/* image and viewport size */ -   struct pwc_coord offset;		/* offset within the viewport */ - -   void *image_data;			/* total buffer, which is subdivided into ... */ -   struct pwc_imgbuf images[MAX_IMAGES];/* ...several images... */ -   int fill_image;			/* ...which are rotated. */ -   int len_per_image;			/* length per image */ -   int image_read_pos;			/* In case we read data in pieces, keep track of were we are in the imagebuffer */ -   int image_used[MAX_IMAGES];		/* For MCAPTURE and SYNC */ - -   struct mutex modlock;		/* to prevent races in video_open(), etc */ -   spinlock_t ptrlock;			/* for manipulating the buffer pointers */ - -   /*** motorized pan/tilt feature */ -   struct pwc_mpt_range angle_range; -   int pan_angle;			/* in degrees * 100 */ -   int tilt_angle;			/* absolute angle; 0,0 is home position */ -   int snapshot_button_status;		/* set to 1 when the user push the button, reset to 0 when this value is read */ +	struct video_device vdev; +	struct mutex modlock; + +	/* Pointer to our usb_device, may be NULL after unplug */ +	struct usb_device *udev; +	/* Protects the setting of udev to NULL by our disconnect handler */ +	struct mutex udevlock; + +	/* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */ +	int type; +	int release;		/* release number */ +	int features;		/* feature bits */ +	char serial[30];	/* serial number (string) */ + +	/*** Video data ***/ +	struct file *capt_file;	/* file doing video capture */ +	int vendpoint;		/* video isoc endpoint */ +	int vcinterface;	/* video control interface */ +	int valternate;		/* alternate interface needed */ +	int vframes, vsize;	/* frames-per-second & size (see PSZ_*) */ +	int pixfmt;		/* pixelformat: V4L2_PIX_FMT_YUV420 or _PWCX */ +	int vframe_count;	/* received frames */ +	int vmax_packet_size;	/* USB maxpacket size */ +	int vlast_packet_size;	/* for frame synchronisation */ +	int visoc_errors;	/* number of contiguous ISOC errors */ +	int vcompression;	/* desired compression factor */ +	int vbandlength;	/* compressed band length; 0 is uncompressed */ +	char vsnapshot;		/* snapshot mode */ +	char vsync;		/* used by isoc handler */ +	char vmirror;		/* for ToUCaM series */ +	char power_save;	/* Do powersaving for this cam */ + +	int cmd_len; +	unsigned char cmd_buf[13]; + +	struct urb *urbs[MAX_ISO_BUFS]; +	char iso_init; + +	/* videobuf2 queue and queued buffers list */ +	struct vb2_queue vb_queue; +	struct list_head queued_bufs; +	spinlock_t queued_bufs_lock; + +	/* +	 * Frame currently being filled, this only gets touched by the +	 * isoc urb complete handler, and by stream start / stop since +	 * start / stop touch it before / after starting / killing the urbs +	 * no locking is needed around this +	 */ +	struct pwc_frame_buf *fill_buf; + +	int frame_header_size, frame_trailer_size; +	int frame_size; +	int frame_total_size;	/* including header & trailer */ +	int drop_frames; + +	void *decompress_data;	/* private data for decompression engine */ + +	/* +	 * We have an 'image' and a 'view', where 'image' is the fixed-size img +	 * as delivered by the camera, and 'view' is the size requested by the +	 * program. The camera image is centered in this viewport, laced with +	 * a gray or black border. view_min <= image <= view <= view_max; +	 */ +	int image_mask;				/* supported sizes */ +	struct pwc_coord view_min, view_max;	/* minimum and maximum view */ +	struct pwc_coord abs_max;		/* maximum supported size */ +	struct pwc_coord image, view;		/* image and viewport size */ +	struct pwc_coord offset;		/* offset of the viewport */ + +	/*** motorized pan/tilt feature */ +	struct pwc_mpt_range angle_range; +	int pan_angle;			/* in degrees * 100 */ +	int tilt_angle;			/* absolute angle; 0,0 is home */ + +	/* +	 * Set to 1 when the user push the button, reset to 0 +	 * when this value is read from sysfs. +	 */ +	int snapshot_button_status;  #ifdef CONFIG_USB_PWC_INPUT_EVDEV -   struct input_dev *button_dev;	/* webcam snapshot button input */ -   char button_phys[64]; +	struct input_dev *button_dev;	/* webcam snapshot button input */ +	char button_phys[64];  #endif -   /*** Misc. data ***/ -   wait_queue_head_t frameq;		/* When waiting for a frame to finish... */ -#if PWC_INT_PIPE -   void *usb_int_handler;		/* for the interrupt endpoint */ -#endif +	/* controls */ +	struct v4l2_ctrl_handler	ctrl_handler; +	u16				saturation_fmt; +	struct v4l2_ctrl		*brightness; +	struct v4l2_ctrl		*contrast; +	struct v4l2_ctrl		*saturation; +	struct v4l2_ctrl		*gamma; +	struct { +		/* awb / red-blue balance cluster */ +		struct v4l2_ctrl	*auto_white_balance; +		struct v4l2_ctrl	*red_balance; +		struct v4l2_ctrl	*blue_balance; +		/* usb ctrl transfers are slow, so we cache things */ +		int			color_bal_valid; +		unsigned long		last_color_bal_update; /* In jiffies */ +		s32			last_red_balance; +		s32			last_blue_balance; +	}; +	struct { +		/* autogain / gain cluster */ +		struct v4l2_ctrl	*autogain; +		struct v4l2_ctrl	*gain; +		int			gain_valid; +		unsigned long		last_gain_update; /* In jiffies */ +		s32			last_gain; +	}; +	struct { +		/* exposure_auto / exposure cluster */ +		struct v4l2_ctrl	*exposure_auto; +		struct v4l2_ctrl	*exposure; +		int			exposure_valid; +		unsigned long		last_exposure_update; /* In jiffies */ +		s32			last_exposure; +	}; +	struct v4l2_ctrl		*colorfx; +	struct { +		/* autocontour/contour cluster */ +		struct v4l2_ctrl	*autocontour; +		struct v4l2_ctrl	*contour; +	}; +	struct v4l2_ctrl		*backlight; +	struct v4l2_ctrl		*flicker; +	struct v4l2_ctrl		*noise_reduction; +	struct v4l2_ctrl		*save_user; +	struct v4l2_ctrl		*restore_user; +	struct v4l2_ctrl		*restore_factory; +	struct { +		/* motor control cluster */ +		struct v4l2_ctrl	*motor_pan; +		struct v4l2_ctrl	*motor_tilt; +		struct v4l2_ctrl	*motor_pan_reset; +		struct v4l2_ctrl	*motor_tilt_reset; +	}; +	/* CODEC3 models have both gain and exposure controlled by autogain */ +	struct v4l2_ctrl		*autogain_expo_cluster[3];  }; -#ifdef __cplusplus -extern "C" { -#endif -  /* Global variables */  #ifdef CONFIG_USB_PWC_DEBUG  extern int pwc_trace;  #endif -extern int pwc_mbufs; - -/** functions in pwc-if.c */ -int pwc_handle_frame(struct pwc_device *pdev); -void pwc_next_image(struct pwc_device *pdev); -int pwc_isoc_init(struct pwc_device *pdev); -void pwc_isoc_cleanup(struct pwc_device *pdev);  /** Functions in pwc-misc.c */  /* sizes in pixels */ @@ -291,50 +355,25 @@ void pwc_construct(struct pwc_device *pdev);  /* Request a certain video mode. Returns < 0 if not possible */  extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frames, int compression, int snapshot);  extern unsigned int pwc_get_fps(struct pwc_device *pdev, unsigned int index, unsigned int size); -/* Calculate the number of bytes per image (not frame) */  extern int pwc_mpt_reset(struct pwc_device *pdev, int flags);  extern int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt); - -/* Various controls; should be obvious. Value 0..65535, or < 0 on error */ -extern int pwc_get_brightness(struct pwc_device *pdev); -extern int pwc_set_brightness(struct pwc_device *pdev, int value); -extern int pwc_get_contrast(struct pwc_device *pdev); -extern int pwc_set_contrast(struct pwc_device *pdev, int value); -extern int pwc_get_gamma(struct pwc_device *pdev); -extern int pwc_set_gamma(struct pwc_device *pdev, int value); -extern int pwc_get_saturation(struct pwc_device *pdev, int *value); -extern int pwc_set_saturation(struct pwc_device *pdev, int value);  extern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value);  extern int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor); -extern int pwc_restore_user(struct pwc_device *pdev); -extern int pwc_save_user(struct pwc_device *pdev); -extern int pwc_restore_factory(struct pwc_device *pdev); - -/* exported for use by v4l2 controls */ -extern int pwc_get_red_gain(struct pwc_device *pdev, int *value); -extern int pwc_set_red_gain(struct pwc_device *pdev, int value); -extern int pwc_get_blue_gain(struct pwc_device *pdev, int *value); -extern int pwc_set_blue_gain(struct pwc_device *pdev, int value); -extern int pwc_get_awb(struct pwc_device *pdev); -extern int pwc_set_awb(struct pwc_device *pdev, int mode); -extern int pwc_set_agc(struct pwc_device *pdev, int mode, int value); -extern int pwc_get_agc(struct pwc_device *pdev, int *value); -extern int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value); -extern int pwc_get_shutter_speed(struct pwc_device *pdev, int *value); - -extern int pwc_set_colour_mode(struct pwc_device *pdev, int colour); -extern int pwc_get_colour_mode(struct pwc_device *pdev, int *colour); -extern int pwc_set_contour(struct pwc_device *pdev, int contour); -extern int pwc_get_contour(struct pwc_device *pdev, int *contour); -extern int pwc_set_backlight(struct pwc_device *pdev, int backlight); -extern int pwc_get_backlight(struct pwc_device *pdev, int *backlight); -extern int pwc_set_flicker(struct pwc_device *pdev, int flicker); -extern int pwc_get_flicker(struct pwc_device *pdev, int *flicker); -extern int pwc_set_dynamic_noise(struct pwc_device *pdev, int noise); -extern int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise); +extern int send_control_msg(struct pwc_device *pdev, +			    u8 request, u16 value, void *buf, int buflen); + +/* Control get / set helpers */ +int pwc_get_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data); +int pwc_set_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, u8 data); +int pwc_get_s8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data); +#define pwc_set_s8_ctrl pwc_set_u8_ctrl +int pwc_get_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *dat); +int pwc_set_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, u16 data); +int pwc_button_ctrl(struct pwc_device *pdev, u16 value); +int pwc_init_controls(struct pwc_device *pdev);  /* Power down or up the camera; not supported by all models */ -extern int pwc_camera_power(struct pwc_device *pdev, int power); +extern void pwc_camera_power(struct pwc_device *pdev, int power);  /* Private ioctl()s; see pwc-ioctl.h */  extern long pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg); @@ -343,12 +382,6 @@ extern const struct v4l2_ioctl_ops pwc_ioctl_ops;  /** pwc-uncompress.c */  /* Expand frame to image, possibly including decompression. Uses read_frame and fill_image */ -extern int pwc_decompress(struct pwc_device *pdev); - -#ifdef __cplusplus -} -#endif - +int pwc_decompress(struct pwc_device *pdev, struct pwc_frame_buf *fbuf);  #endif -/* vim: set cino= formatoptions=croql cindent shiftwidth=8 tabstop=8: */ | 
