SyntekUSBVideoCamera

stk11xx-dev.c

Go to the documentation of this file.
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