1 2#ifndef __LINUX_se401_H 3#define __LINUX_se401_H 4 5#include <linux/uaccess.h> 6#include <linux/videodev.h> 7#include <media/v4l2-common.h> 8#include <media/v4l2-ioctl.h> 9#include <linux/mutex.h> 10 11#define se401_DEBUG /* Turn on debug messages */ 12 13#ifdef se401_DEBUG 14# define PDEBUG(level, fmt, args...) \ 15if (debug >= level) \ 16 info("[" __PRETTY_FUNCTION__ ":%d] " fmt, __LINE__ , ## args) 17#else 18# define PDEBUG(level, fmt, args...) do {} while (0) 19#endif 20 21/* An almost drop-in replacement for sleep_on_interruptible */ 22#define wait_interruptible(test, queue, wait) \ 23{ \ 24 add_wait_queue(queue, wait); \ 25 set_current_state(TASK_INTERRUPTIBLE); \ 26 if (test) \ 27 schedule(); \ 28 remove_wait_queue(queue, wait); \ 29 set_current_state(TASK_RUNNING); \ 30 if (signal_pending(current)) \ 31 break; \ 32} 33 34#define SE401_REQ_GET_CAMERA_DESCRIPTOR 0x06 35#define SE401_REQ_START_CONTINUOUS_CAPTURE 0x41 36#define SE401_REQ_STOP_CONTINUOUS_CAPTURE 0x42 37#define SE401_REQ_CAPTURE_FRAME 0x43 38#define SE401_REQ_GET_BRT 0x44 39#define SE401_REQ_SET_BRT 0x45 40#define SE401_REQ_GET_WIDTH 0x4c 41#define SE401_REQ_SET_WIDTH 0x4d 42#define SE401_REQ_GET_HEIGHT 0x4e 43#define SE401_REQ_SET_HEIGHT 0x4f 44#define SE401_REQ_GET_OUTPUT_MODE 0x50 45#define SE401_REQ_SET_OUTPUT_MODE 0x51 46#define SE401_REQ_GET_EXT_FEATURE 0x52 47#define SE401_REQ_SET_EXT_FEATURE 0x53 48#define SE401_REQ_CAMERA_POWER 0x56 49#define SE401_REQ_LED_CONTROL 0x57 50#define SE401_REQ_BIOS 0xff 51 52#define SE401_BIOS_READ 0x07 53 54#define SE401_FORMAT_BAYER 0x40 55 56/* Hyundai hv7131b registers 57 7121 and 7141 should be the same (haven't really checked...) */ 58/* Mode registers: */ 59#define HV7131_REG_MODE_A 0x00 60#define HV7131_REG_MODE_B 0x01 61#define HV7131_REG_MODE_C 0x02 62/* Frame registers: */ 63#define HV7131_REG_FRSU 0x10 64#define HV7131_REG_FRSL 0x11 65#define HV7131_REG_FCSU 0x12 66#define HV7131_REG_FCSL 0x13 67#define HV7131_REG_FWHU 0x14 68#define HV7131_REG_FWHL 0x15 69#define HV7131_REG_FWWU 0x16 70#define HV7131_REG_FWWL 0x17 71/* Timing registers: */ 72#define HV7131_REG_THBU 0x20 73#define HV7131_REG_THBL 0x21 74#define HV7131_REG_TVBU 0x22 75#define HV7131_REG_TVBL 0x23 76#define HV7131_REG_TITU 0x25 77#define HV7131_REG_TITM 0x26 78#define HV7131_REG_TITL 0x27 79#define HV7131_REG_TMCD 0x28 80/* Adjust Registers: */ 81#define HV7131_REG_ARLV 0x30 82#define HV7131_REG_ARCG 0x31 83#define HV7131_REG_AGCG 0x32 84#define HV7131_REG_ABCG 0x33 85#define HV7131_REG_APBV 0x34 86#define HV7131_REG_ASLP 0x54 87/* Offset Registers: */ 88#define HV7131_REG_OFSR 0x50 89#define HV7131_REG_OFSG 0x51 90#define HV7131_REG_OFSB 0x52 91/* REset level statistics registers: */ 92#define HV7131_REG_LOREFNOH 0x57 93#define HV7131_REG_LOREFNOL 0x58 94#define HV7131_REG_HIREFNOH 0x59 95#define HV7131_REG_HIREFNOL 0x5a 96 97/* se401 registers */ 98#define SE401_OPERATINGMODE 0x2000 99 100 101/* size of usb transfers */ 102#define SE401_PACKETSIZE 4096 103/* number of queued bulk transfers to use, should be about 8 */ 104#define SE401_NUMSBUF 1 105/* read the usb specs for this one :) */ 106#define SE401_VIDEO_ENDPOINT 1 107#define SE401_BUTTON_ENDPOINT 2 108/* number of frames supported by the v4l part */ 109#define SE401_NUMFRAMES 2 110/* scratch buffers for passing data to the decoders */ 111#define SE401_NUMSCRATCH 32 112/* maximum amount of data in a JangGu packet */ 113#define SE401_VLCDATALEN 1024 114/* number of nul sized packets to receive before kicking the camera */ 115#define SE401_MAX_NULLPACKETS 4000 116/* number of decoding errors before kicking the camera */ 117#define SE401_MAX_ERRORS 200 118 119struct usb_device; 120 121struct se401_sbuf { 122 unsigned char *data; 123}; 124 125enum { 126 FRAME_UNUSED, /* Unused (no MCAPTURE) */ 127 FRAME_READY, /* Ready to start grabbing */ 128 FRAME_GRABBING, /* In the process of being grabbed into */ 129 FRAME_DONE, /* Finished grabbing, but not been synced yet */ 130 FRAME_ERROR, /* Something bad happened while processing */ 131}; 132 133enum { 134 FMT_BAYER, 135 FMT_JANGGU, 136}; 137 138enum { 139 BUFFER_UNUSED, 140 BUFFER_READY, 141 BUFFER_BUSY, 142 BUFFER_DONE, 143}; 144 145struct se401_scratch { 146 unsigned char *data; 147 volatile int state; 148 int offset; 149 int length; 150}; 151 152struct se401_frame { 153 unsigned char *data; /* Frame buffer */ 154 155 volatile int grabstate; /* State of grabbing */ 156 157 unsigned char *curline; 158 int curlinepix; 159 int curpix; 160}; 161 162struct usb_se401 { 163 struct video_device vdev; 164 165 /* Device structure */ 166 struct usb_device *dev; 167 168 unsigned char iface; 169 170 char *camera_name; 171 172 int change; 173 int brightness; 174 int hue; 175 int rgain; 176 int ggain; 177 int bgain; 178 int expose_h; 179 int expose_m; 180 int expose_l; 181 int resetlevel; 182 183 int enhance; 184 185 int format; 186 int sizes; 187 int *width; 188 int *height; 189 int cwidth; /* current width */ 190 int cheight; /* current height */ 191 int palette; 192 int maxframesize; 193 int cframesize; /* current framesize */ 194 195 struct mutex lock; 196 int user; /* user count for exclusive use */ 197 int removed; /* device disconnected */ 198 199 int streaming; /* Are we streaming video? */ 200 201 char *fbuf; /* Videodev buffer area */ 202 203 struct urb *urb[SE401_NUMSBUF]; 204 struct urb *inturb; 205 206 int button; 207 int buttonpressed; 208 209 int curframe; /* Current receiving frame */ 210 struct se401_frame frame[SE401_NUMFRAMES]; 211 int readcount; 212 int framecount; 213 int error; 214 int dropped; 215 216 int scratch_next; 217 int scratch_use; 218 int scratch_overflow; 219 struct se401_scratch scratch[SE401_NUMSCRATCH]; 220 221 /* Decoder specific data: */ 222 unsigned char vlcdata[SE401_VLCDATALEN]; 223 int vlcdatapos; 224 int bayeroffset; 225 226 struct se401_sbuf sbuf[SE401_NUMSBUF]; 227 228 wait_queue_head_t wq; /* Processes waiting */ 229 230 int nullpackets; 231}; 232 233 234 235#endif 236