summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2018-06-01configfs: Don't guess interface numbers if they can't be parsedLaurent Pinchart
Interface numbers are crucial parameters required for proper UVC gadget operation. If we can't parse them from ConfigFS there's little point in falling back to defaults that have a high chance being wrong. Treating that case as a fatal error is better to get the root cause fixed. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-05-26configfs: Handle interface numbersKieran Bingham
Store the function configuration pointer in the uvc_device, and use it to identify and store the interface numbers from configfs. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-26configfs: Provide configfs supportKieran Bingham
Parse a configuration name from the commandline, and utilise it to identify the configfs configuration path. Only the short-name (i.e. "uvc.1") is necessary to provide if there is no ambiguity regarding the gadget, otherwise the gadget path should be included ("g1/functions/uvc.1"). If the parameter is not provided then the first function is utilised. Legacy g_webcam is still supported, and the parameter will define the UDC to match against if provided. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-26scripts: Provide a multi-function config scriptKieran Bingham
Just a development starter for now. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24uvc-gadget: Implement streaming from a capture devicePaul Elder
Capture frames from v4l2 capture device and send frames to uvc gadget output device. This is done by passing buffers between these two devices; the buffers are shared through V4L2_MEMORY_DMABUF. Empty buffers dequeued from the uvc device are enqueued into the v4l2 capture device, from which full buffers are dequeued and enqueued back into the uvc device. Implement and use functions to ease manipulation of the capture device, and remove uvc_fill_buffer, as it is no longer needed to fill frames from a non-v4l2 capture source. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24uvc-gadget: Add struct uvc_streamPaul Elder
Since we are preparing to stream frames from a capture v4l2 device to uvc-gadget, add a struct to represent this "frame-forwarding" stream, such that it contains a representation of the uvc gadget device (struct uvc_device) and other data relative to the stream, such as a pointer to the events handler and test pattern generation data. A capture v4l2 device object will be added in a subsequent modification. The stream is allocated dynamically, and the event handler is created separately from the stream. This will allow replacing the event handling mechanism with a different implementation without impacting the stream implementation. Change the argument to functions that need to be able to access stream data from uvc_device to uvc_stream. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24uvc-gadget: Remove bulk supportLaurent Pinchart
Bulk mode is only partially implemented, and it hinders development of the application. Remove it for now, it will be added back properly in the future. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24uvc-gadget: Constify request data pointersLaurent Pinchart
The request data passed from the UVC event handler to processing functions should never be modified. Make it const through the code. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24uvc-gadget: Use uvc_fill_streaming_control in uvc_events_process_dataLaurent Pinchart
The uvc_events_process_data() function looks up format and frame descriptors to fill the streaming control structure. This duplicates code from the uvc_fill_streaming_control() function. Refactor the function to make it usable in uvc_events_process_data() and remove the duplicated code. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24v4l2: Query buffer sizes when exporting buffersLaurent Pinchart
In order to properly import buffers, the size of each buffer to be imported must be known. The size is queried when the buffers are mmap()ed, but mapping them isn't mandatory. Query the size when exporting buffers to ensure that we always have a valid size for import. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-24v4l2: Fix typo in error messageLaurent Pinchart
Add the missing closing parenthesis. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-23v4l2: Document expected fallthroughKieran Bingham
Compilers may now enable warnings for implicit fallthrough of switch case statements, to help catch errors. One such case is highlighted in our v4l2 module: v4l2.c: In function ‘v4l2_enum_frame_sizes’: v4l2.c:179:23: warning: this statement may fall through [-Wimplicit-fallthrough=] frame->step_height = frmenum.stepwise.step_height; ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ v4l2.c:180:3: note: here case V4L2_FRMSIZE_TYPE_CONTINUOUS: ^~~~ This fall through is expected, and the warning can be removed simply by adding a comment to confirm that. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22uvc-gadget: Correct spelling of necessaryKieran Bingham
Trivial spelling fix. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-05-22uvc-gadget: Sort include headersKieran Bingham
Fix the sort order of the header include sections. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22v4l2: Replace USERPTR support with DMABUF supportLaurent Pinchart
V4L2_MEMORY_USERPTR is deprecated, replace it with V4L2_MEMORY_DMABUF support for buffer sharing. Two new functions are added, v4l2_export_buffers() to export previously allocated buffers as dmabuf objects, and v4l2_import_buffers() to import dmabuf objects as backing store for V4L2 buffers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22v4l2: Split buffer allocation and mappingLaurent Pinchart
Not all use cases of V4L2_MEMORY_MMAP require mapping buffers to userspace. Separate the allocation and mapping to allow usage of unmapped buffers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22uvc-gadget: Use V4L2 helper functionsLaurent Pinchart
Replace the manual implementation of the V4L2 ioctls with the V4L2 helper functions from v4l2.c. This cleans up the code and simplifies handling of the V4L2 API. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22v4l2: Fail v4l2_alloc_buffers() when buffers are already allocatedLaurent Pinchart
Allocating buffers allocates resources that must be explicitly freed. Calling v4l2_alloc_buffers() a second time without freeing the buffers in between causes memory leaks and must not be allowed. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22v4l2: Free v4l2_device object when closing itLaurent Pinchart
The v4l2_device object is allocated dynamically by v4l2_open(), free it in v4l2_close() to make the API symmetrical. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-22v4l2: Import V4L2 support code from omap3-isp-liveLaurent Pinchart
The omap3-isp-live project [1] includes generic V4L2 support code that implements the V4L2 API. Instead of reinventing the wheel, import the code and use it. The code has been modified to merge the V4L2 buffers pool implementation in the V4L2 support code as the abstraction wasn't right for the uvc-gadget project. Further refactoring will be performed separately. The original license hasn't been modified from the original LGPL-2.1+. The sole copyright owner is Laurent Pinchart. [1] git://git.ideasonboard.org/omap3-isp-live.git Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21uvc-gadget: Use macros from tools.hLaurent Pinchart
The tools.h header defines clamp and ARRAY_SIZE macros. Use the header to replace the private implementation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21uvc-gadget: Dynamically watch/unwatch uvc device fdPaul Elder
When the uvc device fd is put on the watch list statically, then there are many "Unable to dequeue buffer: Invalid argument (22)." because the V4L2 API returns write events immediately when the stream is off. To fix this, add the fd to the watch list on streamon, and remove it on streamoff. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21uvc-gadget: Use events libraryPaul Elder
Replace the manual implementation of the select-based event loop with the events library. This cleans up the code and simplifies event handling. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21events: Remove select timeoutPaul Elder
The reason why no timeout is needed is twofold: When the stream is off extensive periods of time can pass without an event occurring if the host doesn't send any UVC request. As that period of time is unbound, we can't set any meaningful timeout. When the stream is on buffers are supposed to flow constantly. If buffers stop flowing that would indicate a bug somewhere in the stack, which could be caught by a timeout, but that we wouldn't be able to recover from anyway. The timeout is thus not needed and harmful when the stream is off. Remove it. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21events: Switch to _DEFAULT_SOURCEPaul Elder
glibc version 2.27 warns that _BSD_SOURCE is deprecated in favour of _DEFAULT _SOURCE: # warning "_BSD_SOURCE and _SVID_SOURCE are deprecated, use _DEFAULT_SOURCE" Fix the source code accordingly. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21events: Add a cleanup functionLaurent Pinchart
Add events to the watch list allocates memory. Add a cleanup function to free all memory at cleanup time without having to remove all events explicitly one by one. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21events: Extend the events_unwatch_fd() API with an event typeLaurent Pinchart
If a single file descriptor is being watch for multiple event types, it will be present in multiple entries in the watch list. The events_unwatch_fd() function will remove the first entry regardless of its type, not allowing removal of a particular event type. Fix this by extending the events_unwatch_fd() API to take an event type, and remove the corresponding entry. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21events: Import event handling library from omap3-isp-liveLaurent Pinchart
The omap3-isp-live project [1] includes a generic event handling library that implements a select-based loop. Instead of reinventing the wheel, import the library and use it. The original license hasn't been modified, and includes both GPL-2.0+ and LGPL-2.1+ code. The sole copyright owner is Laurent Pinchart. [1] git://git.ideasonboard.org/omap3-isp-live.git Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-21uvc-gadget: Add .gitignore filePaul Elder
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-05-20uvc-gadget: Use new kernel API headerLaurent Pinchart
The UVC gadget driver now defines its API in the linux/usb/g_uvc.h public header, use it instead of including an internal kernel header through a relative path. The public API doesn't define the UVC_INTF_CONTROL and UVC_INTF_STREAMING macros, define them locally until we can get rid of them. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2017-03-06uvc-gadget: Do not send Set Interface (alternate setting) response twiceRoger Quadros
On alternate setting change, the webcam gadget sends us a UVC_EVENT_STREAMON or UVC_EVENT_STREAMOFF event. In the first case, the driver will issue a delayed status response automatically when we call the VIDIOC_STREAMON ioctl. In the second case, the driver sends the status response immediately. We must thus not send the status response manually with UVCIOC_SEND_RESPONSE in any of those cases. Without this, the ISO streaming doesn't work if host application (e.g. luvcview) is closed and restarted. On dwc3 gadget controller it was resulting in Buffer Expiry error on the ISO endpoint. Signed-off-by: Roger Quadros <rogerq@ti.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2010-06-07Initial importLaurent Pinchart
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>