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
|