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
00045 #include "stk11xx.h"
00046 #include "stk11xx-dev.h"
00047
00048
00062 int dev_stk11xx_initialize_device(struct usb_stk11xx *dev)
00063 {
00064 int ret;
00065
00066 switch (dev->webcam_model) {
00067 case SYNTEK_STK_M811:
00068 case SYNTEK_STK_A311:
00069 ret = dev_stka311_initialize_device(dev);
00070 break;
00071
00072 case SYNTEK_STK_A821:
00073 ret = dev_stka821_initialize_device(dev);
00074 break;
00075
00076 case SYNTEK_STK_6A31:
00077 ret = dev_stk6a31_initialize_device(dev);
00078 break;
00079
00080 case SYNTEK_STK_6A33:
00081 ret = dev_stk6a33_initialize_device(dev);
00082 break;
00083
00084 case SYNTEK_STK_6A51:
00085 ret = dev_stk6a51_initialize_device(dev);
00086 break;
00087
00088 case SYNTEK_STK_6A54:
00089 ret = dev_stk6a54_initialize_device(dev);
00090 break;
00091
00092 default:
00093 ret = -1;
00094 }
00095
00096 return ret;
00097 }
00098
00099
00110 int dev_stk11xx_init_camera(struct usb_stk11xx *dev)
00111 {
00112 int ret;
00113
00114 switch (dev->webcam_model) {
00115 case SYNTEK_STK_M811:
00116 case SYNTEK_STK_A311:
00117 ret = dev_stka311_init_camera(dev);
00118 break;
00119
00120 case SYNTEK_STK_A821:
00121 ret = dev_stka821_init_camera(dev);
00122 break;
00123
00124 case SYNTEK_STK_6A31:
00125 ret = dev_stk6a31_init_camera(dev);
00126 break;
00127
00128 case SYNTEK_STK_6A33:
00129 ret = dev_stk6a33_init_camera(dev);
00130 break;
00131
00132 case SYNTEK_STK_6A51:
00133 ret = dev_stk6a51_init_camera(dev);
00134 break;
00135
00136 case SYNTEK_STK_6A54:
00137 ret = dev_stk6a54_init_camera(dev);
00138 break;
00139
00140 default:
00141 ret = -1;
00142 }
00143
00144 return ret;
00145 }
00146
00147
00161 int dev_stk11xx_check_device(struct usb_stk11xx *dev, int nbr)
00162 {
00163 int i;
00164 int value;
00165
00166 for (i=0; i<nbr; i++) {
00167 usb_stk11xx_read_registry(dev, 0x201, &value);
00168
00169 if (value == 0x00) {
00170 }
00171 else if ((value == 0x14) || (value == 0x30) || (value == 0x70) || (value == 0x71)) {
00172 }
00173 else if (value == 0x01) {
00174 return 1;
00175 }
00176 else if ((value == 0x04) || (value == 0x05))
00177 return 1;
00178 else if (value == 0x15)
00179 return 1;
00180 else {
00181 STK_ERROR("Check device return error (0x0201 = %02X) !\n", value);
00182 return -1;
00183 }
00184 }
00185
00186 return 0;
00187 }
00188
00189
00201 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *dev)
00202 {
00203 int value;
00204
00205 usb_stk11xx_read_registry(dev, 0x0001, &value);
00206
00207 if (value != 0x03) {
00208 STK_ERROR("Error : Register 0x0001 = %02X\n", value);
00209 }
00210
00211 return value;
00212 }
00213
00214
00224 int dev_stk11xx_camera_on(struct usb_stk11xx *dev)
00225 {
00226 int ret = -1;
00227 struct usb_device *udev = dev->udev;
00228
00229 ret = usb_set_interface(udev, 0, 5);
00230
00231 if (ret < 0)
00232 STK_ERROR("usb_set_interface failed !\n");
00233
00234 return ret;
00235 }
00236
00237
00247 int dev_stk11xx_camera_off(struct usb_stk11xx *dev)
00248 {
00249 int ret = -1;
00250 struct usb_device *udev = dev->udev;
00251
00252 ret = usb_set_interface(udev, 0, 0);
00253
00254 if (ret < 0)
00255 STK_ERROR("usb_set_interface failed !\n");
00256
00257 return 0;
00258 }
00259
00260
00270 int dev_stk11xx_camera_asleep(struct usb_stk11xx *dev)
00271 {
00272 int ret;
00273
00274 switch (dev->webcam_model) {
00275 case SYNTEK_STK_M811:
00276 case SYNTEK_STK_A311:
00277 ret = dev_stka311_camera_asleep(dev);
00278 break;
00279
00280 case SYNTEK_STK_A821:
00281 ret = dev_stka821_camera_asleep(dev);
00282 break;
00283
00284 case SYNTEK_STK_6A31:
00285 ret = dev_stk6a31_camera_asleep(dev);
00286 break;
00287
00288 case SYNTEK_STK_6A33:
00289 ret = dev_stk6a33_camera_asleep(dev);
00290 break;
00291
00292 case SYNTEK_STK_6A51:
00293 ret = dev_stk6a51_camera_asleep(dev);
00294 break;
00295
00296 case SYNTEK_STK_6A54:
00297 ret = dev_stk6a54_camera_asleep(dev);
00298 break;
00299
00300 default:
00301 ret = -1;
00302 }
00303
00304 return ret;
00305 }
00306
00307
00321 int dev_stk11xx_camera_settings(struct usb_stk11xx *dev)
00322 {
00323 int ret;
00324
00325 switch (dev->webcam_model) {
00326 case SYNTEK_STK_M811:
00327 case SYNTEK_STK_A311:
00328 ret = dev_stka311_camera_settings(dev);
00329 break;
00330
00331 case SYNTEK_STK_A821:
00332 ret = dev_stka821_camera_settings(dev);
00333 break;
00334
00335 case SYNTEK_STK_6A31:
00336 ret = dev_stk6a31_camera_settings(dev);
00337 break;
00338
00339 case SYNTEK_STK_6A33:
00340 ret = dev_stk6a33_camera_settings(dev);
00341 break;
00342
00343 case SYNTEK_STK_6A51:
00344 ret = dev_stk6a51_camera_settings(dev);
00345 break;
00346
00347 case SYNTEK_STK_6A54:
00348 ret = dev_stk6a54_camera_settings(dev);
00349 break;
00350
00351 default:
00352 ret = -1;
00353 }
00354
00355 return ret;
00356 }
00357
00358
00372 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *dev)
00373 {
00374 int ret;
00375
00376 switch (dev->webcam_model) {
00377 case SYNTEK_STK_M811:
00378 case SYNTEK_STK_A311:
00379 ret = dev_stka311_set_camera_quality(dev);
00380 break;
00381
00382 case SYNTEK_STK_A821:
00383 ret = dev_stka821_set_camera_quality(dev);
00384 break;
00385
00386 case SYNTEK_STK_6A31:
00387 ret = dev_stk6a31_set_camera_quality(dev);
00388 break;
00389
00390 case SYNTEK_STK_6A33:
00391 ret = dev_stk6a33_set_camera_quality(dev);
00392 break;
00393
00394 case SYNTEK_STK_6A51:
00395 ret = dev_stk6a51_set_camera_quality(dev);
00396 break;
00397
00398 case SYNTEK_STK_6A54:
00399 ret = dev_stk6a54_set_camera_quality(dev);
00400 break;
00401
00402 default:
00403 ret = -1;
00404 }
00405
00406 return ret;
00407 }
00408
00409
00420 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *dev)
00421 {
00422 int ret;
00423
00424 switch (dev->webcam_model) {
00425 case SYNTEK_STK_M811:
00426 case SYNTEK_STK_A311:
00427 ret = dev_stka311_set_camera_fps(dev);
00428 break;
00429
00430 case SYNTEK_STK_A821:
00431 ret = dev_stka821_set_camera_fps(dev);
00432 break;
00433
00434 case SYNTEK_STK_6A31:
00435 ret = dev_stk6a31_set_camera_fps(dev);
00436 break;
00437
00438 case SYNTEK_STK_6A33:
00439 ret = dev_stk6a33_set_camera_fps(dev);
00440 break;
00441
00442 case SYNTEK_STK_6A51:
00443 ret = dev_stk6a51_set_camera_fps(dev);
00444 break;
00445
00446 case SYNTEK_STK_6A54:
00447 ret = dev_stk6a54_set_camera_fps(dev);
00448 break;
00449
00450 default:
00451 ret = -1;
00452 }
00453
00454 return ret;
00455 }
00456
00457
00468 int dev_stk11xx_start_stream(struct usb_stk11xx *dev)
00469 {
00470 int ret;
00471
00472 switch (dev->webcam_model) {
00473 case SYNTEK_STK_M811:
00474 case SYNTEK_STK_A311:
00475 ret = dev_stka311_start_stream(dev);
00476 break;
00477
00478 case SYNTEK_STK_A821:
00479 ret = dev_stka821_start_stream(dev);
00480 break;
00481
00482 case SYNTEK_STK_6A31:
00483 ret = dev_stk6a31_start_stream(dev);
00484 break;
00485
00486 case SYNTEK_STK_6A33:
00487 ret = dev_stk6a33_start_stream(dev);
00488 break;
00489
00490 case SYNTEK_STK_6A51:
00491 ret = dev_stk6a51_start_stream(dev);
00492 break;
00493
00494 case SYNTEK_STK_6A54:
00495 ret = dev_stk6a54_start_stream(dev);
00496 break;
00497
00498 default:
00499 ret = -1;
00500 }
00501
00502 return ret;
00503 }
00504
00505
00515 int dev_stk11xx_reconf_camera(struct usb_stk11xx *dev)
00516 {
00517 int ret;
00518
00519 switch (dev->webcam_model) {
00520 case SYNTEK_STK_M811:
00521 case SYNTEK_STK_A311:
00522 ret = dev_stka311_reconf_camera(dev);
00523 break;
00524
00525 case SYNTEK_STK_A821:
00526 ret = dev_stka821_reconf_camera(dev);
00527 break;
00528
00529 case SYNTEK_STK_6A31:
00530 ret = dev_stk6a31_reconf_camera(dev);
00531 break;
00532
00533 case SYNTEK_STK_6A33:
00534 ret = dev_stk6a33_reconf_camera(dev);
00535 break;
00536
00537 case SYNTEK_STK_6A51:
00538 ret = dev_stk6a51_reconf_camera(dev);
00539 break;
00540
00541 case SYNTEK_STK_6A54:
00542 ret = dev_stk6a54_reconf_camera(dev);
00543 break;
00544
00545 default:
00546 ret = -1;
00547 }
00548
00549 return ret;
00550 }
00551
00552
00563 int dev_stk11xx_stop_stream(struct usb_stk11xx *dev)
00564 {
00565 int ret;
00566
00567 switch (dev->webcam_model) {
00568 case SYNTEK_STK_M811:
00569 case SYNTEK_STK_A311:
00570 ret = dev_stka311_stop_stream(dev);
00571 break;
00572
00573 case SYNTEK_STK_A821:
00574 ret = dev_stka821_stop_stream(dev);
00575 break;
00576
00577 case SYNTEK_STK_6A31:
00578 ret = dev_stk6a31_stop_stream(dev);
00579 break;
00580
00581 case SYNTEK_STK_6A33:
00582 ret = dev_stk6a33_stop_stream(dev);
00583 break;
00584
00585 case SYNTEK_STK_6A51:
00586 ret = dev_stk6a51_stop_stream(dev);
00587 break;
00588
00589 case SYNTEK_STK_6A54:
00590 ret = dev_stk6a54_stop_stream(dev);
00591 break;
00592
00593 default:
00594 ret = -1;
00595 }
00596
00597 return ret;
00598 }
00599