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