This source file includes following definitions.
- uvc_video_encode_header
- uvc_video_encode_data
- uvc_video_encode_bulk
- uvc_video_encode_isoc
- uvcg_video_ep_queue
- uvc_video_complete
- uvc_video_free_requests
- uvc_video_alloc_requests
- uvcg_video_pump
- uvcg_video_enable
- uvcg_video_init
1
2
3
4
5
6
7
8
9 #include <linux/kernel.h>
10 #include <linux/device.h>
11 #include <linux/errno.h>
12 #include <linux/usb/ch9.h>
13 #include <linux/usb/gadget.h>
14 #include <linux/usb/video.h>
15
16 #include <media/v4l2-dev.h>
17
18 #include "uvc.h"
19 #include "uvc_queue.h"
20 #include "uvc_video.h"
21
22
23
24
25
26 static int
27 uvc_video_encode_header(struct uvc_video *video, struct uvc_buffer *buf,
28 u8 *data, int len)
29 {
30 data[0] = 2;
31 data[1] = UVC_STREAM_EOH | video->fid;
32
33 if (buf->bytesused - video->queue.buf_used <= len - 2)
34 data[1] |= UVC_STREAM_EOF;
35
36 return 2;
37 }
38
39 static int
40 uvc_video_encode_data(struct uvc_video *video, struct uvc_buffer *buf,
41 u8 *data, int len)
42 {
43 struct uvc_video_queue *queue = &video->queue;
44 unsigned int nbytes;
45 void *mem;
46
47
48 mem = buf->mem + queue->buf_used;
49 nbytes = min((unsigned int)len, buf->bytesused - queue->buf_used);
50
51 memcpy(data, mem, nbytes);
52 queue->buf_used += nbytes;
53
54 return nbytes;
55 }
56
57 static void
58 uvc_video_encode_bulk(struct usb_request *req, struct uvc_video *video,
59 struct uvc_buffer *buf)
60 {
61 void *mem = req->buf;
62 int len = video->req_size;
63 int ret;
64
65
66 if (video->payload_size == 0) {
67 ret = uvc_video_encode_header(video, buf, mem, len);
68 video->payload_size += ret;
69 mem += ret;
70 len -= ret;
71 }
72
73
74 len = min((int)(video->max_payload_size - video->payload_size), len);
75 ret = uvc_video_encode_data(video, buf, mem, len);
76
77 video->payload_size += ret;
78 len -= ret;
79
80 req->length = video->req_size - len;
81 req->zero = video->payload_size == video->max_payload_size;
82
83 if (buf->bytesused == video->queue.buf_used) {
84 video->queue.buf_used = 0;
85 buf->state = UVC_BUF_STATE_DONE;
86 uvcg_queue_next_buffer(&video->queue, buf);
87 video->fid ^= UVC_STREAM_FID;
88
89 video->payload_size = 0;
90 }
91
92 if (video->payload_size == video->max_payload_size ||
93 buf->bytesused == video->queue.buf_used)
94 video->payload_size = 0;
95 }
96
97 static void
98 uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video,
99 struct uvc_buffer *buf)
100 {
101 void *mem = req->buf;
102 int len = video->req_size;
103 int ret;
104
105
106 ret = uvc_video_encode_header(video, buf, mem, len);
107 mem += ret;
108 len -= ret;
109
110
111 ret = uvc_video_encode_data(video, buf, mem, len);
112 len -= ret;
113
114 req->length = video->req_size - len;
115
116 if (buf->bytesused == video->queue.buf_used) {
117 video->queue.buf_used = 0;
118 buf->state = UVC_BUF_STATE_DONE;
119 uvcg_queue_next_buffer(&video->queue, buf);
120 video->fid ^= UVC_STREAM_FID;
121 }
122 }
123
124
125
126
127
128 static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req)
129 {
130 int ret;
131
132 ret = usb_ep_queue(video->ep, req, GFP_ATOMIC);
133 if (ret < 0) {
134 uvcg_err(&video->uvc->func, "Failed to queue request (%d).\n",
135 ret);
136
137
138 if (usb_endpoint_xfer_bulk(video->ep->desc))
139 usb_ep_set_halt(video->ep);
140 }
141
142 return ret;
143 }
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175 static void
176 uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
177 {
178 struct uvc_video *video = req->context;
179 struct uvc_video_queue *queue = &video->queue;
180 struct uvc_buffer *buf;
181 unsigned long flags;
182 int ret;
183
184 switch (req->status) {
185 case 0:
186 break;
187
188 case -ESHUTDOWN:
189 uvcg_dbg(&video->uvc->func, "VS request cancelled.\n");
190 uvcg_queue_cancel(queue, 1);
191 goto requeue;
192
193 default:
194 uvcg_info(&video->uvc->func,
195 "VS request completed with status %d.\n",
196 req->status);
197 uvcg_queue_cancel(queue, 0);
198 goto requeue;
199 }
200
201 spin_lock_irqsave(&video->queue.irqlock, flags);
202 buf = uvcg_queue_head(&video->queue);
203 if (buf == NULL) {
204 spin_unlock_irqrestore(&video->queue.irqlock, flags);
205 goto requeue;
206 }
207
208 video->encode(req, video, buf);
209
210 ret = uvcg_video_ep_queue(video, req);
211 spin_unlock_irqrestore(&video->queue.irqlock, flags);
212
213 if (ret < 0) {
214 uvcg_queue_cancel(queue, 0);
215 goto requeue;
216 }
217
218 return;
219
220 requeue:
221 spin_lock_irqsave(&video->req_lock, flags);
222 list_add_tail(&req->list, &video->req_free);
223 spin_unlock_irqrestore(&video->req_lock, flags);
224 }
225
226 static int
227 uvc_video_free_requests(struct uvc_video *video)
228 {
229 unsigned int i;
230
231 for (i = 0; i < UVC_NUM_REQUESTS; ++i) {
232 if (video->req[i]) {
233 usb_ep_free_request(video->ep, video->req[i]);
234 video->req[i] = NULL;
235 }
236
237 if (video->req_buffer[i]) {
238 kfree(video->req_buffer[i]);
239 video->req_buffer[i] = NULL;
240 }
241 }
242
243 INIT_LIST_HEAD(&video->req_free);
244 video->req_size = 0;
245 return 0;
246 }
247
248 static int
249 uvc_video_alloc_requests(struct uvc_video *video)
250 {
251 unsigned int req_size;
252 unsigned int i;
253 int ret = -ENOMEM;
254
255 BUG_ON(video->req_size);
256
257 req_size = video->ep->maxpacket
258 * max_t(unsigned int, video->ep->maxburst, 1)
259 * (video->ep->mult);
260
261 for (i = 0; i < UVC_NUM_REQUESTS; ++i) {
262 video->req_buffer[i] = kmalloc(req_size, GFP_KERNEL);
263 if (video->req_buffer[i] == NULL)
264 goto error;
265
266 video->req[i] = usb_ep_alloc_request(video->ep, GFP_KERNEL);
267 if (video->req[i] == NULL)
268 goto error;
269
270 video->req[i]->buf = video->req_buffer[i];
271 video->req[i]->length = 0;
272 video->req[i]->complete = uvc_video_complete;
273 video->req[i]->context = video;
274
275 list_add_tail(&video->req[i]->list, &video->req_free);
276 }
277
278 video->req_size = req_size;
279
280 return 0;
281
282 error:
283 uvc_video_free_requests(video);
284 return ret;
285 }
286
287
288
289
290
291
292
293
294
295
296
297 int uvcg_video_pump(struct uvc_video *video)
298 {
299 struct uvc_video_queue *queue = &video->queue;
300 struct usb_request *req;
301 struct uvc_buffer *buf;
302 unsigned long flags;
303 int ret;
304
305
306
307
308
309 while (1) {
310
311
312
313 spin_lock_irqsave(&video->req_lock, flags);
314 if (list_empty(&video->req_free)) {
315 spin_unlock_irqrestore(&video->req_lock, flags);
316 return 0;
317 }
318 req = list_first_entry(&video->req_free, struct usb_request,
319 list);
320 list_del(&req->list);
321 spin_unlock_irqrestore(&video->req_lock, flags);
322
323
324
325
326 spin_lock_irqsave(&queue->irqlock, flags);
327 buf = uvcg_queue_head(queue);
328 if (buf == NULL) {
329 spin_unlock_irqrestore(&queue->irqlock, flags);
330 break;
331 }
332
333 video->encode(req, video, buf);
334
335
336 ret = uvcg_video_ep_queue(video, req);
337 spin_unlock_irqrestore(&queue->irqlock, flags);
338
339 if (ret < 0) {
340 uvcg_queue_cancel(queue, 0);
341 break;
342 }
343 }
344
345 spin_lock_irqsave(&video->req_lock, flags);
346 list_add_tail(&req->list, &video->req_free);
347 spin_unlock_irqrestore(&video->req_lock, flags);
348 return 0;
349 }
350
351
352
353
354 int uvcg_video_enable(struct uvc_video *video, int enable)
355 {
356 unsigned int i;
357 int ret;
358
359 if (video->ep == NULL) {
360 uvcg_info(&video->uvc->func,
361 "Video enable failed, device is uninitialized.\n");
362 return -ENODEV;
363 }
364
365 if (!enable) {
366 for (i = 0; i < UVC_NUM_REQUESTS; ++i)
367 if (video->req[i])
368 usb_ep_dequeue(video->ep, video->req[i]);
369
370 uvc_video_free_requests(video);
371 uvcg_queue_enable(&video->queue, 0);
372 return 0;
373 }
374
375 if ((ret = uvcg_queue_enable(&video->queue, 1)) < 0)
376 return ret;
377
378 if ((ret = uvc_video_alloc_requests(video)) < 0)
379 return ret;
380
381 if (video->max_payload_size) {
382 video->encode = uvc_video_encode_bulk;
383 video->payload_size = 0;
384 } else
385 video->encode = uvc_video_encode_isoc;
386
387 return uvcg_video_pump(video);
388 }
389
390
391
392
393 int uvcg_video_init(struct uvc_video *video, struct uvc_device *uvc)
394 {
395 INIT_LIST_HEAD(&video->req_free);
396 spin_lock_init(&video->req_lock);
397
398 video->uvc = uvc;
399 video->fcc = V4L2_PIX_FMT_YUYV;
400 video->bpp = 16;
401 video->width = 320;
402 video->height = 240;
403 video->imagesize = 320 * 240 * 2;
404
405
406 uvcg_queue_init(&video->queue, V4L2_BUF_TYPE_VIDEO_OUTPUT,
407 &video->mutex);
408 return 0;
409 }
410