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 retok; 00074 int value; 00075 00076 STK_INFO("Initialize USB2.0 Syntek Camera\n"); 00077 00078 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00079 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00080 usb_stk11xx_write_registry(dev, 0x0003, 0x0080); 00081 00082 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00083 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00084 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00085 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00086 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00087 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00088 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00089 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00090 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00091 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00092 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00093 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00094 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00095 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00096 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00097 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00098 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00099 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00100 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00101 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00102 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00103 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00104 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00105 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00106 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00107 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00108 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00109 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00110 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00111 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00112 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00113 00114 for (i=0; i<16; i++) { 00115 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00116 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00117 usb_stk11xx_read_registry(dev, 0x0000, &value); 00118 00119 STK_DEBUG("Loop 1 : Read 0x0000 = %02X\n", value); 00120 } 00121 00122 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00123 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00124 00125 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00126 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00127 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00128 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00129 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00130 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00131 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00132 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00133 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00134 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00135 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00136 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00137 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00138 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00139 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00140 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00141 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00142 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00143 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00144 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00145 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00146 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00147 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00148 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00149 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00150 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00151 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00152 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00153 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00154 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00155 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00156 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00157 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00158 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00159 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00160 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00161 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00162 00163 for (i=0; i<16; i++) { 00164 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00165 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00166 usb_stk11xx_read_registry(dev, 0x0000, &value); 00167 00168 STK_DEBUG("Loop 2 : Read 0x0000 = %02X\n", value); 00169 } 00170 00171 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00172 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00173 00174 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00175 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00176 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00177 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00178 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00179 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00180 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00181 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00182 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00183 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00184 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00185 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00186 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00187 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00188 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00189 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00190 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00191 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00192 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00193 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00194 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00195 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00196 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00197 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00198 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00199 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00200 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00201 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00202 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00203 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00204 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00205 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00206 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00207 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00208 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00209 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00210 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00211 usb_stk11xx_write_registry(dev, 0x0000, 0x0027); 00212 usb_stk11xx_write_registry(dev, 0x0000, 0x0026); 00213 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00214 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00215 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00216 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00217 00218 for (i=0; i<16; i++) { 00219 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00220 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00221 usb_stk11xx_read_registry(dev, 0x0000, &value); 00222 00223 STK_DEBUG("Loop 3 : Read 0x0000 = %02X\n", value); 00224 } 00225 00226 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00227 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00228 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00229 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00230 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00231 00232 usb_stk11xx_write_registry(dev, 0x0117, 0x0000); 00233 usb_stk11xx_read_registry(dev, 0x0103, &value); 00234 usb_stk11xx_write_registry(dev, 0x0103, 0x0001); 00235 usb_stk11xx_read_registry(dev, 0x0103, &value); 00236 usb_stk11xx_write_registry(dev, 0x0103, 0x0000); 00237 00238 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0); 00239 usb_stk11xx_write_registry(dev, 0x0002, 0x00e8); 00240 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00241 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00242 00243 dev_stka311_configure_device(dev, 0); 00244 retok = dev_stk11xx_check_device(dev, 65); 00245 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00246 00247 dev_stka311_configure_device(dev, 1); 00248 retok = dev_stk11xx_check_device(dev, 65); 00249 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00250 00251 dev_stka311_configure_device(dev, 2); 00252 retok = dev_stk11xx_check_device(dev, 500); 00253 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00254 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00255 usb_stk11xx_write_registry(dev, 0x0208, 0x0013); 00256 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00257 retok = dev_stk11xx_check_device(dev, 500); 00258 usb_stk11xx_read_registry(dev, 0x0209, &value); 00259 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00260 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00261 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00262 usb_stk11xx_write_registry(dev, 0x0208, 0x000a); 00263 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00264 retok = dev_stk11xx_check_device(dev, 500); 00265 usb_stk11xx_read_registry(dev, 0x0209, &value); 00266 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00267 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00268 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00269 usb_stk11xx_write_registry(dev, 0x0208, 0x000b); 00270 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00271 retok = dev_stk11xx_check_device(dev, 500); 00272 usb_stk11xx_read_registry(dev, 0x0209, &value); 00273 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00274 00275 dev_stka311_configure_device(dev, 3); 00276 retok = dev_stk11xx_check_device(dev, 65); 00277 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00278 00279 dev_stka311_configure_device(dev, 4); 00280 retok = dev_stk11xx_check_device(dev, 65); 00281 usb_stk11xx_write_registry(dev, 0x0200, 0x0008); 00282 00283 dev_stka311_configure_device(dev, 5); 00284 retok = dev_stk11xx_check_device(dev, 500); 00285 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00286 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00287 usb_stk11xx_write_registry(dev, 0x0208, 0x0013); 00288 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00289 retok = dev_stk11xx_check_device(dev, 500); 00290 usb_stk11xx_read_registry(dev, 0x0209, &value); 00291 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00292 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00293 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00294 usb_stk11xx_write_registry(dev, 0x0208, 0x000a); 00295 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00296 retok = dev_stk11xx_check_device(dev, 500); 00297 usb_stk11xx_read_registry(dev, 0x0209, &value); 00298 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00299 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00300 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00301 usb_stk11xx_write_registry(dev, 0x0208, 0x000b); 00302 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00303 retok = dev_stk11xx_check_device(dev, 500); 00304 usb_stk11xx_read_registry(dev, 0x0209, &value); 00305 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00306 00307 dev_stka311_configure_device(dev, 6); 00308 retok = dev_stk11xx_check_device(dev, 500); 00309 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00310 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00311 usb_stk11xx_write_registry(dev, 0x0208, 0x0013); 00312 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00313 retok = dev_stk11xx_check_device(dev, 500); 00314 usb_stk11xx_read_registry(dev, 0x0209, &value); 00315 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00316 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00317 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00318 usb_stk11xx_write_registry(dev, 0x0208, 0x000a); 00319 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00320 retok = dev_stk11xx_check_device(dev, 500); 00321 usb_stk11xx_read_registry(dev, 0x0209, &value); 00322 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00323 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00324 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00325 usb_stk11xx_write_registry(dev, 0x0208, 0x000b); 00326 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00327 retok = dev_stk11xx_check_device(dev, 500); 00328 usb_stk11xx_read_registry(dev, 0x0209, &value); 00329 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00330 00331 dev_stka311_configure_device(dev, 7); 00332 retok = dev_stk11xx_check_device(dev, 500); 00333 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00334 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00335 usb_stk11xx_write_registry(dev, 0x0208, 0x0013); 00336 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00337 retok = dev_stk11xx_check_device(dev, 500); 00338 usb_stk11xx_read_registry(dev, 0x0209, &value); 00339 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00340 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00341 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00342 usb_stk11xx_write_registry(dev, 0x0208, 0x000a); 00343 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00344 retok = dev_stk11xx_check_device(dev, 500); 00345 usb_stk11xx_read_registry(dev, 0x0209, &value); 00346 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00347 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00348 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00349 usb_stk11xx_write_registry(dev, 0x0208, 0x000b); 00350 usb_stk11xx_write_registry(dev, 0x0200, 0x0020); 00351 retok = dev_stk11xx_check_device(dev, 500); 00352 usb_stk11xx_read_registry(dev, 0x0209, &value); 00353 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00354 00355 usb_stk11xx_write_registry(dev, 0x0002, 0x006f); 00356 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00357 usb_stk11xx_write_registry(dev, 0x0002, 0x006d); 00358 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00359 usb_stk11xx_write_registry(dev, 0x0000, 0x0025); 00360 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00361 00362 dev_stka311_configure_device(dev, 8); 00363 00364 dev_stka311_camera_asleep(dev); 00365 00366 usb_stk11xx_set_feature(dev, 0); 00367 00368 // Device is initialized and is ready !!! 00369 STK_INFO("Syntek USB2.0 Camera is ready\n"); 00370 00371 return 0; 00372 } 00373 00374 00393 int dev_stka311_configure_device(struct usb_stk11xx *dev, int step) 00394 { 00395 int retok; 00396 int value; 00397 00398 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 00399 00400 static const int values_001B[] = { 00401 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e 00402 }; 00403 static const int values_001C[] = { 00404 0x06, 0x02, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0e 00405 }; 00406 static const int values_0202[] = { 00407 0x1e, 0x0a, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e 00408 }; 00409 static const int values_0110[] = { 00410 0x07, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00 00411 }; 00412 static const int values_0112[] = { 00413 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00 00414 }; 00415 static const int values_0114[] = { 00416 0x87, 0x80, 0x80, 0x80, 0x80, 0xbe, 0xbe, 0x80, 0x80, 0x80, 0x80, 0x00 00417 }; 00418 static const int values_0115[] = { 00419 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05 00420 }; 00421 static const int values_0116[] = { 00422 0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe9, 0xe9, 0xe0, 0xe0, 0xe0, 0xe0, 0x00 00423 }; 00424 static const int values_0117[] = { 00425 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04 00426 }; 00427 static const int values_0100[] = { 00428 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21 00429 }; 00430 00431 STK_DEBUG("dev_stka311_configure_device : %d\n", step); 00432 00433 usb_stk11xx_write_registry(dev, 0x0000, 0x0024); 00434 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00435 usb_stk11xx_write_registry(dev, 0x0003, 0x0080); 00436 usb_stk11xx_write_registry(dev, 0x0005, 0x0000); 00437 00438 usb_stk11xx_write_registry(dev, 0x0007, 0x0003); 00439 usb_stk11xx_write_registry(dev, 0x000d, 0x0000); 00440 usb_stk11xx_write_registry(dev, 0x000f, 0x0002); 00441 usb_stk11xx_write_registry(dev, 0x0300, 0x0012); 00442 usb_stk11xx_write_registry(dev, 0x0350, 0x0041); 00443 00444 usb_stk11xx_write_registry(dev, 0x0351, 0x0000); 00445 usb_stk11xx_write_registry(dev, 0x0352, 0x0000); 00446 usb_stk11xx_write_registry(dev, 0x0353, 0x0000); 00447 usb_stk11xx_write_registry(dev, 0x0018, 0x0010); 00448 usb_stk11xx_write_registry(dev, 0x0019, 0x0000); 00449 00450 usb_stk11xx_write_registry(dev, 0x001b, values_001B[step]); 00451 usb_stk11xx_write_registry(dev, 0x001c, values_001C[step]); 00452 usb_stk11xx_write_registry(dev, 0x0300, 0x0080); 00453 usb_stk11xx_write_registry(dev, 0x001a, 0x0004); 00454 usb_stk11xx_write_registry(dev, 0x0202, values_0202[step]); 00455 00456 usb_stk11xx_write_registry(dev, 0x0110, values_0110[step]); 00457 usb_stk11xx_write_registry(dev, 0x0111, 0x0000); 00458 usb_stk11xx_write_registry(dev, 0x0112, values_0112[step]); 00459 usb_stk11xx_write_registry(dev, 0x0113, 0x0000); 00460 usb_stk11xx_write_registry(dev, 0x0114, values_0114[step]); 00461 00462 usb_stk11xx_write_registry(dev, 0x0115, values_0115[step]); 00463 usb_stk11xx_write_registry(dev, 0x0116, values_0116[step]); 00464 usb_stk11xx_write_registry(dev, 0x0117, values_0117[step]); 00465 00466 usb_stk11xx_read_registry(dev, 0x0100, &value); 00467 usb_stk11xx_write_registry(dev, 0x0100, values_0100[step]); 00468 00469 usb_stk11xx_write_registry(dev, 0x0200, 0x0080); 00470 usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 00471 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00472 00473 00474 switch (step) { 00475 case 0: 00476 usb_stk11xx_write_registry(dev, 0x0203, 0x0040); 00477 00478 usb_stk11xx_write_registry(dev, 0x0204, 0x0041); 00479 usb_stk11xx_write_registry(dev, 0x0205, 0x0001); 00480 usb_stk11xx_write_registry(dev, 0x0204, 0x001c); 00481 usb_stk11xx_write_registry(dev, 0x0205, 0x0002); 00482 00483 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00484 00485 break; 00486 00487 case 1: 00488 usb_stk11xx_write_registry(dev, 0x0203, 0x0022); 00489 00490 usb_stk11xx_write_registry(dev, 0x0204, 0x0027); 00491 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 00492 00493 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00494 00495 break; 00496 00497 case 2: 00498 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00499 00500 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00501 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00502 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00503 usb_stk11xx_write_registry(dev, 0x0205, 0x00bf); 00504 00505 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00506 00507 break; 00508 00509 case 3: 00510 usb_stk11xx_write_registry(dev, 0x0203, 0x0042); 00511 00512 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00513 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00514 usb_stk11xx_write_registry(dev, 0x0204, 0x0024); 00515 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 00516 00517 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00518 00519 break; 00520 00521 case 4: 00522 usb_stk11xx_write_registry(dev, 0x0203, 0x0042); 00523 00524 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00525 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00526 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00527 usb_stk11xx_write_registry(dev, 0x0205, 0x00e0); 00528 usb_stk11xx_write_registry(dev, 0x0204, 0x0024); 00529 usb_stk11xx_write_registry(dev, 0x0205, 0x00a5); 00530 00531 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00532 00533 break; 00534 00535 case 5: 00536 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00537 00538 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00539 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00540 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00541 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 00542 00543 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00544 00545 break; 00546 00547 case 6: 00548 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00549 00550 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00551 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00552 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00553 usb_stk11xx_write_registry(dev, 0x0205, 0x00ff); 00554 00555 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00556 00557 break; 00558 00559 case 7: 00560 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00561 00562 usb_stk11xx_write_registry(dev, 0x0204, 0x0012); 00563 usb_stk11xx_write_registry(dev, 0x0205, 0x0080); 00564 usb_stk11xx_write_registry(dev, 0x0204, 0x0013); 00565 usb_stk11xx_write_registry(dev, 0x0205, 0x00b7); 00566 00567 usb_stk11xx_write_registry(dev, 0x0200, 0x0005); 00568 00569 break; 00570 00571 case 8: 00572 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00573 00574 dev_stka311_sensor_settings(dev); 00575 00576 usb_stk11xx_write_registry(dev, 0x0200, 0x0080); 00577 usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 00578 usb_stk11xx_write_registry(dev, 0x02ff, 0x0001); 00579 usb_stk11xx_write_registry(dev, 0x0203, 0x00a0); 00580 00581 break; 00582 00583 case 9: 00584 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00585 00586 dev_stka311_sensor_settings(dev); 00587 00588 usb_stk11xx_write_registry(dev, 0x0104, 0x0000); 00589 usb_stk11xx_write_registry(dev, 0x0105, 0x0000); 00590 usb_stk11xx_write_registry(dev, 0x0106, 0x0000); 00591 00592 break; 00593 00594 case 10: 00595 case 11: 00596 usb_stk11xx_write_registry(dev, 0x0203, 0x0060); 00597 00598 dev_stka311_sensor_settings(dev); 00599 00600 usb_stk11xx_write_registry(dev, 0x0106, 0x0000); 00601 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00602 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00603 usb_stk11xx_write_registry(dev, 0x0204, 0x002a); 00604 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00605 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00606 retok = dev_stk11xx_check_device(dev, 500); 00607 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00608 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00609 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00610 usb_stk11xx_write_registry(dev, 0x0204, 0x002b); 00611 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00612 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00613 retok = dev_stk11xx_check_device(dev, 500); 00614 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00615 00616 break; 00617 } 00618 00619 return 0; 00620 } 00621 00622 00632 int dev_stka311_camera_asleep(struct usb_stk11xx *dev) 00633 { 00634 int value; 00635 00636 usb_stk11xx_read_registry(dev, 0x0104, &value); 00637 usb_stk11xx_read_registry(dev, 0x0105, &value); 00638 usb_stk11xx_read_registry(dev, 0x0106, &value); 00639 00640 usb_stk11xx_write_registry(dev, 0x0100, 0x0021); 00641 usb_stk11xx_write_registry(dev, 0x0116, 0x0000); 00642 usb_stk11xx_write_registry(dev, 0x0117, 0x0000); 00643 usb_stk11xx_write_registry(dev, 0x0018, 0x0000); 00644 00645 usb_stk11xx_read_registry(dev, 0x0000, &value); 00646 usb_stk11xx_write_registry(dev, 0x0000, 0x004c); 00647 00648 return 0; 00649 } 00650 00651 00662 int dev_stka311_init_camera(struct usb_stk11xx *dev) 00663 { 00664 int retok; 00665 int value; 00666 00667 dev_stka311_camera_asleep(dev); 00668 00669 usb_stk11xx_set_feature(dev, 0); 00670 00671 usb_stk11xx_write_registry(dev, 0x0000, 0x00e0); 00672 usb_stk11xx_write_registry(dev, 0x0002, 0x00e8); 00673 usb_stk11xx_write_registry(dev, 0x0002, 0x0068); 00674 usb_stk11xx_write_registry(dev, 0x0000, 0x0020); 00675 00676 dev_stka311_configure_device(dev, 9); 00677 00678 dev_stk11xx_camera_off(dev); 00679 00680 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00681 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00682 usb_stk11xx_write_registry(dev, 0x0204, 0x002a); 00683 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00684 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00685 retok = dev_stk11xx_check_device(dev, 500); 00686 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00687 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00688 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00689 usb_stk11xx_write_registry(dev, 0x0204, 0x002b); 00690 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00691 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00692 retok = dev_stk11xx_check_device(dev, 500); 00693 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00694 00695 dev_stka311_camera_settings(dev); 00696 00697 return 0; 00698 } 00699 00700 00711 int dev_stka311_sensor_settings(struct usb_stk11xx *dev) 00712 { 00713 int i; 00714 int retok; 00715 int value; 00716 00717 int asize; 00718 int *values_204 = NULL; 00719 int *values_205 = NULL; 00720 00721 // From 80x60 to 640x480 00722 static const int values_1_204[] = { 00723 0x12, 0x11, 0x3b, 0x6a, 0x13, 0x10, 0x00, 0x01, 0x02, 0x13, 00724 0x39, 0x38, 0x37, 0x35, 0x0e, 0x12, 0x04, 0x0c, 0x0d, 0x17, 00725 0x18, 0x32, 0x19, 0x1a, 0x03, 0x1b, 0x16, 0x33, 0x34, 0x41, 00726 0x96, 0x3d, 0x69, 0x3a, 0x8e, 0x3c, 0x8f, 0x8b, 0x8c, 0x94, 00727 0x95, 0x40, 0x29, 0x0f, 0xa5, 0x1e, 0xa9, 0xaa, 0xab, 0x90, 00728 0x91, 0x9f, 0xa0, 0x24, 0x25, 0x26, 0x14, 0x2a, 0x2b 00729 }; 00730 static const int values_1_205[] = { 00731 0x45, 0x80, 0x01, 0x7d, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 00732 0x50, 0x93, 0x00, 0x81, 0x20, 0x45, 0x00, 0x00, 0x00, 0x24, 00733 0xc4, 0xb6, 0x00, 0x3c, 0x36, 0x00, 0x07, 0xe2, 0xbf, 0x00, 00734 0x04, 0x19, 0x40, 0x0d, 0x00, 0x73, 0xdf, 0x06, 0x20, 0x88, 00735 0x88, 0xc1, 0x3f, 0x42, 0x80, 0x04, 0xb8, 0x92, 0x0a, 0x00, 00736 0x00, 0x00, 0x00, 0x68, 0x5c, 0xc3, 0x2e, 0x00, 0x00 00737 }; 00738 00739 // From 800x600 to 1280x1024 00740 static const int values_2_204[] = { 00741 0x12, 0x11, 0x3b, 0x6a, 0x13, 0x10, 0x00, 0x01, 0x02, 0x13, 00742 0x39, 0x38, 0x37, 0x35, 0x0e, 0x12, 0x04, 0x0c, 0x0d, 0x17, 00743 0x18, 0x32, 0x19, 0x1a, 0x03, 0x1b, 0x16, 0x33, 0x34, 0x41, 00744 0x96, 0x3d, 0x69, 0x3a, 0x8e, 0x3c, 0x8f, 0x8b, 0x8c, 0x94, 00745 0x95, 0x40, 0x29, 0x0f, 0xa5, 0x1e, 0xa9, 0xaa, 0xab, 0x90, 00746 0x91, 0x9f, 0xa0, 0x24, 0x25, 0x26, 0x14, 0x2a, 0x2b 00747 }; 00748 static const int values_2_205[] = { 00749 0x05, 0x80, 0x01, 0x7d, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 00750 0x50, 0x93, 0x00, 0x81, 0x20, 0x05, 0x00, 0x00, 0x00, 0x1b, 00751 0xbb, 0xa4, 0x01, 0x81, 0x12, 0x00, 0x07, 0xe2, 0xbf, 0x00, 00752 0x04, 0x19, 0x40, 0x0d, 0x00, 0x73, 0xdf, 0x06, 0x20, 0x88, 00753 0x88, 0xc1, 0x3f, 0x42, 0x80, 0x04, 0xb8, 0x92, 0x0a, 0x00, 00754 0x00, 0x00, 0x00, 0x68, 0x5c, 0xc3, 0x2e, 0x00, 0x00 00755 }; 00756 00757 00758 // From the resolution 00759 switch (dev->resolution) { 00760 case STK11XX_1280x1024: 00761 case STK11XX_1024x768: 00762 case STK11XX_800x600: 00763 asize = ARRAY_SIZE(values_2_204); 00764 values_204 = (int *) values_2_204; 00765 values_205 = (int *) values_2_205; 00766 break; 00767 00768 case STK11XX_640x480: 00769 case STK11XX_320x240: 00770 case STK11XX_160x120: 00771 case STK11XX_213x160: 00772 case STK11XX_128x96: 00773 case STK11XX_80x60: 00774 default: 00775 asize = ARRAY_SIZE(values_1_204); 00776 values_204 = (int *) values_1_204; 00777 values_205 = (int *) values_1_205; 00778 break; 00779 } 00780 00781 00782 for(i=0; i<asize; i++) { 00783 usb_stk11xx_read_registry(dev, 0x02ff, &value); 00784 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00785 00786 usb_stk11xx_write_registry(dev, 0x0204, values_204[i]); 00787 usb_stk11xx_write_registry(dev, 0x0205, values_205[i]); 00788 usb_stk11xx_write_registry(dev, 0x0200, 0x0001); 00789 00790 retok = dev_stk11xx_check_device(dev, 500); 00791 00792 if (retok != 1) { 00793 STK_ERROR("Load default sensor settings fail !\n"); 00794 return -1; 00795 } 00796 00797 usb_stk11xx_write_registry(dev, 0x02ff, 0x0000); 00798 } 00799 00800 retok = dev_stk11xx_check_device(dev, 500); 00801 00802 return 0; 00803 } 00804 00805 00819 int dev_stka311_camera_settings(struct usb_stk11xx *dev) 00820 { 00821 int ret; 00822 00823 dev_stka311_set_camera_quality(dev); 00824 00825 ret = dev_stk11xx_check_device(dev, 500); 00826 00827 if (!ret) 00828 STK_DEBUG("Find not 0x4... seems OK\n"); 00829 00830 dev_stka311_set_camera_fps(dev); 00831 00832 ret = dev_stk11xx_check_device(dev, 500); 00833 00834 if (!ret) 00835 STK_DEBUG("Find not 0x4... seems OK\n"); 00836 00837 return 0; 00838 } 00839 00840 00859 int dev_stka311_set_camera_quality(struct usb_stk11xx *dev) 00860 { 00861 usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 00862 00863 // Colour registers 00864 usb_stk11xx_write_registry(dev, 0x0204, 0x0001); 00865 usb_stk11xx_write_registry(dev, 0x0205, (255 - (dev->vsettings.colour >> 8))); 00866 usb_stk11xx_write_registry(dev, 0x0204, 0x0002); 00867 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.colour >> 8)); 00868 00869 // Unknown register 00870 usb_stk11xx_write_registry(dev, 0x0204, 0x00a1); 00871 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00872 00873 // Contrast register 00874 usb_stk11xx_write_registry(dev, 0x0204, 0x0010); 00875 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.contrast >> 9)); 00876 00877 // Unknown register 00878 usb_stk11xx_write_registry(dev, 0x0204, 0x0004); 00879 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00880 00881 // Whiteness register 00882 usb_stk11xx_write_registry(dev, 0x0204, 0x0000); 00883 usb_stk11xx_write_registry(dev, 0x0205, (dev->vsettings.whiteness >> 11) | 0x20); 00884 00885 usb_stk11xx_write_registry(dev, 0x0200, 0x0006); 00886 00887 STK_DEBUG("Set colour : %d\n", dev->vsettings.colour); 00888 STK_DEBUG("Set contrast : %d\n", dev->vsettings.contrast); 00889 STK_DEBUG("Set whiteness : %d\n", dev->vsettings.whiteness); 00890 STK_DEBUG("Set brightness : %d\n", dev->vsettings.brightness); 00891 00892 return 0; 00893 } 00894 00895 00916 int dev_stka311_set_camera_fps(struct usb_stk11xx *dev) 00917 { 00918 usb_stk11xx_write_registry(dev, 0x0200, 0x0000); 00919 00920 // FPS register 00921 switch (dev->vsettings.fps) { 00922 case 10: 00923 usb_stk11xx_write_registry(dev, 0x0204, 0x002e); 00924 usb_stk11xx_write_registry(dev, 0x0205, 0x0004); 00925 usb_stk11xx_write_registry(dev, 0x0204, 0x002d); 00926 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00927 break; 00928 00929 case 15: 00930 usb_stk11xx_write_registry(dev, 0x0204, 0x002e); 00931 usb_stk11xx_write_registry(dev, 0x0205, 0x0002); 00932 usb_stk11xx_write_registry(dev, 0x0204, 0x002d); 00933 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00934 break; 00935 00936 case 20: 00937 usb_stk11xx_write_registry(dev, 0x0204, 0x002e); 00938 usb_stk11xx_write_registry(dev, 0x0205, 0x0001); 00939 usb_stk11xx_write_registry(dev, 0x0204, 0x002d); 00940 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00941 break; 00942 00943 default: 00944 case 25: 00945 usb_stk11xx_write_registry(dev, 0x0204, 0x002e); 00946 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00947 usb_stk11xx_write_registry(dev, 0x0204, 0x002d); 00948 usb_stk11xx_write_registry(dev, 0x0205, 0x0064); 00949 break; 00950 00951 case 30: 00952 usb_stk11xx_write_registry(dev, 0x0204, 0x002e); 00953 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00954 usb_stk11xx_write_registry(dev, 0x0204, 0x002d); 00955 usb_stk11xx_write_registry(dev, 0x0205, 0x0000); 00956 break; 00957 } 00958 00959 usb_stk11xx_write_registry(dev, 0x0200, 0x0006); 00960 00961 return 0; 00962 } 00963 00964 00975 int dev_stka311_start_stream(struct usb_stk11xx *dev) 00976 { 00977 int value; 00978 int value_116, value_117; 00979 00980 usb_stk11xx_read_registry(dev, 0x0116, &value_116); 00981 usb_stk11xx_read_registry(dev, 0x0117, &value_117); 00982 00983 usb_stk11xx_write_registry(dev, 0x0116, 0x0000); 00984 usb_stk11xx_write_registry(dev, 0x0117, 0x0000); 00985 00986 usb_stk11xx_read_registry(dev, 0x0100, &value); // read 0x21 00987 usb_stk11xx_write_registry(dev, 0x0100, 0x00a1); 00988 00989 usb_stk11xx_write_registry(dev, 0x0116, value_116); 00990 usb_stk11xx_write_registry(dev, 0x0117, value_117); 00991 00992 return 0; 00993 } 00994 00995 01005 int dev_stka311_reconf_camera(struct usb_stk11xx *dev) 01006 { 01007 int step = 10; 01008 01009 // Choose the step from the resolution 01010 switch (dev->resolution) { 01011 case STK11XX_1280x1024: 01012 case STK11XX_1024x768: 01013 case STK11XX_800x600: 01014 step = 11; 01015 break; 01016 01017 case STK11XX_640x480: 01018 case STK11XX_320x240: 01019 case STK11XX_160x120: 01020 case STK11XX_213x160: 01021 case STK11XX_128x96: 01022 case STK11XX_80x60: 01023 default: 01024 step = 10; 01025 break; 01026 } 01027 01028 dev_stka311_configure_device(dev, step); 01029 01030 dev_stk11xx_camera_settings(dev); 01031 01032 return 0; 01033 } 01034 01035 01046 int dev_stka311_stop_stream(struct usb_stk11xx *dev) 01047 { 01048 int value; 01049 01050 usb_stk11xx_read_registry(dev, 0x0100, &value); 01051 usb_stk11xx_write_registry(dev, 0x0100, 0x0021); 01052 01053 return 0; 01054 } 01055