SyntekUSBVideoCamera
|
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-A821 API 00053 // 00054 //============================================================================= 00055 00056 00070 int dev_stka821_initialize_device(struct usb_stk11xx *dev) 00071 { 00072 int i; 00073 int value; 00074 00075 STK_INFO("Initialize USB2.0 Syntek Camera\n"); 00076 00077 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00078 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00079 usb_stk11xx_write_registry(dev, 0x0003, 0x0080); 00080 00081 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00082 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00083 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00084 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00085 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00086 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00087 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00088 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00089 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00090 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00091 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00092 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00093 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00094 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00095 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00096 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00097 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00098 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00099 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00100 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00101 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00102 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00103 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00104 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00105 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00106 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00107 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00108 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00109 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00110 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00111 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00112 00113 for (i=0; i<16; i++) { 00114 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00115 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00116 usb_stk11xx_read_registry(dev, 0x0000, &value); 00117 00118 STK_DEBUG("Loop 1 : Read 0x0000 = %02X\n", value); 00119 } 00120 00121 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00122 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00123 00124 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00125 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00126 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00127 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00128 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00129 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00130 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00131 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00132 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00133 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00134 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00135 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00136 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00137 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00138 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00139 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00140 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00141 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00142 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00143 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00144 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00145 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00146 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00147 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00148 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00149 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00150 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00151 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00152 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00153 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00154 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00155 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00156 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00157 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00158 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00159 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00160 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00161 00162 for (i=0; i<16; i++) { 00163 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00164 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00165 usb_stk11xx_read_registry(dev, 0x0000, &value); 00166 00167 STK_DEBUG("Loop 2 : Read 0x0000 = %02X\n", value); 00168 } 00169 00170 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00171 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00172 00173 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00174 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00175 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00176 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00177 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00178 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00179 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00180 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00181 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00182 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00183 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00184 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00185 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00186 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00187 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00188 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00189 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00190 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00191 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00192 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00193 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00194 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00195 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00196 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00197 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00198 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00199 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00200 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00201 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00202 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00203 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00204 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00205 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00206 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00207 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00208 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00209 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00210 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00211 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00212 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00213 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00214 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00215 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00216 00217 for (i=0; i<16; i++) { 00218 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00219 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00220 usb_stk11xx_read_registry(dev, 0x0000, &value); 00221 00222 STK_DEBUG("Loop 3 : Read 0x0000 = %02X\n", value); 00223 } 00224 00225 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00226 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00227 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00228 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00229 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00230 00231 usb_stk11xx_write_registry(dev, 0x0117, 0x0000); 00232 usb_stk11xx_read_registry(dev, 0x0103, &value); 00233 usb_stk11xx_write_registry(dev, 0x0103, 0x0001); 00234 usb_stk11xx_read_registry(dev, 0x0103, &value); 00235 usb_stk11xx_write_registry(dev, 0x0103, 0x0000); 00236 00237 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0); 00238 usb_stk11xx_write_registry(dev, 0x0002, 0x00e8); 00239 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00240 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00241 00242 dev_stka821_configure_device(dev, 0); 00243 dev_stk11xx_check_device(dev, 65); 00244 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00245 00246 dev_stka821_configure_device(dev, 1); 00247 dev_stk11xx_check_device(dev, 65); 00248 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00249 00250 dev_stka821_configure_device(dev, 2); 00251 dev_stk11xx_check_device(dev, 65); 00252 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00253 00254 dev_stka821_configure_device(dev, 3); 00255 dev_stk11xx_check_device(dev, 65); 00256 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00257 00258 dev_stka821_configure_device(dev, 4); 00259 dev_stk11xx_check_device(dev, 65); 00260 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00261 00262 dev_stka821_configure_device(dev, 5); 00263 dev_stk11xx_check_device(dev, 65); 00264 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00265 00266 dev_stka821_configure_device(dev, 6); 00267 dev_stk11xx_check_device(dev, 65); 00268 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00269 00270 dev_stka821_configure_device(dev, 7); 00271 dev_stk11xx_check_device(dev, 65); 00272 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00273 00274 dev_stka821_configure_device(dev, 8); 00275 dev_stk11xx_check_device(dev, 65); 00276 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00277 00278 dev_stka821_configure_device(dev, 9); 00279 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00280 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00281 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00282 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00283 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00284 00285 dev_stka821_configure_device(dev, 10); 00286 usb_stk11xx_write_registry(dev, 0x0200, 0x0080); 00287 usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 00288 usb_stk11xx_write_registry(dev, 0x02ff, 0x0001); 00289 usb_stk11xx_write_registry(dev, 0x0203, 0x00a0); 00290 00291 dev_stka821_camera_asleep(dev); 00292 00293 usb_stk11xx_set_feature(dev, 0); 00294 00295 // Device is initialized and is ready !!! 00296 STK_INFO("Syntek USB2.0 Camera is ready\n"); 00297 00298 return 0; 00299 } 00300 00301 00315 int dev_stka821_configure_device(struct usb_stk11xx *dev, int step) 00316 { 00317 int value; 00318 00319 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 00320 static const int values_001B[] = { 00321 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x07, 0x07 00322 }; 00323 static const int values_001C[] = { 00324 0x06, 0x02, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06 00325 }; 00326 static const int values_0202[] = { 00327 0x1e, 0x0a, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e 00328 }; 00329 static const int values_0110[] = { 00330 0x07, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 00331 }; 00332 static const int values_0112[] = { 00333 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 00334 }; 00335 static const int values_0114[] = { 00336 0x87, 0x80, 0x80, 0x80, 0x80, 0xbe, 0xbe, 0x80, 0x84, 0x80, 0x80, 0x80, 0x80, 0x80 00337 }; 00338 static const int values_0116[] = { 00339 0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe9, 0xe9, 0xe0, 0xe4, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0 00340 }; 00341 static const int values_0100[] = { 00342 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20 00343 }; 00344 00345 STK_DEBUG("dev_stka821_configure_device : %d\n", step); 00346 00347 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00348 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00349 usb_stk11xx_write_registry(dev, 0x0003, 0x0080); 00350 usb_stk11xx_write_registry(dev, 0x0005, 0x0000); 00351 00352 usb_stk11xx_write_registry(dev, 0x0007, 0x0003); 00353 usb_stk11xx_write_registry(dev, 0x000d, 0x0000); 00354 usb_stk11xx_write_registry(dev, 0x000f, 0x0002); 00355 usb_stk11xx_write_registry(dev, 0x0300, 0x0012); 00356 usb_stk11xx_write_registry(dev, 0x0350, 0x0041); 00357 00358 usb_stk11xx_write_registry(dev, 0x0351, 0x0000); 00359 usb_stk11xx_write_registry(dev, 0x0352, 0x0000); 00360 usb_stk11xx_write_registry(dev, 0x0353, 0x0000); 00361 usb_stk11xx_write_registry(dev, 0x0018, 0x0010); 00362 usb_stk11xx_write_registry(dev, 0x0019, 0x0000); 00363 00364 usb_stk11xx_write_registry(dev, 0x001b, values_001B[step]); 00365 usb_stk11xx_write_registry(dev, 0x001c, values_001C[step]); 00366 usb_stk11xx_write_registry(dev, 0x0300, 0x0080); 00367 usb_stk11xx_write_registry(dev, 0x001a, 0x0004); 00368 usb_stk11xx_write_registry(dev, 0x0202, values_0202[step]); 00369 00370 usb_stk11xx_write_registry(dev, 0x0110, values_0110[step]); 00371 usb_stk11xx_write_registry(dev, 0x0111, 0x0000); 00372 usb_stk11xx_write_registry(dev, 0x0112, values_0112[step]); 00373 usb_stk11xx_write_registry(dev, 0x0113, 0x0000); 00374 usb_stk11xx_write_registry(dev, 0x0114, values_0114[step]); 00375 00376 usb_stk11xx_write_registry(dev, 0x0115, 0x0002); 00377 usb_stk11xx_write_registry(dev, 0x0116, values_0116[step]); 00378 usb_stk11xx_write_registry(dev, 0x0117, 0x0001); 00379 00380 usb_stk11xx_read_registry(dev, 0x0100, &value); 00381 usb_stk11xx_write_registry(dev, 0x0100, values_0100[step]); 00382 00383 usb_stk11xx_write_registry(dev, 0x0200, 0x0080); 00384 usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 00385 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00386 00387 00388 switch (step) { 00389 case 0: 00390 usb_stk11xx_write_registry(dev, 0x0203, 0x0040); 00391 00392 usb_stk11xx_write_registry(dev, 0x0204, 0x0041); 00393 usb_stk11xx_write_registry(dev, 0x0205, 0x0001); 00394 usb_stk11xx_write_registry(dev, 0x0204, 0x001c); 00395 usb_stk11xx_write_registry(dev, 0x0205, 0x0002); 00396 00397 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00398 00399 break; 00400 00401 case 1: 00402 usb_stk11xx_write_registry(dev, 0x0203, 0x0022); 00403 00404 usb_stk11xx_write_registry(dev, 0x0204, 0x0027); 00405 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 00406 00407 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00408 00409 break; 00410 00411 case 2: 00412 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00413 00414 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00415 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00416 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00417 usb_stk11xx_write_registry(dev, 0x0205, 0x00bf); 00418 00419 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00420 00421 break; 00422 00423 case 3: 00424 usb_stk11xx_write_registry(dev, 0x0203, 0x0042); 00425 00426 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00427 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00428 usb_stk11xx_write_registry(dev, 0x0204, 0x0024); 00429 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 00430 00431 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00432 00433 break; 00434 00435 case 4: 00436 usb_stk11xx_write_registry(dev, 0x0203, 0x0042); 00437 00438 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00439 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00440 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00441 usb_stk11xx_write_registry(dev, 0x0205, 0x00e0); 00442 usb_stk11xx_write_registry(dev, 0x0204, 0x0024); 00443 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 00444 00445 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00446 00447 break; 00448 00449 case 5: 00450 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00451 00452 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00453 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00454 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00455 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 00456 00457 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00458 00459 break; 00460 00461 case 6: 00462 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00463 00464 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00465 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00466 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00467 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 00468 00469 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00470 00471 break; 00472 00473 case 7: 00474 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00475 00476 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00477 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00478 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00479 usb_stk11xx_write_registry(dev, 0x0205, 0x00b7); 00480 00481 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00482 00483 break; 00484 00485 case 8: 00486 usb_stk11xx_write_registry(dev, 0x0203, 0x0080); 00487 00488 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00489 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00490 usb_stk11xx_write_registry(dev, 0x0204, 0x000a); 00491 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 00492 00493 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00494 00495 break; 00496 00497 case 9: 00498 usb_stk11xx_write_registry(dev, 0x0203, 0x00dc); 00499 00500 usb_stk11xx_write_registry(dev, 0x0204, 0x0015); 00501 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00502 00503 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00504 00505 dev_stk11xx_check_device(dev, 500); 00506 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00507 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00508 usb_stk11xx_write_registry(dev, 0x0208, 0x0000); 00509 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00510 dev_stk11xx_check_device(dev, 500); 00511 usb_stk11xx_read_registry(dev, 0x0209, &value); 00512 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00513 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00514 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00515 usb_stk11xx_write_registry(dev, 0x0208, 0x0001); 00516 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00517 dev_stk11xx_check_device(dev, 500); 00518 usb_stk11xx_read_registry(dev, 0x0209, &value); 00519 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00520 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00521 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00522 usb_stk11xx_write_registry(dev, 0x0208, 0x0002); 00523 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00524 dev_stk11xx_check_device(dev, 500); 00525 usb_stk11xx_read_registry(dev, 0x0209, &value); 00526 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00527 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00528 00529 break; 00530 00531 case 10: 00532 usb_stk11xx_write_registry(dev, 0x0203, 0x00dc); 00533 00534 dev_stka821_sensor_settings(dev); 00535 00536 break; 00537 00538 case 11: 00539 usb_stk11xx_write_registry(dev, 0x0203, 0x00dc); 00540 00541 dev_stka821_sensor_settings(dev); 00542 00543 usb_stk11xx_write_registry(dev, 0x0104, 0x0000); 00544 usb_stk11xx_write_registry(dev, 0x0105, 0x0000); 00545 usb_stk11xx_write_registry(dev, 0x0106, 0x0000); 00546 00547 break; 00548 00549 case 12: 00550 usb_stk11xx_write_registry(dev, 0x0203, 0x00dc); 00551 00552 dev_stka821_sensor_settings(dev); 00553 00554 usb_stk11xx_write_registry(dev, 0x0104, 0x0000); 00555 usb_stk11xx_write_registry(dev, 0x0105, 0x0000); 00556 usb_stk11xx_write_registry(dev, 0x0106, 0x0000); 00557 00558 break; 00559 00560 case 13: 00561 usb_stk11xx_write_registry(dev, 0x0203, 0x00dc); 00562 00563 dev_stka821_sensor_settings(dev); 00564 00565 usb_stk11xx_write_registry(dev, 0x0106, 0x0000); 00566 } 00567 00568 return 0; 00569 } 00570 00571 00581 int dev_stka821_camera_asleep(struct usb_stk11xx *dev) 00582 { 00583 int value; 00584 00585 usb_stk11xx_read_registry(dev, 0x0104, &value); 00586 usb_stk11xx_read_registry(dev, 0x0105, &value); 00587 usb_stk11xx_read_registry(dev, 0x0106, &value); 00588 00589 usb_stk11xx_write_registry(dev, 0x0100, 0x0021); 00590 usb_stk11xx_write_registry(dev, 0x0116, 0x0000); 00591 usb_stk11xx_write_registry(dev, 0x0117, 0x0000); 00592 usb_stk11xx_write_registry(dev, 0x0018, 0x0000); 00593 00594 usb_stk11xx_read_registry(dev, 0x0000, &value); 00595 usb_stk11xx_write_registry(dev, 0x0000, 0x0049); 00596 00597 return 0; 00598 } 00599 00600 00611 int dev_stka821_init_camera(struct usb_stk11xx *dev) 00612 { 00613 // int retok; 00614 // int value; 00615 00616 dev_stka821_camera_asleep(dev); 00617 00618 usb_stk11xx_set_feature(dev, 0); 00619 00620 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0); 00621 usb_stk11xx_write_registry(dev, 0x0002, 0x00e8); 00622 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00623 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00624 00625 dev_stka821_configure_device(dev, 11); 00626 00627 dev_stk11xx_camera_off(dev); 00628 00629 dev_stka821_camera_settings(dev); 00630 00631 dev_stka821_camera_asleep(dev); 00632 00633 usb_stk11xx_set_feature(dev, 0); 00634 00635 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0); 00636 usb_stk11xx_write_registry(dev, 0x0002, 0x00e8); 00637 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00638 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00639 00640 dev_stka821_configure_device(dev, 12); 00641 00642 dev_stk11xx_camera_off(dev); 00643 00644 dev_stka821_camera_settings(dev); 00645 00646 return 0; 00647 } 00648 00649 00660 int dev_stka821_sensor_settings(struct usb_stk11xx *dev) 00661 { 00662 int i; 00663 int retok; 00664 int value; 00665 00666 int asize; 00667 static const int values_204[] = { 00668 0x17, 0x19, 0xb4, 0xa6, 0x12, 0x13, 0x1e, 0x21, 0x24, 0x32, 00669 0x36, 0x39, 0x4d, 0x53, 0x5d, 0x5f, 0x60, 0x61, 0x62, 0x63, 00670 0x64, 0x65, 0x66, 0x82, 0x83, 0x85, 0x86, 0x89, 0x97, 0x98, 00671 0xad, 0xae, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbf, 0x48, 0xd8, 00672 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 00673 0x80, 0x81, 0xd8, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 00674 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0xd8, 0x76, 0x77, 0x78, 0x79, 00675 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x5c, 0xc0, 00676 0x59, 0x5a, 0x5b, 0xd4, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 00677 0x94, 0x95, 0x96, 0xb3, 0x73, 0x06, 0x07, 0x0b, 0x15, 0x20, 00678 0x4e, 0x4f, 0x49, 0x4a, 0x4b, 0x4c, 0x46, 0x06, 0x07, 0xb9, 00679 0xba, 0xbb, 0xbc, 0x61, 0x62, 0x65, 0x66 00680 }; 00681 static const int values_205[] = { 00682 0x41, 0x41, 0x03, 0x06, 0x06, 0x08, 0x06, 0x00, 0x02, 0x69, 00683 0x35, 0x60, 0xfe, 0x1c, 0x04, 0x08, 0x08, 0x08, 0x08, 0x00, 00684 0x00, 0x10, 0x14, 0x01, 0x80, 0x0c, 0xb6, 0x00, 0x25, 0x25, 00685 0x3f, 0x24, 0x10, 0x07, 0xcc, 0x1f, 0x30, 0x02, 0x9c, 0x80, 00686 0x00, 0x0d, 0x18, 0x22, 0x2c, 0x3e, 0x4f, 0x6f, 0x8e, 0xac, 00687 0xc8, 0xe5, 0xa0, 0x00, 0x0d, 0x18, 0x22, 0x2c, 0x3e, 0x4f, 00688 0x6f, 0x8e, 0xac, 0xc8, 0xe5, 0xc0, 0x00, 0x0d, 0x18, 0x22, 00689 0x2c, 0x3e, 0x4f, 0x6f, 0x8e, 0xac, 0xc8, 0xe5, 0x70, 0x18, 00690 0x09, 0x07, 0x07, 0x3c, 0x3d, 0x95, 0x88, 0x89, 0x47, 0x9c, 00691 0x81, 0x9c, 0x3d, 0x76, 0x76, 0x01, 0xf3, 0x05, 0x00, 0x44, 00692 0x06, 0x0a, 0x96, 0x00, 0x7d, 0x00, 0x20, 0x01, 0xf3, 0x04, 00693 0xe4, 0x09, 0xc8, 0x08, 0x08, 0x10, 0x14 00694 }; 00695 00696 00697 asize = ARRAY_SIZE(values_204); 00698 00699 for(i=0; i<asize; i++) { 00700 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00701 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00702 00703 usb_stk11xx_write_registry(dev, 0x0204, values_204[i]); 00704 usb_stk11xx_write_registry(dev, 0x0205, values_205[i]); 00705 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00706 00707 retok = dev_stk11xx_check_device(dev, 500); 00708 00709 if (retok != 1) { 00710 STK_ERROR("Load default sensor settings fail !\n"); 00711 return -1; 00712 } 00713 00714 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00715 } 00716 00717 retok = dev_stk11xx_check_device(dev, 500); 00718 00719 return 0; 00720 } 00721 00722 00736 int dev_stka821_camera_settings(struct usb_stk11xx *dev) 00737 { 00738 int i; 00739 int value; 00740 00741 int asize; 00742 static const int values_204[] = { 00743 0xb3, 0x73, 0x46, 0x06, 0x07, 0xb9, 0xba, 0xbb, 0xbc, 0x61, 0x62, 0x65, 0x66 00744 }; 00745 static const int values_205[] = { 00746 0x76, 0x76, 0x20, 0x01, 0xf3, 0x04, 0xe4, 0x09, 0xc8, 0x08, 0x08, 0x10, 0x14 00747 }; 00748 00749 00750 // Contrast register 00751 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00752 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00753 00754 usb_stk11xx_write_registry(dev, 0x0204, 0x00b3); 00755 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.contrast >> 8)); 00756 00757 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00758 dev_stk11xx_check_device(dev, 500); 00759 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00760 00761 asize = ARRAY_SIZE(values_204); 00762 00763 for (i=1; i<asize; i++) { 00764 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00765 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00766 00767 usb_stk11xx_write_registry(dev, 0x0204, values_204[i]); 00768 usb_stk11xx_write_registry(dev, 0x0205, values_205[i]); 00769 00770 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00771 dev_stk11xx_check_device(dev, 500); 00772 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00773 } 00774 00775 return 0; 00776 } 00777 00778 00792 int dev_stka821_set_camera_quality(struct usb_stk11xx *dev) 00793 { 00794 int value; 00795 00796 // Contrast register 00797 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00798 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00799 00800 usb_stk11xx_write_registry(dev, 0x0204, 0x00b3); 00801 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.contrast >> 8)); 00802 00803 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00804 dev_stk11xx_check_device(dev, 500); 00805 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00806 00807 STK_DEBUG("Set colour : %d\n", dev->vsettings.colour); 00808 STK_DEBUG("Set contrast : %d\n", dev->vsettings.contrast); 00809 STK_DEBUG("Set whiteness : %d\n", dev->vsettings.whiteness); 00810 STK_DEBUG("Set brightness : %d\n", dev->vsettings.brightness); 00811 00812 return 0; 00813 } 00814 00815 00825 int dev_stka821_set_camera_fps(struct usb_stk11xx *dev) 00826 { 00827 return 0; 00828 } 00829 00830 00841 int dev_stka821_start_stream(struct usb_stk11xx *dev) 00842 { 00843 int value; 00844 int value_116, value_117; 00845 00846 usb_stk11xx_read_registry(dev, 0x0116, &value_116); 00847 usb_stk11xx_read_registry(dev, 0x0117, &value_117); 00848 00849 usb_stk11xx_write_registry(dev, 0x0116, 0x0000); 00850 usb_stk11xx_write_registry(dev, 0x0117, 0x0000); 00851 00852 usb_stk11xx_read_registry(dev, 0x0100, &value); // read 0x21 00853 usb_stk11xx_write_registry(dev, 0x0100, 0x00a0); 00854 00855 usb_stk11xx_write_registry(dev, 0x0116, value_116); 00856 usb_stk11xx_write_registry(dev, 0x0117, value_117); 00857 00858 return 0; 00859 } 00860 00861 00871 int dev_stka821_reconf_camera(struct usb_stk11xx *dev) 00872 { 00873 dev_stka821_configure_device(dev, 13); 00874 00875 dev_stk11xx_camera_settings(dev); 00876 00877 return 0; 00878 } 00879 00880 00891 int dev_stka821_stop_stream(struct usb_stk11xx *dev) 00892 { 00893 int value; 00894 00895 usb_stk11xx_read_registry(dev, 0x0100, &value); 00896 usb_stk11xx_write_registry(dev, 0x0100, 0x0020); 00897 00898 return 0; 00899 } 00900