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. */
192 buffer
= kmalloc(JEILINJ_MAX_TRANSFER
, GFP_KERNEL
| GFP_DMA
);
194 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
);
287 /* this function is called at probe and resume time */
288 static int sd_init(struct gspca_dev
*gspca_dev
)
293 /* Set up for getting frames. */
294 static int sd_start(struct gspca_dev
*gspca_dev
)
296 struct sd
*dev
= (struct sd
*) gspca_dev
;
299 /* create the JPEG header */
300 jpeg_define(dev
->jpeg_hdr
, gspca_dev
->height
, gspca_dev
->width
,
301 0x21); /* JPEG 422 */
302 jpeg_set_qual(dev
->jpeg_hdr
, dev
->quality
);
303 PDEBUG(D_STREAM
, "Start streaming at 320x240");
304 ret
= jlj_start(gspca_dev
);
306 PDEBUG(D_ERR
, "Start streaming command failed");
309 /* Start the workqueue function to do the streaming */
310 dev
->work_thread
= create_singlethread_workqueue(MODULE_NAME
);
311 queue_work(dev
->work_thread
, &dev
->work_struct
);
316 /* Table of supported USB devices */
317 static const struct usb_device_id device_table
[] = {
318 {USB_DEVICE(0x0979, 0x0280)},
322 MODULE_DEVICE_TABLE(usb
, device_table
);
324 /* sub-driver description */
325 static const struct sd_desc sd_desc
= {
333 /* -- device connect -- */
334 static int sd_probe(struct usb_interface
*intf
,
335 const struct usb_device_id
*id
)
337 return gspca_dev_probe(intf
, id
,
343 static struct usb_driver sd_driver
= {
345 .id_table
= device_table
,
347 .disconnect
= gspca_disconnect
,
349 .suspend
= gspca_suspend
,
350 .resume
= gspca_resume
,
354 /* -- module insert / remove -- */
355 static int __init
sd_mod_init(void)
357 return usb_register(&sd_driver
);
360 static void __exit
sd_mod_exit(void)
362 usb_deregister(&sd_driver
);
365 module_init(sd_mod_init
);
366 module_exit(sd_mod_exit
);