diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2009-05-22 03:16:42 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 17:21:15 -0400 |
commit | 191d0e7fba43d79a73605adcf85441ebe0a2aff7 (patch) | |
tree | 0325326c5d3690b76df87d0bfc31d794bddd35e3 /drivers/media | |
parent | 7880f6613814e737de829911b204d7bc1f2ccb49 (diff) |
V4L/DVB (11869): gspca - ov534: JPEG 320x240 and 640x480 formats for ov965x.
The YUYV 640x480 format did not work with ov965x.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/gspca/ov534.c | 245 |
1 files changed, 176 insertions, 69 deletions
diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c index 6d9b102be70..8d2164db3d6 100644 --- a/drivers/media/video/gspca/ov534.c +++ b/drivers/media/video/gspca/ov534.c | |||
@@ -60,10 +60,23 @@ struct sd { | |||
60 | static struct ctrl sd_ctrls[] = { | 60 | static struct ctrl sd_ctrls[] = { |
61 | }; | 61 | }; |
62 | 62 | ||
63 | static const struct v4l2_pix_format vga_mode[] = { | 63 | static const struct v4l2_pix_format vga_yuyv_mode[] = { |
64 | {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, | 64 | {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, |
65 | .bytesperline = 640 * 2, | 65 | .bytesperline = 640 * 2, |
66 | .sizeimage = 640 * 480 * 2, | 66 | .sizeimage = 640 * 480 * 2, |
67 | .colorspace = V4L2_COLORSPACE_SRGB, | ||
68 | .priv = 0}, | ||
69 | }; | ||
70 | |||
71 | static const struct v4l2_pix_format vga_jpeg_mode[] = { | ||
72 | {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, | ||
73 | .bytesperline = 320, | ||
74 | .sizeimage = 320 * 240 * 3 / 8 + 590, | ||
75 | .colorspace = V4L2_COLORSPACE_JPEG, | ||
76 | .priv = 1}, | ||
77 | {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, | ||
78 | .bytesperline = 640, | ||
79 | .sizeimage = 640 * 480 * 3 / 8 + 590, | ||
67 | .colorspace = V4L2_COLORSPACE_JPEG, | 80 | .colorspace = V4L2_COLORSPACE_JPEG, |
68 | .priv = 0}, | 81 | .priv = 0}, |
69 | }; | 82 | }; |
@@ -244,7 +257,7 @@ static const u8 bridge_init_ov965x[][2] = { | |||
244 | }; | 257 | }; |
245 | 258 | ||
246 | static const u8 sensor_init_ov965x[][2] = { | 259 | static const u8 sensor_init_ov965x[][2] = { |
247 | {0x12, 0x80}, /* com7 - reset */ | 260 | {0x12, 0x80}, /* com7 - SSCB reset */ |
248 | {0x00, 0x00}, /* gain */ | 261 | {0x00, 0x00}, /* gain */ |
249 | {0x01, 0x80}, /* blue */ | 262 | {0x01, 0x80}, /* blue */ |
250 | {0x02, 0x80}, /* red */ | 263 | {0x02, 0x80}, /* red */ |
@@ -254,10 +267,10 @@ static const u8 sensor_init_ov965x[][2] = { | |||
254 | {0x0e, 0x61}, /* com5 */ | 267 | {0x0e, 0x61}, /* com5 */ |
255 | {0x0f, 0x42}, /* com6 */ | 268 | {0x0f, 0x42}, /* com6 */ |
256 | {0x11, 0x00}, /* clkrc */ | 269 | {0x11, 0x00}, /* clkrc */ |
257 | {0x12, 0x02}, /* com7 */ | 270 | {0x12, 0x02}, /* com7 - 15fps VGA YUYV */ |
258 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ | 271 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ |
259 | {0x14, 0x28}, /* com9 */ | 272 | {0x14, 0x28}, /* com9 */ |
260 | {0x16, 0x24}, /* rsvd16 */ | 273 | {0x16, 0x24}, /* reg16 */ |
261 | {0x17, 0x1d}, /* hstart*/ | 274 | {0x17, 0x1d}, /* hstart*/ |
262 | {0x18, 0xbd}, /* hstop */ | 275 | {0x18, 0xbd}, /* hstop */ |
263 | {0x19, 0x01}, /* vstrt */ | 276 | {0x19, 0x01}, /* vstrt */ |
@@ -269,24 +282,24 @@ static const u8 sensor_init_ov965x[][2] = { | |||
269 | {0x27, 0x08}, /* bbias */ | 282 | {0x27, 0x08}, /* bbias */ |
270 | {0x28, 0x08}, /* gbbias */ | 283 | {0x28, 0x08}, /* gbbias */ |
271 | {0x29, 0x15}, /* gr com */ | 284 | {0x29, 0x15}, /* gr com */ |
272 | {0x2a, 0x00}, | 285 | {0x2a, 0x00}, /* exhch */ |
273 | {0x2b, 0x00}, | 286 | {0x2b, 0x00}, /* exhcl */ |
274 | {0x2c, 0x08}, /* rbias */ | 287 | {0x2c, 0x08}, /* rbias */ |
275 | {0x32, 0xff}, /* href */ | 288 | {0x32, 0xff}, /* href */ |
276 | {0x33, 0x00}, /* chlf */ | 289 | {0x33, 0x00}, /* chlf */ |
277 | {0x34, 0x3f}, /* arblm */ | 290 | {0x34, 0x3f}, /* aref1 */ |
278 | {0x35, 0x00}, /* rsvd35 */ | 291 | {0x35, 0x00}, /* aref2 */ |
279 | {0x36, 0xf8}, /* rsvd36 */ | 292 | {0x36, 0xf8}, /* aref3 */ |
280 | {0x38, 0x72}, /* acom38 */ | 293 | {0x38, 0x72}, /* adc2 */ |
281 | {0x39, 0x57}, /* ofon */ | 294 | {0x39, 0x57}, /* aref4 */ |
282 | {0x3a, 0x80}, /* tslb */ | 295 | {0x3a, 0x80}, /* tslb - yuyv */ |
283 | {0x3b, 0xc4}, | 296 | {0x3b, 0xc4}, /* com11 - night mode 1/4 frame rate */ |
284 | {0x3d, 0x99}, /* com13 */ | 297 | {0x3d, 0x99}, /* com13 */ |
285 | {0x3f, 0xc1}, | 298 | {0x3f, 0xc1}, /* edge */ |
286 | {0x40, 0xc0}, /* com15 */ | 299 | {0x40, 0xc0}, /* com15 */ |
287 | {0x41, 0x40}, /* com16 */ | 300 | {0x41, 0x40}, /* com16 */ |
288 | {0x42, 0xc0}, | 301 | {0x42, 0xc0}, /* com17 */ |
289 | {0x43, 0x0a}, | 302 | {0x43, 0x0a}, /* rsvd */ |
290 | {0x44, 0xf0}, | 303 | {0x44, 0xf0}, |
291 | {0x45, 0x46}, | 304 | {0x45, 0x46}, |
292 | {0x46, 0x62}, | 305 | {0x46, 0x62}, |
@@ -297,22 +310,22 @@ static const u8 sensor_init_ov965x[][2] = { | |||
297 | {0x4c, 0x7f}, | 310 | {0x4c, 0x7f}, |
298 | {0x4d, 0x7f}, | 311 | {0x4d, 0x7f}, |
299 | {0x4e, 0x7f}, | 312 | {0x4e, 0x7f}, |
300 | {0x4f, 0x98}, | 313 | {0x4f, 0x98}, /* matrix */ |
301 | {0x50, 0x98}, | 314 | {0x50, 0x98}, |
302 | {0x51, 0x00}, | 315 | {0x51, 0x00}, |
303 | {0x52, 0x28}, | 316 | {0x52, 0x28}, |
304 | {0x53, 0x70}, | 317 | {0x53, 0x70}, |
305 | {0x54, 0x98}, | 318 | {0x54, 0x98}, |
306 | {0x58, 0x1a}, | 319 | {0x58, 0x1a}, /* matrix coef sign */ |
307 | {0x59, 0x85}, | 320 | {0x59, 0x85}, /* AWB control */ |
308 | {0x5a, 0xa9}, | 321 | {0x5a, 0xa9}, |
309 | {0x5b, 0x64}, | 322 | {0x5b, 0x64}, |
310 | {0x5c, 0x84}, | 323 | {0x5c, 0x84}, |
311 | {0x5d, 0x53}, | 324 | {0x5d, 0x53}, |
312 | {0x5e, 0x0e}, | 325 | {0x5e, 0x0e}, |
313 | {0x5f, 0xf0}, | 326 | {0x5f, 0xf0}, /* AWB blue limit */ |
314 | {0x60, 0xf0}, | 327 | {0x60, 0xf0}, /* AWB red limit */ |
315 | {0x61, 0xf0}, | 328 | {0x61, 0xf0}, /* AWB green limit */ |
316 | {0x62, 0x00}, /* lcc1 */ | 329 | {0x62, 0x00}, /* lcc1 */ |
317 | {0x63, 0x00}, /* lcc2 */ | 330 | {0x63, 0x00}, /* lcc2 */ |
318 | {0x64, 0x02}, /* lcc3 */ | 331 | {0x64, 0x02}, /* lcc3 */ |
@@ -324,15 +337,15 @@ static const u8 sensor_init_ov965x[][2] = { | |||
324 | {0x6d, 0x55}, | 337 | {0x6d, 0x55}, |
325 | {0x6e, 0x00}, | 338 | {0x6e, 0x00}, |
326 | {0x6f, 0x9d}, | 339 | {0x6f, 0x9d}, |
327 | {0x70, 0x21}, | 340 | {0x70, 0x21}, /* dnsth */ |
328 | {0x71, 0x78}, | 341 | {0x71, 0x78}, |
329 | {0x72, 0x00}, | 342 | {0x72, 0x00}, /* poidx */ |
330 | {0x73, 0x01}, | 343 | {0x73, 0x01}, /* pckdv */ |
331 | {0x74, 0x3a}, | 344 | {0x74, 0x3a}, /* xindx */ |
332 | {0x75, 0x35}, | 345 | {0x75, 0x35}, /* yindx */ |
333 | {0x76, 0x01}, | 346 | {0x76, 0x01}, |
334 | {0x77, 0x02}, | 347 | {0x77, 0x02}, |
335 | {0x7a, 0x12}, | 348 | {0x7a, 0x12}, /* gamma curve */ |
336 | {0x7b, 0x08}, | 349 | {0x7b, 0x08}, |
337 | {0x7c, 0x16}, | 350 | {0x7c, 0x16}, |
338 | {0x7d, 0x30}, | 351 | {0x7d, 0x30}, |
@@ -349,33 +362,33 @@ static const u8 sensor_init_ov965x[][2] = { | |||
349 | {0x88, 0xe6}, | 362 | {0x88, 0xe6}, |
350 | {0x89, 0xf2}, | 363 | {0x89, 0xf2}, |
351 | {0x8a, 0x03}, | 364 | {0x8a, 0x03}, |
352 | {0x8c, 0x89}, | 365 | {0x8c, 0x89}, /* com19 */ |
353 | {0x14, 0x28}, /* com9 */ | 366 | {0x14, 0x28}, /* com9 */ |
354 | {0x90, 0x7d}, | 367 | {0x90, 0x7d}, |
355 | {0x91, 0x7b}, | 368 | {0x91, 0x7b}, |
356 | {0x9d, 0x03}, | 369 | {0x9d, 0x03}, /* lcc6 */ |
357 | {0x9e, 0x04}, | 370 | {0x9e, 0x04}, /* lcc7 */ |
358 | {0x9f, 0x7a}, | 371 | {0x9f, 0x7a}, |
359 | {0xa0, 0x79}, | 372 | {0xa0, 0x79}, |
360 | {0xa1, 0x40}, /* aechm */ | 373 | {0xa1, 0x40}, /* aechm */ |
361 | {0xa4, 0x50}, | 374 | {0xa4, 0x50}, /* com21 */ |
362 | {0xa5, 0x68}, /* com26 */ | 375 | {0xa5, 0x68}, /* com26 */ |
363 | {0xa6, 0x4a}, | 376 | {0xa6, 0x4a}, /* AWB green */ |
364 | {0xa8, 0xc1}, /* acoma8 */ | 377 | {0xa8, 0xc1}, /* refa8 */ |
365 | {0xa9, 0xef}, /* acoma9 */ | 378 | {0xa9, 0xef}, /* refa9 */ |
366 | {0xaa, 0x92}, | 379 | {0xaa, 0x92}, |
367 | {0xab, 0x04}, | 380 | {0xab, 0x04}, |
368 | {0xac, 0x80}, | 381 | {0xac, 0x80}, /* black level control */ |
369 | {0xad, 0x80}, | 382 | {0xad, 0x80}, |
370 | {0xae, 0x80}, | 383 | {0xae, 0x80}, |
371 | {0xaf, 0x80}, | 384 | {0xaf, 0x80}, |
372 | {0xb2, 0xf2}, | 385 | {0xb2, 0xf2}, |
373 | {0xb3, 0x20}, | 386 | {0xb3, 0x20}, |
374 | {0xb4, 0x20}, | 387 | {0xb4, 0x20}, /* ctrlb4 */ |
375 | {0xb5, 0x00}, | 388 | {0xb5, 0x00}, |
376 | {0xb6, 0xaf}, | 389 | {0xb6, 0xaf}, |
377 | {0xbb, 0xae}, | 390 | {0xbb, 0xae}, |
378 | {0xbc, 0x7f}, | 391 | {0xbc, 0x7f}, /* ADC channel offsets */ |
379 | {0xdb, 0x7f}, | 392 | {0xdb, 0x7f}, |
380 | {0xbe, 0x7f}, | 393 | {0xbe, 0x7f}, |
381 | {0xbf, 0x7f}, | 394 | {0xbf, 0x7f}, |
@@ -384,7 +397,7 @@ static const u8 sensor_init_ov965x[][2] = { | |||
384 | {0xc2, 0x01}, | 397 | {0xc2, 0x01}, |
385 | {0xc3, 0x4e}, | 398 | {0xc3, 0x4e}, |
386 | {0xc6, 0x85}, | 399 | {0xc6, 0x85}, |
387 | {0xc7, 0x80}, | 400 | {0xc7, 0x80}, /* com24 */ |
388 | {0xc9, 0xe0}, | 401 | {0xc9, 0xe0}, |
389 | {0xca, 0xe8}, | 402 | {0xca, 0xe8}, |
390 | {0xcb, 0xf0}, | 403 | {0xcb, 0xf0}, |
@@ -399,11 +412,11 @@ static const u8 sensor_init_ov965x[][2] = { | |||
399 | {0x58, 0x1a}, | 412 | {0x58, 0x1a}, |
400 | {0xff, 0x41}, /* read 41, write ff 00 */ | 413 | {0xff, 0x41}, /* read 41, write ff 00 */ |
401 | {0x41, 0x40}, /* com16 */ | 414 | {0x41, 0x40}, /* com16 */ |
402 | {0xc5, 0x03}, | 415 | {0xc5, 0x03}, /* 60 Hz banding filter */ |
403 | {0x6a, 0x02}, | 416 | {0x6a, 0x02}, /* 50 Hz banding filter */ |
404 | 417 | ||
405 | {0x12, 0x62}, /* com7 - VGA + CIF */ | 418 | {0x12, 0x62}, /* com7 - 30fps VGA YUV */ |
406 | {0x36, 0xfa}, /* rsvd36 */ | 419 | {0x36, 0xfa}, /* aref3 */ |
407 | {0x69, 0x0a}, /* hv */ | 420 | {0x69, 0x0a}, /* hv */ |
408 | {0x8c, 0x89}, /* com22 */ | 421 | {0x8c, 0x89}, /* com22 */ |
409 | {0x14, 0x28}, /* com9 */ | 422 | {0x14, 0x28}, /* com9 */ |
@@ -442,8 +455,8 @@ static const u8 bridge_init_ov965x_2[][2] = { | |||
442 | {0x52, 0x3c}, | 455 | {0x52, 0x3c}, |
443 | {0x53, 0x00}, | 456 | {0x53, 0x00}, |
444 | {0x54, 0x00}, | 457 | {0x54, 0x00}, |
445 | {0x55, 0x00}, | 458 | {0x55, 0x00}, /* brightness */ |
446 | {0x57, 0x00}, | 459 | {0x57, 0x00}, /* contrast 2 */ |
447 | {0x5c, 0x00}, | 460 | {0x5c, 0x00}, |
448 | {0x5a, 0xa0}, | 461 | {0x5a, 0xa0}, |
449 | {0x5b, 0x78}, | 462 | {0x5b, 0x78}, |
@@ -489,9 +502,66 @@ static const u8 sensor_init_ov965x_2[][2] = { | |||
489 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ | 502 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ |
490 | }; | 503 | }; |
491 | 504 | ||
505 | static const u8 sensor_start_ov965x[][2] = { | ||
506 | {0x12, 0x62}, /* com7 - 30fps VGA YUV */ | ||
507 | {0x36, 0xfa}, /* aref3 */ | ||
508 | {0x69, 0x0a}, /* hv */ | ||
509 | {0x8c, 0x89}, /* com22 */ | ||
510 | {0x14, 0x28}, /* com9 */ | ||
511 | {0x3e, 0x0c}, /* com14 */ | ||
512 | {0x41, 0x40}, /* com16 */ | ||
513 | {0x72, 0x00}, | ||
514 | {0x73, 0x00}, | ||
515 | {0x74, 0x3a}, | ||
516 | {0x75, 0x35}, | ||
517 | {0x76, 0x01}, | ||
518 | {0xc7, 0x80}, /* com24 */ | ||
519 | {0x03, 0x12}, /* vref */ | ||
520 | {0x17, 0x16}, /* hstart */ | ||
521 | {0x18, 0x02}, /* hstop */ | ||
522 | {0x19, 0x01}, /* vstrt */ | ||
523 | {0x1a, 0x3d}, /* vstop */ | ||
524 | {0x32, 0xff}, /* href */ | ||
525 | {0xc0, 0xaa}, | ||
526 | {} | ||
527 | }; | ||
528 | |||
492 | static const u8 bridge_start_ov965x[][2] = { | 529 | static const u8 bridge_start_ov965x[][2] = { |
530 | {0x94, 0xaa}, | ||
531 | {0xf1, 0x60}, | ||
532 | {0xe5, 0x04}, | ||
533 | {0xc0, 0x50}, | ||
534 | {0xc1, 0x3c}, | ||
535 | {0x8c, 0x00}, | ||
536 | {0x8d, 0x1c}, | ||
537 | {0x34, 0x05}, | ||
538 | {} | ||
539 | }; | ||
540 | |||
541 | static const u8 bridge_start_ov965x_vga[][2] = { | ||
542 | {0xc2, 0x0c}, | ||
543 | {0xc3, 0xf9}, | ||
544 | {0xda, 0x01}, | ||
545 | {0x50, 0x00}, | ||
546 | {0x51, 0xa0}, | ||
547 | {0x52, 0x3c}, | ||
548 | {0x53, 0x00}, | ||
549 | {0x54, 0x00}, | ||
550 | {0x55, 0x00}, | ||
551 | {0x57, 0x00}, | ||
552 | {0x5c, 0x00}, | ||
553 | {0x5a, 0xa0}, | ||
554 | {0x5b, 0x78}, | ||
555 | {0x35, 0x02}, | ||
556 | {0xd9, 0x10}, | ||
557 | {0x94, 0x11}, | ||
558 | {} | ||
559 | }; | ||
560 | |||
561 | static const u8 bridge_start_ov965x_cif[][2] = { | ||
493 | {0xc2, 0x4c}, | 562 | {0xc2, 0x4c}, |
494 | {0xc3, 0xf9}, | 563 | {0xc3, 0xf9}, |
564 | {0xda, 0x00}, | ||
495 | {0x50, 0x00}, | 565 | {0x50, 0x00}, |
496 | {0x51, 0xa0}, | 566 | {0x51, 0xa0}, |
497 | {0x52, 0x78}, | 567 | {0x52, 0x78}, |
@@ -500,30 +570,54 @@ static const u8 bridge_start_ov965x[][2] = { | |||
500 | {0x55, 0x00}, | 570 | {0x55, 0x00}, |
501 | {0x57, 0x00}, | 571 | {0x57, 0x00}, |
502 | {0x5c, 0x00}, | 572 | {0x5c, 0x00}, |
503 | {0x5a, 0x28}, | 573 | {0x5a, 0x50}, |
504 | {0x5b, 0x1e}, | 574 | {0x5b, 0x3c}, |
505 | {0x35, 0x00}, | 575 | {0x35, 0x02}, |
506 | {0xd9, 0x21}, | 576 | {0xd9, 0x10}, |
507 | {0x94, 0x11}, | 577 | {0x94, 0x11}, |
578 | {} | ||
508 | }; | 579 | }; |
509 | 580 | ||
510 | static const u8 sensor_start_ov965x[][2] = { | 581 | static const u8 sensor_start_ov965x_vga[][2] = { |
511 | {0x3b, 0xe4}, | 582 | {0x3b, 0xc4}, /* com11 - night mode 1/4 frame rate */ |
583 | {0x1e, 0x04}, /* mvfp */ | ||
584 | {0x13, 0xe0}, /* com8 */ | ||
585 | {0x00, 0x00}, | ||
586 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ | ||
587 | {0x11, 0x03}, /* clkrc */ | ||
588 | {0x6b, 0x5a}, /* dblv */ | ||
589 | {0x6a, 0x05}, /* 50 Hz banding filter */ | ||
590 | {0xc5, 0x07}, /* 60 Hz banding filter */ | ||
591 | {0xa2, 0x4b}, /* bd50 */ | ||
592 | {0xa3, 0x3e}, /* bd60 */ | ||
593 | |||
594 | {0x2d, 0x00}, /* advfl */ | ||
595 | {} | ||
596 | }; | ||
597 | |||
598 | static const u8 sensor_start_ov965x_cif[][2] = { | ||
599 | {0x3b, 0xe4}, /* com11 - night mode 1/4 frame rate */ | ||
512 | {0x1e, 0x04}, /* mvfp */ | 600 | {0x1e, 0x04}, /* mvfp */ |
513 | {0x13, 0xe0}, /* com8 */ | 601 | {0x13, 0xe0}, /* com8 */ |
514 | {0x00, 0x00}, | 602 | {0x00, 0x00}, |
515 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ | 603 | {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ |
516 | {0x11, 0x01}, /* clkrc */ | 604 | {0x11, 0x01}, /* clkrc */ |
517 | {0x6b, 0x5a}, /* dblv */ | 605 | {0x6b, 0x5a}, /* dblv */ |
518 | {0x6a, 0x02}, | 606 | {0x6a, 0x02}, /* 50 Hz banding filter */ |
519 | {0xc5, 0x03}, | 607 | {0xc5, 0x03}, /* 60 Hz banding filter */ |
520 | {0xa2, 0x96}, | 608 | {0xa2, 0x96}, /* bd50 */ |
521 | {0xa3, 0x7d}, | 609 | {0xa3, 0x7d}, /* bd60 */ |
610 | |||
522 | {0xff, 0x13}, /* read 13, write ff 00 */ | 611 | {0xff, 0x13}, /* read 13, write ff 00 */ |
523 | {0x13, 0xe7}, | 612 | {0x13, 0xe7}, |
524 | {0x3a, 0x80}, | 613 | {0x3a, 0x80}, /* tslb - yuyv */ |
614 | {} | ||
615 | }; | ||
616 | |||
617 | static const u8 sensor_start_ov965x_2[][2] = { | ||
525 | {0xff, 0x42}, /* read 42, write ff 00 */ | 618 | {0xff, 0x42}, /* read 42, write ff 00 */ |
526 | {0x42, 0xc1}, | 619 | {0x42, 0xc1}, /* com17 - 50 Hz filter */ |
620 | {} | ||
527 | }; | 621 | }; |
528 | 622 | ||
529 | 623 | ||
@@ -705,13 +799,16 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
705 | 799 | ||
706 | cam = &gspca_dev->cam; | 800 | cam = &gspca_dev->cam; |
707 | 801 | ||
708 | cam->cam_mode = vga_mode; | ||
709 | cam->nmodes = ARRAY_SIZE(vga_mode); | ||
710 | |||
711 | if (sd->sensor == SENSOR_OV772X) { | 802 | if (sd->sensor == SENSOR_OV772X) { |
803 | cam->cam_mode = vga_yuyv_mode; | ||
804 | cam->nmodes = ARRAY_SIZE(vga_yuyv_mode); | ||
805 | |||
712 | cam->bulk = 1; | 806 | cam->bulk = 1; |
713 | cam->bulk_size = 16384; | 807 | cam->bulk_size = 16384; |
714 | cam->bulk_nurbs = 2; | 808 | cam->bulk_nurbs = 2; |
809 | } else { /* ov965x */ | ||
810 | cam->cam_mode = vga_jpeg_mode; | ||
811 | cam->nmodes = ARRAY_SIZE(vga_jpeg_mode); | ||
715 | } | 812 | } |
716 | 813 | ||
717 | return 0; | 814 | return 0; |
@@ -781,6 +878,7 @@ static int sd_init(struct gspca_dev *gspca_dev) | |||
781 | static int sd_start(struct gspca_dev *gspca_dev) | 878 | static int sd_start(struct gspca_dev *gspca_dev) |
782 | { | 879 | { |
783 | struct sd *sd = (struct sd *) gspca_dev; | 880 | struct sd *sd = (struct sd *) gspca_dev; |
881 | int mode; | ||
784 | 882 | ||
785 | switch (sd->sensor) { | 883 | switch (sd->sensor) { |
786 | case SENSOR_OV772X: | 884 | case SENSOR_OV772X: |
@@ -789,13 +887,28 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
789 | break; | 887 | break; |
790 | default: | 888 | default: |
791 | /* case SENSOR_OV965X: */ | 889 | /* case SENSOR_OV965X: */ |
792 | reg_w_array(gspca_dev, bridge_start_ov965x, | 890 | |
793 | ARRAY_SIZE(bridge_start_ov965x)); | ||
794 | sccb_w_array(gspca_dev, sensor_start_ov965x, | 891 | sccb_w_array(gspca_dev, sensor_start_ov965x, |
795 | ARRAY_SIZE(sensor_start_ov965x)); | 892 | ARRAY_SIZE(sensor_start_ov965x)); |
893 | reg_w_array(gspca_dev, bridge_start_ov965x, | ||
894 | ARRAY_SIZE(bridge_start_ov965x)); | ||
895 | mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; | ||
896 | if (mode != 0) { /* 320x240 */ | ||
897 | reg_w_array(gspca_dev, bridge_start_ov965x_cif, | ||
898 | ARRAY_SIZE(bridge_start_ov965x_cif)); | ||
899 | sccb_w_array(gspca_dev, sensor_start_ov965x_cif, | ||
900 | ARRAY_SIZE(sensor_start_ov965x_cif)); | ||
901 | } else { /* 640x480 */ | ||
902 | reg_w_array(gspca_dev, bridge_start_ov965x_vga, | ||
903 | ARRAY_SIZE(bridge_start_ov965x_vga)); | ||
904 | sccb_w_array(gspca_dev, sensor_start_ov965x_vga, | ||
905 | ARRAY_SIZE(sensor_start_ov965x_vga)); | ||
906 | } | ||
907 | sccb_w_array(gspca_dev, sensor_start_ov965x_2, | ||
908 | ARRAY_SIZE(sensor_start_ov965x_2)); | ||
909 | ov534_reg_write(gspca_dev, 0xe0, 0x00); | ||
796 | ov534_reg_write(gspca_dev, 0xe0, 0x00); | 910 | ov534_reg_write(gspca_dev, 0xe0, 0x00); |
797 | ov534_set_led(gspca_dev, 1); | 911 | ov534_set_led(gspca_dev, 1); |
798 | /*fixme: other sensor start omitted*/ | ||
799 | } | 912 | } |
800 | return 0; | 913 | return 0; |
801 | } | 914 | } |
@@ -878,12 +991,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame, | |||
878 | /* If this packet is marked as EOF, end the frame */ | 991 | /* If this packet is marked as EOF, end the frame */ |
879 | } else if (data[1] & UVC_STREAM_EOF) { | 992 | } else if (data[1] & UVC_STREAM_EOF) { |
880 | sd->last_pts = 0; | 993 | sd->last_pts = 0; |
881 | |||
882 | if (frame->data_end - frame->data != | ||
883 | gspca_dev->width * gspca_dev->height * 2) { | ||
884 | PDEBUG(D_PACK, "short frame"); | ||
885 | goto discard; | ||
886 | } | ||
887 | frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, | 994 | frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, |
888 | data + 12, len - 12); | 995 | data + 12, len - 12); |
889 | } else { | 996 | } else { |