Compile uvc_queue, uvc_v4l2, uvc_video separately so that later they can be all combined in a separately compiled f_uvc. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> --- drivers/usb/gadget/Makefile | 2 +- drivers/usb/gadget/f_uvc.c | 2 + drivers/usb/gadget/f_uvc.h | 8 +++++++ drivers/usb/gadget/uvc.h | 1 + drivers/usb/gadget/uvc_queue.c | 42 +++++++++++++++++++-------------------- drivers/usb/gadget/uvc_queue.h | 35 +++++++++++++++++++++++++++++++++ drivers/usb/gadget/uvc_v4l2.c | 4 ++- drivers/usb/gadget/uvc_v4l2.h | 21 ++++++++++++++++++++ drivers/usb/gadget/uvc_video.c | 10 +++----- drivers/usb/gadget/uvc_video.h | 24 ++++++++++++++++++++++ drivers/usb/gadget/webcam.c | 6 +---- 11 files changed, 120 insertions(+), 35 deletions(-) create mode 100644 drivers/usb/gadget/uvc_v4l2.h create mode 100644 drivers/usb/gadget/uvc_video.h diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index f1af396..75bb72e 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -80,7 +80,7 @@ g_multi-y := multi.o g_hid-y := hid.o g_dbgp-y := dbgp.o g_nokia-y := nokia.o -g_webcam-y := webcam.o +g_webcam-y := webcam.o uvc_queue.o uvc_v4l2.o uvc_video.o g_ncm-y := ncm.o g_acm_ms-y := acm_ms.o g_tcm_usb_gadget-y := tcm_usb_gadget.o diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c index aecd2db..501f5cc 100644 --- a/drivers/usb/gadget/f_uvc.c +++ b/drivers/usb/gadget/f_uvc.c @@ -27,6 +27,8 @@ #include <media/v4l2-event.h> #include "uvc.h" +#include "uvc_video.h" +#include "uvc_v4l2.h" unsigned int uvc_gadget_trace_param; unsigned int streaming_interval; diff --git a/drivers/usb/gadget/f_uvc.h b/drivers/usb/gadget/f_uvc.h index 6732c0d..b27e05f 100644 --- a/drivers/usb/gadget/f_uvc.h +++ b/drivers/usb/gadget/f_uvc.h @@ -16,6 +16,14 @@ #include <linux/usb/composite.h> #include <linux/usb/video.h> +#include "uvc.h" + +void uvc_function_setup_continue(struct uvc_device *uvc); + +void uvc_function_connect(struct uvc_device *uvc); + +void uvc_function_disconnect(struct uvc_device *uvc); + int uvc_bind_config(struct usb_configuration *c, unsigned int streaming_interval_webcam, unsigned int streaming_maxpacket_webcam, diff --git a/drivers/usb/gadget/uvc.h b/drivers/usb/gadget/uvc.h index 7a9111d..33e82b9 100644 --- a/drivers/usb/gadget/uvc.h +++ b/drivers/usb/gadget/uvc.h @@ -58,6 +58,7 @@ struct uvc_event #include <linux/version.h> #include <media/v4l2-fh.h> #include <media/v4l2-device.h> +#include <linux/usb/composite.h> #include "uvc_queue.h" diff --git a/drivers/usb/gadget/uvc_queue.c b/drivers/usb/gadget/uvc_queue.c index 0bb5d50..aa25186 100644 --- a/drivers/usb/gadget/uvc_queue.c +++ b/drivers/usb/gadget/uvc_queue.c @@ -125,8 +125,7 @@ static struct vb2_ops uvc_queue_qops = { .wait_finish = uvc_wait_finish, }; -static int uvc_queue_init(struct uvc_video_queue *queue, - enum v4l2_buf_type type) +int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type) { int ret; @@ -151,7 +150,7 @@ static int uvc_queue_init(struct uvc_video_queue *queue, /* * Free the video buffers. */ -static void uvc_free_buffers(struct uvc_video_queue *queue) +void uvc_free_buffers(struct uvc_video_queue *queue) { mutex_lock(&queue->mutex); vb2_queue_release(&queue->queue); @@ -161,8 +160,8 @@ static void uvc_free_buffers(struct uvc_video_queue *queue) /* * Allocate the video buffers. */ -static int uvc_alloc_buffers(struct uvc_video_queue *queue, - struct v4l2_requestbuffers *rb) +int uvc_alloc_buffers(struct uvc_video_queue *queue, + struct v4l2_requestbuffers *rb) { int ret; @@ -173,8 +172,8 @@ static int uvc_alloc_buffers(struct uvc_video_queue *queue, return ret ? ret : rb->count; } -static int uvc_query_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *buf) +int uvc_query_buffer(struct uvc_video_queue *queue, + struct v4l2_buffer *buf) { int ret; @@ -185,8 +184,8 @@ static int uvc_query_buffer(struct uvc_video_queue *queue, return ret; } -static int uvc_queue_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *buf) +int uvc_queue_buffer(struct uvc_video_queue *queue, + struct v4l2_buffer *buf) { unsigned long flags; int ret; @@ -210,8 +209,8 @@ done: * Dequeue a video buffer. If nonblocking is false, block until a buffer is * available. */ -static int uvc_dequeue_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *buf, int nonblocking) +int uvc_dequeue_buffer(struct uvc_video_queue *queue, + struct v4l2_buffer *buf, int nonblocking) { int ret; @@ -228,8 +227,8 @@ static int uvc_dequeue_buffer(struct uvc_video_queue *queue, * This function implements video queue polling and is intended to be used by * the device poll handler. */ -static unsigned int uvc_queue_poll(struct uvc_video_queue *queue, - struct file *file, poll_table *wait) +unsigned int uvc_queue_poll(struct uvc_video_queue *queue, + struct file *file, poll_table *wait) { unsigned int ret; @@ -240,8 +239,7 @@ static unsigned int uvc_queue_poll(struct uvc_video_queue *queue, return ret; } -static int uvc_queue_mmap(struct uvc_video_queue *queue, - struct vm_area_struct *vma) +int uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma) { int ret; @@ -258,8 +256,8 @@ static int uvc_queue_mmap(struct uvc_video_queue *queue, * * NO-MMU arch need this function to make mmap() work correctly. */ -static unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, - unsigned long pgoff) +unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, + unsigned long pgoff) { unsigned long ret; @@ -282,7 +280,7 @@ static unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, * This function acquires the irq spinlock and can be called from interrupt * context. */ -static void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect) +void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect) { struct uvc_buffer *buf; unsigned long flags; @@ -323,7 +321,7 @@ static void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect) * This function can't be called from interrupt context. Use * uvc_queue_cancel() instead. */ -static int uvc_queue_enable(struct uvc_video_queue *queue, int enable) +int uvc_queue_enable(struct uvc_video_queue *queue, int enable) { unsigned long flags; int ret = 0; @@ -360,8 +358,8 @@ done: } /* called with &queue_irqlock held.. */ -static struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, - struct uvc_buffer *buf) +struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, + struct uvc_buffer *buf) { struct uvc_buffer *nextbuf; @@ -394,7 +392,7 @@ static struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, return nextbuf; } -static struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue) +struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue) { struct uvc_buffer *buf = NULL; diff --git a/drivers/usb/gadget/uvc_queue.h b/drivers/usb/gadget/uvc_queue.h index 8e76ce9..68e1f39 100644 --- a/drivers/usb/gadget/uvc_queue.h +++ b/drivers/usb/gadget/uvc_queue.h @@ -57,6 +57,41 @@ static inline int uvc_queue_streaming(struct uvc_video_queue *queue) return vb2_is_streaming(&queue->queue); } +int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type); + +void uvc_free_buffers(struct uvc_video_queue *queue); + +int uvc_alloc_buffers(struct uvc_video_queue *queue, + struct v4l2_requestbuffers *rb); + +int uvc_query_buffer(struct uvc_video_queue *queue, + struct v4l2_buffer *buf); + +int uvc_queue_buffer(struct uvc_video_queue *queue, + struct v4l2_buffer *buf); + +int uvc_dequeue_buffer(struct uvc_video_queue *queue, + struct v4l2_buffer *buf, int nonblocking); + +unsigned int uvc_queue_poll(struct uvc_video_queue *queue, + struct file *file, poll_table *wait); + +int uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma); + +#ifndef CONFIG_MMU +unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, + unsigned long pgoff); +#endif /* CONFIG_MMU */ + +void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect); + +int uvc_queue_enable(struct uvc_video_queue *queue, int enable); + +struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, + struct uvc_buffer *buf); + +struct uvc_buffer *uvc_queue_head(struct uvc_video_queue *queue); + #endif /* __KERNEL__ */ #endif /* _UVC_QUEUE_H_ */ diff --git a/drivers/usb/gadget/uvc_v4l2.c b/drivers/usb/gadget/uvc_v4l2.c index ad48e81..48774f3 100644 --- a/drivers/usb/gadget/uvc_v4l2.c +++ b/drivers/usb/gadget/uvc_v4l2.c @@ -24,7 +24,9 @@ #include <media/v4l2-ioctl.h> #include "uvc.h" +#include "f_uvc.h" #include "uvc_queue.h" +#include "uvc_video.h" /* -------------------------------------------------------------------------- * Requests handling @@ -351,7 +353,7 @@ static unsigned long uvc_v4l2_get_unmapped_area(struct file *file, } #endif -static struct v4l2_file_operations uvc_v4l2_fops = { +struct v4l2_file_operations uvc_v4l2_fops = { .owner = THIS_MODULE, .open = uvc_v4l2_open, .release = uvc_v4l2_release, diff --git a/drivers/usb/gadget/uvc_v4l2.h b/drivers/usb/gadget/uvc_v4l2.h new file mode 100644 index 0000000..ebcb1d1 --- /dev/null +++ b/drivers/usb/gadget/uvc_v4l2.h @@ -0,0 +1,21 @@ +/* + * uvc_v4l2.h -- USB Video Class Gadget driver + * + * Copyright (C) 2009-2010 + * Laurent Pinchart (laurent.pinchart@xxxxxxxxxxxxxxxx) + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * Author: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __UVC__V4L2__H__ +#define __UVC__V4L2__H__ + +extern struct v4l2_file_operations uvc_v4l2_fops; + +#endif /* __UVC__V4L2__H__ */ diff --git a/drivers/usb/gadget/uvc_video.c b/drivers/usb/gadget/uvc_video.c index 71e896d..2f6e31e 100644 --- a/drivers/usb/gadget/uvc_video.c +++ b/drivers/usb/gadget/uvc_video.c @@ -15,6 +15,7 @@ #include <linux/errno.h> #include <linux/usb/ch9.h> #include <linux/usb/gadget.h> +#include <linux/usb/video.h> #include <media/v4l2-dev.h> @@ -278,8 +279,7 @@ error: * This function fills the available USB requests (listed in req_free) with * video data from the queued buffers. */ -static int -uvc_video_pump(struct uvc_video *video) +int uvc_video_pump(struct uvc_video *video) { struct usb_request *req; struct uvc_buffer *buf; @@ -336,8 +336,7 @@ uvc_video_pump(struct uvc_video *video) /* * Enable or disable the video stream. */ -static int -uvc_video_enable(struct uvc_video *video, int enable) +int uvc_video_enable(struct uvc_video *video, int enable) { unsigned int i; int ret; @@ -375,8 +374,7 @@ uvc_video_enable(struct uvc_video *video, int enable) /* * Initialize the UVC video stream. */ -static int -uvc_video_init(struct uvc_video *video) +int uvc_video_init(struct uvc_video *video) { INIT_LIST_HEAD(&video->req_free); spin_lock_init(&video->req_lock); diff --git a/drivers/usb/gadget/uvc_video.h b/drivers/usb/gadget/uvc_video.h new file mode 100644 index 0000000..2283780 --- /dev/null +++ b/drivers/usb/gadget/uvc_video.h @@ -0,0 +1,24 @@ +/* + * uvc_video.h -- USB Video Class Gadget driver + * + * Copyright (C) 2009-2010 + * Laurent Pinchart (laurent.pinchart@xxxxxxxxxxxxxxxx) + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * Author: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __UVC__VIDEO__H__ +#define __UVC__VIDEO__H__ + +int uvc_video_pump(struct uvc_video *video); + +int uvc_video_enable(struct uvc_video *video, int enable); + +int uvc_video_init(struct uvc_video *video); + +#endif /* __UVC__VIDEO__H__ */ diff --git a/drivers/usb/gadget/webcam.c b/drivers/usb/gadget/webcam.c index 6809dc2..62d4bf3 100644 --- a/drivers/usb/gadget/webcam.c +++ b/drivers/usb/gadget/webcam.c @@ -12,10 +12,9 @@ #include <linux/kernel.h> #include <linux/device.h> +#include <linux/module.h> #include <linux/usb/video.h> -#include "f_uvc.h" - /* * Kbuild is not very cooperative with respect to linking separately * compiled library objects into one module. So for now we won't use @@ -23,9 +22,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "uvc_queue.c" -#include "uvc_video.c" -#include "uvc_v4l2.c" #include "f_uvc.c" USB_GADGET_COMPOSITE_OPTIONS(); -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html