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 */
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 PDEBUG(D_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 PDEBUG(D_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. */
192 buffer
= kmalloc(JEILINJ_MAX_TRANSFER
, GFP_KERNEL
| GFP_DMA
);
194 PDEBUG(D_ERR
, "Couldn't allocate USB buffer");
197 while (gspca_dev
->present
&& gspca_dev
->streaming
) {
199 * Now request data block 0. Line 0 reports the size
200 * to download, in blocks of size 0x200, and also tells the
201 * "actual" data size, in bytes, which seems best to ignore.
203 ret
= usb_bulk_msg(gspca_dev
->dev
,
204 usb_rcvbulkpipe(gspca_dev
->dev
, 0x82),
205 buffer
, JEILINJ_MAX_TRANSFER
, &act_len
,
206 JEILINJ_DATA_TIMEOUT
);
208 "Got %d bytes out of %d for Block 0",
209 act_len
, JEILINJ_MAX_TRANSFER
);
210 if (ret
< 0 || act_len
< FRAME_HEADER_LEN
)
212 size_in_blocks
= buffer
[0x0a];
213 blocks_left
= buffer
[0x0a] - 1;
214 PDEBUG(D_STREAM
, "blocks_left = 0x%x", blocks_left
);
216 /* Start a new frame, and add the JPEG header, first thing */
217 gspca_frame_add(gspca_dev
, FIRST_PACKET
,
218 dev
->jpeg_hdr
, JPEG_HDR_SZ
);
219 /* Toss line 0 of data block 0, keep the rest. */
220 gspca_frame_add(gspca_dev
, INTER_PACKET
,
221 buffer
+ FRAME_HEADER_LEN
,
222 JEILINJ_MAX_TRANSFER
- FRAME_HEADER_LEN
);
224 while (blocks_left
> 0) {
225 if (!gspca_dev
->present
)
227 ret
= usb_bulk_msg(gspca_dev
->dev
,
228 usb_rcvbulkpipe(gspca_dev
->dev
, 0x82),
229 buffer
, JEILINJ_MAX_TRANSFER
, &act_len
,
230 JEILINJ_DATA_TIMEOUT
);
231 if (ret
< 0 || act_len
< JEILINJ_MAX_TRANSFER
)
234 "%d blocks remaining for frame", blocks_left
);
236 if (blocks_left
== 0)
237 packet_type
= LAST_PACKET
;
239 packet_type
= INTER_PACKET
;
240 gspca_frame_add(gspca_dev
, packet_type
,
241 buffer
, JEILINJ_MAX_TRANSFER
);
245 mutex_lock(&gspca_dev
->usb_lock
);
246 if (gspca_dev
->present
)
248 mutex_unlock(&gspca_dev
->usb_lock
);
252 /* This function is called at probe time just before sd_init */
253 static int sd_config(struct gspca_dev
*gspca_dev
,
254 const struct usb_device_id
*id
)
256 struct cam
*cam
= &gspca_dev
->cam
;
257 struct sd
*dev
= (struct sd
*) gspca_dev
;
262 "JEILINJ camera detected"
263 " (vid/pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
264 cam
->cam_mode
= jlj_mode
;
267 /* We don't use the buffer gspca allocates so make it small. */
269 INIT_WORK(&dev
->work_struct
, jlj_dostream
);
273 /* called on streamoff with alt==0 and on disconnect */
274 /* the usb_lock is held at entry - restore on exit */
275 static void sd_stop0(struct gspca_dev
*gspca_dev
)
277 struct sd
*dev
= (struct sd
*) gspca_dev
;
279 /* wait for the work queue to terminate */
280 mutex_unlock(&gspca_dev
->usb_lock
);
281 /* This waits for jlj_dostream to finish */
282 destroy_workqueue(dev
->work_thread
);
283 dev
->work_thread
= NULL
;
284 mutex_lock(&gspca_dev
->usb_lock
);
285 kfree(dev
->jpeg_hdr
);
288 /* this function is called at probe and resume time */
289 static int sd_init(struct gspca_dev
*gspca_dev
)
294 /* Set up for getting frames. */
295 static int sd_start(struct gspca_dev
*gspca_dev
)
297 struct sd
*dev
= (struct sd
*) gspca_dev
;
300 /* create the JPEG header */
301 dev
->jpeg_hdr
= kmalloc(JPEG_HDR_SZ
, GFP_KERNEL
);
302 if (dev
->jpeg_hdr
== NULL
)
304 jpeg_define(dev
->jpeg_hdr
, gspca_dev
->height
, gspca_dev
->width
,
305 0x21); /* JPEG 422 */
306 jpeg_set_qual(dev
->jpeg_hdr
, dev
->quality
);
307 PDEBUG(D_STREAM
, "Start streaming at 320x240");
308 ret
= jlj_start(gspca_dev
);
310 PDEBUG(D_ERR
, "Start streaming command failed");
313 /* Start the workqueue function to do the streaming */
314 dev
->work_thread
= create_singlethread_workqueue(MODULE_NAME
);
315 queue_work(dev
->work_thread
, &dev
->work_struct
);
320 /* Table of supported USB devices */
321 static const __devinitdata
struct usb_device_id device_table
[] = {
322 {USB_DEVICE(0x0979, 0x0280)},
326 MODULE_DEVICE_TABLE(usb
, device_table
);
328 /* sub-driver description */
329 static const struct sd_desc sd_desc
= {
337 /* -- device connect -- */
338 static int sd_probe(struct usb_interface
*intf
,
339 const struct usb_device_id
*id
)
341 return gspca_dev_probe(intf
, id
,
347 static struct usb_driver sd_driver
= {
349 .id_table
= device_table
,
351 .disconnect
= gspca_disconnect
,
353 .suspend
= gspca_suspend
,
354 .resume
= gspca_resume
,
358 /* -- module insert / remove -- */
359 static int __init
sd_mod_init(void)
363 ret
= usb_register(&sd_driver
);
366 PDEBUG(D_PROBE
, "registered");
370 static void __exit
sd_mod_exit(void)
372 usb_deregister(&sd_driver
);
373 PDEBUG(D_PROBE
, "deregistered");
376 module_init(sd_mod_init
);
377 module_exit(sd_mod_exit
);