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_M811: 00069 case SYNTEK_STK_A311: 00070 ret = dev_stka311_initialize_device(dev); 00071 break; 00072 00073 case SYNTEK_STK_A821: 00074 ret = dev_stka821_initialize_device(dev); 00075 break; 00076 00077 case SYNTEK_STK_6A31: 00078 ret = dev_stk6a31_initialize_device(dev); 00079 break; 00080 00081 case SYNTEK_STK_6A33: 00082 ret = dev_stk6a33_initialize_device(dev); 00083 break; 00084 00085 case SYNTEK_STK_6A51: 00086 ret = dev_stk6a51_initialize_device(dev); 00087 break; 00088 00089 case SYNTEK_STK_6A54: 00090 ret = dev_stk6a54_initialize_device(dev); 00091 break; 00092 00093 case SYNTEK_STK_6D51: 00094 ret = dev_stk6d51_initialize_device(dev); 00095 break; 00096 00097 default: 00098 ret = -1; 00099 } 00100 00101 return ret; 00102 } 00103 00104 00115 int dev_stk11xx_init_camera(struct usb_stk11xx *dev) 00116 { 00117 int ret; 00118 00119 switch (dev->webcam_model) { 00120 case SYNTEK_STK_M811: 00121 case SYNTEK_STK_A311: 00122 ret = dev_stka311_init_camera(dev); 00123 break; 00124 00125 case SYNTEK_STK_A821: 00126 ret = dev_stka821_init_camera(dev); 00127 break; 00128 00129 case SYNTEK_STK_6A31: 00130 ret = dev_stk6a31_init_camera(dev); 00131 break; 00132 00133 case SYNTEK_STK_6A33: 00134 ret = dev_stk6a33_init_camera(dev); 00135 break; 00136 00137 case SYNTEK_STK_6A51: 00138 ret = dev_stk6a51_init_camera(dev); 00139 break; 00140 00141 case SYNTEK_STK_6A54: 00142 ret = dev_stk6a54_init_camera(dev); 00143 break; 00144 00145 case SYNTEK_STK_6D51: 00146 ret = dev_stk6d51_init_camera(dev); 00147 break; 00148 00149 default: 00150 ret = -1; 00151 } 00152 00153 return ret; 00154 } 00155 00156 00170 int dev_stk11xx_check_device(struct usb_stk11xx *dev, int nbr) 00171 { 00172 int i; 00173 int value; 00174 00175 for (i=0; i<nbr; i++) { 00176 usb_stk11xx_read_registry(dev, 0x201, &value); 00177 00178 if (value == 0x00) { 00179 } 00180 else if ((value == 0x11) || (value == 0x14)) { 00181 } 00182 else if ((value == 0x30) || (value == 0x31)) { 00183 } 00184 else if ((value == 0x51)) { 00185 } 00186 else if ((value == 0x70) || (value == 0x71)) { 00187 } 00188 else if ((value == 0x91)) { 00189 } 00190 else if (value == 0x01) { 00191 return 1; 00192 } 00193 else if ((value == 0x04) || (value == 0x05)) 00194 return 1; 00195 else if (value == 0x15) 00196 return 1; 00197 else { 00198 STK_ERROR("Check device return error (0x0201 = %02X) !\n", value); 00199 return -1; 00200 } 00201 } 00202 00203 return 0; 00204 } 00205 00206 00218 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *dev) 00219 { 00220 int value; 00221 00222 usb_stk11xx_read_registry(dev, 0x0001, &value); 00223 00224 if (value != 0x03) { 00225 STK_ERROR("Error : Register 0x0001 = %02X\n", value); 00226 } 00227 00228 return value; 00229 } 00230 00231 00241 int dev_stk11xx_camera_on(struct usb_stk11xx *dev) 00242 { 00243 int ret = -1; 00244 struct usb_device *udev = dev->udev; 00245 00246 ret = usb_set_interface(udev, 0, 5); 00247 00248 if (ret < 0) 00249 STK_ERROR("usb_set_interface failed !\n"); 00250 00251 return ret; 00252 } 00253 00254 00264 int dev_stk11xx_camera_off(struct usb_stk11xx *dev) 00265 { 00266 int ret = -1; 00267 struct usb_device *udev = dev->udev; 00268 00269 ret = usb_set_interface(udev, 0, 0); 00270 00271 if (ret < 0) 00272 STK_ERROR("usb_set_interface failed !\n"); 00273 00274 return 0; 00275 } 00276 00277 00287 int dev_stk11xx_camera_asleep(struct usb_stk11xx *dev) 00288 { 00289 int ret; 00290 00291 switch (dev->webcam_model) { 00292 case SYNTEK_STK_M811: 00293 case SYNTEK_STK_A311: 00294 ret = dev_stka311_camera_asleep(dev); 00295 break; 00296 00297 case SYNTEK_STK_A821: 00298 ret = dev_stka821_camera_asleep(dev); 00299 break; 00300 00301 case SYNTEK_STK_6A31: 00302 ret = dev_stk6a31_camera_asleep(dev); 00303 break; 00304 00305 case SYNTEK_STK_6A33: 00306 ret = dev_stk6a33_camera_asleep(dev); 00307 break; 00308 00309 case SYNTEK_STK_6A51: 00310 ret = dev_stk6a51_camera_asleep(dev); 00311 break; 00312 00313 case SYNTEK_STK_6A54: 00314 ret = dev_stk6a54_camera_asleep(dev); 00315 break; 00316 00317 case SYNTEK_STK_6D51: 00318 ret = dev_stk6d51_camera_asleep(dev); 00319 break; 00320 00321 default: 00322 ret = -1; 00323 } 00324 00325 return ret; 00326 } 00327 00328 00342 int dev_stk11xx_camera_settings(struct usb_stk11xx *dev) 00343 { 00344 int ret; 00345 00346 switch (dev->webcam_model) { 00347 case SYNTEK_STK_M811: 00348 case SYNTEK_STK_A311: 00349 ret = dev_stka311_camera_settings(dev); 00350 break; 00351 00352 case SYNTEK_STK_A821: 00353 ret = dev_stka821_camera_settings(dev); 00354 break; 00355 00356 case SYNTEK_STK_6A31: 00357 ret = dev_stk6a31_camera_settings(dev); 00358 break; 00359 00360 case SYNTEK_STK_6A33: 00361 ret = dev_stk6a33_camera_settings(dev); 00362 break; 00363 00364 case SYNTEK_STK_6A51: 00365 ret = dev_stk6a51_camera_settings(dev); 00366 break; 00367 00368 case SYNTEK_STK_6A54: 00369 ret = dev_stk6a54_camera_settings(dev); 00370 break; 00371 00372 case SYNTEK_STK_6D51: 00373 ret = dev_stk6d51_camera_settings(dev); 00374 break; 00375 00376 default: 00377 ret = -1; 00378 } 00379 00380 return ret; 00381 } 00382 00383 00397 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *dev) 00398 { 00399 int ret; 00400 00401 switch (dev->webcam_model) { 00402 case SYNTEK_STK_M811: 00403 case SYNTEK_STK_A311: 00404 ret = dev_stka311_set_camera_quality(dev); 00405 break; 00406 00407 case SYNTEK_STK_A821: 00408 ret = dev_stka821_set_camera_quality(dev); 00409 break; 00410 00411 case SYNTEK_STK_6A31: 00412 ret = dev_stk6a31_set_camera_quality(dev); 00413 break; 00414 00415 case SYNTEK_STK_6A33: 00416 ret = dev_stk6a33_set_camera_quality(dev); 00417 break; 00418 00419 case SYNTEK_STK_6A51: 00420 ret = dev_stk6a51_set_camera_quality(dev); 00421 break; 00422 00423 case SYNTEK_STK_6A54: 00424 ret = dev_stk6a54_set_camera_quality(dev); 00425 break; 00426 00427 case SYNTEK_STK_6D51: 00428 ret = dev_stk6d51_set_camera_quality(dev); 00429 break; 00430 00431 default: 00432 ret = -1; 00433 } 00434 00435 return ret; 00436 } 00437 00438 00449 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *dev) 00450 { 00451 int ret; 00452 00453 switch (dev->webcam_model) { 00454 case SYNTEK_STK_M811: 00455 case SYNTEK_STK_A311: 00456 ret = dev_stka311_set_camera_fps(dev); 00457 break; 00458 00459 case SYNTEK_STK_A821: 00460 ret = dev_stka821_set_camera_fps(dev); 00461 break; 00462 00463 case SYNTEK_STK_6A31: 00464 ret = dev_stk6a31_set_camera_fps(dev); 00465 break; 00466 00467 case SYNTEK_STK_6A33: 00468 ret = dev_stk6a33_set_camera_fps(dev); 00469 break; 00470 00471 case SYNTEK_STK_6A51: 00472 ret = dev_stk6a51_set_camera_fps(dev); 00473 break; 00474 00475 case SYNTEK_STK_6A54: 00476 ret = dev_stk6a54_set_camera_fps(dev); 00477 break; 00478 00479 case SYNTEK_STK_6D51: 00480 ret = dev_stk6d51_set_camera_fps(dev); 00481 break; 00482 00483 default: 00484 ret = -1; 00485 } 00486 00487 return ret; 00488 } 00489 00490 00501 int dev_stk11xx_start_stream(struct usb_stk11xx *dev) 00502 { 00503 int ret; 00504 00505 switch (dev->webcam_model) { 00506 case SYNTEK_STK_M811: 00507 case SYNTEK_STK_A311: 00508 ret = dev_stka311_start_stream(dev); 00509 break; 00510 00511 case SYNTEK_STK_A821: 00512 ret = dev_stka821_start_stream(dev); 00513 break; 00514 00515 case SYNTEK_STK_6A31: 00516 ret = dev_stk6a31_start_stream(dev); 00517 break; 00518 00519 case SYNTEK_STK_6A33: 00520 ret = dev_stk6a33_start_stream(dev); 00521 break; 00522 00523 case SYNTEK_STK_6A51: 00524 ret = dev_stk6a51_start_stream(dev); 00525 break; 00526 00527 case SYNTEK_STK_6A54: 00528 ret = dev_stk6a54_start_stream(dev); 00529 break; 00530 00531 case SYNTEK_STK_6D51: 00532 ret = dev_stk6d51_start_stream(dev); 00533 break; 00534 00535 default: 00536 ret = -1; 00537 } 00538 00539 return ret; 00540 } 00541 00542 00552 int dev_stk11xx_reconf_camera(struct usb_stk11xx *dev) 00553 { 00554 int ret; 00555 00556 switch (dev->webcam_model) { 00557 case SYNTEK_STK_M811: 00558 case SYNTEK_STK_A311: 00559 ret = dev_stka311_reconf_camera(dev); 00560 break; 00561 00562 case SYNTEK_STK_A821: 00563 ret = dev_stka821_reconf_camera(dev); 00564 break; 00565 00566 case SYNTEK_STK_6A31: 00567 ret = dev_stk6a31_reconf_camera(dev); 00568 break; 00569 00570 case SYNTEK_STK_6A33: 00571 ret = dev_stk6a33_reconf_camera(dev); 00572 break; 00573 00574 case SYNTEK_STK_6A51: 00575 ret = dev_stk6a51_reconf_camera(dev); 00576 break; 00577 00578 case SYNTEK_STK_6A54: 00579 ret = dev_stk6a54_reconf_camera(dev); 00580 break; 00581 00582 case SYNTEK_STK_6D51: 00583 ret = dev_stk6d51_reconf_camera(dev); 00584 break; 00585 00586 default: 00587 ret = -1; 00588 } 00589 00590 return ret; 00591 } 00592 00593 00604 int dev_stk11xx_stop_stream(struct usb_stk11xx *dev) 00605 { 00606 int ret; 00607 00608 switch (dev->webcam_model) { 00609 case SYNTEK_STK_M811: 00610 case SYNTEK_STK_A311: 00611 ret = dev_stka311_stop_stream(dev); 00612 break; 00613 00614 case SYNTEK_STK_A821: 00615 ret = dev_stka821_stop_stream(dev); 00616 break; 00617 00618 case SYNTEK_STK_6A31: 00619 ret = dev_stk6a31_stop_stream(dev); 00620 break; 00621 00622 case SYNTEK_STK_6A33: 00623 ret = dev_stk6a33_stop_stream(dev); 00624 break; 00625 00626 case SYNTEK_STK_6A51: 00627 ret = dev_stk6a51_stop_stream(dev); 00628 break; 00629 00630 case SYNTEK_STK_6A54: 00631 ret = dev_stk6a54_stop_stream(dev); 00632 break; 00633 00634 case SYNTEK_STK_6D51: 00635 ret = dev_stk6d51_stop_stream(dev); 00636 break; 00637 00638 default: 00639 ret = -1; 00640 } 00641 00642 return ret; 00643 } 00644