Age | Commit message (Collapse) | Author |
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Just a development starter for now.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Add the missing closing parenthesis.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
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>
|
|
Trivial spelling fix.
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
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>
|
|
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>
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|