00001
00034 #include <linux/module.h>
00035 #include <linux/init.h>
00036 #include <linux/kernel.h>
00037 #include <linux/version.h>
00038 #include <linux/errno.h>
00039 #include <linux/slab.h>
00040 #include <linux/kref.h>
00041
00042 #include <linux/usb.h>
00043 #include <media/v4l2-common.h>
00044
00045 #include "stk11xx.h"
00046 #include "stk11xx-dev.h"
00047
00048
00049
00050
00051
00052
00053
00054
00055
00069 int dev_stka311_initialize_device(struct usb_stk11xx *dev)
00070 {
00071 int i;
00072 int retok;
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 retok = dev_stk11xx_check_device(dev, 65);
00244 usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00245
00246 dev_stka311_configure_device(dev, 1);
00247 retok = dev_stk11xx_check_device(dev, 65);
00248 usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00249
00250 dev_stka311_configure_device(dev, 2);
00251 retok = 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 retok = 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 retok = 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 retok = 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 retok = dev_stk11xx_check_device(dev, 65);
00276 usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00277
00278 dev_stka311_configure_device(dev, 4);
00279 retok = dev_stk11xx_check_device(dev, 65);
00280 usb_stk11xx_write_registry(dev, 0x0200, 0x0008);
00281
00282 dev_stka311_configure_device(dev, 5);
00283 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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 retok = 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
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 retok;
00395 int value;
00396
00397
00398
00399 static const int values_001B[] = {
00400 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e
00401 };
00402 static const int values_001C[] = {
00403 0x06, 0x02, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0e
00404 };
00405 static const int values_0202[] = {
00406 0x1e, 0x0a, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e
00407 };
00408 static const int values_0110[] = {
00409 0x07, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00
00410 };
00411 static const int values_0112[] = {
00412 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
00413 };
00414 static const int values_0114[] = {
00415 0x87, 0x80, 0x80, 0x80, 0x80, 0xbe, 0xbe, 0x80, 0x80, 0x80, 0x80, 0x00
00416 };
00417 static const int values_0115[] = {
00418 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05
00419 };
00420 static const int values_0116[] = {
00421 0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe9, 0xe9, 0xe0, 0xe0, 0xe0, 0xe0, 0x00
00422 };
00423 static const int values_0117[] = {
00424 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04
00425 };
00426 static const int values_0100[] = {
00427 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21
00428 };
00429
00430 STK_DEBUG("dev_stka311_configure_device : %d\n", step);
00431
00432 usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00433 usb_stk11xx_write_registry(dev, 0x0002, 0x0068);
00434 usb_stk11xx_write_registry(dev, 0x0003, 0x0080);
00435 usb_stk11xx_write_registry(dev, 0x0005, 0x0000);
00436
00437 usb_stk11xx_write_registry(dev, 0x0007, 0x0003);
00438 usb_stk11xx_write_registry(dev, 0x000d, 0x0000);
00439 usb_stk11xx_write_registry(dev, 0x000f, 0x0002);
00440 usb_stk11xx_write_registry(dev, 0x0300, 0x0012);
00441 usb_stk11xx_write_registry(dev, 0x0350, 0x0041);
00442
00443 usb_stk11xx_write_registry(dev, 0x0351, 0x0000);
00444 usb_stk11xx_write_registry(dev, 0x0352, 0x0000);
00445 usb_stk11xx_write_registry(dev, 0x0353, 0x0000);
00446 usb_stk11xx_write_registry(dev, 0x0018, 0x0010);
00447 usb_stk11xx_write_registry(dev, 0x0019, 0x0000);
00448
00449 usb_stk11xx_write_registry(dev, 0x001b, values_001B[step]);
00450 usb_stk11xx_write_registry(dev, 0x001c, values_001C[step]);
00451 usb_stk11xx_write_registry(dev, 0x0300, 0x0080);
00452 usb_stk11xx_write_registry(dev, 0x001a, 0x0004);
00453 usb_stk11xx_write_registry(dev, 0x0202, values_0202[step]);
00454
00455 usb_stk11xx_write_registry(dev, 0x0110, values_0110[step]);
00456 usb_stk11xx_write_registry(dev, 0x0111, 0x0000);
00457 usb_stk11xx_write_registry(dev, 0x0112, values_0112[step]);
00458 usb_stk11xx_write_registry(dev, 0x0113, 0x0000);
00459 usb_stk11xx_write_registry(dev, 0x0114, values_0114[step]);
00460
00461 usb_stk11xx_write_registry(dev, 0x0115, values_0115[step]);
00462 usb_stk11xx_write_registry(dev, 0x0116, values_0116[step]);
00463 usb_stk11xx_write_registry(dev, 0x0117, values_0117[step]);
00464
00465 usb_stk11xx_read_registry(dev, 0x0100, &value);
00466 usb_stk11xx_write_registry(dev, 0x0100, values_0100[step]);
00467
00468 usb_stk11xx_write_registry(dev, 0x0200, 0x0080);
00469 usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00470 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00471
00472
00473 switch (step) {
00474 case 0:
00475 usb_stk11xx_write_registry(dev, 0x0203, 0x0040);
00476
00477 usb_stk11xx_write_registry(dev, 0x0204, 0x0041);
00478 usb_stk11xx_write_registry(dev, 0x0205, 0x0001);
00479 usb_stk11xx_write_registry(dev, 0x0204, 0x001c);
00480 usb_stk11xx_write_registry(dev, 0x0205, 0x0002);
00481
00482 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00483
00484 break;
00485
00486 case 1:
00487 usb_stk11xx_write_registry(dev, 0x0203, 0x0022);
00488
00489 usb_stk11xx_write_registry(dev, 0x0204, 0x0027);
00490 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5);
00491
00492 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00493
00494 break;
00495
00496 case 2:
00497 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00498
00499 usb_stk11xx_write_registry(dev, 0x0204, 0x0012);
00500 usb_stk11xx_write_registry(dev, 0x0205, 0x0080);
00501 usb_stk11xx_write_registry(dev, 0x0204, 0x0013);
00502 usb_stk11xx_write_registry(dev, 0x0205, 0x00bf);
00503
00504 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00505
00506 break;
00507
00508 case 3:
00509 usb_stk11xx_write_registry(dev, 0x0203, 0x0042);
00510
00511 usb_stk11xx_write_registry(dev, 0x0204, 0x0012);
00512 usb_stk11xx_write_registry(dev, 0x0205, 0x0080);
00513 usb_stk11xx_write_registry(dev, 0x0204, 0x0024);
00514 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5);
00515
00516 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00517
00518 break;
00519
00520 case 4:
00521 usb_stk11xx_write_registry(dev, 0x0203, 0x0042);
00522
00523 usb_stk11xx_write_registry(dev, 0x0204, 0x0012);
00524 usb_stk11xx_write_registry(dev, 0x0205, 0x0080);
00525 usb_stk11xx_write_registry(dev, 0x0204, 0x0013);
00526 usb_stk11xx_write_registry(dev, 0x0205, 0x00e0);
00527 usb_stk11xx_write_registry(dev, 0x0204, 0x0024);
00528 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5);
00529
00530 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00531
00532 break;
00533
00534 case 5:
00535 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00536
00537 usb_stk11xx_write_registry(dev, 0x0204, 0x0012);
00538 usb_stk11xx_write_registry(dev, 0x0205, 0x0080);
00539 usb_stk11xx_write_registry(dev, 0x0204, 0x0013);
00540 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff);
00541
00542 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00543
00544 break;
00545
00546 case 6:
00547 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00548
00549 usb_stk11xx_write_registry(dev, 0x0204, 0x0012);
00550 usb_stk11xx_write_registry(dev, 0x0205, 0x0080);
00551 usb_stk11xx_write_registry(dev, 0x0204, 0x0013);
00552 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff);
00553
00554 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00555
00556 break;
00557
00558 case 7:
00559 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00560
00561 usb_stk11xx_write_registry(dev, 0x0204, 0x0012);
00562 usb_stk11xx_write_registry(dev, 0x0205, 0x0080);
00563 usb_stk11xx_write_registry(dev, 0x0204, 0x0013);
00564 usb_stk11xx_write_registry(dev, 0x0205, 0x00b7);
00565
00566 usb_stk11xx_write_registry(dev, 0x0200, 0x0005);
00567
00568 break;
00569
00570 case 8:
00571 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00572
00573 dev_stka311_sensor_settings(dev);
00574
00575 usb_stk11xx_write_registry(dev, 0x0200, 0x0080);
00576 usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00577 usb_stk11xx_write_registry(dev, 0x02ff, 0x0001);
00578 usb_stk11xx_write_registry(dev, 0x0203, 0x00a0);
00579
00580 break;
00581
00582 case 9:
00583 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00584
00585 dev_stka311_sensor_settings(dev);
00586
00587 usb_stk11xx_write_registry(dev, 0x0104, 0x0000);
00588 usb_stk11xx_write_registry(dev, 0x0105, 0x0000);
00589 usb_stk11xx_write_registry(dev, 0x0106, 0x0000);
00590
00591 break;
00592
00593 case 10:
00594 case 11:
00595 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00596
00597 dev_stka311_sensor_settings(dev);
00598
00599 usb_stk11xx_write_registry(dev, 0x0106, 0x0000);
00600 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00601 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00602 usb_stk11xx_write_registry(dev, 0x0204, 0x002a);
00603 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00604 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00605 retok = dev_stk11xx_check_device(dev, 500);
00606 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00607 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00608 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00609 usb_stk11xx_write_registry(dev, 0x0204, 0x002b);
00610 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00611 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00612 retok = dev_stk11xx_check_device(dev, 500);
00613 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00614
00615 break;
00616 }
00617
00618 return 0;
00619 }
00620
00621
00631 int dev_stka311_camera_asleep(struct usb_stk11xx *dev)
00632 {
00633 int value;
00634
00635 usb_stk11xx_read_registry(dev, 0x0104, &value);
00636 usb_stk11xx_read_registry(dev, 0x0105, &value);
00637 usb_stk11xx_read_registry(dev, 0x0106, &value);
00638
00639 usb_stk11xx_write_registry(dev, 0x0100, 0x0021);
00640 usb_stk11xx_write_registry(dev, 0x0116, 0x0000);
00641 usb_stk11xx_write_registry(dev, 0x0117, 0x0000);
00642 usb_stk11xx_write_registry(dev, 0x0018, 0x0000);
00643
00644 usb_stk11xx_read_registry(dev, 0x0000, &value);
00645 usb_stk11xx_write_registry(dev, 0x0000, 0x004c);
00646
00647 return 0;
00648 }
00649
00650
00661 int dev_stka311_init_camera(struct usb_stk11xx *dev)
00662 {
00663 int retok;
00664 int value;
00665
00666 dev_stka311_camera_asleep(dev);
00667
00668 usb_stk11xx_set_feature(dev, 0);
00669
00670 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0);
00671 usb_stk11xx_write_registry(dev, 0x0002, 0x00e8);
00672 usb_stk11xx_write_registry(dev, 0x0002, 0x0068);
00673 usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00674
00675 dev_stka311_configure_device(dev, 9);
00676
00677 dev_stk11xx_camera_off(dev);
00678
00679 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00680 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00681 usb_stk11xx_write_registry(dev, 0x0204, 0x002a);
00682 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00683 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00684 retok = dev_stk11xx_check_device(dev, 500);
00685 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00686 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00687 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00688 usb_stk11xx_write_registry(dev, 0x0204, 0x002b);
00689 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00690 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00691 retok = dev_stk11xx_check_device(dev, 500);
00692 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00693
00694 dev_stka311_camera_settings(dev);
00695
00696 return 0;
00697 }
00698
00699
00710 int dev_stka311_sensor_settings(struct usb_stk11xx *dev)
00711 {
00712 int i;
00713 int retok;
00714 int value;
00715
00716 int asize;
00717 int *values_204 = NULL;
00718 int *values_205 = NULL;
00719
00720
00721 static const int values_1_204[] = {
00722 0x12, 0x11, 0x3b, 0x6a, 0x13, 0x10, 0x00, 0x01, 0x02, 0x13,
00723 0x39, 0x38, 0x37, 0x35, 0x0e, 0x12, 0x04, 0x0c, 0x0d, 0x17,
00724 0x18, 0x32, 0x19, 0x1a, 0x03, 0x1b, 0x16, 0x33, 0x34, 0x41,
00725 0x96, 0x3d, 0x69, 0x3a, 0x8e, 0x3c, 0x8f, 0x8b, 0x8c, 0x94,
00726 0x95, 0x40, 0x29, 0x0f, 0xa5, 0x1e, 0xa9, 0xaa, 0xab, 0x90,
00727 0x91, 0x9f, 0xa0, 0x24, 0x25, 0x26, 0x14, 0x2a, 0x2b
00728 };
00729 static const int values_1_205[] = {
00730 0x45, 0x80, 0x01, 0x7d, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
00731 0x50, 0x93, 0x00, 0x81, 0x20, 0x45, 0x00, 0x00, 0x00, 0x24,
00732 0xc4, 0xb6, 0x00, 0x3c, 0x36, 0x00, 0x07, 0xe2, 0xbf, 0x00,
00733 0x04, 0x19, 0x40, 0x0d, 0x00, 0x73, 0xdf, 0x06, 0x20, 0x88,
00734 0x88, 0xc1, 0x3f, 0x42, 0x80, 0x04, 0xb8, 0x92, 0x0a, 0x00,
00735 0x00, 0x00, 0x00, 0x68, 0x5c, 0xc3, 0x2e, 0x00, 0x00
00736 };
00737
00738
00739 static const int values_2_204[] = {
00740 0x12, 0x11, 0x3b, 0x6a, 0x13, 0x10, 0x00, 0x01, 0x02, 0x13,
00741 0x39, 0x38, 0x37, 0x35, 0x0e, 0x12, 0x04, 0x0c, 0x0d, 0x17,
00742 0x18, 0x32, 0x19, 0x1a, 0x03, 0x1b, 0x16, 0x33, 0x34, 0x41,
00743 0x96, 0x3d, 0x69, 0x3a, 0x8e, 0x3c, 0x8f, 0x8b, 0x8c, 0x94,
00744 0x95, 0x40, 0x29, 0x0f, 0xa5, 0x1e, 0xa9, 0xaa, 0xab, 0x90,
00745 0x91, 0x9f, 0xa0, 0x24, 0x25, 0x26, 0x14, 0x2a, 0x2b
00746 };
00747 static const int values_2_205[] = {
00748 0x05, 0x80, 0x01, 0x7d, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
00749 0x50, 0x93, 0x00, 0x81, 0x20, 0x05, 0x00, 0x00, 0x00, 0x1b,
00750 0xbb, 0xa4, 0x01, 0x81, 0x12, 0x00, 0x07, 0xe2, 0xbf, 0x00,
00751 0x04, 0x19, 0x40, 0x0d, 0x00, 0x73, 0xdf, 0x06, 0x20, 0x88,
00752 0x88, 0xc1, 0x3f, 0x42, 0x80, 0x04, 0xb8, 0x92, 0x0a, 0x00,
00753 0x00, 0x00, 0x00, 0x68, 0x5c, 0xc3, 0x2e, 0x00, 0x00
00754 };
00755
00756
00757
00758 switch (dev->resolution) {
00759 case STK11XX_1280x1024:
00760 case STK11XX_1024x768:
00761 case STK11XX_800x600:
00762 asize = ARRAY_SIZE(values_2_204);
00763 values_204 = (int *) values_2_204;
00764 values_205 = (int *) values_2_205;
00765 break;
00766
00767 case STK11XX_640x480:
00768 case STK11XX_320x240:
00769 case STK11XX_160x120:
00770 case STK11XX_213x160:
00771 case STK11XX_128x96:
00772 case STK11XX_80x60:
00773 default:
00774 asize = ARRAY_SIZE(values_1_204);
00775 values_204 = (int *) values_1_204;
00776 values_205 = (int *) values_1_205;
00777 break;
00778 }
00779
00780
00781 for(i=0; i<asize; i++) {
00782 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00783 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00784
00785 usb_stk11xx_write_registry(dev, 0x0204, values_204[i]);
00786 usb_stk11xx_write_registry(dev, 0x0205, values_205[i]);
00787 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00788
00789 retok = dev_stk11xx_check_device(dev, 500);
00790
00791 if (retok != 1) {
00792 STK_ERROR("Load default sensor settings fail !\n");
00793 return -1;
00794 }
00795
00796 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00797 }
00798
00799 retok = dev_stk11xx_check_device(dev, 500);
00800
00801 return 0;
00802 }
00803
00804
00818 int dev_stka311_camera_settings(struct usb_stk11xx *dev)
00819 {
00820 int ret;
00821
00822 dev_stka311_set_camera_quality(dev);
00823
00824 ret = dev_stk11xx_check_device(dev, 500);
00825
00826 if (!ret)
00827 STK_DEBUG("Find not 0x4... seems OK\n");
00828
00829 dev_stka311_set_camera_fps(dev);
00830
00831 ret = dev_stk11xx_check_device(dev, 500);
00832
00833 if (!ret)
00834 STK_DEBUG("Find not 0x4... seems OK\n");
00835
00836 return 0;
00837 }
00838
00839
00858 int dev_stka311_set_camera_quality(struct usb_stk11xx *dev)
00859 {
00860 usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00861
00862
00863 usb_stk11xx_write_registry(dev, 0x0204, 0x0001);
00864 usb_stk11xx_write_registry(dev, 0x0205, (255 - (dev->vsettings.colour >> 8)));
00865 usb_stk11xx_write_registry(dev, 0x0204, 0x0002);
00866 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.colour >> 8));
00867
00868
00869 usb_stk11xx_write_registry(dev, 0x0204, 0x00a1);
00870 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00871
00872
00873 usb_stk11xx_write_registry(dev, 0x0204, 0x0010);
00874 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.contrast >> 9));
00875
00876
00877 usb_stk11xx_write_registry(dev, 0x0204, 0x0004);
00878 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00879
00880
00881 usb_stk11xx_write_registry(dev, 0x0204, 0x0000);
00882 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.whiteness >> 11) | 0x20);
00883
00884 usb_stk11xx_write_registry(dev, 0x0200, 0x0006);
00885
00886 STK_DEBUG("Set colour : %d\n", dev->vsettings.colour);
00887 STK_DEBUG("Set contrast : %d\n", dev->vsettings.contrast);
00888 STK_DEBUG("Set whiteness : %d\n", dev->vsettings.whiteness);
00889 STK_DEBUG("Set brightness : %d\n", dev->vsettings.brightness);
00890
00891 return 0;
00892 }
00893
00894
00915 int dev_stka311_set_camera_fps(struct usb_stk11xx *dev)
00916 {
00917 usb_stk11xx_write_registry(dev, 0x0200, 0x0000);
00918
00919
00920 switch (dev->vsettings.fps) {
00921 case 10:
00922 usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00923 usb_stk11xx_write_registry(dev, 0x0205, 0x0004);
00924 usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00925 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00926 break;
00927
00928 case 15:
00929 usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00930 usb_stk11xx_write_registry(dev, 0x0205, 0x0002);
00931 usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00932 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00933 break;
00934
00935 case 20:
00936 usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00937 usb_stk11xx_write_registry(dev, 0x0205, 0x0001);
00938 usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00939 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00940 break;
00941
00942 default:
00943 case 25:
00944 usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00945 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00946 usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00947 usb_stk11xx_write_registry(dev, 0x0205, 0x0064);
00948 break;
00949
00950 case 30:
00951 usb_stk11xx_write_registry(dev, 0x0204, 0x002e);
00952 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00953 usb_stk11xx_write_registry(dev, 0x0204, 0x002d);
00954 usb_stk11xx_write_registry(dev, 0x0205, 0x0000);
00955 break;
00956 }
00957
00958 usb_stk11xx_write_registry(dev, 0x0200, 0x0006);
00959
00960 return 0;
00961 }
00962
00963
00974 int dev_stka311_start_stream(struct usb_stk11xx *dev)
00975 {
00976 int value;
00977 int value_116, value_117;
00978
00979 usb_stk11xx_read_registry(dev, 0x0116, &value_116);
00980 usb_stk11xx_read_registry(dev, 0x0117, &value_117);
00981
00982 usb_stk11xx_write_registry(dev, 0x0116, 0x0000);
00983 usb_stk11xx_write_registry(dev, 0x0117, 0x0000);
00984
00985 usb_stk11xx_read_registry(dev, 0x0100, &value);
00986 usb_stk11xx_write_registry(dev, 0x0100, 0x00a1);
00987
00988 usb_stk11xx_write_registry(dev, 0x0116, value_116);
00989 usb_stk11xx_write_registry(dev, 0x0117, value_117);
00990
00991 return 0;
00992 }
00993
00994
01004 int dev_stka311_reconf_camera(struct usb_stk11xx *dev)
01005 {
01006 int step = 10;
01007
01008
01009 switch (dev->resolution) {
01010 case STK11XX_1280x1024:
01011 case STK11XX_1024x768:
01012 case STK11XX_800x600:
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