2005-04-17 02:20:36 +04:00
# ifndef __LINUX_se401_H
# define __LINUX_se401_H
# include <asm/uaccess.h>
# include <linux/videodev.h>
2006-06-05 17:26:32 +04:00
# include <media/v4l2-common.h>
2008-07-20 15:12:02 +04:00
# include <media/v4l2-ioctl.h>
2006-01-11 17:55:29 +03:00
# include <linux/mutex.h>
2005-04-17 02:20:36 +04:00
# define se401_DEBUG /* Turn on debug messages */
# ifdef se401_DEBUG
# define PDEBUG(level, fmt, args...) \
if ( debug > = level ) info ( " [ " __PRETTY_FUNCTION__ " :%d] " fmt , __LINE__ , # # args )
# else
# define PDEBUG(level, fmt, args...) do {} while(0)
# endif
/* An almost drop-in replacement for sleep_on_interruptible */
# define wait_interruptible(test, queue, wait) \
{ \
add_wait_queue ( queue , wait ) ; \
set_current_state ( TASK_INTERRUPTIBLE ) ; \
if ( test ) \
schedule ( ) ; \
remove_wait_queue ( queue , wait ) ; \
set_current_state ( TASK_RUNNING ) ; \
if ( signal_pending ( current ) ) \
break ; \
}
# define SE401_REQ_GET_CAMERA_DESCRIPTOR 0x06
# define SE401_REQ_START_CONTINUOUS_CAPTURE 0x41
# define SE401_REQ_STOP_CONTINUOUS_CAPTURE 0x42
# define SE401_REQ_CAPTURE_FRAME 0x43
# define SE401_REQ_GET_BRT 0x44
# define SE401_REQ_SET_BRT 0x45
# define SE401_REQ_GET_WIDTH 0x4c
# define SE401_REQ_SET_WIDTH 0x4d
# define SE401_REQ_GET_HEIGHT 0x4e
# define SE401_REQ_SET_HEIGHT 0x4f
# define SE401_REQ_GET_OUTPUT_MODE 0x50
# define SE401_REQ_SET_OUTPUT_MODE 0x51
# define SE401_REQ_GET_EXT_FEATURE 0x52
# define SE401_REQ_SET_EXT_FEATURE 0x53
# define SE401_REQ_CAMERA_POWER 0x56
# define SE401_REQ_LED_CONTROL 0x57
# define SE401_REQ_BIOS 0xff
# define SE401_BIOS_READ 0x07
# define SE401_FORMAT_BAYER 0x40
/* Hyundai hv7131b registers
7121 and 7141 should be the same ( haven ' t really checked . . . ) */
/* Mode registers: */
# define HV7131_REG_MODE_A 0x00
# define HV7131_REG_MODE_B 0x01
# define HV7131_REG_MODE_C 0x02
/* Frame registers: */
# define HV7131_REG_FRSU 0x10
# define HV7131_REG_FRSL 0x11
# define HV7131_REG_FCSU 0x12
# define HV7131_REG_FCSL 0x13
# define HV7131_REG_FWHU 0x14
# define HV7131_REG_FWHL 0x15
# define HV7131_REG_FWWU 0x16
# define HV7131_REG_FWWL 0x17
/* Timing registers: */
# define HV7131_REG_THBU 0x20
# define HV7131_REG_THBL 0x21
# define HV7131_REG_TVBU 0x22
# define HV7131_REG_TVBL 0x23
# define HV7131_REG_TITU 0x25
# define HV7131_REG_TITM 0x26
# define HV7131_REG_TITL 0x27
# define HV7131_REG_TMCD 0x28
/* Adjust Registers: */
# define HV7131_REG_ARLV 0x30
# define HV7131_REG_ARCG 0x31
# define HV7131_REG_AGCG 0x32
# define HV7131_REG_ABCG 0x33
# define HV7131_REG_APBV 0x34
# define HV7131_REG_ASLP 0x54
/* Offset Registers: */
# define HV7131_REG_OFSR 0x50
# define HV7131_REG_OFSG 0x51
# define HV7131_REG_OFSB 0x52
/* REset level statistics registers: */
# define HV7131_REG_LOREFNOH 0x57
# define HV7131_REG_LOREFNOL 0x58
# define HV7131_REG_HIREFNOH 0x59
# define HV7131_REG_HIREFNOL 0x5a
/* se401 registers */
# define SE401_OPERATINGMODE 0x2000
/* size of usb transfers */
# define SE401_PACKETSIZE 4096
/* number of queued bulk transfers to use, should be about 8 */
# define SE401_NUMSBUF 1
/* read the usb specs for this one :) */
# define SE401_VIDEO_ENDPOINT 1
# define SE401_BUTTON_ENDPOINT 2
/* number of frames supported by the v4l part */
# define SE401_NUMFRAMES 2
/* scratch buffers for passing data to the decoders */
# define SE401_NUMSCRATCH 32
/* maximum amount of data in a JangGu packet */
# define SE401_VLCDATALEN 1024
/* number of nul sized packets to receive before kicking the camera */
# define SE401_MAX_NULLPACKETS 4000
/* number of decoding errors before kicking the camera */
# define SE401_MAX_ERRORS 200
struct usb_device ;
struct se401_sbuf {
unsigned char * data ;
} ;
enum {
FRAME_UNUSED , /* Unused (no MCAPTURE) */
FRAME_READY , /* Ready to start grabbing */
FRAME_GRABBING , /* In the process of being grabbed into */
FRAME_DONE , /* Finished grabbing, but not been synced yet */
FRAME_ERROR , /* Something bad happened while processing */
} ;
enum {
FMT_BAYER ,
FMT_JANGGU ,
} ;
enum {
BUFFER_UNUSED ,
BUFFER_READY ,
BUFFER_BUSY ,
BUFFER_DONE ,
} ;
struct se401_scratch {
unsigned char * data ;
volatile int state ;
int offset ;
int length ;
} ;
struct se401_frame {
unsigned char * data ; /* Frame buffer */
volatile int grabstate ; /* State of grabbing */
unsigned char * curline ;
int curlinepix ;
int curpix ;
} ;
struct usb_se401 {
struct video_device vdev ;
/* Device structure */
struct usb_device * dev ;
unsigned char iface ;
char * camera_name ;
int change ;
int brightness ;
int hue ;
int rgain ;
int ggain ;
int bgain ;
int expose_h ;
int expose_m ;
int expose_l ;
int resetlevel ;
2006-03-25 15:19:53 +03:00
2005-04-17 02:20:36 +04:00
int enhance ;
int format ;
int sizes ;
int * width ;
int * height ;
int cwidth ; /* current width */
int cheight ; /* current height */
int palette ;
int maxframesize ;
int cframesize ; /* current framesize */
2006-01-11 17:55:29 +03:00
struct mutex lock ;
2005-04-17 02:20:36 +04:00
int user ; /* user count for exclusive use */
int removed ; /* device disconnected */
int streaming ; /* Are we streaming video? */
char * fbuf ; /* Videodev buffer area */
struct urb * urb [ SE401_NUMSBUF ] ;
struct urb * inturb ;
2006-03-25 15:19:53 +03:00
2005-04-17 02:20:36 +04:00
int button ;
int buttonpressed ;
int curframe ; /* Current receiving frame */
2006-03-25 15:19:53 +03:00
struct se401_frame frame [ SE401_NUMFRAMES ] ;
2005-04-17 02:20:36 +04:00
int readcount ;
int framecount ;
int error ;
int dropped ;
int scratch_next ;
int scratch_use ;
int scratch_overflow ;
struct se401_scratch scratch [ SE401_NUMSCRATCH ] ;
/* Decoder specific data: */
unsigned char vlcdata [ SE401_VLCDATALEN ] ;
int vlcdatapos ;
int bayeroffset ;
struct se401_sbuf sbuf [ SE401_NUMSBUF ] ;
wait_queue_head_t wq ; /* Processes waiting */
int nullpackets ;
} ;
# endif