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