2 * uvc_v4l2.c -- USB Video Class Gadget driver
4 * Copyright (C) 2009-2010
5 * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
13 #include <linux/kernel.h>
14 #include <linux/device.h>
15 #include <linux/errno.h>
16 #include <linux/list.h>
17 #include <linux/videodev2.h>
18 #include <linux/vmalloc.h>
19 #include <linux/wait.h>
21 #include <media/v4l2-dev.h>
22 #include <media/v4l2-event.h>
23 #include <media/v4l2-ioctl.h>
27 #include "uvc_queue.h"
28 #include "uvc_video.h"
31 /* --------------------------------------------------------------------------
36 uvc_send_response(struct uvc_device
*uvc
, struct uvc_request_data
*data
)
38 struct usb_composite_dev
*cdev
= uvc
->func
.config
->cdev
;
39 struct usb_request
*req
= uvc
->control_req
;
42 return usb_ep_set_halt(cdev
->gadget
->ep0
);
44 req
->length
= min_t(unsigned int, uvc
->event_length
, data
->length
);
45 req
->zero
= data
->length
< uvc
->event_length
;
47 memcpy(req
->buf
, data
->data
, req
->length
);
49 return usb_ep_queue(cdev
->gadget
->ep0
, req
, GFP_KERNEL
);
52 /* --------------------------------------------------------------------------
62 static struct uvc_format uvc_formats
[] = {
63 { 16, V4L2_PIX_FMT_YUYV
},
64 { 0, V4L2_PIX_FMT_MJPEG
},
68 uvc_v4l2_querycap(struct file
*file
, void *fh
, struct v4l2_capability
*cap
)
70 struct video_device
*vdev
= video_devdata(file
);
71 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
72 struct usb_composite_dev
*cdev
= uvc
->func
.config
->cdev
;
74 strlcpy(cap
->driver
, "g_uvc", sizeof(cap
->driver
));
75 strlcpy(cap
->card
, cdev
->gadget
->name
, sizeof(cap
->card
));
76 strlcpy(cap
->bus_info
, dev_name(&cdev
->gadget
->dev
),
77 sizeof(cap
->bus_info
));
79 cap
->device_caps
= V4L2_CAP_VIDEO_OUTPUT
| V4L2_CAP_STREAMING
;
80 cap
->capabilities
= cap
->device_caps
| V4L2_CAP_DEVICE_CAPS
;
86 uvc_v4l2_get_format(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
88 struct video_device
*vdev
= video_devdata(file
);
89 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
90 struct uvc_video
*video
= &uvc
->video
;
92 fmt
->fmt
.pix
.pixelformat
= video
->fcc
;
93 fmt
->fmt
.pix
.width
= video
->width
;
94 fmt
->fmt
.pix
.height
= video
->height
;
95 fmt
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
96 fmt
->fmt
.pix
.bytesperline
= video
->bpp
* video
->width
/ 8;
97 fmt
->fmt
.pix
.sizeimage
= video
->imagesize
;
98 fmt
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SRGB
;
99 fmt
->fmt
.pix
.priv
= 0;
105 uvc_v4l2_set_format(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
107 struct video_device
*vdev
= video_devdata(file
);
108 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
109 struct uvc_video
*video
= &uvc
->video
;
110 struct uvc_format
*format
;
111 unsigned int imagesize
;
115 for (i
= 0; i
< ARRAY_SIZE(uvc_formats
); ++i
) {
116 format
= &uvc_formats
[i
];
117 if (format
->fcc
== fmt
->fmt
.pix
.pixelformat
)
121 if (i
== ARRAY_SIZE(uvc_formats
)) {
122 printk(KERN_INFO
"Unsupported format 0x%08x.\n",
123 fmt
->fmt
.pix
.pixelformat
);
127 bpl
= format
->bpp
* fmt
->fmt
.pix
.width
/ 8;
128 imagesize
= bpl
? bpl
* fmt
->fmt
.pix
.height
: fmt
->fmt
.pix
.sizeimage
;
130 video
->fcc
= format
->fcc
;
131 video
->bpp
= format
->bpp
;
132 video
->width
= fmt
->fmt
.pix
.width
;
133 video
->height
= fmt
->fmt
.pix
.height
;
134 video
->imagesize
= imagesize
;
136 fmt
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
137 fmt
->fmt
.pix
.bytesperline
= bpl
;
138 fmt
->fmt
.pix
.sizeimage
= imagesize
;
139 fmt
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SRGB
;
140 fmt
->fmt
.pix
.priv
= 0;
146 uvc_v4l2_reqbufs(struct file
*file
, void *fh
, struct v4l2_requestbuffers
*b
)
148 struct video_device
*vdev
= video_devdata(file
);
149 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
150 struct uvc_video
*video
= &uvc
->video
;
152 if (b
->type
!= video
->queue
.queue
.type
)
155 return uvcg_alloc_buffers(&video
->queue
, b
);
159 uvc_v4l2_querybuf(struct file
*file
, void *fh
, struct v4l2_buffer
*b
)
161 struct video_device
*vdev
= video_devdata(file
);
162 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
163 struct uvc_video
*video
= &uvc
->video
;
165 return uvcg_query_buffer(&video
->queue
, b
);
169 uvc_v4l2_qbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*b
)
171 struct video_device
*vdev
= video_devdata(file
);
172 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
173 struct uvc_video
*video
= &uvc
->video
;
176 ret
= uvcg_queue_buffer(&video
->queue
, b
);
180 return uvcg_video_pump(video
);
184 uvc_v4l2_dqbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*b
)
186 struct video_device
*vdev
= video_devdata(file
);
187 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
188 struct uvc_video
*video
= &uvc
->video
;
190 return uvcg_dequeue_buffer(&video
->queue
, b
, file
->f_flags
& O_NONBLOCK
);
194 uvc_v4l2_streamon(struct file
*file
, void *fh
, enum v4l2_buf_type type
)
196 struct video_device
*vdev
= video_devdata(file
);
197 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
198 struct uvc_video
*video
= &uvc
->video
;
201 if (type
!= video
->queue
.queue
.type
)
204 /* Enable UVC video. */
205 ret
= uvcg_video_enable(video
, 1);
210 * Complete the alternate setting selection setup phase now that
211 * userspace is ready to provide video frames.
213 uvc_function_setup_continue(uvc
);
214 uvc
->state
= UVC_STATE_STREAMING
;
220 uvc_v4l2_streamoff(struct file
*file
, void *fh
, enum v4l2_buf_type type
)
222 struct video_device
*vdev
= video_devdata(file
);
223 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
224 struct uvc_video
*video
= &uvc
->video
;
226 if (type
!= video
->queue
.queue
.type
)
229 return uvcg_video_enable(video
, 0);
233 uvc_v4l2_subscribe_event(struct v4l2_fh
*fh
,
234 const struct v4l2_event_subscription
*sub
)
236 if (sub
->type
< UVC_EVENT_FIRST
|| sub
->type
> UVC_EVENT_LAST
)
239 return v4l2_event_subscribe(fh
, sub
, 2, NULL
);
243 uvc_v4l2_unsubscribe_event(struct v4l2_fh
*fh
,
244 const struct v4l2_event_subscription
*sub
)
246 return v4l2_event_unsubscribe(fh
, sub
);
250 uvc_v4l2_ioctl_default(struct file
*file
, void *fh
, bool valid_prio
,
251 unsigned int cmd
, void *arg
)
253 struct video_device
*vdev
= video_devdata(file
);
254 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
257 case UVCIOC_SEND_RESPONSE
:
258 return uvc_send_response(uvc
, arg
);
265 const struct v4l2_ioctl_ops uvc_v4l2_ioctl_ops
= {
266 .vidioc_querycap
= uvc_v4l2_querycap
,
267 .vidioc_g_fmt_vid_out
= uvc_v4l2_get_format
,
268 .vidioc_s_fmt_vid_out
= uvc_v4l2_set_format
,
269 .vidioc_reqbufs
= uvc_v4l2_reqbufs
,
270 .vidioc_querybuf
= uvc_v4l2_querybuf
,
271 .vidioc_qbuf
= uvc_v4l2_qbuf
,
272 .vidioc_dqbuf
= uvc_v4l2_dqbuf
,
273 .vidioc_streamon
= uvc_v4l2_streamon
,
274 .vidioc_streamoff
= uvc_v4l2_streamoff
,
275 .vidioc_subscribe_event
= uvc_v4l2_subscribe_event
,
276 .vidioc_unsubscribe_event
= uvc_v4l2_unsubscribe_event
,
277 .vidioc_default
= uvc_v4l2_ioctl_default
,
280 /* --------------------------------------------------------------------------
285 uvc_v4l2_open(struct file
*file
)
287 struct video_device
*vdev
= video_devdata(file
);
288 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
289 struct uvc_file_handle
*handle
;
291 handle
= kzalloc(sizeof(*handle
), GFP_KERNEL
);
295 v4l2_fh_init(&handle
->vfh
, vdev
);
296 v4l2_fh_add(&handle
->vfh
);
298 handle
->device
= &uvc
->video
;
299 file
->private_data
= &handle
->vfh
;
301 uvc_function_connect(uvc
);
306 uvc_v4l2_release(struct file
*file
)
308 struct video_device
*vdev
= video_devdata(file
);
309 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
310 struct uvc_file_handle
*handle
= to_uvc_file_handle(file
->private_data
);
311 struct uvc_video
*video
= handle
->device
;
313 uvc_function_disconnect(uvc
);
315 mutex_lock(&video
->mutex
);
316 uvcg_video_enable(video
, 0);
317 uvcg_free_buffers(&video
->queue
);
318 mutex_unlock(&video
->mutex
);
320 file
->private_data
= NULL
;
321 v4l2_fh_del(&handle
->vfh
);
322 v4l2_fh_exit(&handle
->vfh
);
329 uvc_v4l2_mmap(struct file
*file
, struct vm_area_struct
*vma
)
331 struct video_device
*vdev
= video_devdata(file
);
332 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
334 return uvcg_queue_mmap(&uvc
->video
.queue
, vma
);
338 uvc_v4l2_poll(struct file
*file
, poll_table
*wait
)
340 struct video_device
*vdev
= video_devdata(file
);
341 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
343 return uvcg_queue_poll(&uvc
->video
.queue
, file
, wait
);
347 static unsigned long uvcg_v4l2_get_unmapped_area(struct file
*file
,
348 unsigned long addr
, unsigned long len
, unsigned long pgoff
,
351 struct video_device
*vdev
= video_devdata(file
);
352 struct uvc_device
*uvc
= video_get_drvdata(vdev
);
354 return uvcg_queue_get_unmapped_area(&uvc
->video
.queue
, pgoff
);
358 struct v4l2_file_operations uvc_v4l2_fops
= {
359 .owner
= THIS_MODULE
,
360 .open
= uvc_v4l2_open
,
361 .release
= uvc_v4l2_release
,
362 .unlocked_ioctl
= video_ioctl2
,
363 .mmap
= uvc_v4l2_mmap
,
364 .poll
= uvc_v4l2_poll
,
366 .get_unmapped_area
= uvcg_v4l2_get_unmapped_area
,