1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /****************************************************************************
4 * Filename: cpia2_v4l.c
6 * Copyright 2001, STMicrolectronics, Inc.
7 * Contact: steve.miller@st.com
8 * Copyright 2001,2005, Scott J. Bertin <scottbertin@yahoo.com>
11 * This is a USB driver for CPia2 based video cameras.
12 * The infrastructure of this driver is based on the cpia usb driver by
13 * Jochen Scharrlach and Johannes Erdfeldt.
15 * Stripped of 2.4 stuff ready for main kernel submit by
16 * Alan Cox <alan@lxorguk.ukuu.org.uk>
17 ****************************************************************************/
19 #define CPIA_VERSION "3.0.1"
21 #include <linux/module.h>
22 #include <linux/time.h>
23 #include <linux/sched.h>
24 #include <linux/slab.h>
25 #include <linux/init.h>
26 #include <linux/videodev2.h>
27 #include <linux/stringify.h>
28 #include <media/v4l2-ioctl.h>
29 #include <media/v4l2-event.h>
33 static int video_nr
= -1;
34 module_param(video_nr
, int, 0);
35 MODULE_PARM_DESC(video_nr
, "video device to register (0=/dev/video0, etc)");
37 static int buffer_size
= 68 * 1024;
38 module_param(buffer_size
, int, 0);
39 MODULE_PARM_DESC(buffer_size
, "Size for each frame buffer in bytes (default 68k)");
41 static int num_buffers
= 3;
42 module_param(num_buffers
, int, 0);
43 MODULE_PARM_DESC(num_buffers
, "Number of frame buffers (1-"
44 __stringify(VIDEO_MAX_FRAME
) ", default 3)");
46 static int alternate
= DEFAULT_ALT
;
47 module_param(alternate
, int, 0);
48 MODULE_PARM_DESC(alternate
, "USB Alternate (" __stringify(USBIF_ISO_1
) "-"
49 __stringify(USBIF_ISO_6
) ", default "
50 __stringify(DEFAULT_ALT
) ")");
52 static int flicker_mode
;
53 module_param(flicker_mode
, int, 0);
54 MODULE_PARM_DESC(flicker_mode
, "Flicker frequency (0 (disabled), " __stringify(50) " or "
55 __stringify(60) ", default 0)");
57 MODULE_AUTHOR("Steve Miller (STMicroelectronics) <steve.miller@st.com>");
58 MODULE_DESCRIPTION("V4L-driver for STMicroelectronics CPiA2 based cameras");
59 MODULE_SUPPORTED_DEVICE("video");
60 MODULE_LICENSE("GPL");
61 MODULE_VERSION(CPIA_VERSION
);
63 #define ABOUT "V4L-Driver for Vision CPiA2 based cameras"
64 #define CPIA2_CID_USB_ALT (V4L2_CID_USER_BASE | 0xf000)
66 /******************************************************************************
70 *****************************************************************************/
71 static int cpia2_open(struct file
*file
)
73 struct camera_data
*cam
= video_drvdata(file
);
76 if (mutex_lock_interruptible(&cam
->v4l2_lock
))
78 retval
= v4l2_fh_open(file
);
82 if (v4l2_fh_is_singular_file(file
)) {
83 if (cpia2_allocate_buffers(cam
)) {
84 v4l2_fh_release(file
);
89 /* reset the camera */
90 if (cpia2_reset_camera(cam
) < 0) {
91 v4l2_fh_release(file
);
100 cpia2_dbg_dump_registers(cam
);
102 mutex_unlock(&cam
->v4l2_lock
);
106 /******************************************************************************
110 *****************************************************************************/
111 static int cpia2_close(struct file
*file
)
113 struct video_device
*dev
= video_devdata(file
);
114 struct camera_data
*cam
= video_get_drvdata(dev
);
116 mutex_lock(&cam
->v4l2_lock
);
117 if (video_is_registered(&cam
->vdev
) && v4l2_fh_is_singular_file(file
)) {
118 cpia2_usb_stream_stop(cam
);
120 /* save camera state for later open */
121 cpia2_save_camera_state(cam
);
123 cpia2_set_low_power(cam
);
124 cpia2_free_buffers(cam
);
127 if (cam
->stream_fh
== file
->private_data
) {
128 cam
->stream_fh
= NULL
;
131 mutex_unlock(&cam
->v4l2_lock
);
132 return v4l2_fh_release(file
);
135 /******************************************************************************
139 *****************************************************************************/
140 static ssize_t
cpia2_v4l_read(struct file
*file
, char __user
*buf
, size_t count
,
143 struct camera_data
*cam
= video_drvdata(file
);
144 int noblock
= file
->f_flags
&O_NONBLOCK
;
150 if (mutex_lock_interruptible(&cam
->v4l2_lock
))
152 ret
= cpia2_read(cam
, buf
, count
, noblock
);
153 mutex_unlock(&cam
->v4l2_lock
);
158 /******************************************************************************
162 *****************************************************************************/
163 static __poll_t
cpia2_v4l_poll(struct file
*filp
, struct poll_table_struct
*wait
)
165 struct camera_data
*cam
= video_drvdata(filp
);
168 mutex_lock(&cam
->v4l2_lock
);
169 res
= cpia2_poll(cam
, filp
, wait
);
170 mutex_unlock(&cam
->v4l2_lock
);
175 static int sync(struct camera_data
*cam
, int frame_nr
)
177 struct framebuf
*frame
= &cam
->buffers
[frame_nr
];
180 if (frame
->status
== FRAME_READY
)
183 if (!cam
->streaming
) {
184 frame
->status
= FRAME_READY
;
189 mutex_unlock(&cam
->v4l2_lock
);
190 wait_event_interruptible(cam
->wq_stream
,
192 frame
->status
== FRAME_READY
);
193 mutex_lock(&cam
->v4l2_lock
);
194 if (signal_pending(current
))
196 if (!video_is_registered(&cam
->vdev
))
201 /******************************************************************************
205 * V4L2 device capabilities
207 *****************************************************************************/
209 static int cpia2_querycap(struct file
*file
, void *fh
, struct v4l2_capability
*vc
)
211 struct camera_data
*cam
= video_drvdata(file
);
213 strscpy(vc
->driver
, "cpia2", sizeof(vc
->driver
));
215 if (cam
->params
.pnp_id
.product
== 0x151)
216 strscpy(vc
->card
, "QX5 Microscope", sizeof(vc
->card
));
218 strscpy(vc
->card
, "CPiA2 Camera", sizeof(vc
->card
));
219 switch (cam
->params
.pnp_id
.device_type
) {
221 strcat(vc
->card
, " (672/");
224 strcat(vc
->card
, " (676/");
227 strcat(vc
->card
, " (XXX/");
230 switch (cam
->params
.version
.sensor_flags
) {
231 case CPIA2_VP_SENSOR_FLAGS_404
:
232 strcat(vc
->card
, "404)");
234 case CPIA2_VP_SENSOR_FLAGS_407
:
235 strcat(vc
->card
, "407)");
237 case CPIA2_VP_SENSOR_FLAGS_409
:
238 strcat(vc
->card
, "409)");
240 case CPIA2_VP_SENSOR_FLAGS_410
:
241 strcat(vc
->card
, "410)");
243 case CPIA2_VP_SENSOR_FLAGS_500
:
244 strcat(vc
->card
, "500)");
247 strcat(vc
->card
, "XXX)");
251 if (usb_make_path(cam
->dev
, vc
->bus_info
, sizeof(vc
->bus_info
)) <0)
252 memset(vc
->bus_info
,0, sizeof(vc
->bus_info
));
256 /******************************************************************************
260 * V4L2 input get/set/enumerate
262 *****************************************************************************/
264 static int cpia2_enum_input(struct file
*file
, void *fh
, struct v4l2_input
*i
)
268 strscpy(i
->name
, "Camera", sizeof(i
->name
));
269 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
273 static int cpia2_g_input(struct file
*file
, void *fh
, unsigned int *i
)
279 static int cpia2_s_input(struct file
*file
, void *fh
, unsigned int i
)
281 return i
? -EINVAL
: 0;
284 /******************************************************************************
288 * V4L2 format enumerate
290 *****************************************************************************/
292 static int cpia2_enum_fmt_vid_cap(struct file
*file
, void *fh
,
293 struct v4l2_fmtdesc
*f
)
295 int index
= f
->index
;
297 if (index
< 0 || index
> 1)
300 memset(f
, 0, sizeof(*f
));
302 f
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
303 f
->flags
= V4L2_FMT_FLAG_COMPRESSED
;
306 strscpy(f
->description
, "MJPEG", sizeof(f
->description
));
307 f
->pixelformat
= V4L2_PIX_FMT_MJPEG
;
310 strscpy(f
->description
, "JPEG", sizeof(f
->description
));
311 f
->pixelformat
= V4L2_PIX_FMT_JPEG
;
320 /******************************************************************************
326 *****************************************************************************/
328 static int cpia2_try_fmt_vid_cap(struct file
*file
, void *fh
,
329 struct v4l2_format
*f
)
331 struct camera_data
*cam
= video_drvdata(file
);
333 if (f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_MJPEG
&&
334 f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_JPEG
)
337 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
338 f
->fmt
.pix
.bytesperline
= 0;
339 f
->fmt
.pix
.sizeimage
= cam
->frame_size
;
340 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_JPEG
;
343 switch (cpia2_match_video_size(f
->fmt
.pix
.width
, f
->fmt
.pix
.height
)) {
345 f
->fmt
.pix
.width
= 640;
346 f
->fmt
.pix
.height
= 480;
349 f
->fmt
.pix
.width
= 352;
350 f
->fmt
.pix
.height
= 288;
353 f
->fmt
.pix
.width
= 320;
354 f
->fmt
.pix
.height
= 240;
356 case VIDEOSIZE_288_216
:
357 f
->fmt
.pix
.width
= 288;
358 f
->fmt
.pix
.height
= 216;
360 case VIDEOSIZE_256_192
:
361 f
->fmt
.pix
.width
= 256;
362 f
->fmt
.pix
.height
= 192;
364 case VIDEOSIZE_224_168
:
365 f
->fmt
.pix
.width
= 224;
366 f
->fmt
.pix
.height
= 168;
368 case VIDEOSIZE_192_144
:
369 f
->fmt
.pix
.width
= 192;
370 f
->fmt
.pix
.height
= 144;
374 f
->fmt
.pix
.width
= 176;
375 f
->fmt
.pix
.height
= 144;
382 /******************************************************************************
388 *****************************************************************************/
390 static int cpia2_s_fmt_vid_cap(struct file
*file
, void *_fh
,
391 struct v4l2_format
*f
)
393 struct camera_data
*cam
= video_drvdata(file
);
396 err
= cpia2_try_fmt_vid_cap(file
, _fh
, f
);
400 cam
->pixelformat
= f
->fmt
.pix
.pixelformat
;
402 /* NOTE: This should be set to 1 for MJPEG, but some apps don't handle
403 * the missing Huffman table properly. */
404 cam
->params
.compression
.inhibit_htables
= 0;
405 /*f->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG;*/
407 /* we set the video window to something smaller or equal to what
408 * is requested by the user???
410 DBG("Requested width = %d, height = %d\n",
411 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
);
412 if (f
->fmt
.pix
.width
!= cam
->width
||
413 f
->fmt
.pix
.height
!= cam
->height
) {
414 cam
->width
= f
->fmt
.pix
.width
;
415 cam
->height
= f
->fmt
.pix
.height
;
416 cam
->params
.roi
.width
= f
->fmt
.pix
.width
;
417 cam
->params
.roi
.height
= f
->fmt
.pix
.height
;
418 cpia2_set_format(cam
);
421 for (frame
= 0; frame
< cam
->num_frames
; ++frame
) {
422 if (cam
->buffers
[frame
].status
== FRAME_READING
)
423 if ((err
= sync(cam
, frame
)) < 0)
426 cam
->buffers
[frame
].status
= FRAME_EMPTY
;
432 /******************************************************************************
438 *****************************************************************************/
440 static int cpia2_g_fmt_vid_cap(struct file
*file
, void *fh
,
441 struct v4l2_format
*f
)
443 struct camera_data
*cam
= video_drvdata(file
);
445 f
->fmt
.pix
.width
= cam
->width
;
446 f
->fmt
.pix
.height
= cam
->height
;
447 f
->fmt
.pix
.pixelformat
= cam
->pixelformat
;
448 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
449 f
->fmt
.pix
.bytesperline
= 0;
450 f
->fmt
.pix
.sizeimage
= cam
->frame_size
;
451 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_JPEG
;
457 /******************************************************************************
461 * V4L2 query cropping capabilities
462 * NOTE: cropping is currently disabled
464 *****************************************************************************/
466 static int cpia2_g_selection(struct file
*file
, void *fh
,
467 struct v4l2_selection
*s
)
469 struct camera_data
*cam
= video_drvdata(file
);
471 if (s
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
475 case V4L2_SEL_TGT_CROP_BOUNDS
:
476 case V4L2_SEL_TGT_CROP_DEFAULT
:
479 s
->r
.width
= cam
->width
;
480 s
->r
.height
= cam
->height
;
488 struct framerate_info
{
490 struct v4l2_fract period
;
493 static const struct framerate_info framerate_controls
[] = {
494 { CPIA2_VP_FRAMERATE_6_25
, { 4, 25 } },
495 { CPIA2_VP_FRAMERATE_7_5
, { 2, 15 } },
496 { CPIA2_VP_FRAMERATE_12_5
, { 2, 25 } },
497 { CPIA2_VP_FRAMERATE_15
, { 1, 15 } },
498 { CPIA2_VP_FRAMERATE_25
, { 1, 25 } },
499 { CPIA2_VP_FRAMERATE_30
, { 1, 30 } },
502 static int cpia2_g_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*p
)
504 struct camera_data
*cam
= video_drvdata(file
);
505 struct v4l2_captureparm
*cap
= &p
->parm
.capture
;
508 if (p
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
511 cap
->capability
= V4L2_CAP_TIMEPERFRAME
;
512 cap
->readbuffers
= cam
->num_frames
;
513 for (i
= 0; i
< ARRAY_SIZE(framerate_controls
); i
++)
514 if (cam
->params
.vp_params
.frame_rate
== framerate_controls
[i
].value
) {
515 cap
->timeperframe
= framerate_controls
[i
].period
;
521 static int cpia2_s_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*p
)
523 struct camera_data
*cam
= video_drvdata(file
);
524 struct v4l2_captureparm
*cap
= &p
->parm
.capture
;
525 struct v4l2_fract tpf
= cap
->timeperframe
;
526 int max
= ARRAY_SIZE(framerate_controls
) - 1;
530 ret
= cpia2_g_parm(file
, fh
, p
);
531 if (ret
|| !tpf
.denominator
|| !tpf
.numerator
)
534 /* Maximum 15 fps for this model */
535 if (cam
->params
.pnp_id
.device_type
== DEVICE_STV_672
&&
536 cam
->params
.version
.sensor_flags
== CPIA2_VP_SENSOR_FLAGS_500
)
538 for (i
= 0; i
<= max
; i
++) {
539 struct v4l2_fract f1
= tpf
;
540 struct v4l2_fract f2
= framerate_controls
[i
].period
;
542 f1
.numerator
*= f2
.denominator
;
543 f2
.numerator
*= f1
.denominator
;
544 if (f1
.numerator
>= f2
.numerator
)
549 cap
->timeperframe
= framerate_controls
[i
].period
;
550 return cpia2_set_fps(cam
, framerate_controls
[i
].value
);
553 static const struct {
556 } cpia2_framesizes
[] = {
567 static int cpia2_enum_framesizes(struct file
*file
, void *fh
,
568 struct v4l2_frmsizeenum
*fsize
)
571 if (fsize
->pixel_format
!= V4L2_PIX_FMT_MJPEG
&&
572 fsize
->pixel_format
!= V4L2_PIX_FMT_JPEG
)
574 if (fsize
->index
>= ARRAY_SIZE(cpia2_framesizes
))
576 fsize
->type
= V4L2_FRMSIZE_TYPE_DISCRETE
;
577 fsize
->discrete
.width
= cpia2_framesizes
[fsize
->index
].width
;
578 fsize
->discrete
.height
= cpia2_framesizes
[fsize
->index
].height
;
583 static int cpia2_enum_frameintervals(struct file
*file
, void *fh
,
584 struct v4l2_frmivalenum
*fival
)
586 struct camera_data
*cam
= video_drvdata(file
);
587 int max
= ARRAY_SIZE(framerate_controls
) - 1;
590 if (fival
->pixel_format
!= V4L2_PIX_FMT_MJPEG
&&
591 fival
->pixel_format
!= V4L2_PIX_FMT_JPEG
)
594 /* Maximum 15 fps for this model */
595 if (cam
->params
.pnp_id
.device_type
== DEVICE_STV_672
&&
596 cam
->params
.version
.sensor_flags
== CPIA2_VP_SENSOR_FLAGS_500
)
598 if (fival
->index
> max
)
600 for (i
= 0; i
< ARRAY_SIZE(cpia2_framesizes
); i
++)
601 if (fival
->width
== cpia2_framesizes
[i
].width
&&
602 fival
->height
== cpia2_framesizes
[i
].height
)
604 if (i
== ARRAY_SIZE(cpia2_framesizes
))
606 fival
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
607 fival
->discrete
= framerate_controls
[fival
->index
].period
;
611 /******************************************************************************
615 * V4L2 set the value of a control variable
617 *****************************************************************************/
619 static int cpia2_s_ctrl(struct v4l2_ctrl
*ctrl
)
621 struct camera_data
*cam
=
622 container_of(ctrl
->handler
, struct camera_data
, hdl
);
623 static const int flicker_table
[] = {
629 DBG("Set control id:%d, value:%d\n", ctrl
->id
, ctrl
->val
);
632 case V4L2_CID_BRIGHTNESS
:
633 cpia2_set_brightness(cam
, ctrl
->val
);
635 case V4L2_CID_CONTRAST
:
636 cpia2_set_contrast(cam
, ctrl
->val
);
638 case V4L2_CID_SATURATION
:
639 cpia2_set_saturation(cam
, ctrl
->val
);
642 cpia2_set_property_mirror(cam
, ctrl
->val
);
645 cpia2_set_property_flip(cam
, ctrl
->val
);
647 case V4L2_CID_POWER_LINE_FREQUENCY
:
648 return cpia2_set_flicker_mode(cam
, flicker_table
[ctrl
->val
]);
649 case V4L2_CID_ILLUMINATORS_1
:
650 return cpia2_set_gpio(cam
, (cam
->top_light
->val
<< 6) |
651 (cam
->bottom_light
->val
<< 7));
652 case V4L2_CID_JPEG_ACTIVE_MARKER
:
653 cam
->params
.compression
.inhibit_htables
=
654 !(ctrl
->val
& V4L2_JPEG_ACTIVE_MARKER_DHT
);
656 case V4L2_CID_JPEG_COMPRESSION_QUALITY
:
657 cam
->params
.vc_params
.quality
= ctrl
->val
;
659 case CPIA2_CID_USB_ALT
:
660 cam
->params
.camera_state
.stream_mode
= ctrl
->val
;
669 /******************************************************************************
673 * V4L2 get the JPEG compression parameters
675 *****************************************************************************/
677 static int cpia2_g_jpegcomp(struct file
*file
, void *fh
, struct v4l2_jpegcompression
*parms
)
679 struct camera_data
*cam
= video_drvdata(file
);
681 memset(parms
, 0, sizeof(*parms
));
683 parms
->quality
= 80; // TODO: Can this be made meaningful?
685 parms
->jpeg_markers
= V4L2_JPEG_MARKER_DQT
| V4L2_JPEG_MARKER_DRI
;
686 if(!cam
->params
.compression
.inhibit_htables
) {
687 parms
->jpeg_markers
|= V4L2_JPEG_MARKER_DHT
;
690 parms
->APPn
= cam
->APPn
;
691 parms
->APP_len
= cam
->APP_len
;
692 if(cam
->APP_len
> 0) {
693 memcpy(parms
->APP_data
, cam
->APP_data
, cam
->APP_len
);
694 parms
->jpeg_markers
|= V4L2_JPEG_MARKER_APP
;
697 parms
->COM_len
= cam
->COM_len
;
698 if(cam
->COM_len
> 0) {
699 memcpy(parms
->COM_data
, cam
->COM_data
, cam
->COM_len
);
700 parms
->jpeg_markers
|= JPEG_MARKER_COM
;
703 DBG("G_JPEGCOMP APP_len:%d COM_len:%d\n",
704 parms
->APP_len
, parms
->COM_len
);
709 /******************************************************************************
713 * V4L2 set the JPEG compression parameters
714 * NOTE: quality and some jpeg_markers are ignored.
716 *****************************************************************************/
718 static int cpia2_s_jpegcomp(struct file
*file
, void *fh
,
719 const struct v4l2_jpegcompression
*parms
)
721 struct camera_data
*cam
= video_drvdata(file
);
723 DBG("S_JPEGCOMP APP_len:%d COM_len:%d\n",
724 parms
->APP_len
, parms
->COM_len
);
726 cam
->params
.compression
.inhibit_htables
=
727 !(parms
->jpeg_markers
& V4L2_JPEG_MARKER_DHT
);
729 if(parms
->APP_len
!= 0) {
730 if(parms
->APP_len
> 0 &&
731 parms
->APP_len
<= sizeof(cam
->APP_data
) &&
732 parms
->APPn
>= 0 && parms
->APPn
<= 15) {
733 cam
->APPn
= parms
->APPn
;
734 cam
->APP_len
= parms
->APP_len
;
735 memcpy(cam
->APP_data
, parms
->APP_data
, parms
->APP_len
);
737 LOG("Bad APPn Params n=%d len=%d\n",
738 parms
->APPn
, parms
->APP_len
);
745 if(parms
->COM_len
!= 0) {
746 if(parms
->COM_len
> 0 &&
747 parms
->COM_len
<= sizeof(cam
->COM_data
)) {
748 cam
->COM_len
= parms
->COM_len
;
749 memcpy(cam
->COM_data
, parms
->COM_data
, parms
->COM_len
);
751 LOG("Bad COM_len=%d\n", parms
->COM_len
);
759 /******************************************************************************
763 * V4L2 Initiate memory mapping.
764 * NOTE: The user's request is ignored. For now the buffers are fixed.
766 *****************************************************************************/
768 static int cpia2_reqbufs(struct file
*file
, void *fh
, struct v4l2_requestbuffers
*req
)
770 struct camera_data
*cam
= video_drvdata(file
);
772 if(req
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
773 req
->memory
!= V4L2_MEMORY_MMAP
)
776 DBG("REQBUFS requested:%d returning:%d\n", req
->count
, cam
->num_frames
);
777 req
->count
= cam
->num_frames
;
778 memset(&req
->reserved
, 0, sizeof(req
->reserved
));
783 /******************************************************************************
787 * V4L2 Query memory buffer status.
789 *****************************************************************************/
791 static int cpia2_querybuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
793 struct camera_data
*cam
= video_drvdata(file
);
795 if(buf
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
796 buf
->index
>= cam
->num_frames
)
799 buf
->m
.offset
= cam
->buffers
[buf
->index
].data
- cam
->frame_buffer
;
800 buf
->length
= cam
->frame_size
;
802 buf
->memory
= V4L2_MEMORY_MMAP
;
805 buf
->flags
= V4L2_BUF_FLAG_MAPPED
;
809 buf
->flags
|= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
811 switch (cam
->buffers
[buf
->index
].status
) {
816 buf
->flags
= V4L2_BUF_FLAG_QUEUED
;
819 buf
->bytesused
= cam
->buffers
[buf
->index
].length
;
820 buf
->timestamp
= ns_to_timeval(cam
->buffers
[buf
->index
].ts
);
821 buf
->sequence
= cam
->buffers
[buf
->index
].seq
;
822 buf
->flags
= V4L2_BUF_FLAG_DONE
;
826 DBG("QUERYBUF index:%d offset:%d flags:%d seq:%d bytesused:%d\n",
827 buf
->index
, buf
->m
.offset
, buf
->flags
, buf
->sequence
,
833 /******************************************************************************
837 * V4L2 User is freeing buffer
839 *****************************************************************************/
841 static int cpia2_qbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
843 struct camera_data
*cam
= video_drvdata(file
);
845 if(buf
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
846 buf
->memory
!= V4L2_MEMORY_MMAP
||
847 buf
->index
>= cam
->num_frames
)
850 DBG("QBUF #%d\n", buf
->index
);
852 if(cam
->buffers
[buf
->index
].status
== FRAME_READY
)
853 cam
->buffers
[buf
->index
].status
= FRAME_EMPTY
;
858 /******************************************************************************
860 * find_earliest_filled_buffer
862 * Helper for ioctl_dqbuf. Find the next ready buffer.
864 *****************************************************************************/
866 static int find_earliest_filled_buffer(struct camera_data
*cam
)
870 for (i
=0; i
<cam
->num_frames
; i
++) {
871 if(cam
->buffers
[i
].status
== FRAME_READY
) {
875 /* find which buffer is earlier */
876 if (cam
->buffers
[i
].ts
< cam
->buffers
[found
].ts
)
884 /******************************************************************************
888 * V4L2 User is asking for a filled buffer.
890 *****************************************************************************/
892 static int cpia2_dqbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
894 struct camera_data
*cam
= video_drvdata(file
);
897 if(buf
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
898 buf
->memory
!= V4L2_MEMORY_MMAP
)
901 frame
= find_earliest_filled_buffer(cam
);
903 if(frame
< 0 && file
->f_flags
&O_NONBLOCK
)
907 /* Wait for a frame to become available */
908 struct framebuf
*cb
=cam
->curbuff
;
909 mutex_unlock(&cam
->v4l2_lock
);
910 wait_event_interruptible(cam
->wq_stream
,
911 !video_is_registered(&cam
->vdev
) ||
912 (cb
=cam
->curbuff
)->status
== FRAME_READY
);
913 mutex_lock(&cam
->v4l2_lock
);
914 if (signal_pending(current
))
916 if (!video_is_registered(&cam
->vdev
))
923 buf
->bytesused
= cam
->buffers
[buf
->index
].length
;
924 buf
->flags
= V4L2_BUF_FLAG_MAPPED
| V4L2_BUF_FLAG_DONE
925 | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
926 buf
->field
= V4L2_FIELD_NONE
;
927 buf
->timestamp
= ns_to_timeval(cam
->buffers
[buf
->index
].ts
);
928 buf
->sequence
= cam
->buffers
[buf
->index
].seq
;
929 buf
->m
.offset
= cam
->buffers
[buf
->index
].data
- cam
->frame_buffer
;
930 buf
->length
= cam
->frame_size
;
933 memset(&buf
->timecode
, 0, sizeof(buf
->timecode
));
935 DBG("DQBUF #%d status:%d seq:%d length:%d\n", buf
->index
,
936 cam
->buffers
[buf
->index
].status
, buf
->sequence
, buf
->bytesused
);
941 static int cpia2_streamon(struct file
*file
, void *fh
, enum v4l2_buf_type type
)
943 struct camera_data
*cam
= video_drvdata(file
);
946 DBG("VIDIOC_STREAMON, streaming=%d\n", cam
->streaming
);
947 if (!cam
->mmapped
|| type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
950 if (!cam
->streaming
) {
951 ret
= cpia2_usb_stream_start(cam
,
952 cam
->params
.camera_state
.stream_mode
);
954 v4l2_ctrl_grab(cam
->usb_alt
, true);
959 static int cpia2_streamoff(struct file
*file
, void *fh
, enum v4l2_buf_type type
)
961 struct camera_data
*cam
= video_drvdata(file
);
964 DBG("VIDIOC_STREAMOFF, streaming=%d\n", cam
->streaming
);
965 if (!cam
->mmapped
|| type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
968 if (cam
->streaming
) {
969 ret
= cpia2_usb_stream_stop(cam
);
971 v4l2_ctrl_grab(cam
->usb_alt
, false);
976 /******************************************************************************
980 *****************************************************************************/
981 static int cpia2_mmap(struct file
*file
, struct vm_area_struct
*area
)
983 struct camera_data
*cam
= video_drvdata(file
);
986 if (mutex_lock_interruptible(&cam
->v4l2_lock
))
988 retval
= cpia2_remap_buffer(cam
, area
);
991 cam
->stream_fh
= file
->private_data
;
992 mutex_unlock(&cam
->v4l2_lock
);
996 /******************************************************************************
998 * reset_camera_struct_v4l
1000 * Sets all values to the defaults
1001 *****************************************************************************/
1002 static void reset_camera_struct_v4l(struct camera_data
*cam
)
1004 cam
->width
= cam
->params
.roi
.width
;
1005 cam
->height
= cam
->params
.roi
.height
;
1007 cam
->frame_size
= buffer_size
;
1008 cam
->num_frames
= num_buffers
;
1011 cam
->params
.flicker_control
.flicker_mode_req
= flicker_mode
;
1014 cam
->params
.camera_state
.stream_mode
= alternate
;
1016 cam
->pixelformat
= V4L2_PIX_FMT_JPEG
;
1019 static const struct v4l2_ioctl_ops cpia2_ioctl_ops
= {
1020 .vidioc_querycap
= cpia2_querycap
,
1021 .vidioc_enum_input
= cpia2_enum_input
,
1022 .vidioc_g_input
= cpia2_g_input
,
1023 .vidioc_s_input
= cpia2_s_input
,
1024 .vidioc_enum_fmt_vid_cap
= cpia2_enum_fmt_vid_cap
,
1025 .vidioc_g_fmt_vid_cap
= cpia2_g_fmt_vid_cap
,
1026 .vidioc_s_fmt_vid_cap
= cpia2_s_fmt_vid_cap
,
1027 .vidioc_try_fmt_vid_cap
= cpia2_try_fmt_vid_cap
,
1028 .vidioc_g_jpegcomp
= cpia2_g_jpegcomp
,
1029 .vidioc_s_jpegcomp
= cpia2_s_jpegcomp
,
1030 .vidioc_g_selection
= cpia2_g_selection
,
1031 .vidioc_reqbufs
= cpia2_reqbufs
,
1032 .vidioc_querybuf
= cpia2_querybuf
,
1033 .vidioc_qbuf
= cpia2_qbuf
,
1034 .vidioc_dqbuf
= cpia2_dqbuf
,
1035 .vidioc_streamon
= cpia2_streamon
,
1036 .vidioc_streamoff
= cpia2_streamoff
,
1037 .vidioc_s_parm
= cpia2_s_parm
,
1038 .vidioc_g_parm
= cpia2_g_parm
,
1039 .vidioc_enum_framesizes
= cpia2_enum_framesizes
,
1040 .vidioc_enum_frameintervals
= cpia2_enum_frameintervals
,
1041 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1042 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1046 * The v4l video device structure initialized for this device
1048 static const struct v4l2_file_operations cpia2_fops
= {
1049 .owner
= THIS_MODULE
,
1051 .release
= cpia2_close
,
1052 .read
= cpia2_v4l_read
,
1053 .poll
= cpia2_v4l_poll
,
1054 .unlocked_ioctl
= video_ioctl2
,
1058 static const struct video_device cpia2_template
= {
1059 /* I could not find any place for the old .initialize initializer?? */
1060 .name
= "CPiA2 Camera",
1061 .fops
= &cpia2_fops
,
1062 .ioctl_ops
= &cpia2_ioctl_ops
,
1063 .release
= video_device_release_empty
,
1066 void cpia2_camera_release(struct v4l2_device
*v4l2_dev
)
1068 struct camera_data
*cam
=
1069 container_of(v4l2_dev
, struct camera_data
, v4l2_dev
);
1071 v4l2_ctrl_handler_free(&cam
->hdl
);
1072 v4l2_device_unregister(&cam
->v4l2_dev
);
1076 static const struct v4l2_ctrl_ops cpia2_ctrl_ops
= {
1077 .s_ctrl
= cpia2_s_ctrl
,
1080 /******************************************************************************
1082 * cpia2_register_camera
1084 *****************************************************************************/
1085 int cpia2_register_camera(struct camera_data
*cam
)
1087 struct v4l2_ctrl_handler
*hdl
= &cam
->hdl
;
1088 struct v4l2_ctrl_config cpia2_usb_alt
= {
1089 .ops
= &cpia2_ctrl_ops
,
1090 .id
= CPIA2_CID_USB_ALT
,
1091 .name
= "USB Alternate",
1092 .type
= V4L2_CTRL_TYPE_INTEGER
,
1099 v4l2_ctrl_handler_init(hdl
, 12);
1100 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1101 V4L2_CID_BRIGHTNESS
,
1102 cam
->params
.pnp_id
.device_type
== DEVICE_STV_672
? 1 : 0,
1103 255, 1, DEFAULT_BRIGHTNESS
);
1104 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1105 V4L2_CID_CONTRAST
, 0, 255, 1, DEFAULT_CONTRAST
);
1106 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1107 V4L2_CID_SATURATION
, 0, 255, 1, DEFAULT_SATURATION
);
1108 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1109 V4L2_CID_HFLIP
, 0, 1, 1, 0);
1110 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1111 V4L2_CID_JPEG_ACTIVE_MARKER
, 0,
1112 V4L2_JPEG_ACTIVE_MARKER_DHT
, 0,
1113 V4L2_JPEG_ACTIVE_MARKER_DHT
);
1114 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1115 V4L2_CID_JPEG_COMPRESSION_QUALITY
, 1,
1117 cpia2_usb_alt
.def
= alternate
;
1118 cam
->usb_alt
= v4l2_ctrl_new_custom(hdl
, &cpia2_usb_alt
, NULL
);
1120 if (cam
->params
.pnp_id
.device_type
!= DEVICE_STV_672
)
1121 v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1122 V4L2_CID_VFLIP
, 0, 1, 1, 0);
1123 /* Flicker control only valid for 672 */
1124 if (cam
->params
.pnp_id
.device_type
== DEVICE_STV_672
)
1125 v4l2_ctrl_new_std_menu(hdl
, &cpia2_ctrl_ops
,
1126 V4L2_CID_POWER_LINE_FREQUENCY
,
1127 V4L2_CID_POWER_LINE_FREQUENCY_60HZ
, 0, 0);
1128 /* Light control only valid for the QX5 Microscope */
1129 if (cam
->params
.pnp_id
.product
== 0x151) {
1130 cam
->top_light
= v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1131 V4L2_CID_ILLUMINATORS_1
, 0, 1, 1, 0);
1132 cam
->bottom_light
= v4l2_ctrl_new_std(hdl
, &cpia2_ctrl_ops
,
1133 V4L2_CID_ILLUMINATORS_2
, 0, 1, 1, 0);
1134 v4l2_ctrl_cluster(2, &cam
->top_light
);
1139 v4l2_ctrl_handler_free(hdl
);
1143 cam
->vdev
= cpia2_template
;
1144 video_set_drvdata(&cam
->vdev
, cam
);
1145 cam
->vdev
.lock
= &cam
->v4l2_lock
;
1146 cam
->vdev
.ctrl_handler
= hdl
;
1147 cam
->vdev
.v4l2_dev
= &cam
->v4l2_dev
;
1148 cam
->vdev
.device_caps
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_READWRITE
|
1151 reset_camera_struct_v4l(cam
);
1153 /* register v4l device */
1154 if (video_register_device(&cam
->vdev
, VFL_TYPE_GRABBER
, video_nr
) < 0) {
1155 ERR("video_register_device failed\n");
1162 /******************************************************************************
1164 * cpia2_unregister_camera
1166 *****************************************************************************/
1167 void cpia2_unregister_camera(struct camera_data
*cam
)
1169 video_unregister_device(&cam
->vdev
);
1172 /******************************************************************************
1176 * Make sure that all user-supplied parameters are sensible
1177 *****************************************************************************/
1178 static void __init
check_parameters(void)
1180 if(buffer_size
< PAGE_SIZE
) {
1181 buffer_size
= PAGE_SIZE
;
1182 LOG("buffer_size too small, setting to %d\n", buffer_size
);
1183 } else if(buffer_size
> 1024*1024) {
1184 /* arbitrary upper limiit */
1185 buffer_size
= 1024*1024;
1186 LOG("buffer_size ridiculously large, setting to %d\n",
1189 buffer_size
+= PAGE_SIZE
-1;
1190 buffer_size
&= ~(PAGE_SIZE
-1);
1193 if(num_buffers
< 1) {
1195 LOG("num_buffers too small, setting to %d\n", num_buffers
);
1196 } else if(num_buffers
> VIDEO_MAX_FRAME
) {
1197 num_buffers
= VIDEO_MAX_FRAME
;
1198 LOG("num_buffers too large, setting to %d\n", num_buffers
);
1201 if(alternate
< USBIF_ISO_1
|| alternate
> USBIF_ISO_6
) {
1202 alternate
= DEFAULT_ALT
;
1203 LOG("alternate specified is invalid, using %d\n", alternate
);
1206 if (flicker_mode
!= 0 && flicker_mode
!= FLICKER_50
&& flicker_mode
!= FLICKER_60
) {
1208 LOG("Flicker mode specified is invalid, using %d\n",
1212 DBG("Using %d buffers, each %d bytes, alternate=%d\n",
1213 num_buffers
, buffer_size
, alternate
);
1216 /************ Module Stuff ***************/
1219 /******************************************************************************
1221 * cpia2_init/module_init
1223 *****************************************************************************/
1224 static int __init
cpia2_init(void)
1227 ABOUT
, CPIA_VERSION
);
1229 return cpia2_usb_init();
1233 /******************************************************************************
1235 * cpia2_exit/module_exit
1237 *****************************************************************************/
1238 static void __exit
cpia2_exit(void)
1240 cpia2_usb_cleanup();
1241 schedule_timeout(2 * HZ
);
1244 module_init(cpia2_init
);
1245 module_exit(cpia2_exit
);