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_stk6a54_initialize_device(struct usb_stk11xx *dev)
00071 {
00072 int retok;
00073 int value;
00074
00075 STK_INFO("Initialize USB2.0 Syntek Camera\n");
00076
00077 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0);
00078 usb_stk11xx_write_registry(dev, 0x0002, 0x00f8);
00079 usb_stk11xx_write_registry(dev, 0x0002, 0x0078);
00080 usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00081
00082 dev_stk6a54_configure_device(dev, 0);
00083 retok = dev_stk11xx_check_device(dev, 65);
00084 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00085 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00086 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00087 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00088 usb_stk11xx_write_registry(dev, 0x0208, 0x000a);
00089 usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00090 retok = dev_stk11xx_check_device(dev, 65);
00091 usb_stk11xx_read_registry(dev, 0x0209, &value);
00092 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00093 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00094 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00095 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00096 usb_stk11xx_write_registry(dev, 0x0208, 0x000b);
00097 usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00098 retok = dev_stk11xx_check_device(dev, 65);
00099 usb_stk11xx_read_registry(dev, 0x0209, &value);
00100 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00101 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00102 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00103 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00104 usb_stk11xx_write_registry(dev, 0x0208, 0x001c);
00105 usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00106 retok = dev_stk11xx_check_device(dev, 65);
00107 usb_stk11xx_read_registry(dev, 0x0209, &value);
00108 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00109 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00110 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00111 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00112 usb_stk11xx_write_registry(dev, 0x0208, 0x001d);
00113 usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00114 retok = dev_stk11xx_check_device(dev, 65);
00115 usb_stk11xx_read_registry(dev, 0x0209, &value);
00116 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00117 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0);
00118 usb_stk11xx_write_registry(dev, 0x0002, 0x00f8);
00119 usb_stk11xx_write_registry(dev, 0x0002, 0x0078);
00120 usb_stk11xx_write_registry(dev, 0x0000, 0x0020);
00121 usb_stk11xx_write_registry(dev, 0x0100, 0x0021);
00122 usb_stk11xx_read_registry(dev, 0x0000, &value);
00123 usb_stk11xx_write_registry(dev, 0x0000, 0x004b);
00124
00125
00126 dev_stk6a54_configure_device(dev, 1);
00127
00128 usb_stk11xx_set_feature(dev, 0);
00129
00130
00131 STK_INFO("Syntek USB2.0 Camera is ready\n");
00132
00133 return 0;
00134 }
00135
00136
00150 int dev_stk6a54_configure_device(struct usb_stk11xx *dev, int step)
00151 {
00152 int value;
00153
00154
00155 static const int values_001B[] = {
00156 0x0e, 0x0e
00157 };
00158 static const int values_001C[] = {
00159 0x46, 0x46
00160 };
00161 static const int values_0202[] = {
00162 0x1e, 0x1e
00163 };
00164 static const int values_0110[] = {
00165 0x00, 0x00
00166 };
00167 static const int values_0112[] = {
00168 0x00, 0x00
00169 };
00170 static const int values_0114[] = {
00171 0x00, 0x00
00172 };
00173 static const int values_0115[] = {
00174 0x00, 0x05
00175 };
00176 static const int values_0116[] = {
00177 0x00, 0xe0
00178 };
00179 static const int values_0117[] = {
00180 0x00, 0x01
00181 };
00182 static const int values_0100[] = {
00183 0x21, 0x21
00184 };
00185
00186
00187 STK_DEBUG("dev_stk6a54_configure_device : %d\n", step);
00188
00189 usb_stk11xx_write_registry(dev, 0x0000, 0x0024);
00190 usb_stk11xx_write_registry(dev, 0x0002, 0x0078);
00191 usb_stk11xx_write_registry(dev, 0x0003, 0x0080);
00192 usb_stk11xx_write_registry(dev, 0x0005, 0x0000);
00193
00194 usb_stk11xx_write_registry(dev, 0x0007, 0x0003);
00195 usb_stk11xx_write_registry(dev, 0x000d, 0x0000);
00196 usb_stk11xx_write_registry(dev, 0x000f, 0x0002);
00197 usb_stk11xx_write_registry(dev, 0x0300, 0x0012);
00198 usb_stk11xx_write_registry(dev, 0x0350, 0x0041);
00199
00200 usb_stk11xx_write_registry(dev, 0x0351, 0x0000);
00201 usb_stk11xx_write_registry(dev, 0x0352, 0x0000);
00202 usb_stk11xx_write_registry(dev, 0x0353, 0x0000);
00203 usb_stk11xx_write_registry(dev, 0x0018, 0x0010);
00204 usb_stk11xx_write_registry(dev, 0x0019, 0x0000);
00205
00206 usb_stk11xx_write_registry(dev, 0x001b, values_001B[step]);
00207 usb_stk11xx_write_registry(dev, 0x001c, values_001C[step]);
00208 usb_stk11xx_write_registry(dev, 0x0300, 0x0080);
00209 usb_stk11xx_write_registry(dev, 0x001a, 0x0004);
00210 usb_stk11xx_write_registry(dev, 0x0202, values_0202[step]);
00211
00212 usb_stk11xx_write_registry(dev, 0x0110, values_0110[step]);
00213 usb_stk11xx_write_registry(dev, 0x0111, 0x0000);
00214 usb_stk11xx_write_registry(dev, 0x0112, values_0112[step]);
00215 usb_stk11xx_write_registry(dev, 0x0113, 0x0000);
00216 usb_stk11xx_write_registry(dev, 0x0114, values_0114[step]);
00217
00218 usb_stk11xx_write_registry(dev, 0x0115, values_0115[step]);
00219 usb_stk11xx_write_registry(dev, 0x0116, values_0116[step]);
00220 usb_stk11xx_write_registry(dev, 0x0117, values_0117[step]);
00221
00222 usb_stk11xx_read_registry(dev, 0x0100, &value);
00223 usb_stk11xx_write_registry(dev, 0x0100, values_0100[step]);
00224
00225 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00226
00227
00228 switch (step) {
00229 case 0:
00230 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00231
00232 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00233 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00234
00235 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00236
00237 usb_stk11xx_write_registry(dev, 0x0204, 0x00ff);
00238 usb_stk11xx_write_registry(dev, 0x0205, 0x0001);
00239
00240 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00241
00242 break;
00243
00244 case 1:
00245 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00246
00247 dev_stk6a54_sensor_settings(dev);
00248
00249 usb_stk11xx_read_registry(dev, 0x0209, &value);
00250 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00251
00252 break;
00253 }
00254
00255 return 0;
00256 }
00257
00258
00268 int dev_stk6a54_camera_asleep(struct usb_stk11xx *dev)
00269 {
00270 int value;
00271
00272 usb_stk11xx_read_registry(dev, 0x0104, &value);
00273 usb_stk11xx_read_registry(dev, 0x0105, &value);
00274 usb_stk11xx_read_registry(dev, 0x0106, &value);
00275
00276 usb_stk11xx_write_registry(dev, 0x0100, 0x0021);
00277 usb_stk11xx_write_registry(dev, 0x0116, 0x0000);
00278 usb_stk11xx_write_registry(dev, 0x0117, 0x0000);
00279 usb_stk11xx_write_registry(dev, 0x0018, 0x0000);
00280
00281 usb_stk11xx_read_registry(dev, 0x0000, &value);
00282 usb_stk11xx_write_registry(dev, 0x0000, 0x0049);
00283
00284 return 0;
00285 }
00286
00287
00298 int dev_stk6a54_init_camera(struct usb_stk11xx *dev)
00299 {
00300 return 0;
00301 }
00302
00303
00314 int dev_stk6a54_sensor_settings(struct usb_stk11xx *dev)
00315 {
00316 int i;
00317 int retok;
00318 int value;
00319
00320 int asize;
00321
00322 static const int values_204[] = {
00323 0xff, 0x12, 0xff, 0x2c, 0x2e, 0xff, 0x3c, 0x11, 0x09, 0x04,
00324 0x13, 0x14, 0x2c, 0x33, 0x3a, 0x3b, 0x3e, 0x43, 0x16, 0x39,
00325 0x35, 0x22, 0x37, 0x23, 0x34, 0x36, 0x06, 0x07, 0x0d, 0x0e,
00326 0x4c, 0x4a, 0x21, 0x24, 0x25, 0x26, 0x5c, 0x63, 0x46, 0x0c,
00327 0x61, 0x62, 0x7c, 0x20, 0x28, 0x6c, 0x6d, 0x6e, 0x70, 0x71,
00328 0x73, 0x3d, 0x5a, 0x4f, 0x50, 0xff, 0xe5, 0xf9, 0x41, 0xe0,
00329 0x76, 0x33, 0x42, 0x43, 0x4c, 0x87, 0x88, 0xd7, 0xd9, 0xd3,
00330 0xc8, 0xc9, 0x7c, 0x7d, 0x7c, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d,
00331 0x7d, 0x90, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
00332 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x92, 0x93,
00333 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
00334 0x93, 0x93, 0x96, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
00335 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0xc3, 0xa4, 0xa8, 0xc5,
00336 0xc6, 0xbf, 0xc7, 0xb6, 0xb8, 0xb7, 0xb9, 0xb3, 0xb4, 0xb5,
00337 0xb0, 0xb1, 0xb2, 0xc4, 0xc0, 0xc1, 0x86, 0x50, 0x51, 0x52,
00338 0x53, 0x54, 0x55, 0x57, 0x5a, 0x5b, 0x5c, 0xc3, 0x7f, 0xda,
00339 0xd7, 0xe5, 0xe1, 0xe0, 0xdd, 0x05, 0xff, 0x12, 0x11, 0x17,
00340 0x18, 0x19, 0x1a, 0x32, 0x37, 0x4f, 0x50, 0x5a, 0x6d, 0x3d,
00341 0x39, 0x35, 0x22, 0x37, 0x23, 0x34, 0x36, 0x06, 0x07, 0x0d,
00342 0x0e, 0x4c, 0xff, 0xe0, 0xc0, 0xc1, 0x8c, 0x86, 0x50, 0x51,
00343 0x52, 0x53, 0x54, 0x55, 0x5a, 0x5b, 0x5c, 0xd3, 0xe0, 0xff,
00344 0xe0, 0xc0, 0xc1, 0x8c, 0x86, 0x50, 0x51, 0x52, 0x53, 0x54,
00345 0x55, 0x5a, 0x5b, 0x5c, 0xd3, 0xe0, 0xff, 0xff, 0x04, 0xff,
00346 0xff, 0xff, 0x7c, 0x7d, 0x7c, 0x7c, 0x7d, 0x7c, 0x7d, 0x7c,
00347 0xff, 0x7c, 0x7d, 0x7c, 0x7d, 0x7c, 0xff, 0x7c, 0x7d, 0x7c,
00348 0x7d, 0x7c, 0x7d, 0x7c, 0x7c, 0xff, 0x7c, 0x7d, 0x7c, 0x7d,
00349 0x7c, 0x7d, 0xff, 0x92, 0x93, 0xff, 0x90, 0x91, 0x91, 0x91,
00350 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
00351 0x91, 0x91, 0x91, 0xff, 0xc3, 0xc7, 0xce, 0xcc, 0xcd, 0xff,
00352 0x04, 0xff, 0x04
00353 };
00354
00355 static const int values_205[] = {
00356 0x01, 0x80, 0x00, 0xff, 0xdf, 0x01, 0x32, 0x00, 0x02, 0x28,
00357 0xe5, 0x48, 0x0c, 0x78, 0x33, 0xfb, 0x00, 0x11, 0x10, 0x02,
00358 0x88, 0x0a, 0x40, 0x00, 0xa0, 0x1a, 0x02, 0xc0, 0xb7, 0x01,
00359 0x00, 0x81, 0x99, 0x40, 0x38, 0x82, 0x00, 0x00, 0x3f, 0x3c,
00360 0x70, 0x80, 0x05, 0x80, 0x30, 0x00, 0x80, 0x00, 0x02, 0x94,
00361 0xc1, 0x34, 0x57, 0xbb, 0x9c, 0x00, 0x7f, 0xc0, 0x24, 0x14,
00362 0xff, 0xa0, 0x20, 0x18, 0x00, 0xd0, 0x3f, 0x03, 0x10, 0x82,
00363 0x08, 0x80, 0x00, 0x00, 0x03, 0x48, 0x48, 0x08, 0x20, 0x10,
00364 0x0e, 0x00, 0x0e, 0x1a, 0x31, 0x5a, 0x69, 0x75, 0x7e, 0x88,
00365 0x8f, 0x96, 0xa3, 0xaf, 0xc4, 0xd7, 0xe8, 0x20, 0x00, 0x06,
00366 0xe3, 0x05, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
00367 0x00, 0x00, 0x00, 0x08, 0x19, 0x02, 0x0c, 0x24, 0x30, 0x28,
00368 0x26, 0x02, 0x98, 0x80, 0x00, 0x00, 0xed, 0x00, 0x00, 0x11,
00369 0x51, 0x80, 0x10, 0x66, 0xa5, 0x64, 0x7c, 0xaf, 0x97, 0xff,
00370 0xc5, 0x94, 0x0f, 0x5c, 0xc8, 0x96, 0x3d, 0x00, 0x90, 0x18,
00371 0x00, 0x00, 0x88, 0x00, 0x90, 0x18, 0x05, 0xed, 0x00, 0x00,
00372 0x01, 0x1f, 0x67, 0x00, 0xff, 0x00, 0x01, 0x40, 0x00, 0x11,
00373 0x43, 0x00, 0x4b, 0x09, 0xc0, 0xca, 0xa8, 0x23, 0x00, 0x38,
00374 0x12, 0xda, 0x1a, 0xc3, 0x00, 0xc0, 0x1a, 0x88, 0xc0, 0x87,
00375 0x41, 0x00, 0x00, 0x04, 0x64, 0x4b, 0x00, 0x1d, 0x00, 0xc8,
00376 0x96, 0x00, 0x00, 0x00, 0xc8, 0x96, 0x00, 0x82, 0x00, 0x00,
00377 0x04, 0x64, 0x4b, 0x00, 0x3d, 0x00, 0xc8, 0x96, 0x00, 0x00,
00378 0x00, 0xa0, 0x78, 0x00, 0x82, 0x00, 0x00, 0x01, 0xfa, 0x01,
00379 0x00, 0x00, 0x00, 0x04, 0x0a, 0x09, 0x16, 0x0a, 0x06, 0x09,
00380 0x00, 0x00, 0x04, 0x08, 0x28, 0x08, 0x00, 0x00, 0x05, 0x01,
00381 0x7f, 0x02, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x07, 0x03, 0x4d,
00382 0x04, 0x4d, 0x00, 0x01, 0xc5, 0x00, 0x00, 0x00, 0x23, 0x3c,
00383 0x50, 0x63, 0x73, 0x83, 0x92, 0xa0, 0xad, 0xba, 0xc6, 0xd2,
00384 0xde, 0xe9, 0xf5, 0x01, 0x0c, 0x00, 0x80, 0x80, 0x80, 0x01,
00385 0xfa, 0x01, 0xfa
00386 };
00387
00388 asize = ARRAY_SIZE(values_204);
00389
00390 for(i=0; i<asize; i++) {
00391 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00392 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00393
00394 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00395
00396 usb_stk11xx_write_registry(dev, 0x0204, values_204[i]);
00397 usb_stk11xx_write_registry(dev, 0x0205, values_205[i]);
00398 usb_stk11xx_write_registry(dev, 0x0200, 0x0001);
00399
00400 retok = dev_stk11xx_check_device(dev, 500);
00401
00402 if (retok != 1) {
00403 STK_ERROR("Load default sensor settings fail !\n");
00404 return -1;
00405 }
00406
00407 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000);
00408 }
00409
00410 usb_stk11xx_read_registry(dev, 0x02ff, &value);
00411
00412 usb_stk11xx_write_registry(dev, 0x0203, 0x0060);
00413
00414 usb_stk11xx_write_registry(dev, 0x0208, 0x0004);
00415
00416 usb_stk11xx_write_registry(dev, 0x0200, 0x0020);
00417
00418 retok = dev_stk11xx_check_device(dev, 500);
00419
00420 return 0;
00421 }
00422
00423
00437 int dev_stk6a54_camera_settings(struct usb_stk11xx *dev)
00438 {
00439 return 0;
00440 }
00441
00442
00456 int dev_stk6a54_set_camera_quality(struct usb_stk11xx *dev)
00457 {
00458 return 0;
00459 }
00460
00461
00471 int dev_stk6a54_set_camera_fps(struct usb_stk11xx *dev)
00472 {
00473 return 0;
00474 }
00475
00476
00487 int dev_stk6a54_start_stream(struct usb_stk11xx *dev)
00488 {
00489 return 0;
00490 }
00491
00492
00502 int dev_stk6a54_reconf_camera(struct usb_stk11xx *dev)
00503 {
00504 dev_stk11xx_camera_settings(dev);
00505
00506 return 0;
00507 }
00508
00509
00520 int dev_stk6a54_stop_stream(struct usb_stk11xx *dev)
00521 {
00522 return 0;
00523 }
00524
00525