Syntek USB Video Camera
stk11xx-dev.c
Go to the documentation of this file.
1
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/kernel.h>
37#include <linux/version.h>
38#include <linux/errno.h>
39#include <linux/slab.h>
40#include <linux/kref.h>
41
42#include <linux/usb.h>
43#include <media/v4l2-common.h>
44#include <media/v4l2-ioctl.h>
45
46#include "stk11xx.h"
47#include "stk11xx-dev.h"
48
49
64{
65 int ret;
66
67 switch (dev->webcam_model) {
68 case SYNTEK_STK_0408:
70 break;
71 case SYNTEK_STK_M811:
72 case SYNTEK_STK_A311:
74 break;
75
76 case SYNTEK_STK_A821:
77 case SYNTEK_STK_AA11:
79 break;
80
81 case SYNTEK_STK_6A31:
83 break;
84
85 case SYNTEK_STK_6A33:
87 break;
88
89 case SYNTEK_STK_6A51:
91 break;
92
93 case SYNTEK_STK_6A54:
95 break;
96
97 case SYNTEK_STK_6D51:
99 break;
100
101 case SYNTEK_STK_0500:
103 break;
104
105 default:
106 ret = -1;
107 }
108
109 return ret;
110}
111
112
124{
125 int ret;
126
127 switch (dev->webcam_model) {
128 case SYNTEK_STK_0408:
129 ret = dev_stk0408_init_camera(dev);
130 break;
131 case SYNTEK_STK_M811:
132 case SYNTEK_STK_A311:
133 ret = dev_stka311_init_camera(dev);
134 break;
135
136 case SYNTEK_STK_A821:
137 case SYNTEK_STK_AA11:
138 ret = dev_stka821_init_camera(dev);
139 break;
140
141 case SYNTEK_STK_6A31:
142 ret = dev_stk6a31_init_camera(dev);
143 break;
144
145 case SYNTEK_STK_6A33:
146 ret = dev_stk6a33_init_camera(dev);
147 break;
148
149 case SYNTEK_STK_6A51:
150 ret = dev_stk6a51_init_camera(dev);
151 break;
152
153 case SYNTEK_STK_6A54:
154 ret = dev_stk6a54_init_camera(dev);
155 break;
156
157 case SYNTEK_STK_6D51:
158 ret = dev_stk6d51_init_camera(dev);
159 break;
160
161 case SYNTEK_STK_0500:
162 ret = dev_stk0500_init_camera(dev);
163 break;
164
165 default:
166 ret = -1;
167 }
168
169 return ret;
170}
171
172
186int dev_stk11xx_check_device(struct usb_stk11xx *dev, int nbr)
187{
188 int i;
189 int value;
190
191 for (i=0; i<nbr; i++) {
192 usb_stk11xx_read_registry(dev, 0x201, &value);
193
194 if (value == 0x00) {
195 }
196 else if ((value == 0x11) || (value == 0x14)) {
197 }
198 else if ((value == 0x30) || (value == 0x31)) {
199 }
200 else if ((value == 0x51)) {
201 }
202 else if ((value == 0x70) || (value == 0x71)) {
203 }
204 else if ((value == 0x91)) {
205 }
206 else if (value == 0x01) {
207 return 1;
208 }
209 else if ((value == 0x04) || (value == 0x05))
210 return 1;
211 else if (value == 0x15)
212 return 1;
213 else {
214 STK_ERROR("Check device return error (0x0201 = %02X) !\n", value);
215 return -1;
216 }
217 }
218
219 return 0;
220}
221
222
235{
236 int value;
237
238 usb_stk11xx_read_registry(dev, 0x0001, &value);
239
240 if (value != 0x03) {
241 STK_DEBUG("Error : Register 0x0001 = %02X\n", value);
242 }
243
244 return value;
245}
246
247
258{
259 int ret = -1;
260 struct usb_device *udev = dev->udev;
261
262 ret = usb_set_interface(udev, 0, 5);
263
264 if (ret < 0)
265 STK_ERROR("usb_set_interface failed !\n");
266
267 return ret;
268}
269
270
281{
282 int ret = -1;
283 struct usb_device *udev = dev->udev;
284
285 ret = usb_set_interface(udev, 0, 0);
286
287 if (ret < 0)
288 STK_ERROR("usb_set_interface failed !\n");
289
290 return 0;
291}
292
293
304{
305 int ret;
306
307 switch (dev->webcam_model) {
308 case SYNTEK_STK_0408:
309 ret = dev_stk0408_camera_asleep(dev);
310 break;
311 case SYNTEK_STK_M811:
312 case SYNTEK_STK_A311:
313 ret = dev_stka311_camera_asleep(dev);
314 break;
315
316 case SYNTEK_STK_A821:
317 case SYNTEK_STK_AA11:
318 ret = dev_stka821_camera_asleep(dev);
319 break;
320
321 case SYNTEK_STK_6A31:
322 ret = dev_stk6a31_camera_asleep(dev);
323 break;
324
325 case SYNTEK_STK_6A33:
326 ret = dev_stk6a33_camera_asleep(dev);
327 break;
328
329 case SYNTEK_STK_6A51:
330 ret = dev_stk6a51_camera_asleep(dev);
331 break;
332
333 case SYNTEK_STK_6A54:
334 ret = dev_stk6a54_camera_asleep(dev);
335 break;
336
337 case SYNTEK_STK_6D51:
338 ret = dev_stk6d51_camera_asleep(dev);
339 break;
340
341 case SYNTEK_STK_0500:
342 ret = dev_stk0500_camera_asleep(dev);
343 break;
344
345 default:
346 ret = -1;
347 }
348
349 return ret;
350}
351
352
367{
368 int ret;
369
370 switch (dev->webcam_model) {
371 case SYNTEK_STK_0408:
373 break;
374 case SYNTEK_STK_M811:
375 case SYNTEK_STK_A311:
377 break;
378
379 case SYNTEK_STK_A821:
380 case SYNTEK_STK_AA11:
382 break;
383
384 case SYNTEK_STK_6A31:
386 break;
387
388 case SYNTEK_STK_6A33:
390 break;
391
392 case SYNTEK_STK_6A51:
394 break;
395
396 case SYNTEK_STK_6A54:
398 break;
399
400 case SYNTEK_STK_6D51:
402 break;
403
404 case SYNTEK_STK_0500:
406 break;
407
408 default:
409 ret = -1;
410 }
411
412 return ret;
413}
414
415
430{
431 int ret;
432
433 switch (dev->webcam_model) {
434 case SYNTEK_STK_0408:
436 break;
437 case SYNTEK_STK_M811:
438 case SYNTEK_STK_A311:
440 break;
441
442 case SYNTEK_STK_A821:
443 case SYNTEK_STK_AA11:
445 break;
446
447 case SYNTEK_STK_6A31:
449 break;
450
451 case SYNTEK_STK_6A33:
453 break;
454
455 case SYNTEK_STK_6A51:
457 break;
458
459 case SYNTEK_STK_6A54:
461 break;
462
463 case SYNTEK_STK_6D51:
465 break;
466
467 case SYNTEK_STK_0500:
469 break;
470
471 default:
472 ret = -1;
473 }
474
475 return ret;
476}
477
478
490{
491 int ret;
492
493 switch (dev->webcam_model) {
494 case SYNTEK_STK_0408:
496 break;
497 case SYNTEK_STK_M811:
498 case SYNTEK_STK_A311:
500 break;
501
502 case SYNTEK_STK_A821:
503 case SYNTEK_STK_AA11:
505 break;
506
507 case SYNTEK_STK_6A31:
509 break;
510
511 case SYNTEK_STK_6A33:
513 break;
514
515 case SYNTEK_STK_6A51:
517 break;
518
519 case SYNTEK_STK_6A54:
521 break;
522
523 case SYNTEK_STK_6D51:
525 break;
526
527 case SYNTEK_STK_0500:
529 break;
530
531 default:
532 ret = -1;
533 }
534
535 return ret;
536}
537
538
550{
551 int ret;
552
553 switch (dev->webcam_model) {
554 case SYNTEK_STK_0408:
555 ret = dev_stk0408_start_stream(dev);
556 break;
557 case SYNTEK_STK_M811:
558 case SYNTEK_STK_A311:
559 ret = dev_stka311_start_stream(dev);
560 break;
561
562 case SYNTEK_STK_A821:
563 case SYNTEK_STK_AA11:
564 ret = dev_stka821_start_stream(dev);
565 break;
566
567 case SYNTEK_STK_6A31:
568 ret = dev_stk6a31_start_stream(dev);
569 break;
570
571 case SYNTEK_STK_6A33:
572 ret = dev_stk6a33_start_stream(dev);
573 break;
574
575 case SYNTEK_STK_6A51:
576 ret = dev_stk6a51_start_stream(dev);
577 break;
578
579 case SYNTEK_STK_6A54:
580 ret = dev_stk6a54_start_stream(dev);
581 break;
582
583 case SYNTEK_STK_6D51:
584 ret = dev_stk6d51_start_stream(dev);
585 break;
586
587 case SYNTEK_STK_0500:
588 ret = dev_stk0500_start_stream(dev);
589 break;
590
591 default:
592 ret = -1;
593 }
594
595 return ret;
596}
597
598
609{
610 int ret;
611
612 switch (dev->webcam_model) {
613 case SYNTEK_STK_0408:
614 ret = dev_stk0408_reconf_camera(dev);
615 break;
616 case SYNTEK_STK_M811:
617 case SYNTEK_STK_A311:
618 ret = dev_stka311_reconf_camera(dev);
619 break;
620
621 case SYNTEK_STK_A821:
622 case SYNTEK_STK_AA11:
623 ret = dev_stka821_reconf_camera(dev);
624 break;
625
626 case SYNTEK_STK_6A31:
627 ret = dev_stk6a31_reconf_camera(dev);
628 break;
629
630 case SYNTEK_STK_6A33:
631 ret = dev_stk6a33_reconf_camera(dev);
632 break;
633
634 case SYNTEK_STK_6A51:
635 ret = dev_stk6a51_reconf_camera(dev);
636 break;
637
638 case SYNTEK_STK_6A54:
639 ret = dev_stk6a54_reconf_camera(dev);
640 break;
641
642 case SYNTEK_STK_6D51:
643 ret = dev_stk6d51_reconf_camera(dev);
644 break;
645
646 case SYNTEK_STK_0500:
647 ret = dev_stk0500_reconf_camera(dev);
648 break;
649
650 default:
651 ret = -1;
652 }
653
654 return ret;
655}
656
657
669{
670 int ret;
671
672 switch (dev->webcam_model) {
673 case SYNTEK_STK_0408:
674 ret = dev_stk0408_stop_stream(dev);
675 break;
676 case SYNTEK_STK_M811:
677 case SYNTEK_STK_A311:
678 ret = dev_stka311_stop_stream(dev);
679 break;
680
681 case SYNTEK_STK_A821:
682 case SYNTEK_STK_AA11:
683 ret = dev_stka821_stop_stream(dev);
684 break;
685
686 case SYNTEK_STK_6A31:
687 ret = dev_stk6a31_stop_stream(dev);
688 break;
689
690 case SYNTEK_STK_6A33:
691 ret = dev_stk6a33_stop_stream(dev);
692 break;
693
694 case SYNTEK_STK_6A51:
695 ret = dev_stk6a51_stop_stream(dev);
696 break;
697
698 case SYNTEK_STK_6A54:
699 ret = dev_stk6a54_stop_stream(dev);
700 break;
701
702 case SYNTEK_STK_6D51:
703 ret = dev_stk6d51_stop_stream(dev);
704 break;
705
706 case SYNTEK_STK_0500:
707 ret = dev_stk0500_stop_stream(dev);
708 break;
709
710 default:
711 ret = -1;
712 }
713
714 return ret;
715}
716
717
728{
729 int ret;
730
731 switch (dev->webcam_model) {
732 case SYNTEK_STK_0408:
733 // Use a particular decompressor based uvyv
734 ret = dev_stk0408_decode(dev);
735 break;
736
737 case SYNTEK_STK_M811:
738 case SYNTEK_STK_A311:
739 case SYNTEK_STK_A821:
740 case SYNTEK_STK_AA11:
741 case SYNTEK_STK_6A31:
742 case SYNTEK_STK_6A33:
743 case SYNTEK_STK_6A51:
744 case SYNTEK_STK_6A54:
745 case SYNTEK_STK_6D51:
746 // Use a generec decompressor based bayer stream
747 ret = stk11xx_decompress(dev);
748 break;
749
750 default:
751 ret = -1;
752 }
753
754 return ret;
755}
756
int stk11xx_decompress(struct usb_stk11xx *dev)
Decompress a frame.
int dev_stk0408_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk0408_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk0408_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk0408_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk0408_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk0408_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk0408_initialize_device(struct usb_stk11xx *dev)
This function initializes the device.
int dev_stk0408_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk0408_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk0500_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk0500_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stk0500_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk0500_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk0500_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk0500_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk0500_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk0500_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk0500_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a31_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a31_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a31_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk6a31_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a31_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk6a31_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk6a31_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk6a31_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stk6a31_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk6a33_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a33_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk6a33_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk6a33_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk6a33_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk6a33_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk6a33_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stk6a33_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a33_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a51_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stk6a51_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk6a51_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a51_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a51_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a51_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk6a51_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk6a51_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk6a51_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk6a54_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a54_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk6a54_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a54_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk6a54_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stk6a54_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6a54_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk6a54_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk6a54_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk6d51_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk6d51_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6d51_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk6d51_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk6d51_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6d51_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk6d51_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk6d51_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk6d51_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stka311_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stka311_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stka311_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stka311_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stka311_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stka311_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stka311_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stka311_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stka311_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stka821_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stka821_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stka821_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stka821_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stka821_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stka821_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stka821_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stka821_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stka821_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
int dev_stk11xx_initialize_device(struct usb_stk11xx *dev)
This function permits to initialize the device.
Definition stk11xx-dev.c:63
int dev_stk11xx_camera_asleep(struct usb_stk11xx *dev)
Wake-up the camera.
int dev_stk11xx_reconf_camera(struct usb_stk11xx *dev)
Reconfigure the camera before the stream.
int dev_stk11xx_set_camera_quality(struct usb_stk11xx *dev)
This function permits to modify the quality video of the camera.
int dev_stk11xx_camera_off(struct usb_stk11xx *dev)
This function switchs off the camera.
int dev_stk11xx_set_camera_fps(struct usb_stk11xx *dev)
This function permits to modify the fps of the camera.
int dev_stk11xx_stop_stream(struct usb_stk11xx *dev)
This function sets the device to stop the stream.
int dev_stk11xx_camera_settings(struct usb_stk11xx *dev)
This function permits to modify the settings of the camera.
int dev_stk11xx_start_stream(struct usb_stk11xx *dev)
This function sets the device to start the stream.
int dev_stk11xx_watchdog_camera(struct usb_stk11xx *dev)
A espece of software watchdog.
int dev_stk11xx_init_camera(struct usb_stk11xx *dev)
This function initializes the device for the stream.
int dev_stk11xx_camera_on(struct usb_stk11xx *dev)
This function switchs on the camera.
int dev_stk11xx_decompress(struct usb_stk11xx *dev)
Decompress/convert a frame from the video stream.
int dev_stk11xx_check_device(struct usb_stk11xx *dev, int nbr)
This function permits to check the device in reading the register 0x0201.
Driver for Syntek USB video camera.
int usb_stk11xx_read_registry(struct usb_stk11xx *dev, __u16 index, int *value)
Read a 16-bits value from a 16-bits register.
Driver for Syntek USB video camera.
#define STK_ERROR(str, args...)
Definition stk11xx.h:156
#define STK_DEBUG(str, args...)
Definition stk11xx.h:158
int webcam_model
Definition stk11xx.h:324
struct usb_device * udev
Definition stk11xx.h:320