SyntekUSBVideoCamera
|
00001 00034 #include <linux/module.h> 00035 #include <linux/init.h> 00036 #include <linux/kernel.h> 00037 #include <linux/version.h> 00038 #include <linux/errno.h> 00039 #include <linux/slab.h> 00040 #include <linux/kref.h> 00041 00042 #include <linux/usb.h> 00043 #include <media/v4l2-common.h> 00044 #include <media/v4l2-ioctl.h> 00045 00046 #include "stk11xx.h" 00047 #include "stk11xx-dev.h" 00048 00049 00063 int dev_stk11xx_initialize_device(struct usb_stk11xx *dev) 00064 { 00065 int ret; 00066 00067 switch (dev->webcam_model) { 00068 case SYNTEK_STK_0408: 00069 ret = dev_stk0408_initialize_device(dev); 00070 break; 00071 case SYNTEK_STK_M811: 00072 case SYNTEK_STK_A311: 00073 ret = dev_stka311_initialize_device(dev); 00074 break; 00075 00076 case SYNTEK_STK_A821: 00077 case SYNTEK_STK_AA11: 00078 ret = dev_stka821_initialize_device(dev); 00079 break; 00080 00081 case SYNTEK_STK_6A31: 00082 ret = dev_stk6a31_initialize_device(dev); 00083 break; 00084 00085 case SYNTEK_STK_6A33: 00086 ret = dev_stk6a33_initialize_device(dev); 00087 break; 00088 00089 case SYNTEK_STK_6A51: 00090 ret = dev_stk6a51_initialize_device(dev); 00091 break; 00092 00093 case SYNTEK_STK_6A54: 00094 ret = dev_stk6a54_initialize_device(dev); 00095 break; 00096 00097 case SYNTEK_STK_6D51: 00098 ret = dev_stk6d51_initialize_device(dev); 00099 break; 00100 00101 case SYNTEK_STK_0500: 00102 ret = dev_stk0500_initialize_device(dev); 00103 break; 00104 00105 default: 00106 ret = -1; 00107 } 00108 00109 return ret; 00110 } 00111 00112 00123 int dev_stk11xx_init_camera(struct usb_stk11xx *dev) 00124 { 00125 int ret; 00126 00127 switch (dev->webcam_model) { 00128 case SYNTEK_STK_0408: 00129 ret = dev_stk0408_init_camera(dev); 00130 break; 00131 case SYNTEK_STK_M811: 00132 case SYNTEK_STK_A311: 00133 ret = dev_stka311_init_camera(dev); 00134 break; 00135 00136 case SYNTEK_STK_A821: 00137 case SYNTEK_STK_AA11: 00138 ret = dev_stka821_init_camera(dev); 00139 break; 00140 00141 case SYNTEK_STK_6A31: 00142 ret = dev_stk6a31_init_camera(dev); 00143 break; 00144 00145 case SYNTEK_STK_6A33: 00146 ret = dev_stk6a33_init_camera(dev); 00147 break; 00148 00149 case SYNTEK_STK_6A51: 00150 ret = dev_stk6a51_init_camera(dev); 00151 break; 00152 00153 case SYNTEK_STK_6A54: 00154 ret = dev_stk6a54_init_camera(dev); 00155 break; 00156 00157 case SYNTEK_STK_6D51: 00158 ret = dev_stk6d51_init_camera(dev); 00159 break; 00160 00161 case SYNTEK_STK_0500: 00162 ret = dev_stk0500_init_camera(dev); 00163 break; 00164 00165 default: 00166 ret = -1; 00167 } 00168 00169 return ret; 00170 } 00171 00172 00186 int dev_stk11xx_check_device(struct usb_stk11xx *dev, int nbr) 00187 { 00188 int i; 00189 int value; 00190 00191 for (i=0; i<nbr; i++) { 00192 usb_stk11xx_read_registry(dev, 0x201, &value); 00193 00194 if (value == 0x00) { 00195 } 00196 else if ((value == 0x11) || (value == 0x14)) { 00197 } 00198 else if ((value == 0x30) || (value == 0x31)) { 00199 } 00200 else if ((value == 0x51)) { 00201 } 00202 else if ((value == 0x70) || (value == 0x71)) { 00203 } 00204 else if ((value == 0x91)) { 00205 } 00206 else if (value == 0x01) { 00207 return 1; 00208 } 00209 else if ((value == 0x04) || (value == 0x05)) 00210 return 1; 00211 else if (value == 0x15) 00212 return 1; 00213 else { 00214 STK_ERROR("Check device return error (0x0201 = %02X) !\n", value); 00215 return -1; 00216 } 00217 } 00218 00219 return 0; 00220 } 00221 00222 00234 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *dev) 00235 { 00236 int value; 00237 00238 usb_stk11xx_read_registry(dev, 0x0001, &value); 00239 00240 if (value != 0x03) { 00241 STK_DEBUG("Error : Register 0x0001 = %02X\n", value); 00242 } 00243 00244 return value; 00245 } 00246 00247 00257 int dev_stk11xx_camera_on(struct usb_stk11xx *dev) 00258 { 00259 int ret = -1; 00260 struct usb_device *udev = dev->udev; 00261 00262 ret = usb_set_interface(udev, 0, 5); 00263 00264 if (ret < 0) 00265 STK_ERROR("usb_set_interface failed !\n"); 00266 00267 return ret; 00268 } 00269 00270 00280 int dev_stk11xx_camera_off(struct usb_stk11xx *dev) 00281 { 00282 int ret = -1; 00283 struct usb_device *udev = dev->udev; 00284 00285 ret = usb_set_interface(udev, 0, 0); 00286 00287 if (ret < 0) 00288 STK_ERROR("usb_set_interface failed !\n"); 00289 00290 return 0; 00291 } 00292 00293 00303 int dev_stk11xx_camera_asleep(struct usb_stk11xx *dev) 00304 { 00305 int ret; 00306 00307 switch (dev->webcam_model) { 00308 case SYNTEK_STK_0408: 00309 ret = dev_stk0408_camera_asleep(dev); 00310 break; 00311 case SYNTEK_STK_M811: 00312 case SYNTEK_STK_A311: 00313 ret = dev_stka311_camera_asleep(dev); 00314 break; 00315 00316 case SYNTEK_STK_A821: 00317 case SYNTEK_STK_AA11: 00318 ret = dev_stka821_camera_asleep(dev); 00319 break; 00320 00321 case SYNTEK_STK_6A31: 00322 ret = dev_stk6a31_camera_asleep(dev); 00323 break; 00324 00325 case SYNTEK_STK_6A33: 00326 ret = dev_stk6a33_camera_asleep(dev); 00327 break; 00328 00329 case SYNTEK_STK_6A51: 00330 ret = dev_stk6a51_camera_asleep(dev); 00331 break; 00332 00333 case SYNTEK_STK_6A54: 00334 ret = dev_stk6a54_camera_asleep(dev); 00335 break; 00336 00337 case SYNTEK_STK_6D51: 00338 ret = dev_stk6d51_camera_asleep(dev); 00339 break; 00340 00341 case SYNTEK_STK_0500: 00342 ret = dev_stk0500_camera_asleep(dev); 00343 break; 00344 00345 default: 00346 ret = -1; 00347 } 00348 00349 return ret; 00350 } 00351 00352 00366 int dev_stk11xx_camera_settings(struct usb_stk11xx *dev) 00367 { 00368 int ret; 00369 00370 switch (dev->webcam_model) { 00371 case SYNTEK_STK_0408: 00372 ret = dev_stk0408_camera_settings(dev); 00373 break; 00374 case SYNTEK_STK_M811: 00375 case SYNTEK_STK_A311: 00376 ret = dev_stka311_camera_settings(dev); 00377 break; 00378 00379 case SYNTEK_STK_A821: 00380 case SYNTEK_STK_AA11: 00381 ret = dev_stka821_camera_settings(dev); 00382 break; 00383 00384 case SYNTEK_STK_6A31: 00385 ret = dev_stk6a31_camera_settings(dev); 00386 break; 00387 00388 case SYNTEK_STK_6A33: 00389 ret = dev_stk6a33_camera_settings(dev); 00390 break; 00391 00392 case SYNTEK_STK_6A51: 00393 ret = dev_stk6a51_camera_settings(dev); 00394 break; 00395 00396 case SYNTEK_STK_6A54: 00397 ret = dev_stk6a54_camera_settings(dev); 00398 break; 00399 00400 case SYNTEK_STK_6D51: 00401 ret = dev_stk6d51_camera_settings(dev); 00402 break; 00403 00404 case SYNTEK_STK_0500: 00405 ret = dev_stk0500_camera_settings(dev); 00406 break; 00407 00408 default: 00409 ret = -1; 00410 } 00411 00412 return ret; 00413 } 00414 00415 00429 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *dev) 00430 { 00431 int ret; 00432 00433 switch (dev->webcam_model) { 00434 case SYNTEK_STK_0408: 00435 ret = dev_stk0408_set_camera_quality(dev); 00436 break; 00437 case SYNTEK_STK_M811: 00438 case SYNTEK_STK_A311: 00439 ret = dev_stka311_set_camera_quality(dev); 00440 break; 00441 00442 case SYNTEK_STK_A821: 00443 case SYNTEK_STK_AA11: 00444 ret = dev_stka821_set_camera_quality(dev); 00445 break; 00446 00447 case SYNTEK_STK_6A31: 00448 ret = dev_stk6a31_set_camera_quality(dev); 00449 break; 00450 00451 case SYNTEK_STK_6A33: 00452 ret = dev_stk6a33_set_camera_quality(dev); 00453 break; 00454 00455 case SYNTEK_STK_6A51: 00456 ret = dev_stk6a51_set_camera_quality(dev); 00457 break; 00458 00459 case SYNTEK_STK_6A54: 00460 ret = dev_stk6a54_set_camera_quality(dev); 00461 break; 00462 00463 case SYNTEK_STK_6D51: 00464 ret = dev_stk6d51_set_camera_quality(dev); 00465 break; 00466 00467 case SYNTEK_STK_0500: 00468 ret = dev_stk0500_set_camera_quality(dev); 00469 break; 00470 00471 default: 00472 ret = -1; 00473 } 00474 00475 return ret; 00476 } 00477 00478 00489 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *dev) 00490 { 00491 int ret; 00492 00493 switch (dev->webcam_model) { 00494 case SYNTEK_STK_0408: 00495 ret = dev_stk0408_set_camera_fps(dev); 00496 break; 00497 case SYNTEK_STK_M811: 00498 case SYNTEK_STK_A311: 00499 ret = dev_stka311_set_camera_fps(dev); 00500 break; 00501 00502 case SYNTEK_STK_A821: 00503 case SYNTEK_STK_AA11: 00504 ret = dev_stka821_set_camera_fps(dev); 00505 break; 00506 00507 case SYNTEK_STK_6A31: 00508 ret = dev_stk6a31_set_camera_fps(dev); 00509 break; 00510 00511 case SYNTEK_STK_6A33: 00512 ret = dev_stk6a33_set_camera_fps(dev); 00513 break; 00514 00515 case SYNTEK_STK_6A51: 00516 ret = dev_stk6a51_set_camera_fps(dev); 00517 break; 00518 00519 case SYNTEK_STK_6A54: 00520 ret = dev_stk6a54_set_camera_fps(dev); 00521 break; 00522 00523 case SYNTEK_STK_6D51: 00524 ret = dev_stk6d51_set_camera_fps(dev); 00525 break; 00526 00527 case SYNTEK_STK_0500: 00528 ret = dev_stk0500_set_camera_fps(dev); 00529 break; 00530 00531 default: 00532 ret = -1; 00533 } 00534 00535 return ret; 00536 } 00537 00538 00549 int dev_stk11xx_start_stream(struct usb_stk11xx *dev) 00550 { 00551 int ret; 00552 00553 switch (dev->webcam_model) { 00554 case SYNTEK_STK_0408: 00555 ret = dev_stk0408_start_stream(dev); 00556 break; 00557 case SYNTEK_STK_M811: 00558 case SYNTEK_STK_A311: 00559 ret = dev_stka311_start_stream(dev); 00560 break; 00561 00562 case SYNTEK_STK_A821: 00563 case SYNTEK_STK_AA11: 00564 ret = dev_stka821_start_stream(dev); 00565 break; 00566 00567 case SYNTEK_STK_6A31: 00568 ret = dev_stk6a31_start_stream(dev); 00569 break; 00570 00571 case SYNTEK_STK_6A33: 00572 ret = dev_stk6a33_start_stream(dev); 00573 break; 00574 00575 case SYNTEK_STK_6A51: 00576 ret = dev_stk6a51_start_stream(dev); 00577 break; 00578 00579 case SYNTEK_STK_6A54: 00580 ret = dev_stk6a54_start_stream(dev); 00581 break; 00582 00583 case SYNTEK_STK_6D51: 00584 ret = dev_stk6d51_start_stream(dev); 00585 break; 00586 00587 case SYNTEK_STK_0500: 00588 ret = dev_stk0500_start_stream(dev); 00589 break; 00590 00591 default: 00592 ret = -1; 00593 } 00594 00595 return ret; 00596 } 00597 00598 00608 int dev_stk11xx_reconf_camera(struct usb_stk11xx *dev) 00609 { 00610 int ret; 00611 00612 switch (dev->webcam_model) { 00613 case SYNTEK_STK_0408: 00614 ret = dev_stk0408_reconf_camera(dev); 00615 break; 00616 case SYNTEK_STK_M811: 00617 case SYNTEK_STK_A311: 00618 ret = dev_stka311_reconf_camera(dev); 00619 break; 00620 00621 case SYNTEK_STK_A821: 00622 case SYNTEK_STK_AA11: 00623 ret = dev_stka821_reconf_camera(dev); 00624 break; 00625 00626 case SYNTEK_STK_6A31: 00627 ret = dev_stk6a31_reconf_camera(dev); 00628 break; 00629 00630 case SYNTEK_STK_6A33: 00631 ret = dev_stk6a33_reconf_camera(dev); 00632 break; 00633 00634 case SYNTEK_STK_6A51: 00635 ret = dev_stk6a51_reconf_camera(dev); 00636 break; 00637 00638 case SYNTEK_STK_6A54: 00639 ret = dev_stk6a54_reconf_camera(dev); 00640 break; 00641 00642 case SYNTEK_STK_6D51: 00643 ret = dev_stk6d51_reconf_camera(dev); 00644 break; 00645 00646 case SYNTEK_STK_0500: 00647 ret = dev_stk0500_reconf_camera(dev); 00648 break; 00649 00650 default: 00651 ret = -1; 00652 } 00653 00654 return ret; 00655 } 00656 00657 00668 int dev_stk11xx_stop_stream(struct usb_stk11xx *dev) 00669 { 00670 int ret; 00671 00672 switch (dev->webcam_model) { 00673 case SYNTEK_STK_0408: 00674 ret = dev_stk0408_stop_stream(dev); 00675 break; 00676 case SYNTEK_STK_M811: 00677 case SYNTEK_STK_A311: 00678 ret = dev_stka311_stop_stream(dev); 00679 break; 00680 00681 case SYNTEK_STK_A821: 00682 case SYNTEK_STK_AA11: 00683 ret = dev_stka821_stop_stream(dev); 00684 break; 00685 00686 case SYNTEK_STK_6A31: 00687 ret = dev_stk6a31_stop_stream(dev); 00688 break; 00689 00690 case SYNTEK_STK_6A33: 00691 ret = dev_stk6a33_stop_stream(dev); 00692 break; 00693 00694 case SYNTEK_STK_6A51: 00695 ret = dev_stk6a51_stop_stream(dev); 00696 break; 00697 00698 case SYNTEK_STK_6A54: 00699 ret = dev_stk6a54_stop_stream(dev); 00700 break; 00701 00702 case SYNTEK_STK_6D51: 00703 ret = dev_stk6d51_stop_stream(dev); 00704 break; 00705 00706 case SYNTEK_STK_0500: 00707 ret = dev_stk0500_stop_stream(dev); 00708 break; 00709 00710 default: 00711 ret = -1; 00712 } 00713 00714 return ret; 00715 } 00716 00717 00727 int dev_stk11xx_decompress(struct usb_stk11xx *dev) 00728 { 00729 int ret; 00730 00731 switch (dev->webcam_model) { 00732 case SYNTEK_STK_0408: 00733 // Use a particular decompressor based uvyv 00734 ret = dev_stk0408_decode(dev); 00735 break; 00736 00737 case SYNTEK_STK_M811: 00738 case SYNTEK_STK_A311: 00739 case SYNTEK_STK_A821: 00740 case SYNTEK_STK_AA11: 00741 case SYNTEK_STK_6A31: 00742 case SYNTEK_STK_6A33: 00743 case SYNTEK_STK_6A51: 00744 case SYNTEK_STK_6A54: 00745 case SYNTEK_STK_6D51: 00746 // Use a generec decompressor based bayer stream 00747 ret = stk11xx_decompress(dev); 00748 break; 00749 00750 default: 00751 ret = -1; 00752 } 00753 00754 return ret; 00755 } 00756