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