2008-04-12 09:58:09 -03:00
# ifndef GSPCAV2_H
# define GSPCAV2_H
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/usb.h>
# include <linux/videodev2.h>
# include <media/v4l2-common.h>
# include <linux/mutex.h>
2008-07-30 04:53:02 -03:00
/* compilation option */
2011-05-17 04:37:05 -03:00
/*#define GSPCA_DEBUG 1*/
2008-07-30 04:53:02 -03:00
# ifdef GSPCA_DEBUG
2008-04-12 09:58:09 -03:00
/* GSPCA our debug messages */
extern int gspca_debug ;
2011-08-21 19:56:57 -03:00
# define PDEBUG(level, fmt, ...) \
do { \
if ( gspca_debug & ( level ) ) \
pr_info ( fmt , # # __VA_ARGS__ ) ; \
} while ( 0 )
2008-04-12 09:58:09 -03:00
# define D_ERR 0x01
# define D_PROBE 0x02
# define D_CONF 0x04
# define D_STREAM 0x08
# define D_FRAM 0x10
# define D_PACK 0x20
2011-05-17 04:10:32 -03:00
# define D_USBI 0x00
# define D_USBO 0x00
2008-06-12 10:58:58 -03:00
# define D_V4L2 0x0100
2008-04-12 09:58:09 -03:00
# else
2011-08-21 19:56:57 -03:00
# define PDEBUG(level, fmt, ...)
2008-04-12 09:58:09 -03:00
# endif
# define GSPCA_MAX_FRAMES 16 /* maximum number of video frame buffers */
2008-09-04 07:01:50 -03:00
/* image transfers */
# define MAX_NURBS 4 /* max number of URBs */
2008-04-12 09:58:09 -03:00
2009-12-02 06:18:46 -03:00
/* used to list framerates supported by a camera mode (resolution) */
struct framerates {
2010-01-17 03:27:04 -03:00
const u8 * rates ;
2009-12-02 06:18:46 -03:00
int nrates ;
} ;
2010-10-02 04:12:25 -03:00
/* control definition */
struct gspca_ctrl {
s16 val ; /* current value */
s16 def ; /* default value */
s16 min , max ; /* minimum and maximum values */
} ;
2008-04-12 09:58:09 -03:00
/* device information - set at probe time */
struct cam {
2008-12-29 07:49:41 -03:00
const struct v4l2_pix_format * cam_mode ; /* size nmodes */
2010-12-28 07:01:04 -03:00
const struct framerates * mode_framerates ; /* must have size nmodes,
2009-12-02 06:18:46 -03:00
* just like cam_mode */
2010-10-02 04:12:25 -03:00
struct gspca_ctrl * ctrls ; /* control table - size nctrls */
/* may be NULL */
2009-12-15 05:23:04 -03:00
u32 bulk_size ; /* buffer size when image transfer by bulk */
u32 input_flags ; /* value for ENUM_INPUT status flags */
u8 nmodes ; /* size of cam_mode */
u8 no_urb_create ; /* don't create transfer URBs */
u8 bulk_nurbs ; /* number of URBs in bulk mode
2008-11-14 07:53:32 -03:00
* - cannot be > MAX_NURBS
* - when 0 and bulk_size ! = 0 means
* 1 URB and submit done by subdriver */
2009-04-21 13:45:56 -03:00
u8 bulk ; /* image transfer by 0:isoc / 1:bulk */
2009-04-25 13:29:01 -03:00
u8 npkt ; /* number of packets in an ISOC message
* 0 is the default value : 32 packets */
2012-01-01 16:35:01 -03:00
u8 needs_full_bandwidth ; /* Set this flag to notify the bandwidth calc.
* code that the cam fills all image buffers to
* the max , even when using compression . */
2008-04-12 09:58:09 -03:00
} ;
struct gspca_dev ;
struct gspca_frame ;
/* subdriver operations */
typedef int ( * cam_op ) ( struct gspca_dev * ) ;
typedef void ( * cam_v_op ) ( struct gspca_dev * ) ;
typedef int ( * cam_cf_op ) ( struct gspca_dev * , const struct usb_device_id * ) ;
typedef int ( * cam_jpg_op ) ( struct gspca_dev * ,
struct v4l2_jpegcompression * ) ;
2009-07-19 05:29:20 -03:00
typedef int ( * cam_reg_op ) ( struct gspca_dev * ,
struct v4l2_dbg_register * ) ;
typedef int ( * cam_ident_op ) ( struct gspca_dev * ,
struct v4l2_dbg_chip_ident * ) ;
2010-12-25 13:46:14 -03:00
typedef void ( * cam_streamparm_op ) ( struct gspca_dev * ,
2008-12-10 06:02:42 -03:00
struct v4l2_streamparm * ) ;
2008-04-12 09:58:09 -03:00
typedef int ( * cam_qmnu_op ) ( struct gspca_dev * ,
struct v4l2_querymenu * ) ;
typedef void ( * cam_pkt_op ) ( struct gspca_dev * gspca_dev ,
2009-11-13 09:21:03 -03:00
u8 * data ,
2008-04-12 09:58:09 -03:00
int len ) ;
2010-01-28 06:39:49 -03:00
typedef int ( * cam_int_pkt_op ) ( struct gspca_dev * gspca_dev ,
u8 * data ,
int len ) ;
2008-04-12 09:58:09 -03:00
struct ctrl {
struct v4l2_queryctrl qctrl ;
int ( * set ) ( struct gspca_dev * , __s32 ) ;
int ( * get ) ( struct gspca_dev * , __s32 * ) ;
2010-10-02 04:12:25 -03:00
cam_v_op set_control ;
2008-04-12 09:58:09 -03:00
} ;
/* subdriver description */
struct sd_desc {
/* information */
2008-07-04 11:16:16 -03:00
const char * name ; /* sub-driver name */
2008-04-12 09:58:09 -03:00
/* controls */
2010-10-02 04:12:25 -03:00
const struct ctrl * ctrls ; /* static control definition */
2008-04-12 09:58:09 -03:00
int nctrls ;
2008-09-03 17:12:16 -03:00
/* mandatory operations */
2008-04-23 08:09:12 -03:00
cam_cf_op config ; /* called on probe */
2008-09-03 17:12:16 -03:00
cam_op init ; /* called on probe and resume */
2012-05-06 09:28:17 -03:00
cam_op init_controls ; /* called on probe */
2009-06-30 07:07:01 -03:00
cam_op start ; /* called on stream on after URBs creation */
2008-04-12 09:58:09 -03:00
cam_pkt_op pkt_scan ;
2008-07-05 11:49:20 -03:00
/* optional operations */
2009-06-30 07:07:01 -03:00
cam_op isoc_init ; /* called on stream on before getting the EP */
cam_op isoc_nego ; /* called when URB submit failed with NOSPC */
2008-09-03 17:12:16 -03:00
cam_v_op stopN ; /* called on stream off - main alt */
2008-11-18 06:33:08 -03:00
cam_v_op stop0 ; /* called on stream off & disconnect - alt 0 */
2008-07-05 11:49:20 -03:00
cam_v_op dq_callback ; /* called when a frame has been dequeued */
2008-04-12 09:58:09 -03:00
cam_jpg_op get_jcomp ;
cam_jpg_op set_jcomp ;
cam_qmnu_op querymenu ;
2008-12-10 06:02:42 -03:00
cam_streamparm_op get_streamparm ;
cam_streamparm_op set_streamparm ;
2009-07-19 05:29:20 -03:00
# ifdef CONFIG_VIDEO_ADV_DEBUG
cam_reg_op set_register ;
cam_reg_op get_register ;
# endif
cam_ident_op get_chip_ident ;
2010-03-30 14:32:04 -03:00
# if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
2010-01-28 06:39:49 -03:00
cam_int_pkt_op int_pkt_scan ;
2010-02-19 04:28:39 -03:00
/* other_input makes the gspca core create gspca_dev->input even when
int_pkt_scan is NULL , for cams with non interrupt driven buttons */
u8 other_input ;
2010-01-28 06:39:49 -03:00
# endif
2008-04-12 09:58:09 -03:00
} ;
/* packet types when moving from iso buf to frame buf */
2008-10-03 08:46:50 -03:00
enum gspca_packet_type {
DISCARD_PACKET ,
FIRST_PACKET ,
INTER_PACKET ,
LAST_PACKET
} ;
2008-04-12 09:58:09 -03:00
struct gspca_frame {
2008-06-30 15:50:11 -03:00
__u8 * data ; /* frame buffer */
2008-04-12 09:58:09 -03:00
int vma_use_count ;
struct v4l2_buffer v4l2_buf ;
} ;
struct gspca_dev {
2008-11-19 06:37:53 -03:00
struct video_device vdev ; /* !! must be the first item */
2008-11-18 15:52:31 -03:00
struct module * module ; /* subdriver handling the device */
2008-04-12 09:58:09 -03:00
struct usb_device * dev ;
2008-05-04 06:46:21 -03:00
struct file * capt_file ; /* file doing video capture */
2010-03-30 14:32:04 -03:00
# if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
2010-01-28 06:39:49 -03:00
struct input_dev * input_dev ;
char phys [ 64 ] ; /* physical device path */
# endif
2008-04-12 09:58:09 -03:00
struct cam cam ; /* device information */
const struct sd_desc * sd_desc ; /* subdriver description */
2008-09-03 17:12:14 -03:00
unsigned ctrl_dis ; /* disabled controls (bit map) */
2009-11-12 15:59:27 -03:00
unsigned ctrl_inac ; /* inactive controls (bit map) */
2008-04-12 09:58:09 -03:00
2008-09-03 17:12:19 -03:00
# define USB_BUF_SZ 64
__u8 * usb_buf ; /* buffer for USB exchanges */
2008-06-12 10:58:58 -03:00
struct urb * urb [ MAX_NURBS ] ;
2010-03-30 14:32:04 -03:00
# if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
2010-01-28 06:39:49 -03:00
struct urb * int_urb ;
# endif
2008-04-12 09:58:09 -03:00
__u8 * frbuf ; /* buffer for nframes */
struct gspca_frame frame [ GSPCA_MAX_FRAMES ] ;
2010-06-27 03:08:19 -03:00
u8 * image ; /* image beeing filled */
2008-06-30 15:50:11 -03:00
__u32 frsz ; /* frame size */
2010-06-27 03:08:19 -03:00
u32 image_len ; /* current length of image */
2010-07-06 04:32:27 -03:00
atomic_t fr_q ; /* next frame to queue */
atomic_t fr_i ; /* frame being filled */
2008-04-12 09:58:09 -03:00
signed char fr_queue [ GSPCA_MAX_FRAMES ] ; /* frame queue */
2010-07-06 04:32:27 -03:00
char nframes ; /* number of frames */
u8 fr_o ; /* next frame to dequeue */
2008-10-23 07:29:51 -03:00
__u8 last_packet_type ;
__s8 empty_packet ; /* if (-1) don't check empty packets */
__u8 streaming ;
2008-04-12 09:58:09 -03:00
2008-06-30 15:50:11 -03:00
__u8 curr_mode ; /* current camera mode */
2008-04-12 09:58:09 -03:00
__u32 pixfmt ; /* current mode parameters */
2008-06-30 15:50:11 -03:00
__u16 width ;
__u16 height ;
2008-10-23 07:29:51 -03:00
__u32 sequence ; /* frame sequence number */
2008-04-12 09:58:09 -03:00
wait_queue_head_t wq ; /* wait queue */
struct mutex usb_lock ; /* usb exchange protection */
struct mutex queue_lock ; /* ISOC queue protection */
2009-12-02 07:14:33 -03:00
int usb_err ; /* USB error - protected by usb_lock */
2010-07-14 06:30:18 -03:00
u16 pkt_size ; /* ISOC packet size */
2008-09-03 16:48:10 -03:00
# ifdef CONFIG_PM
char frozen ; /* suspend - resume */
# endif
2008-04-12 09:58:09 -03:00
char present ; /* device connected */
char nbufread ; /* number of buffers for read() */
2008-06-12 10:58:58 -03:00
char memory ; /* memory type (V4L2_MEMORY_xxx) */
2008-10-23 07:29:51 -03:00
__u8 iface ; /* USB interface number */
__u8 alt ; /* USB alternate setting */
2010-07-14 06:30:18 -03:00
u8 audio ; /* presence of audio device */
2008-04-12 09:58:09 -03:00
} ;
int gspca_dev_probe ( struct usb_interface * intf ,
const struct usb_device_id * id ,
const struct sd_desc * sd_desc ,
2008-06-12 10:58:58 -03:00
int dev_size ,
struct module * module ) ;
2010-06-05 07:47:36 -03:00
int gspca_dev_probe2 ( struct usb_interface * intf ,
const struct usb_device_id * id ,
const struct sd_desc * sd_desc ,
int dev_size ,
struct module * module ) ;
2008-04-12 09:58:09 -03:00
void gspca_disconnect ( struct usb_interface * intf ) ;
2009-11-13 09:21:03 -03:00
void gspca_frame_add ( struct gspca_dev * gspca_dev ,
enum gspca_packet_type packet_type ,
const u8 * data ,
int len ) ;
2008-09-03 16:48:10 -03:00
# ifdef CONFIG_PM
int gspca_suspend ( struct usb_interface * intf , pm_message_t message ) ;
int gspca_resume ( struct usb_interface * intf ) ;
# endif
2008-07-10 10:40:53 -03:00
int gspca_auto_gain_n_exposure ( struct gspca_dev * gspca_dev , int avg_lum ,
int desired_avg_lum , int deadzone , int gain_knee , int exposure_knee ) ;
2008-04-12 09:58:09 -03:00
# endif /* GSPCAV2_H */