[media] gspca - jeilinj: Add SPORTSCAM_DV15 camera support
[deliverable/linux.git] / drivers / media / video / gspca / jeilinj.c
CommitLineData
3040b043
TK
1/*
2 * Jeilinj subdriver
3 *
4 * Supports some Jeilin dual-mode cameras which use bulk transport and
5 * download raw JPEG data.
6 *
7 * Copyright (C) 2009 Theodore Kilgore
c3d86927 8 * Copyright (C) 2011 Patrice Chotard
3040b043
TK
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24
25#define MODULE_NAME "jeilinj"
26
5a0e3ad6 27#include <linux/slab.h>
3040b043
TK
28#include "gspca.h"
29#include "jpeg.h"
30
31MODULE_AUTHOR("Theodore Kilgore <kilgota@auburn.edu>");
32MODULE_DESCRIPTION("GSPCA/JEILINJ USB Camera Driver");
33MODULE_LICENSE("GPL");
34
35/* Default timeouts, in ms */
36#define JEILINJ_CMD_TIMEOUT 500
713b466f 37#define JEILINJ_CMD_DELAY 160
3040b043
TK
38#define JEILINJ_DATA_TIMEOUT 1000
39
40/* Maximum transfer size to use. */
41#define JEILINJ_MAX_TRANSFER 0x200
3040b043 42#define FRAME_HEADER_LEN 0x10
c3d86927 43#define FRAME_START 0xFFFFFFFF
3040b043 44
713b466f
PC
45enum {
46 SAKAR_57379,
47 SPORTSCAM_DV15,
48};
3040b043
TK
49/* Structure to hold all of our device specific stuff */
50struct sd {
51 struct gspca_dev gspca_dev; /* !! must be the first item */
c3d86927 52 int blocks_left;
3040b043
TK
53 const struct v4l2_pix_format *cap_mode;
54 /* Driver stuff */
713b466f 55 u8 type;
3040b043 56 u8 quality; /* image quality */
9a731a32 57 u8 jpeg_hdr[JPEG_HDR_SZ];
3040b043
TK
58};
59
c3d86927
PC
60struct jlj_command {
61 unsigned char instruction[2];
62 unsigned char ack_wanted;
713b466f 63 unsigned char delay;
c3d86927 64};
3040b043
TK
65
66/* AFAICT these cameras will only do 320x240. */
67static struct v4l2_pix_format jlj_mode[] = {
68 { 320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
69 .bytesperline = 320,
70 .sizeimage = 320 * 240,
71 .colorspace = V4L2_COLORSPACE_JPEG,
6f8efcfb
PC
72 .priv = 0},
73 { 640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
74 .bytesperline = 640,
75 .sizeimage = 640 * 480,
76 .colorspace = V4L2_COLORSPACE_JPEG,
3040b043
TK
77 .priv = 0}
78};
79
80/*
81 * cam uses endpoint 0x03 to send commands, 0x84 for read commands,
82 * and 0x82 for bulk transfer.
83 */
84
85/* All commands are two bytes only */
8715b16e 86static void jlj_write2(struct gspca_dev *gspca_dev, unsigned char *command)
3040b043
TK
87{
88 int retval;
89
8715b16e
PC
90 if (gspca_dev->usb_err < 0)
91 return;
3040b043
TK
92 memcpy(gspca_dev->usb_buf, command, 2);
93 retval = usb_bulk_msg(gspca_dev->dev,
94 usb_sndbulkpipe(gspca_dev->dev, 3),
95 gspca_dev->usb_buf, 2, NULL, 500);
8715b16e 96 if (retval < 0) {
0b656321 97 err("command write [%02x] error %d",
3040b043 98 gspca_dev->usb_buf[0], retval);
8715b16e
PC
99 gspca_dev->usb_err = retval;
100 }
3040b043
TK
101}
102
103/* Responses are one byte only */
8715b16e 104static void jlj_read1(struct gspca_dev *gspca_dev, unsigned char response)
3040b043
TK
105{
106 int retval;
107
8715b16e
PC
108 if (gspca_dev->usb_err < 0)
109 return;
3040b043
TK
110 retval = usb_bulk_msg(gspca_dev->dev,
111 usb_rcvbulkpipe(gspca_dev->dev, 0x84),
112 gspca_dev->usb_buf, 1, NULL, 500);
113 response = gspca_dev->usb_buf[0];
8715b16e 114 if (retval < 0) {
0b656321 115 err("read command [%02x] error %d",
3040b043 116 gspca_dev->usb_buf[0], retval);
8715b16e
PC
117 gspca_dev->usb_err = retval;
118 }
3040b043
TK
119}
120
121static int jlj_start(struct gspca_dev *gspca_dev)
122{
123 int i;
713b466f 124 int start_commands_size;
3040b043 125 u8 response = 0xff;
c3d86927 126 struct sd *sd = (struct sd *) gspca_dev;
3040b043 127 struct jlj_command start_commands[] = {
713b466f
PC
128 {{0x71, 0x81}, 0, 0},
129 {{0x70, 0x05}, 0, JEILINJ_CMD_DELAY},
130 {{0x95, 0x70}, 1, 0},
131 {{0x71, 0x81 - gspca_dev->curr_mode}, 0, 0},
132 {{0x70, 0x04}, 0, JEILINJ_CMD_DELAY},
133 {{0x95, 0x70}, 1, 0},
134 {{0x71, 0x00}, 0, 0}, /* start streaming ??*/
135 {{0x70, 0x08}, 0, JEILINJ_CMD_DELAY},
136 {{0x95, 0x70}, 1, 0},
137#define SPORTSCAM_DV15_CMD_SIZE 9
138 {{0x94, 0x02}, 0, 0},
139 {{0xde, 0x24}, 0, 0},
140 {{0x94, 0x02}, 0, 0},
141 {{0xdd, 0xf0}, 0, 0},
142 {{0x94, 0x02}, 0, 0},
143 {{0xe3, 0x2c}, 0, 0},
144 {{0x94, 0x02}, 0, 0},
145 {{0xe4, 0x00}, 0, 0},
146 {{0x94, 0x02}, 0, 0},
147 {{0xe5, 0x00}, 0, 0},
148 {{0x94, 0x02}, 0, 0},
149 {{0xe6, 0x2c}, 0, 0},
150 {{0x94, 0x03}, 0, 0},
151 {{0xaa, 0x00}, 0, 0},
152 {{0x71, 0x1e}, 0, 0},
153 {{0x70, 0x06}, 0, 0},
154 {{0x71, 0x80}, 0, 0},
155 {{0x70, 0x07}, 0, 0}
3040b043 156 };
c3d86927
PC
157
158 sd->blocks_left = 0;
713b466f
PC
159 /* Under Windows, USB spy shows that only the 9 first start
160 * commands are used for SPORTSCAM_DV15 webcam
161 */
162 if (sd->type == SPORTSCAM_DV15)
163 start_commands_size = SPORTSCAM_DV15_CMD_SIZE;
164 else
165 start_commands_size = ARRAY_SIZE(start_commands);
166
167 for (i = 0; i < start_commands_size; i++) {
8715b16e 168 jlj_write2(gspca_dev, start_commands[i].instruction);
713b466f
PC
169 if (start_commands[i].delay)
170 msleep(start_commands[i].delay);
3040b043 171 if (start_commands[i].ack_wanted)
8715b16e 172 jlj_read1(gspca_dev, response);
3040b043 173 }
8715b16e
PC
174 if (gspca_dev->usb_err < 0)
175 PDEBUG(D_ERR, "Start streaming command failed");
176 return gspca_dev->usb_err;
3040b043
TK
177}
178
c3d86927
PC
179static void sd_pkt_scan(struct gspca_dev *gspca_dev,
180 u8 *data, int len)
3040b043 181{
c3d86927 182 struct sd *sd = (struct sd *) gspca_dev;
3040b043 183 int packet_type;
c3d86927 184 u32 header_marker;
3040b043 185
c3d86927
PC
186 PDEBUG(D_STREAM, "Got %d bytes out of %d for Block 0",
187 len, JEILINJ_MAX_TRANSFER);
188 if (len != JEILINJ_MAX_TRANSFER) {
189 PDEBUG(D_PACK, "bad length");
190 goto discard;
3040b043 191 }
c3d86927
PC
192 /* check if it's start of frame */
193 header_marker = ((u32 *)data)[0];
194 if (header_marker == FRAME_START) {
195 sd->blocks_left = data[0x0a] - 1;
196 PDEBUG(D_STREAM, "blocks_left = 0x%x", sd->blocks_left);
6ca3f255 197 /* Start a new frame, and add the JPEG header, first thing */
76dd272b 198 gspca_frame_add(gspca_dev, FIRST_PACKET,
c3d86927 199 sd->jpeg_hdr, JPEG_HDR_SZ);
76dd272b
JFM
200 /* Toss line 0 of data block 0, keep the rest. */
201 gspca_frame_add(gspca_dev, INTER_PACKET,
c3d86927 202 data + FRAME_HEADER_LEN,
3040b043 203 JEILINJ_MAX_TRANSFER - FRAME_HEADER_LEN);
c3d86927
PC
204 } else if (sd->blocks_left > 0) {
205 PDEBUG(D_STREAM, "%d blocks remaining for frame",
206 sd->blocks_left);
207 sd->blocks_left -= 1;
208 if (sd->blocks_left == 0)
209 packet_type = LAST_PACKET;
210 else
211 packet_type = INTER_PACKET;
212 gspca_frame_add(gspca_dev, packet_type,
213 data, JEILINJ_MAX_TRANSFER);
214 } else
215 goto discard;
216 return;
217discard:
218 /* Discard data until a new frame starts. */
219 gspca_dev->last_packet_type = DISCARD_PACKET;
3040b043
TK
220}
221
222/* This function is called at probe time just before sd_init */
223static int sd_config(struct gspca_dev *gspca_dev,
224 const struct usb_device_id *id)
225{
226 struct cam *cam = &gspca_dev->cam;
227 struct sd *dev = (struct sd *) gspca_dev;
228
713b466f 229 dev->type = id->driver_info;
3040b043 230 dev->quality = 85;
3040b043
TK
231 PDEBUG(D_PROBE,
232 "JEILINJ camera detected"
233 " (vid/pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
234 cam->cam_mode = jlj_mode;
6f8efcfb 235 cam->nmodes = ARRAY_SIZE(jlj_mode);
3040b043 236 cam->bulk = 1;
c3d86927
PC
237 cam->bulk_nurbs = 1;
238 cam->bulk_size = JEILINJ_MAX_TRANSFER;
3040b043
TK
239 return 0;
240}
241
c3d86927 242static void sd_stopN(struct gspca_dev *gspca_dev)
3040b043 243{
c3d86927
PC
244 int i;
245 u8 *buf;
246 u8 stop_commands[][2] = {
247 {0x71, 0x00},
248 {0x70, 0x09},
249 {0x71, 0x80},
250 {0x70, 0x05}
251 };
252
253 for (;;) {
254 /* get the image remaining blocks */
255 usb_bulk_msg(gspca_dev->dev,
256 gspca_dev->urb[0]->pipe,
257 gspca_dev->urb[0]->transfer_buffer,
258 JEILINJ_MAX_TRANSFER, NULL,
259 JEILINJ_DATA_TIMEOUT);
3040b043 260
c3d86927
PC
261 /* search for 0xff 0xd9 (EOF for JPEG) */
262 i = 0;
263 buf = gspca_dev->urb[0]->transfer_buffer;
264 while ((i < (JEILINJ_MAX_TRANSFER - 1)) &&
265 ((buf[i] != 0xff) || (buf[i+1] != 0xd9)))
266 i++;
267
268 if (i != (JEILINJ_MAX_TRANSFER - 1))
269 /* last remaining block found */
270 break;
271 }
272
273 for (i = 0; i < ARRAY_SIZE(stop_commands); i++)
274 jlj_write2(gspca_dev, stop_commands[i]);
3040b043
TK
275}
276
277/* this function is called at probe and resume time */
278static int sd_init(struct gspca_dev *gspca_dev)
279{
8715b16e 280 return gspca_dev->usb_err;
3040b043
TK
281}
282
283/* Set up for getting frames. */
284static int sd_start(struct gspca_dev *gspca_dev)
285{
286 struct sd *dev = (struct sd *) gspca_dev;
3040b043
TK
287
288 /* create the JPEG header */
3040b043
TK
289 jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width,
290 0x21); /* JPEG 422 */
291 jpeg_set_qual(dev->jpeg_hdr, dev->quality);
6f8efcfb
PC
292 PDEBUG(D_STREAM, "Start streaming at %dx%d",
293 gspca_dev->height, gspca_dev->width);
8715b16e
PC
294 jlj_start(gspca_dev);
295 return gspca_dev->usb_err;
3040b043
TK
296}
297
298/* Table of supported USB devices */
95c967c1 299static const struct usb_device_id device_table[] = {
713b466f
PC
300 {USB_DEVICE(0x0979, 0x0280), .driver_info = SAKAR_57379},
301 {USB_DEVICE(0x0979, 0x0270), .driver_info = SPORTSCAM_DV15},
3040b043
TK
302 {}
303};
304
305MODULE_DEVICE_TABLE(usb, device_table);
306
307/* sub-driver description */
713b466f
PC
308static const struct sd_desc sd_desc_sakar_57379 = {
309 .name = MODULE_NAME,
310 .config = sd_config,
311 .init = sd_init,
312 .start = sd_start,
313 .stopN = sd_stopN,
314 .pkt_scan = sd_pkt_scan,
315};
316
317/* sub-driver description */
318static const struct sd_desc sd_desc_sportscam_dv15 = {
3040b043
TK
319 .name = MODULE_NAME,
320 .config = sd_config,
321 .init = sd_init,
322 .start = sd_start,
c3d86927
PC
323 .stopN = sd_stopN,
324 .pkt_scan = sd_pkt_scan,
3040b043
TK
325};
326
713b466f
PC
327static const struct sd_desc *sd_desc[2] = {
328 &sd_desc_sakar_57379,
329 &sd_desc_sportscam_dv15
330};
331
3040b043
TK
332/* -- device connect -- */
333static int sd_probe(struct usb_interface *intf,
334 const struct usb_device_id *id)
335{
336 return gspca_dev_probe(intf, id,
713b466f 337 sd_desc[id->driver_info],
3040b043
TK
338 sizeof(struct sd),
339 THIS_MODULE);
340}
341
342static struct usb_driver sd_driver = {
343 .name = MODULE_NAME,
344 .id_table = device_table,
345 .probe = sd_probe,
346 .disconnect = gspca_disconnect,
347#ifdef CONFIG_PM
348 .suspend = gspca_suspend,
349 .resume = gspca_resume,
350#endif
351};
352
353/* -- module insert / remove -- */
354static int __init sd_mod_init(void)
355{
54826437 356 return usb_register(&sd_driver);
3040b043
TK
357}
358
359static void __exit sd_mod_exit(void)
360{
361 usb_deregister(&sd_driver);
3040b043
TK
362}
363
364module_init(sd_mod_init);
365module_exit(sd_mod_exit);
This page took 0.188088 seconds and 5 git commands to generate.