4 * Supports some Jeilin dual-mode cameras which use bulk transport and
5 * download raw JPEG data.
7 * Copyright (C) 2009 Theodore Kilgore
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #define MODULE_NAME "jeilinj"
26 #include <linux/workqueue.h>
27 #include <linux/slab.h>
31 MODULE_AUTHOR("Theodore Kilgore <kilgota@auburn.edu>");
32 MODULE_DESCRIPTION("GSPCA/JEILINJ USB Camera Driver");
33 MODULE_LICENSE("GPL");
35 /* Default timeouts, in ms */
36 #define JEILINJ_CMD_TIMEOUT 500
37 #define JEILINJ_DATA_TIMEOUT 1000
39 /* Maximum transfer size to use. */
40 #define JEILINJ_MAX_TRANSFER 0x200
42 #define FRAME_HEADER_LEN 0x10
44 /* Structure to hold all of our device specific stuff */
46 struct gspca_dev gspca_dev
; /* !! must be the first item */
47 const struct v4l2_pix_format
*cap_mode
;
49 struct work_struct work_struct
;
50 struct workqueue_struct
*work_thread
;
51 u8 quality
; /* image quality */
52 u8 jpegqual
; /* webcam quality */
53 u8 jpeg_hdr
[JPEG_HDR_SZ
];
57 unsigned char instruction
[2];
58 unsigned char ack_wanted
;
61 /* AFAICT these cameras will only do 320x240. */
62 static struct v4l2_pix_format jlj_mode
[] = {
63 { 320, 240, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
65 .sizeimage
= 320 * 240,
66 .colorspace
= V4L2_COLORSPACE_JPEG
,
71 * cam uses endpoint 0x03 to send commands, 0x84 for read commands,
72 * and 0x82 for bulk transfer.
75 /* All commands are two bytes only */
76 static int jlj_write2(struct gspca_dev
*gspca_dev
, unsigned char *command
)
80 memcpy(gspca_dev
->usb_buf
, command
, 2);
81 retval
= usb_bulk_msg(gspca_dev
->dev
,
82 usb_sndbulkpipe(gspca_dev
->dev
, 3),
83 gspca_dev
->usb_buf
, 2, NULL
, 500);
85 err("command write [%02x] error %d",
86 gspca_dev
->usb_buf
[0], retval
);
90 /* Responses are one byte only */
91 static int jlj_read1(struct gspca_dev
*gspca_dev
, unsigned char response
)
95 retval
= usb_bulk_msg(gspca_dev
->dev
,
96 usb_rcvbulkpipe(gspca_dev
->dev
, 0x84),
97 gspca_dev
->usb_buf
, 1, NULL
, 500);
98 response
= gspca_dev
->usb_buf
[0];
100 err("read command [%02x] error %d",
101 gspca_dev
->usb_buf
[0], retval
);
105 static int jlj_start(struct gspca_dev
*gspca_dev
)
110 struct jlj_command start_commands
[] = {
139 for (i
= 0; i
< ARRAY_SIZE(start_commands
); i
++) {
140 retval
= jlj_write2(gspca_dev
, start_commands
[i
].instruction
);
143 if (start_commands
[i
].ack_wanted
)
144 retval
= jlj_read1(gspca_dev
, response
);
148 PDEBUG(D_ERR
, "jlj_start retval is %d", retval
);
152 static int jlj_stop(struct gspca_dev
*gspca_dev
)
156 struct jlj_command stop_commands
[] = {
162 for (i
= 0; i
< ARRAY_SIZE(stop_commands
); i
++) {
163 retval
= jlj_write2(gspca_dev
, stop_commands
[i
].instruction
);
170 /* This function is called as a workqueue function and runs whenever the camera
171 * is streaming data. Because it is a workqueue function it is allowed to sleep
172 * so we can use synchronous USB calls. To avoid possible collisions with other
173 * threads attempting to use the camera's USB interface the gspca usb_lock is
174 * used when performing the one USB control operation inside the workqueue,
175 * which tells the camera to close the stream. In practice the only thing
176 * which needs to be protected against is the usb_set_interface call that
177 * gspca makes during stream_off. Otherwise the camera doesn't provide any
178 * controls that the user could try to change.
181 static void jlj_dostream(struct work_struct
*work
)
183 struct sd
*dev
= container_of(work
, struct sd
, work_struct
);
184 struct gspca_dev
*gspca_dev
= &dev
->gspca_dev
;
185 int blocks_left
; /* 0x200-sized blocks remaining in current frame. */
191 buffer
= kmalloc(JEILINJ_MAX_TRANSFER
, GFP_KERNEL
| GFP_DMA
);
193 err("Couldn't allocate USB buffer");
196 while (gspca_dev
->present
&& gspca_dev
->streaming
) {
198 * Now request data block 0. Line 0 reports the size
199 * to download, in blocks of size 0x200, and also tells the
200 * "actual" data size, in bytes, which seems best to ignore.
202 ret
= usb_bulk_msg(gspca_dev
->dev
,
203 usb_rcvbulkpipe(gspca_dev
->dev
, 0x82),
204 buffer
, JEILINJ_MAX_TRANSFER
, &act_len
,
205 JEILINJ_DATA_TIMEOUT
);
207 "Got %d bytes out of %d for Block 0",
208 act_len
, JEILINJ_MAX_TRANSFER
);
209 if (ret
< 0 || act_len
< FRAME_HEADER_LEN
)
211 blocks_left
= buffer
[0x0a] - 1;
212 PDEBUG(D_STREAM
, "blocks_left = 0x%x", blocks_left
);
214 /* Start a new frame, and add the JPEG header, first thing */
215 gspca_frame_add(gspca_dev
, FIRST_PACKET
,
216 dev
->jpeg_hdr
, JPEG_HDR_SZ
);
217 /* Toss line 0 of data block 0, keep the rest. */
218 gspca_frame_add(gspca_dev
, INTER_PACKET
,
219 buffer
+ FRAME_HEADER_LEN
,
220 JEILINJ_MAX_TRANSFER
- FRAME_HEADER_LEN
);
222 while (blocks_left
> 0) {
223 if (!gspca_dev
->present
)
225 ret
= usb_bulk_msg(gspca_dev
->dev
,
226 usb_rcvbulkpipe(gspca_dev
->dev
, 0x82),
227 buffer
, JEILINJ_MAX_TRANSFER
, &act_len
,
228 JEILINJ_DATA_TIMEOUT
);
229 if (ret
< 0 || act_len
< JEILINJ_MAX_TRANSFER
)
232 "%d blocks remaining for frame", blocks_left
);
234 if (blocks_left
== 0)
235 packet_type
= LAST_PACKET
;
237 packet_type
= INTER_PACKET
;
238 gspca_frame_add(gspca_dev
, packet_type
,
239 buffer
, JEILINJ_MAX_TRANSFER
);
243 mutex_lock(&gspca_dev
->usb_lock
);
244 if (gspca_dev
->present
)
246 mutex_unlock(&gspca_dev
->usb_lock
);
250 /* This function is called at probe time just before sd_init */
251 static int sd_config(struct gspca_dev
*gspca_dev
,
252 const struct usb_device_id
*id
)
254 struct cam
*cam
= &gspca_dev
->cam
;
255 struct sd
*dev
= (struct sd
*) gspca_dev
;
260 "JEILINJ camera detected"
261 " (vid/pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
262 cam
->cam_mode
= jlj_mode
;
265 /* We don't use the buffer gspca allocates so make it small. */
267 INIT_WORK(&dev
->work_struct
, jlj_dostream
);
271 /* called on streamoff with alt==0 and on disconnect */
272 /* the usb_lock is held at entry - restore on exit */
273 static void sd_stop0(struct gspca_dev
*gspca_dev
)
275 struct sd
*dev
= (struct sd
*) gspca_dev
;
277 /* wait for the work queue to terminate */
278 mutex_unlock(&gspca_dev
->usb_lock
);
279 /* This waits for jlj_dostream to finish */
280 destroy_workqueue(dev
->work_thread
);
281 dev
->work_thread
= NULL
;
282 mutex_lock(&gspca_dev
->usb_lock
);
285 /* this function is called at probe and resume time */
286 static int sd_init(struct gspca_dev
*gspca_dev
)
291 /* Set up for getting frames. */
292 static int sd_start(struct gspca_dev
*gspca_dev
)
294 struct sd
*dev
= (struct sd
*) gspca_dev
;
297 /* create the JPEG header */
298 jpeg_define(dev
->jpeg_hdr
, gspca_dev
->height
, gspca_dev
->width
,
299 0x21); /* JPEG 422 */
300 jpeg_set_qual(dev
->jpeg_hdr
, dev
->quality
);
301 PDEBUG(D_STREAM
, "Start streaming at 320x240");
302 ret
= jlj_start(gspca_dev
);
304 PDEBUG(D_ERR
, "Start streaming command failed");
307 /* Start the workqueue function to do the streaming */
308 dev
->work_thread
= create_singlethread_workqueue(MODULE_NAME
);
309 queue_work(dev
->work_thread
, &dev
->work_struct
);
314 /* Table of supported USB devices */
315 static const struct usb_device_id device_table
[] = {
316 {USB_DEVICE(0x0979, 0x0280)},
320 MODULE_DEVICE_TABLE(usb
, device_table
);
322 /* sub-driver description */
323 static const struct sd_desc sd_desc
= {
331 /* -- device connect -- */
332 static int sd_probe(struct usb_interface
*intf
,
333 const struct usb_device_id
*id
)
335 return gspca_dev_probe(intf
, id
,
341 static struct usb_driver sd_driver
= {
343 .id_table
= device_table
,
345 .disconnect
= gspca_disconnect
,
347 .suspend
= gspca_suspend
,
348 .resume
= gspca_resume
,
352 /* -- module insert / remove -- */
353 static int __init
sd_mod_init(void)
355 return usb_register(&sd_driver
);
358 static void __exit
sd_mod_exit(void)
360 usb_deregister(&sd_driver
);
363 module_init(sd_mod_init
);
364 module_exit(sd_mod_exit
);