summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2018-07-31lib: configfs: Detect configfs mount pointKieran Bingham
Parse /proc/mounts to identify the correct mount location of the ConfigFS filesystem. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: Compile custom glob() implementation for AndroidPaul Elder
The Android C library doesn't provide the glob() function which we use in the configfs code. Add conditional compilation to cmake such that a local copy of glob is automatically compiled if glob isn't provided. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: glob: Fix compilation on AndroidLaurent Pinchart
The glibc glob() implementation doesn't compile on Android due to missing support for getlogin_r (before Android ABI 28) and to missing __THROW, __THROWNL and __attribute_noinline__ macros. getlogin_r is only used to implement support for the '~' path component which we don't use in the uvc-gadget library, so we can compile it out. The three macros can safely be defined as no-op. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: glob: Fix compilationLaurent Pinchart
The glibc glob() implementation seems to be meant to be compilable outside of glibc, but that clearly hasn't been tested for some time. Fix compilation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: Import glob.c from glibc 2.26Laurent Pinchart
The Android libc implementation (bionic) doesn't provide the glob() function. To enable compilation of the UVC gadget library for Android, import the glibc glob() implementation. The glob.c and glob.h files are imported unmodified to ease copyright management, even if they don't compile as-is. Compilation will be fixed separately. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: configfs: Globalize nested configfs callback functionsPaul Elder
Android now uses clang as the default C compiler, and gcc support is deprecated. clang doesn't support nested functions, which were used to implement callback functions in the ConfigFS code. We thus move the callbacks to the global scope. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: configfs: Fix asprintf return value usageKieran Bingham
The asprintf function returns -1, and leaves the first parameter undefined in case of an allocation error. This conflicts with the code's assumption that the parameter is set NULL on error. Check all return values of asprintf, and ensure that the string parameter is not used as a return value on error paths. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12uvc: check ioctl return value for errorPaul Elder
There is code that is meant to check for the error of an ioctl, but the return variable that it checks isn't actually assigned from the ioctl. Assign the return value before checking it. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> [Fixed error message] Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Add README.md fileLaurent Pinchart
Start by adding short build instructions. The documentation should be expanded later. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Import the g_uvc.h header from the kernel sourcesLaurent Pinchart
In order to avoid depending on an external kernel source tree recent enough to provide the g_uvc.h header, import in the the project. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12lib: Relicense code under the LGPL-2.1+Laurent Pinchart
To allow usage of the UVC gadget library in closed-source or otherwise GPL-incompatible applications, relicense the library under the terms of the LGPL v2.1 or later, as published by the Free Software Foundation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Update copyright dates and ownerLaurent Pinchart
Ideas on Board SPRL, the original copyright owner of the UVC gadget application code, has been dissolved. All company copyrights have been transferred to Laurent Pinchart. Update the copyright notices to accordingly. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Use SPDX headersLaurent Pinchart
Replace the boilerplate copyright headers with an SPDX header to ease license compliance. This doesn't change the license of any of the files. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Split UVC gadget into a library and test applicationLaurent Pinchart
Split the project into a UVC gadget library and a test application. To avoid rolling out a custom build system, switch to CMake. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: Fix file description headerLaurent Pinchart
The file description came from a bad copy&paste, fix it. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Make uvc_device structure opaqueLaurent Pinchart
The internals of the uvc_device structure should not be accessed outside of uvc.c. The only existing need to access the structure internals is in stream.c, where access to the UVC V4L2 device is needed. To avoid that, create an accessor function uvc_v4l2_device(), and make the structure private. Ideally the UVC V4L2 device should not be exposed. This can be achieved by creating an abstract video sink class to handle the UVC video sink. This is however out of scope for now. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: Use abstract video sourcesLaurent Pinchart
Replace the manual V4L2 capture implementation by an abstract video_source, provided by the user of the UVC stream. Removes any knowledge of the video source internals from the uvc_stream class, allowing usage of different source types. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09Makefile: Suppress unused parameter warningsLaurent Pinchart
When implementing callback APIs, it is common to not use some of the parameters to the callback functions. Instead of requiring the user of the callback to annotate unused parameters manually, suppress the warning. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09v4l2-source: Add V4L2 source classLaurent Pinchart
The v4l2_source class is an implementation of the video_source class that uses a V4L2 capture device to provide video. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09video-source: Add abstract video source classLaurent Pinchart
The video_source is an abstract class representing a source of video buffers. It can be subclassed by implementing the video_source_ops operations to support different types of video sources. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09v4l2: Extract video buffer structure to separate fileLaurent Pinchart
The v4l2_video_buffer structure describes a video buffer. It is used by the v4l2_device class only, but isn't otherwise tied to V4L2. To prepare for non-V4L2 video sources, extract it to a separate file and rename it to video_buffer. At the same time, add a new video_buffer_set structure to represent as set of video buffers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Initialize the maxsize field internallyLaurent Pinchart
The uvc_device maxsize field is initialized in stream.c, requiring access to the uvc_device internals. Move its initialization to uvc.c. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Add API to set video formatLaurent Pinchart
Add a uvc_setformat() function to set the format for the UVC video stream instead of accessing the internals of the uvc_device in stream.c. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Add API to set function configurationLaurent Pinchart
Add a uvc_set_config() function to set the UVC function configuration instead of accessing the internals of the uvc_device in stream.c. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: Make the uvc_stream structure opaqueLaurent Pinchart
The internals of the uvc_stream structure don't need to be accessed outside stream.c. Move the structure definition from stream.h to stream.c to make it opaque. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Handle UVC events internally in uvc.cLaurent Pinchart
The event notifier for the UVC device is registered in uvc_stream_set_event_handler(), which requires exposing the uvc_events_process() event handler to the uvc_stream class. Make the event handler internal by registering it in uvc_events_init(). This requires passing the uvc_stream pointer to the uvc_open() function and storing it internally in the uvc_device object. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: add documentationPaul Elder
Add documentation to functions in stream.h header file. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc-gadget: factor out uvc protocol and stream handling codePaul Elder
uvc-gadget.c has been getting cluttered with functions related to UVC protocol handling and stream handling. Additionally, it is forseen that we might want stream handling to be modular for different system models. Factor out code related to UVC protocol handling to uvc.c (and uvc.h) and code related to stream handling to stream.c (and stream.h), and update the Makefile accordingly. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-08uvc-gadget.sh: add new default frame sizesPaul Elder
Create a couple more frame sizes through configfs. This is so that we can test by default with multiple frame sizes. The frame sizes are instantiated in a non-sorted order purposefully to test and make sure that bFrameIndex parsing is done properly by all involved components. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-08uvc-gadget.sh: add function to create frame sizePaul Elder
Currently there are a set of files that need to be written to in configfs to instantiate a single frame size of a UVC function. Add a function create_frame() to do this in one call. There is no delete_frame() since delete_uvc() will delete the frame settings. Previously delete_uvc() only deleted the single frame size, so this has been changed to a wildcard to catch all frame sizes. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-05configfs: add support for bFrameIndexPaul Elder
Driver now supports bFrameIndex through configfs; enable reading this attribute from configfs. This is necessary to associate the correct bFrameIndexes with the UVC frame descriptors. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-01uvc-gadget: Don't hardcode the maximum payload transfer sizeLaurent Pinchart
Use the streaming endpoint maximum packet size parsed from ConfigFS instead of hardcoding an arbitrary value. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-06-01uvc-gadget: Don't hardcode formats and frame sizesLaurent Pinchart
Replace the hardcode formats and frame sizes with the configuration read from ConfigFS. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-06-01configfs: Parse UVC formats, frames and intervalsLaurent Pinchart
Extend the ConfigFS parser to parse UVC formats and intervals. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-06-01configfs: Restructure attribute read to support binary attributesLaurent Pinchart
Modify the attribute_read() function to not add a terminating 0 to the buffer, and to return the number of bytes read, in order to support binary attributes. The attribute_read_uint() and attribute_read_str() functions are modified accordingly to use the new attribute_read() semantics. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-06-01configfs: Refactor ConfigFS parsing codeLaurent Pinchart
Move all attribute parsing to a top-level configfs_parse_uvc() function, and split control and streaming interface attributes to two separate helper functions. In addition to making the code more structured, it will also allow supporting multiple streaming interfaces in a single UVC function in the future. The uvc_function_config structure is similarly reorganized in a hierarchical representation of the configuration. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-06-01configfs: Document the uvc_function_config structureLaurent Pinchart
The structure is part of the API towards the UVC gadget application, document it. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
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>