summaryrefslogtreecommitdiffstats
path: root/drivers/usb/cpia.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/cpia.h')
-rw-r--r--drivers/usb/cpia.h90
1 files changed, 67 insertions, 23 deletions
diff --git a/drivers/usb/cpia.h b/drivers/usb/cpia.h
index 4596ec159..f1d9ed7cd 100644
--- a/drivers/usb/cpia.h
+++ b/drivers/usb/cpia.h
@@ -78,9 +78,10 @@
#define CPIA_YUYV 0
#define CPIA_UYVY 1
-#define STREAM_BUF_SIZE (PAGE_SIZE * 4)
+#define STREAM_BUF_SIZE (PAGE_SIZE * 4)
+/* #define STREAM_BUF_SIZE (FRAMES_PER_DESC * FRAME_SIZE_PER_DESC) */
-#define SCRATCH_BUF_SIZE (STREAM_BUF_SIZE * 2)
+#define SCRATCH_BUF_SIZE (STREAM_BUF_SIZE * 2)
#define FRAMES_PER_DESC 10
#define FRAME_SIZE_PER_DESC 960 /* Shouldn't be hardcoded */
@@ -91,54 +92,97 @@ enum {
STATE_LINES, /* Parsing lines */
};
+#define CPIA_MAGIC 0x1968
+struct cpia_frame_header {
+ __u16 magic; /* 0 - 1 */
+ __u16 timestamp; /* 2 - 3 */
+ __u16 unused; /* 4 - 5 */
+ __u16 timestamp1; /* 6 - 7 */
+ __u8 unused1[8]; /* 8 - 15 */
+ __u8 video_size; /* 16 0 = QCIF, 1 = CIF */
+ __u8 sub_sample; /* 17 0 = 4:2:0, 1 = 4:2:2 */
+ __u8 yuv_order; /* 18 0 = YUYV, 1 = UYVY */
+ __u8 unused2[5]; /* 19 - 23 */
+ __u8 col_start; /* 24 */
+ __u8 col_end; /* 25 */
+ __u8 row_start; /* 26 */
+ __u8 row_end; /* 27 */
+ __u8 comp_enable; /* 28 0 = non compressed, 1 = compressed */
+ __u8 decimation; /* 29 0 = no decimation, 1 = decimation */
+ __u8 y_thresh; /* 30 */
+ __u8 uv_thresh; /* 31 */
+ __u8 system_state; /* 32 */
+ __u8 grab_state; /* 33 */
+ __u8 stream_state; /* 34 */
+ __u8 fatal_error; /* 35 */
+ __u8 cmd_error; /* 36 */
+ __u8 debug_flags; /* 37 */
+ __u8 camera_state_7; /* 38 */
+ __u8 camera_state_8; /* 39 */
+ __u8 cr_achieved; /* 40 */
+ __u8 fr_achieved; /* 41 */
+ __u8 unused3[22]; /* 42 - 63 */
+};
+
struct usb_device;
struct cpia_sbuf {
char *data;
- int len;
struct usb_isoc_desc *isodesc;
-#if 0
- void *isodesc;
-#endif
};
enum {
- FRAME_READY, /* Ready to grab into */
+ 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_UNUSED, /* Unused (no MCAPTURE) */
+ FRAME_ERROR, /* Something bad happened while processing */
};
struct cpia_frame {
- char *data;
- int width;
- int height;
- int state;
+ char *data; /* Frame buffer */
+
+ struct cpia_frame_header header; /* Header from stream */
+
+ int width; /* Width application is expecting */
+ int height; /* Height */
+
+ int hdrwidth; /* Width the frame actually is */
+ int hdrheight; /* Height */
+
+ int grabstate; /* State of grabbing */
+ int scanstate; /* State of scanning */
+
+ int curline; /* Line of frame we're working on */
+
+ wait_queue_head_t wq; /* Processes waiting */
};
+#define CPIA_NUMFRAMES 2
+#define CPIA_NUMSBUF 2
+
struct usb_cpia {
struct video_device vdev;
/* Device structure */
struct usb_device *dev;
- int streaming;
+ int streaming; /* Are we streaming Isochronous? */
+ int grabbing; /* Are we grabbing? */
- char *fbuf; /* Videodev buffer area */
+ int compress; /* Should the next frame be compressed? */
- int curframe;
- struct cpia_frame frame[2]; /* Double buffering */
+ char *fbuf; /* Videodev buffer area */
- int receivesbuf; /* Current receiving sbuf */
- struct cpia_sbuf sbuf[3]; /* Triple buffering */
+ int curframe;
+ struct cpia_frame frame[CPIA_NUMFRAMES]; /* Double buffering */
- int state; /* Current scanning state */
- int curline;
+ int cursbuf; /* Current receiving sbuf */
+ struct cpia_sbuf sbuf[CPIA_NUMSBUF]; /* Double buffering */
- char scratch[SCRATCH_BUF_SIZE];
+ /* Scratch space from the Isochronous pipe */
+ unsigned char scratch[SCRATCH_BUF_SIZE];
int scratchlen;
-
- wait_queue_head_t wq;
};
#endif