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
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
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
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
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
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
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
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
00870 usb_stk11xx_write_registry(dev, 0x0204, 0x00a1);
00871 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00872
00873
00874 usb_stk11xx_write_registry(dev, 0x0204, 0x0010);
00875 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.contrast >> 9));
00876
00877
00878 usb_stk11xx_write_registry(dev, 0x0204, 0x0004);
00879 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00880
00881
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
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);
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
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