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