SyntekUSBVideoCamera
stk11xx-dev-a311.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 
00050 //=============================================================================
00051 //
00052 // STK-M811 API / STK-A311 API
00053 //
00054 //=============================================================================
00055 
00056 
00070 int dev_stka311_initialize_device(struct usb_stk11xx *dev)
00071 {
00072     int i;
00073     int value;
00074 
00075     STK_INFO("Initialize USB2.0 Syntek Camera\n");
00076 
00077     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00078     usb_stk11xx_write_registry(dev, 0x0002, 0x0068);
00079     usb_stk11xx_write_registry(dev, 0x0003, 0x0080);
00080 
00081     usb_stk11xx_write_registry(dev, 0x0002, 0x006f);
00082     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00083     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00084     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00085     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00086     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00087     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00088     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00089     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00090     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00091     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00092     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00093     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00094     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00095     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00096     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00097     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00098     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00099     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00100     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00101     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00102     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00103     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00104     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00105     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00106     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00107     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00108     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00109     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00110     usb_stk11xx_write_registry(dev, 0x0002, 0x006d);
00111     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00112 
00113     for (i=0; i<16; i++) {
00114         usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00115         usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00116         usb_stk11xx_read_registry(dev, 0x0000, &value);
00117     
00118         STK_DEBUG("Loop 1 : Read 0x0000 = %02X\n", value);
00119     }
00120 
00121     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00122     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00123 
00124     usb_stk11xx_write_registry(dev, 0x0002, 0x006f);
00125     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00126     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00127     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00128     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00129     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00130     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00131     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00132     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00133     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00134     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00135     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00136     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00137     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00138     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00139     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00140     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00141     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00142     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00143     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00144     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00145     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00146     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00147     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00148     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00149     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00150     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00151     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00152     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00153     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00154     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00155     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00156     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00157     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00158     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00159     usb_stk11xx_write_registry(dev, 0x0002, 0x006d);
00160     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00161 
00162     for (i=0; i<16; i++) {
00163         usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00164         usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00165         usb_stk11xx_read_registry(dev, 0x0000, &value);
00166 
00167         STK_DEBUG("Loop 2 : Read 0x0000 = %02X\n", value);
00168     }
00169 
00170     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00171     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00172 
00173     usb_stk11xx_write_registry(dev, 0x0002, 0x006f);
00174     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00175     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00176     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00177     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00178     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00179     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00180     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00181     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00182     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00183     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00184     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00185     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00186     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00187     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00188     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00189     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00190     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00191     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00192     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00193     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00194     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00195     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00196     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00197     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00198     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00199     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00200     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00201     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00202     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00203     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00204     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00205     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00206     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00207     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00208     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00209     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00210     usb_stk11xx_write_registry(dev, 0x0000, 0x0027);
00211     usb_stk11xx_write_registry(dev, 0x0000, 0x0026);
00212     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00213     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00214     usb_stk11xx_write_registry(dev, 0x0002, 0x006d);
00215     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00216 
00217     for (i=0; i<16; i++) {
00218         usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00219         usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00220         usb_stk11xx_read_registry(dev, 0x0000, &value);
00221     
00222         STK_DEBUG("Loop 3 : Read 0x0000 = %02X\n", value);
00223     }
00224 
00225     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00226     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00227     usb_stk11xx_write_registry(dev, 0x0002, 0x006f);
00228     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00229     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00230 
00231     usb_stk11xx_write_registry(dev, 0x0117, 0x0000);
00232     usb_stk11xx_read_registry(dev, 0x0103, &value);
00233     usb_stk11xx_write_registry(dev, 0x0103, 0x0001);
00234     usb_stk11xx_read_registry(dev, 0x0103, &value);
00235     usb_stk11xx_write_registry(dev, 0x0103, 0x0000);
00236 
00237     usb_stk11xx_write_registry(dev, 0x0000, 0x00e0);
00238     usb_stk11xx_write_registry(dev, 0x0002, 0x00e8);
00239     usb_stk11xx_write_registry(dev, 0x0002, 0x0068);
00240     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00241 
00242     dev_stka311_configure_device(dev, 0);
00243     dev_stk11xx_check_device(dev, 65);
00244     usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00245 
00246     dev_stka311_configure_device(dev, 1);
00247     dev_stk11xx_check_device(dev, 65);
00248     usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00249 
00250     dev_stka311_configure_device(dev, 2);
00251     dev_stk11xx_check_device(dev, 500);
00252     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00253     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00254     usb_stk11xx_write_registry(dev, 0x0208, 0x0013);
00255     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00256     dev_stk11xx_check_device(dev, 500);
00257     usb_stk11xx_read_registry(dev, 0x0209, &value);
00258     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00259     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00260     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00261     usb_stk11xx_write_registry(dev, 0x0208, 0x000a);
00262     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00263     dev_stk11xx_check_device(dev, 500);
00264     usb_stk11xx_read_registry(dev, 0x0209, &value);
00265     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00266     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00267     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00268     usb_stk11xx_write_registry(dev, 0x0208, 0x000b);
00269     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00270     dev_stk11xx_check_device(dev, 500);
00271     usb_stk11xx_read_registry(dev, 0x0209, &value);
00272     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00273 
00274     dev_stka311_configure_device(dev, 3);
00275     dev_stk11xx_check_device(dev, 65);
00276     usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00277 
00278     dev_stka311_configure_device(dev, 4);
00279     dev_stk11xx_check_device(dev, 65);
00280     usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00281 
00282     dev_stka311_configure_device(dev, 5);
00283     dev_stk11xx_check_device(dev, 500);
00284     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00285     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00286     usb_stk11xx_write_registry(dev, 0x0208, 0x0013);
00287     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00288     dev_stk11xx_check_device(dev, 500);
00289     usb_stk11xx_read_registry(dev, 0x0209, &value);
00290     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00291     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00292     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00293     usb_stk11xx_write_registry(dev, 0x0208, 0x000a);
00294     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00295     dev_stk11xx_check_device(dev, 500);
00296     usb_stk11xx_read_registry(dev, 0x0209, &value);
00297     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00298     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00299     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00300     usb_stk11xx_write_registry(dev, 0x0208, 0x000b);
00301     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00302     dev_stk11xx_check_device(dev, 500);
00303     usb_stk11xx_read_registry(dev, 0x0209, &value);
00304     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00305 
00306     dev_stka311_configure_device(dev, 6);
00307     dev_stk11xx_check_device(dev, 500);
00308     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00309     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00310     usb_stk11xx_write_registry(dev, 0x0208, 0x0013);
00311     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00312     dev_stk11xx_check_device(dev, 500);
00313     usb_stk11xx_read_registry(dev, 0x0209, &value);
00314     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00315     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00316     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00317     usb_stk11xx_write_registry(dev, 0x0208, 0x000a);
00318     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00319     dev_stk11xx_check_device(dev, 500);
00320     usb_stk11xx_read_registry(dev, 0x0209, &value);
00321     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00322     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00323     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00324     usb_stk11xx_write_registry(dev, 0x0208, 0x000b);
00325     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00326     dev_stk11xx_check_device(dev, 500);
00327     usb_stk11xx_read_registry(dev, 0x0209, &value);
00328     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00329 
00330     dev_stka311_configure_device(dev, 7);
00331     dev_stk11xx_check_device(dev, 500);
00332     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00333     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00334     usb_stk11xx_write_registry(dev, 0x0208, 0x0013);
00335     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00336     dev_stk11xx_check_device(dev, 500);
00337     usb_stk11xx_read_registry(dev, 0x0209, &value);
00338     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00339     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00340     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00341     usb_stk11xx_write_registry(dev, 0x0208, 0x000a);
00342     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00343     dev_stk11xx_check_device(dev, 500);
00344     usb_stk11xx_read_registry(dev, 0x0209, &value);
00345     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00346     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00347     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00348     usb_stk11xx_write_registry(dev, 0x0208, 0x000b);
00349     usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00350     dev_stk11xx_check_device(dev, 500);
00351     usb_stk11xx_read_registry(dev, 0x0209, &value);
00352     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00353 
00354     usb_stk11xx_write_registry(dev, 0x0002, 0x006f);
00355     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00356     usb_stk11xx_write_registry(dev, 0x0002, 0x006d);
00357     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00358     usb_stk11xx_write_registry(dev, 0x0000, 0x0025);
00359     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00360 
00361     dev_stka311_configure_device(dev, 8);
00362 
00363     dev_stka311_camera_asleep(dev);
00364 
00365     usb_stk11xx_set_feature(dev, 0);
00366 
00367     // Device is initialized and is ready !!!
00368     STK_INFO("Syntek USB2.0 Camera is ready\n");
00369 
00370     return 0;
00371 }
00372 
00373 
00392 int dev_stka311_configure_device(struct usb_stk11xx *dev, int step)
00393 {
00394     int value;
00395 
00396     //     0,    1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   11
00397 
00398     static const int values_001B[] = {
00399         0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e
00400     };
00401     static const int values_001C[] = {
00402         0x06, 0x02, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0e
00403     };
00404     static const int values_0202[] = {
00405         0x1e, 0x0a, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e
00406     };
00407     static const int values_0110[] = {
00408         0x07, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00
00409     };
00410     static const int values_0112[] = {
00411         0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
00412     };
00413     static const int values_0114[] = {
00414         0x87, 0x80, 0x80, 0x80, 0x80, 0xbe, 0xbe, 0x80, 0x80, 0x80, 0x80, 0x00
00415     };
00416     static const int values_0115[] = {
00417         0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05
00418     };
00419     static const int values_0116[] = {
00420         0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe9, 0xe9, 0xe0, 0xe0, 0xe0, 0xe0, 0x00
00421     };
00422     static const int values_0117[] = {
00423         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04
00424     };
00425     static const int values_0100[] = {
00426         0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21
00427     };
00428 
00429     STK_DEBUG("dev_stka311_configure_device : %d\n", step);
00430 
00431     usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00432     usb_stk11xx_write_registry(dev, 0x0002, 0x0068);
00433     usb_stk11xx_write_registry(dev, 0x0003, 0x0080);
00434     usb_stk11xx_write_registry(dev, 0x0005, 0x0000);
00435     
00436     usb_stk11xx_write_registry(dev, 0x0007, 0x0003);
00437     usb_stk11xx_write_registry(dev, 0x000d, 0x0000);
00438     usb_stk11xx_write_registry(dev, 0x000f, 0x0002);
00439     usb_stk11xx_write_registry(dev, 0x0300, 0x0012);
00440     usb_stk11xx_write_registry(dev, 0x0350, 0x0041);
00441     
00442     usb_stk11xx_write_registry(dev, 0x0351, 0x0000);
00443     usb_stk11xx_write_registry(dev, 0x0352, 0x0000);
00444     usb_stk11xx_write_registry(dev, 0x0353, 0x0000);
00445     usb_stk11xx_write_registry(dev, 0x0018, 0x0010);
00446     usb_stk11xx_write_registry(dev, 0x0019, 0x0000);
00447     
00448     usb_stk11xx_write_registry(dev, 0x001b, values_001B[step]);
00449     usb_stk11xx_write_registry(dev, 0x001c, values_001C[step]);
00450     usb_stk11xx_write_registry(dev, 0x0300, 0x0080);
00451     usb_stk11xx_write_registry(dev, 0x001a, 0x0004);
00452     usb_stk11xx_write_registry(dev, 0x0202, values_0202[step]);
00453     
00454     usb_stk11xx_write_registry(dev, 0x0110, values_0110[step]);
00455     usb_stk11xx_write_registry(dev, 0x0111, 0x0000);
00456     usb_stk11xx_write_registry(dev, 0x0112, values_0112[step]);
00457     usb_stk11xx_write_registry(dev, 0x0113, 0x0000);
00458     usb_stk11xx_write_registry(dev, 0x0114, values_0114[step]);
00459     
00460     usb_stk11xx_write_registry(dev, 0x0115, values_0115[step]);
00461     usb_stk11xx_write_registry(dev, 0x0116, values_0116[step]);
00462     usb_stk11xx_write_registry(dev, 0x0117, values_0117[step]);
00463 
00464     usb_stk11xx_read_registry(dev, 0x0100, &value);
00465     usb_stk11xx_write_registry(dev, 0x0100, values_0100[step]);
00466 
00467     usb_stk11xx_write_registry(dev, 0x0200, 0x0080); 
00468     usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 
00469     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 
00470 
00471 
00472     switch (step) {
00473         case 0:
00474             usb_stk11xx_write_registry(dev, 0x0203, 0x0040); 
00475 
00476             usb_stk11xx_write_registry(dev, 0x0204, 0x0041); 
00477             usb_stk11xx_write_registry(dev, 0x0205, 0x0001); 
00478             usb_stk11xx_write_registry(dev, 0x0204, 0x001c); 
00479             usb_stk11xx_write_registry(dev, 0x0205, 0x0002); 
00480 
00481             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00482 
00483             break;
00484 
00485         case 1:
00486             usb_stk11xx_write_registry(dev, 0x0203, 0x0022); 
00487 
00488             usb_stk11xx_write_registry(dev, 0x0204, 0x0027); 
00489             usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 
00490 
00491             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00492 
00493             break;
00494     
00495         case 2:
00496             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00497 
00498             usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 
00499             usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 
00500             usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 
00501             usb_stk11xx_write_registry(dev, 0x0205, 0x00bf); 
00502 
00503             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00504 
00505             break;
00506 
00507         case 3:
00508             usb_stk11xx_write_registry(dev, 0x0203, 0x0042); 
00509 
00510             usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 
00511             usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 
00512             usb_stk11xx_write_registry(dev, 0x0204, 0x0024); 
00513             usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 
00514 
00515             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00516 
00517             break;
00518 
00519         case 4:
00520             usb_stk11xx_write_registry(dev, 0x0203, 0x0042); 
00521 
00522             usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 
00523             usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 
00524             usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 
00525             usb_stk11xx_write_registry(dev, 0x0205, 0x00e0); 
00526             usb_stk11xx_write_registry(dev, 0x0204, 0x0024); 
00527             usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 
00528 
00529             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00530 
00531             break;
00532 
00533         case 5:
00534             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00535 
00536             usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 
00537             usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 
00538             usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 
00539             usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 
00540 
00541             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00542 
00543             break;
00544 
00545         case 6:
00546             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00547 
00548             usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 
00549             usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 
00550             usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 
00551             usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 
00552 
00553             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00554 
00555             break;
00556 
00557         case 7:
00558             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00559 
00560             usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 
00561             usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 
00562             usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 
00563             usb_stk11xx_write_registry(dev, 0x0205, 0x00b7); 
00564 
00565             usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 
00566 
00567             break;
00568 
00569         case 8:
00570             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00571 
00572             dev_stka311_sensor_settings(dev);
00573 
00574             usb_stk11xx_write_registry(dev, 0x0200, 0x0080);
00575             usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00576             usb_stk11xx_write_registry(dev, 0x02ff, 0x0001);
00577             usb_stk11xx_write_registry(dev, 0x0203, 0x00a0);
00578 
00579             break;
00580 
00581         case 9:
00582             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00583 
00584             dev_stka311_sensor_settings(dev);
00585 
00586             usb_stk11xx_write_registry(dev, 0x0104, 0x0000);
00587             usb_stk11xx_write_registry(dev, 0x0105, 0x0000);
00588             usb_stk11xx_write_registry(dev, 0x0106, 0x0000);
00589 
00590             break;
00591     
00592         case 10:
00593         case 11:
00594             usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 
00595 
00596             dev_stka311_sensor_settings(dev);
00597 
00598             usb_stk11xx_write_registry(dev, 0x0106, 0x0000);
00599             usb_stk11xx_read_registry(dev, 0x02ff, &value);
00600             usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00601             usb_stk11xx_write_registry(dev, 0x0204, 0x002a);
00602             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00603             usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00604             dev_stk11xx_check_device(dev, 500);
00605             usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00606             usb_stk11xx_read_registry(dev, 0x02ff, &value);
00607             usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00608             usb_stk11xx_write_registry(dev, 0x0204, 0x002b);
00609             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00610             usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00611             dev_stk11xx_check_device(dev, 500);
00612             usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00613 
00614             break;
00615     }
00616     
00617     return 0;
00618 }
00619 
00620 
00630 int dev_stka311_camera_asleep(struct usb_stk11xx *dev)
00631 {
00632     int value;
00633 
00634     usb_stk11xx_read_registry(dev, 0x0104, &value);
00635     usb_stk11xx_read_registry(dev, 0x0105, &value);
00636     usb_stk11xx_read_registry(dev, 0x0106, &value);
00637 
00638     usb_stk11xx_write_registry(dev, 0x0100, 0x0021);
00639     usb_stk11xx_write_registry(dev, 0x0116, 0x0000);
00640     usb_stk11xx_write_registry(dev, 0x0117, 0x0000);
00641     usb_stk11xx_write_registry(dev, 0x0018, 0x0000);
00642 
00643     usb_stk11xx_read_registry(dev, 0x0000, &value);
00644     usb_stk11xx_write_registry(dev, 0x0000, 0x004c);
00645 
00646     return 0;
00647 }
00648 
00649 
00660 int dev_stka311_init_camera(struct usb_stk11xx *dev)
00661 {
00662     int value;
00663 
00664     dev_stka311_camera_asleep(dev);
00665 
00666     usb_stk11xx_set_feature(dev, 0);
00667 
00668     usb_stk11xx_write_registry(dev, 0x0000, 0x00e0);
00669     usb_stk11xx_write_registry(dev, 0x0002, 0x00e8);
00670     usb_stk11xx_write_registry(dev, 0x0002, 0x0068);
00671     usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00672 
00673     dev_stka311_configure_device(dev, 9);
00674 
00675     dev_stk11xx_camera_off(dev);
00676 
00677     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00678     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00679     usb_stk11xx_write_registry(dev, 0x0204, 0x002a);
00680     usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 
00681     usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 
00682     dev_stk11xx_check_device(dev, 500);
00683     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00684     usb_stk11xx_read_registry(dev, 0x02ff, &value);
00685     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00686     usb_stk11xx_write_registry(dev, 0x0204, 0x002b);
00687     usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00688     usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00689     dev_stk11xx_check_device(dev, 500);
00690     usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00691 
00692     dev_stka311_camera_settings(dev);
00693 
00694     return 0;
00695 }
00696 
00697 
00708 int dev_stka311_sensor_settings(struct usb_stk11xx *dev)
00709 {
00710     int i;
00711     int retok;
00712     int value;
00713 
00714     int asize;
00715     int *values_204 = NULL;
00716     int *values_205 = NULL;
00717 
00718     // From 80x60 to 640x480
00719     static const int values_1_204[] = {
00720         0x12, 0x11, 0x3b, 0x6a, 0x13, 0x10, 0x00, 0x01, 0x02, 0x13,
00721         0x39, 0x38, 0x37, 0x35, 0x0e, 0x12, 0x04, 0x0c, 0x0d, 0x17,
00722         0x18, 0x32, 0x19, 0x1a, 0x03, 0x1b, 0x16, 0x33, 0x34, 0x41,
00723         0x96, 0x3d, 0x69, 0x3a, 0x8e, 0x3c, 0x8f, 0x8b, 0x8c, 0x94,
00724         0x95, 0x40, 0x29, 0x0f, 0xa5, 0x1e, 0xa9, 0xaa, 0xab, 0x90,
00725         0x91, 0x9f, 0xa0, 0x24, 0x25, 0x26, 0x14, 0x2a, 0x2b 
00726     };
00727     static const int values_1_205[] = {
00728         0x45, 0x80, 0x01, 0x7d, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
00729         0x50, 0x93, 0x00, 0x81, 0x20, 0x45, 0x00, 0x00, 0x00, 0x24,
00730         0xc4, 0xb6, 0x00, 0x3c, 0x36, 0x00, 0x07, 0xe2, 0xbf, 0x00,
00731         0x04, 0x19, 0x40, 0x0d, 0x00, 0x73, 0xdf, 0x06, 0x20, 0x88,
00732         0x88, 0xc1, 0x3f, 0x42, 0x80, 0x04, 0xb8, 0x92, 0x0a, 0x00,
00733         0x00, 0x00, 0x00, 0x68, 0x5c, 0xc3, 0x2e, 0x00, 0x00
00734     };
00735 
00736     // From 800x600 to 1280x1024
00737     static const int values_2_204[] = {
00738         0x12, 0x11, 0x3b, 0x6a, 0x13, 0x10, 0x00, 0x01, 0x02, 0x13,
00739         0x39, 0x38, 0x37, 0x35, 0x0e, 0x12, 0x04, 0x0c, 0x0d, 0x17,
00740         0x18, 0x32, 0x19, 0x1a, 0x03, 0x1b, 0x16, 0x33, 0x34, 0x41,
00741         0x96, 0x3d, 0x69, 0x3a, 0x8e, 0x3c, 0x8f, 0x8b, 0x8c, 0x94,
00742         0x95, 0x40, 0x29, 0x0f, 0xa5, 0x1e, 0xa9, 0xaa, 0xab, 0x90,
00743         0x91, 0x9f, 0xa0, 0x24, 0x25, 0x26, 0x14, 0x2a, 0x2b 
00744     };
00745     static const int values_2_205[] = {
00746         0x05, 0x80, 0x01, 0x7d, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
00747         0x50, 0x93, 0x00, 0x81, 0x20, 0x05, 0x00, 0x00, 0x00, 0x1b,
00748         0xbb, 0xa4, 0x01, 0x81, 0x12, 0x00, 0x07, 0xe2, 0xbf, 0x00,
00749         0x04, 0x19, 0x40, 0x0d, 0x00, 0x73, 0xdf, 0x06, 0x20, 0x88,
00750         0x88, 0xc1, 0x3f, 0x42, 0x80, 0x04, 0xb8, 0x92, 0x0a, 0x00,
00751         0x00, 0x00, 0x00, 0x68, 0x5c, 0xc3, 0x2e, 0x00, 0x00
00752     };
00753 
00754 
00755     // From the resolution
00756     switch (dev->resolution) {
00757         case STK11XX_1280x1024:
00758         case STK11XX_1024x768:
00759         case STK11XX_800x600:
00760         case STK11XX_720x576:
00761             asize = ARRAY_SIZE(values_2_204);
00762             values_204 = (int *) values_2_204;
00763             values_205 = (int *) values_2_205;
00764             break;
00765 
00766         case STK11XX_640x480:
00767         case STK11XX_320x240:
00768         case STK11XX_160x120:
00769         case STK11XX_213x160:
00770         case STK11XX_128x96:
00771         case STK11XX_80x60:
00772         default:
00773             asize = ARRAY_SIZE(values_1_204);
00774             values_204 = (int *) values_1_204;
00775             values_205 = (int *) values_1_205;
00776             break;
00777     }
00778     
00779 
00780     for(i=0; i<asize; i++) {
00781         usb_stk11xx_read_registry(dev, 0x02ff, &value);
00782         usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00783 
00784         usb_stk11xx_write_registry(dev, 0x0204, values_204[i]);
00785         usb_stk11xx_write_registry(dev, 0x0205, values_205[i]);
00786         usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00787 
00788         retok = dev_stk11xx_check_device(dev, 500);
00789 
00790         if (retok != 1) {
00791             STK_ERROR("Load default sensor settings fail !\n");
00792             return -1;
00793         }
00794 
00795         usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00796     }
00797 
00798     retok = dev_stk11xx_check_device(dev, 500);
00799 
00800     return 0;
00801 }
00802 
00803 
00817 int dev_stka311_camera_settings(struct usb_stk11xx *dev)
00818 {
00819     int ret;
00820 
00821     dev_stka311_set_camera_quality(dev);
00822 
00823     ret = dev_stk11xx_check_device(dev, 500);
00824 
00825     if (!ret)
00826         STK_DEBUG("Find not 0x4... seems OK\n");
00827 
00828     dev_stka311_set_camera_fps(dev);
00829 
00830     ret = dev_stk11xx_check_device(dev, 500);
00831 
00832     if (!ret)
00833         STK_DEBUG("Find not 0x4... seems OK\n");
00834 
00835     return 0;
00836 }
00837 
00838 
00857 int dev_stka311_set_camera_quality(struct usb_stk11xx *dev)
00858 {
00859     usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00860 
00861     // Colour registers
00862     usb_stk11xx_write_registry(dev, 0x0204, 0x0001);
00863     usb_stk11xx_write_registry(dev, 0x0205, (255 - (dev->vsettings.colour >> 8)));
00864     usb_stk11xx_write_registry(dev, 0x0204, 0x0002);
00865     usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.colour >> 8));
00866 
00867     // Unknown register
00868     usb_stk11xx_write_registry(dev, 0x0204, 0x00a1);
00869     usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00870 
00871     // Contrast register
00872     usb_stk11xx_write_registry(dev, 0x0204, 0x0010);
00873     usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.contrast >> 9));
00874 
00875     // Unknown register
00876     usb_stk11xx_write_registry(dev, 0x0204, 0x0004);
00877     usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00878 
00879     // Whiteness register
00880     usb_stk11xx_write_registry(dev, 0x0204, 0x0000);
00881     usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.whiteness >> 11) | 0x20);
00882 
00883     usb_stk11xx_write_registry(dev, 0x0200, 0x0006);
00884 
00885     STK_DEBUG("Set colour : %d\n", dev->vsettings.colour);
00886     STK_DEBUG("Set contrast : %d\n", dev->vsettings.contrast);
00887     STK_DEBUG("Set whiteness : %d\n", dev->vsettings.whiteness);
00888     STK_DEBUG("Set brightness : %d\n", dev->vsettings.brightness);
00889 
00890     return 0;
00891 }
00892 
00893 
00914 int dev_stka311_set_camera_fps(struct usb_stk11xx *dev)
00915 {
00916     usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00917 
00918     // FPS register
00919     switch (dev->vsettings.fps) {
00920         case 10:
00921             usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00922             usb_stk11xx_write_registry(dev, 0x0205, 0x0004);
00923             usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00924             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00925             break;
00926 
00927         case 15:
00928             usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00929             usb_stk11xx_write_registry(dev, 0x0205, 0x0002);
00930             usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00931             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00932             break;
00933 
00934         case 20:
00935             usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00936             usb_stk11xx_write_registry(dev, 0x0205, 0x0001);
00937             usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00938             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00939             break;
00940 
00941         default:
00942         case 25:
00943             usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00944             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00945             usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00946             usb_stk11xx_write_registry(dev, 0x0205, 0x0064);
00947             break;
00948 
00949         case 30:
00950             usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00951             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00952             usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00953             usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00954             break;
00955     }
00956 
00957     usb_stk11xx_write_registry(dev, 0x0200, 0x0006);
00958 
00959     return 0;
00960 }
00961 
00962 
00973 int dev_stka311_start_stream(struct usb_stk11xx *dev)
00974 {
00975     int value;
00976     int value_116, value_117;
00977 
00978     usb_stk11xx_read_registry(dev, 0x0116, &value_116);
00979     usb_stk11xx_read_registry(dev, 0x0117, &value_117);
00980 
00981     usb_stk11xx_write_registry(dev, 0x0116, 0x0000);
00982     usb_stk11xx_write_registry(dev, 0x0117, 0x0000);
00983 
00984     usb_stk11xx_read_registry(dev, 0x0100, &value); // read 0x21
00985     usb_stk11xx_write_registry(dev, 0x0100, 0x00a1);
00986 
00987     usb_stk11xx_write_registry(dev, 0x0116, value_116);
00988     usb_stk11xx_write_registry(dev, 0x0117, value_117);
00989 
00990     return 0;
00991 }
00992 
00993 
01003 int dev_stka311_reconf_camera(struct usb_stk11xx *dev)
01004 {
01005     int step = 10;
01006 
01007     // Choose the step from the resolution
01008     switch (dev->resolution) {
01009         case STK11XX_1280x1024:
01010         case STK11XX_1024x768:
01011         case STK11XX_800x600:
01012         case STK11XX_720x576:
01013             step = 11;
01014             break;
01015 
01016         case STK11XX_640x480:
01017         case STK11XX_320x240:
01018         case STK11XX_160x120:
01019         case STK11XX_213x160:
01020         case STK11XX_128x96:
01021         case STK11XX_80x60:
01022         default:
01023             step = 10;
01024             break;
01025     }
01026 
01027     dev_stka311_configure_device(dev, step);
01028 
01029     dev_stk11xx_camera_settings(dev);
01030 
01031     return 0;
01032 }
01033 
01034 
01045 int dev_stka311_stop_stream(struct usb_stk11xx *dev)
01046 {
01047     int value;
01048 
01049     usb_stk11xx_read_registry(dev, 0x0100, &value);
01050     usb_stk11xx_write_registry(dev, 0x0100, 0x0021);
01051 
01052     return 0;
01053 }
01054