Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | #ifndef __LINUX_CPIA_H #define __LINUX_CPIA_H #include <linux/list.h> #define USB_REQ_CPIA_GET_VERSION 0x01 #define USB_REQ_CPIA_GET_PNP_ID 0x02 #define USB_REQ_CPIA_GET_CAMERA_STATUS 0x03 #define USB_REQ_CPIA_GOTO_HI_POWER 0x04 #define USB_REQ_CPIA_GOTO_LO_POWER 0x05 /* No 0x06 */ #define USB_REQ_CPIA_GOTO_SUSPEND 0x07 #define USB_REQ_CPIA_GOTO_PASS_THROUGH 0x08 /* No 0x09 */ #define USB_REQ_CPIA_MODIFY_CAMERA_STATUS 0x0A #define USB_REQ_CPIA_READ_VC_REGS 0x21 #define USB_REQ_CPIA_WRITE_BC_REG 0x22 #define USB_REQ_CPIA_READ_MC_PORTS 0x23 #define USB_REQ_CPIA_WRITE_MC_PORT 0x24 #define USB_REQ_CPIA_SET_BAUD_RATE 0x25 #define USB_REQ_CPIA_SET_ECP_TIMING 0x26 #define USB_REQ_CPIA_READ_IDATA 0x27 #define USB_REQ_CPIA_WRITE_IDATA 0x28 #define USB_REQ_CPIA_GENERIC_CALL 0x29 #define USB_REQ_CPIA_I2CSTART 0x2A #define USB_REQ_CPIA_I2CSTOP 0x2B #define USB_REQ_CPIA_I2CWRITE 0x2C #define USB_REQ_CPIA_I2CREAD 0x2D #define USB_REQ_CPIA_GET_VP_VERSION 0xA1 #define USB_REQ_CPIA_SET_COLOUR_PARAMS 0xA3 #define USB_REQ_CPIA_SET_EXPOSURE 0xA4 /* No 0xA5 */ #define USB_REQ_CPIA_SET_COLOUR_BALANCE 0xA6 #define USB_REQ_CPIA_SET_SENSOR_FPS 0xA7 #define USB_REQ_CPIA_SET_VP_DEFAULTS 0xA8 #define USB_REQ_CPIA_SET_APCOR 0xA9 #define USB_REQ_CPIA_SET_FLICKER_CTRL 0xAA #define USB_REQ_CPIA_SET_VL_OFFSET 0xAB #define USB_REQ_CPIA_GET_COLOUR_PARAMETERS 0xB0 #define USB_REQ_CPIA_GET_COLOUR_BALANCE 0xB1 #define USB_REQ_CPIA_GET_EXPOSURE 0xB2 #define USB_REQ_CPIA_SET_SENSOR_MATRIX 0xB3 #define USB_REQ_CPIA_COLOUR_BARS 0xBD #define USB_REQ_CPIA_READ_VP_REGS 0xBE #define USB_REQ_CPIA_WRITE_VP_REGS 0xBF #define USB_REQ_CPIA_GRAB_FRAME 0xC1 #define USB_REQ_CPIA_UPLOAD_FRAME 0xC2 #define WAIT_FOR_NEXT_FRAME 0 #define FORCE_FRAME_UPLOAD 1 #define USB_REQ_CPIA_SET_GRAB_MODE 0xC3 #define USB_REQ_CPIA_INIT_STREAM_CAP 0xC4 #define USB_REQ_CPIA_FINI_STREAM_CAP 0xC5 #define USB_REQ_CPIA_START_STREAM_CAP 0xC6 #define USB_REQ_CPIA_END_STREAM_CAP 0xC7 #define USB_REQ_CPIA_SET_FORMAT 0xC8 #define FORMAT_QCIF 0 #define FORMAT_CIF 1 #define FORMAT_YUYV 0 #define FORMAT_UYVY 1 #define FORMAT_420 0 #define FORMAT_422 1 #define USB_REQ_CPIA_SET_ROI 0xC9 #define USB_REQ_CPIA_SET_COMPRESSION 0xCA #define COMP_DISABLED 0 #define COMP_AUTO 1 #define COMP_MANUAL 2 #define DONT_DECIMATE 0 #define DECIMATE 1 #define USB_REQ_CPIA_SET_COMPRESSION_TARGET 0xCB #define TARGET_QUALITY 0 #define TARGET_FRAMERATE 1 #define USB_REQ_CPIA_SET_YUV_THRESH 0xCC #define USB_REQ_CPIA_SET_COMPRESSION_PARAMS 0xCD #define USB_REQ_CPIA_DISCARD_FRAME 0xCE #define USB_REQ_CPIA_OUTPUT_RS232 0xE1 #define USB_REQ_CPIA_ABORT_PROCESS 0xE4 #define USB_REQ_CPIA_SET_DRAM_PAGE 0xE5 #define USB_REQ_CPIA_START_DRAM_UPLOAD 0xE6 #define USB_REQ_CPIA_START_DUMMY_STREAM 0xE8 #define USB_REQ_CPIA_ABORT_STREAM 0xE9 #define USB_REQ_CPIA_DOWNLOAD_DRAM 0xEA /* #define USB_REQ_CPIA_NULL_CMD 0x?? */ #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 FRAMES_PER_DESC 10 #define FRAME_SIZE_PER_DESC 960 /* Shouldn't be hardcoded */ enum { STATE_SCANNING, /* Scanning for start */ STATE_HEADER, /* Parsing header */ 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; urb_t *urb; }; 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 */ }; struct cpia_frame { 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 */ volatile int grabstate; /* State of grabbing */ int scanstate; /* State of scanning */ int curline; /* Line of frame we're working on */ long scanlength; /* uncompressed, raw data length of frame */ long bytes_read; /* amount of scanlength that has been read from *data */ 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; unsigned char iface; struct semaphore lock; int user; /* user count for exclusive use */ int streaming; /* Are we streaming Isochronous? */ int grabbing; /* Are we grabbing? */ int compress; /* Should the next frame be compressed? */ char *fbuf; /* Videodev buffer area */ int curframe; struct cpia_frame frame[CPIA_NUMFRAMES]; /* Double buffering */ int cursbuf; /* Current receiving sbuf */ struct cpia_sbuf sbuf[CPIA_NUMSBUF]; /* Double buffering */ /* Scratch space from the Isochronous pipe */ unsigned char scratch[SCRATCH_BUF_SIZE]; int scratchlen; }; #endif |