linux/drivers/usb/gadget/function/uvc_video.c
<<
>>
Prefs
   1/*
   2 *      uvc_video.c  --  USB Video Class Gadget driver
   3 *
   4 *      Copyright (C) 2009-2010
   5 *          Laurent Pinchart (laurent.pinchart@ideasonboard.com)
   6 *
   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.
  11 */
  12
  13#include <linux/kernel.h>
  14#include <linux/device.h>
  15#include <linux/errno.h>
  16#include <linux/usb/ch9.h>
  17#include <linux/usb/gadget.h>
  18#include <linux/usb/video.h>
  19
  20#include <media/v4l2-dev.h>
  21
  22#include "uvc.h"
  23#include "uvc_queue.h"
  24#include "uvc_video.h"
  25
  26/* --------------------------------------------------------------------------
  27 * Video codecs
  28 */
  29
  30static int
  31uvc_video_encode_header(struct uvc_video *video, struct uvc_buffer *buf,
  32                u8 *data, int len)
  33{
  34        data[0] = 2;
  35        data[1] = UVC_STREAM_EOH | video->fid;
  36
  37        if (buf->bytesused - video->queue.buf_used <= len - 2)
  38                data[1] |= UVC_STREAM_EOF;
  39
  40        return 2;
  41}
  42
  43static int
  44uvc_video_encode_data(struct uvc_video *video, struct uvc_buffer *buf,
  45                u8 *data, int len)
  46{
  47        struct uvc_video_queue *queue = &video->queue;
  48        unsigned int nbytes;
  49        void *mem;
  50
  51        /* Copy video data to the USB buffer. */
  52        mem = buf->mem + queue->buf_used;
  53        nbytes = min((unsigned int)len, buf->bytesused - queue->buf_used);
  54
  55        memcpy(data, mem, nbytes);
  56        queue->buf_used += nbytes;
  57
  58        return nbytes;
  59}
  60
  61static void
  62uvc_video_encode_bulk(struct usb_request *req, struct uvc_video *video,
  63                struct uvc_buffer *buf)
  64{
  65        void *mem = req->buf;
  66        int len = video->req_size;
  67        int ret;
  68
  69        /* Add a header at the beginning of the payload. */
  70        if (video->payload_size == 0) {
  71                ret = uvc_video_encode_header(video, buf, mem, len);
  72                video->payload_size += ret;
  73                mem += ret;
  74                len -= ret;
  75        }
  76
  77        /* Process video data. */
  78        len = min((int)(video->max_payload_size - video->payload_size), len);
  79        ret = uvc_video_encode_data(video, buf, mem, len);
  80
  81        video->payload_size += ret;
  82        len -= ret;
  83
  84        req->length = video->req_size - len;
  85        req->zero = video->payload_size == video->max_payload_size;
  86
  87        if (buf->bytesused == video->queue.buf_used) {
  88                video->queue.buf_used = 0;
  89                buf->state = UVC_BUF_STATE_DONE;
  90                uvcg_queue_next_buffer(&video->queue, buf);
  91                video->fid ^= UVC_STREAM_FID;
  92
  93                video->payload_size = 0;
  94        }
  95
  96        if (video->payload_size == video->max_payload_size ||
  97            buf->bytesused == video->queue.buf_used)
  98                video->payload_size = 0;
  99}
 100
 101static void
 102uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video,
 103                struct uvc_buffer *buf)
 104{
 105        void *mem = req->buf;
 106        int len = video->req_size;
 107        int ret;
 108
 109        /* Add the header. */
 110        ret = uvc_video_encode_header(video, buf, mem, len);
 111        mem += ret;
 112        len -= ret;
 113
 114        /* Process video data. */
 115        ret = uvc_video_encode_data(video, buf, mem, len);
 116        len -= ret;
 117
 118        req->length = video->req_size - len;
 119
 120        if (buf->bytesused == video->queue.buf_used) {
 121                video->queue.buf_used = 0;
 122                buf->state = UVC_BUF_STATE_DONE;
 123                uvcg_queue_next_buffer(&video->queue, buf);
 124                video->fid ^= UVC_STREAM_FID;
 125        }
 126}
 127
 128/* --------------------------------------------------------------------------
 129 * Request handling
 130 */
 131
 132/*
 133 * I somehow feel that synchronisation won't be easy to achieve here. We have
 134 * three events that control USB requests submission:
 135 *
 136 * - USB request completion: the completion handler will resubmit the request
 137 *   if a video buffer is available.
 138 *
 139 * - USB interface setting selection: in response to a SET_INTERFACE request,
 140 *   the handler will start streaming if a video buffer is available and if
 141 *   video is not currently streaming.
 142 *
 143 * - V4L2 buffer queueing: the driver will start streaming if video is not
 144 *   currently streaming.
 145 *
 146 * Race conditions between those 3 events might lead to deadlocks or other
 147 * nasty side effects.
 148 *
 149 * The "video currently streaming" condition can't be detected by the irqqueue
 150 * being empty, as a request can still be in flight. A separate "queue paused"
 151 * flag is thus needed.
 152 *
 153 * The paused flag will be set when we try to retrieve the irqqueue head if the
 154 * queue is empty, and cleared when we queue a buffer.
 155 *
 156 * The USB request completion handler will get the buffer at the irqqueue head
 157 * under protection of the queue spinlock. If the queue is empty, the streaming
 158 * paused flag will be set. Right after releasing the spinlock a userspace
 159 * application can queue a buffer. The flag will then cleared, and the ioctl
 160 * handler will restart the video stream.
 161 */
 162static void
 163uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
 164{
 165        struct uvc_video *video = req->context;
 166        struct uvc_video_queue *queue = &video->queue;
 167        struct uvc_buffer *buf;
 168        unsigned long flags;
 169        int ret;
 170
 171        switch (req->status) {
 172        case 0:
 173                break;
 174
 175        case -ESHUTDOWN:        /* disconnect from host. */
 176                printk(KERN_DEBUG "VS request cancelled.\n");
 177                uvcg_queue_cancel(queue, 1);
 178                goto requeue;
 179
 180        default:
 181                printk(KERN_INFO "VS request completed with status %d.\n",
 182                        req->status);
 183                uvcg_queue_cancel(queue, 0);
 184                goto requeue;
 185        }
 186
 187        spin_lock_irqsave(&video->queue.irqlock, flags);
 188        buf = uvcg_queue_head(&video->queue);
 189        if (buf == NULL) {
 190                spin_unlock_irqrestore(&video->queue.irqlock, flags);
 191                goto requeue;
 192        }
 193
 194        video->encode(req, video, buf);
 195
 196        if ((ret = usb_ep_queue(ep, req, GFP_ATOMIC)) < 0) {
 197                printk(KERN_INFO "Failed to queue request (%d).\n", ret);
 198                usb_ep_set_halt(ep);
 199                spin_unlock_irqrestore(&video->queue.irqlock, flags);
 200                uvcg_queue_cancel(queue, 0);
 201                goto requeue;
 202        }
 203        spin_unlock_irqrestore(&video->queue.irqlock, flags);
 204
 205        return;
 206
 207requeue:
 208        spin_lock_irqsave(&video->req_lock, flags);
 209        list_add_tail(&req->list, &video->req_free);
 210        spin_unlock_irqrestore(&video->req_lock, flags);
 211}
 212
 213static int
 214uvc_video_free_requests(struct uvc_video *video)
 215{
 216        unsigned int i;
 217
 218        for (i = 0; i < UVC_NUM_REQUESTS; ++i) {
 219                if (video->req[i]) {
 220                        usb_ep_free_request(video->ep, video->req[i]);
 221                        video->req[i] = NULL;
 222                }
 223
 224                if (video->req_buffer[i]) {
 225                        kfree(video->req_buffer[i]);
 226                        video->req_buffer[i] = NULL;
 227                }
 228        }
 229
 230        INIT_LIST_HEAD(&video->req_free);
 231        video->req_size = 0;
 232        return 0;
 233}
 234
 235static int
 236uvc_video_alloc_requests(struct uvc_video *video)
 237{
 238        unsigned int req_size;
 239        unsigned int i;
 240        int ret = -ENOMEM;
 241
 242        BUG_ON(video->req_size);
 243
 244        req_size = video->ep->maxpacket
 245                 * max_t(unsigned int, video->ep->maxburst, 1)
 246                 * (video->ep->mult + 1);
 247
 248        for (i = 0; i < UVC_NUM_REQUESTS; ++i) {
 249                video->req_buffer[i] = kmalloc(req_size, GFP_KERNEL);
 250                if (video->req_buffer[i] == NULL)
 251                        goto error;
 252
 253                video->req[i] = usb_ep_alloc_request(video->ep, GFP_KERNEL);
 254                if (video->req[i] == NULL)
 255                        goto error;
 256
 257                video->req[i]->buf = video->req_buffer[i];
 258                video->req[i]->length = 0;
 259                video->req[i]->complete = uvc_video_complete;
 260                video->req[i]->context = video;
 261
 262                list_add_tail(&video->req[i]->list, &video->req_free);
 263        }
 264
 265        video->req_size = req_size;
 266
 267        return 0;
 268
 269error:
 270        uvc_video_free_requests(video);
 271        return ret;
 272}
 273
 274/* --------------------------------------------------------------------------
 275 * Video streaming
 276 */
 277
 278/*
 279 * uvcg_video_pump - Pump video data into the USB requests
 280 *
 281 * This function fills the available USB requests (listed in req_free) with
 282 * video data from the queued buffers.
 283 */
 284int uvcg_video_pump(struct uvc_video *video)
 285{
 286        struct uvc_video_queue *queue = &video->queue;
 287        struct usb_request *req;
 288        struct uvc_buffer *buf;
 289        unsigned long flags;
 290        int ret;
 291
 292        /* FIXME TODO Race between uvcg_video_pump and requests completion
 293         * handler ???
 294         */
 295
 296        while (1) {
 297                /* Retrieve the first available USB request, protected by the
 298                 * request lock.
 299                 */
 300                spin_lock_irqsave(&video->req_lock, flags);
 301                if (list_empty(&video->req_free)) {
 302                        spin_unlock_irqrestore(&video->req_lock, flags);
 303                        return 0;
 304                }
 305                req = list_first_entry(&video->req_free, struct usb_request,
 306                                        list);
 307                list_del(&req->list);
 308                spin_unlock_irqrestore(&video->req_lock, flags);
 309
 310                /* Retrieve the first available video buffer and fill the
 311                 * request, protected by the video queue irqlock.
 312                 */
 313                spin_lock_irqsave(&queue->irqlock, flags);
 314                buf = uvcg_queue_head(queue);
 315                if (buf == NULL) {
 316                        spin_unlock_irqrestore(&queue->irqlock, flags);
 317                        break;
 318                }
 319
 320                video->encode(req, video, buf);
 321
 322                /* Queue the USB request */
 323                ret = usb_ep_queue(video->ep, req, GFP_ATOMIC);
 324                if (ret < 0) {
 325                        printk(KERN_INFO "Failed to queue request (%d)\n", ret);
 326                        usb_ep_set_halt(video->ep);
 327                        spin_unlock_irqrestore(&queue->irqlock, flags);
 328                        uvcg_queue_cancel(queue, 0);
 329                        break;
 330                }
 331                spin_unlock_irqrestore(&queue->irqlock, flags);
 332        }
 333
 334        spin_lock_irqsave(&video->req_lock, flags);
 335        list_add_tail(&req->list, &video->req_free);
 336        spin_unlock_irqrestore(&video->req_lock, flags);
 337        return 0;
 338}
 339
 340/*
 341 * Enable or disable the video stream.
 342 */
 343int uvcg_video_enable(struct uvc_video *video, int enable)
 344{
 345        unsigned int i;
 346        int ret;
 347
 348        if (video->ep == NULL) {
 349                printk(KERN_INFO "Video enable failed, device is "
 350                        "uninitialized.\n");
 351                return -ENODEV;
 352        }
 353
 354        if (!enable) {
 355                for (i = 0; i < UVC_NUM_REQUESTS; ++i)
 356                        if (video->req[i])
 357                                usb_ep_dequeue(video->ep, video->req[i]);
 358
 359                uvc_video_free_requests(video);
 360                uvcg_queue_enable(&video->queue, 0);
 361                return 0;
 362        }
 363
 364        if ((ret = uvcg_queue_enable(&video->queue, 1)) < 0)
 365                return ret;
 366
 367        if ((ret = uvc_video_alloc_requests(video)) < 0)
 368                return ret;
 369
 370        if (video->max_payload_size) {
 371                video->encode = uvc_video_encode_bulk;
 372                video->payload_size = 0;
 373        } else
 374                video->encode = uvc_video_encode_isoc;
 375
 376        return uvcg_video_pump(video);
 377}
 378
 379/*
 380 * Initialize the UVC video stream.
 381 */
 382int uvcg_video_init(struct uvc_video *video)
 383{
 384        INIT_LIST_HEAD(&video->req_free);
 385        spin_lock_init(&video->req_lock);
 386
 387        video->fcc = V4L2_PIX_FMT_YUYV;
 388        video->bpp = 16;
 389        video->width = 320;
 390        video->height = 240;
 391        video->imagesize = 320 * 240 * 2;
 392
 393        /* Initialize the video buffers queue. */
 394        uvcg_queue_init(&video->queue, V4L2_BUF_TYPE_VIDEO_OUTPUT,
 395                        &video->mutex);
 396        return 0;
 397}
 398
 399