blob: d81bbf23b6b18e62936f3b0f2338b139b8f81f95 [file] [log] [blame]
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -03001
2V4L2 events
3-----------
4
5The V4L2 events provide a generic way to pass events to user space.
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -03006The driver must use :c:type:`v4l2_fh` to be able to support V4L2 events.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -03007
8Events are defined by a type and an optional ID. The ID may refer to a V4L2
9object such as a control ID. If unused, then the ID is 0.
10
11When the user subscribes to an event the driver will allocate a number of
12kevent structs for that event. So every (type, ID) event tuple will have
13its own set of kevent structs. This guarantees that if a driver is generating
14lots of events of one type in a short time, then that will not overwrite
15events of another type.
16
17But if you get more events of one type than the number of kevents that were
18reserved, then the oldest event will be dropped and the new one added.
19
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030020Furthermore, the internal struct :c:type:`v4l2_subscribed_event` has
21``merge()`` and ``replace()`` callbacks which drivers can set. These
22callbacks are called when a new event is raised and there is no more room.
23The ``replace()`` callback allows you to replace the payload of the old event
24with that of the new event, merging any relevant data from the old payload
25into the new payload that replaces it. It is called when this event type has
26only one kevent struct allocated. The ``merge()`` callback allows you to merge
27the oldest event payload into that of the second-oldest event payload. It is
28called when there are two or more kevent structs allocated.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030029
30This way no status information is lost, just the intermediate steps leading
31up to that state.
32
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030033A good example of these ``replace``/``merge`` callbacks is in v4l2-event.c:
34``ctrls_replace()`` and ``ctrls_merge()`` callbacks for the control event.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030035
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030036.. note::
37 these callbacks can be called from interrupt context, so they must
38 be fast.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030039
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030040In order to queue events to video device, drivers should call:
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030041
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030042 :cpp:func:`v4l2_event_queue <v4l2_event_queue>`
43 (:c:type:`vdev <video_device>`, :ref:`ev <v4l2-event>`)
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030044
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030045The driver's only responsibility is to fill in the type and the data fields.
46The other fields will be filled in by V4L2.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030047
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030048Event subscription
49~~~~~~~~~~~~~~~~~~
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030050
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030051Subscribing to an event is via:
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030052
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030053 :cpp:func:`v4l2_event_subscribe <v4l2_event_subscribe>`
54 (:c:type:`fh <v4l2_fh>`, :ref:`sub <v4l2-event-subscription>` ,
55 elems, :c:type:`ops <v4l2_subscribed_event_ops>`)
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030056
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030057
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030058This function is used to implement :c:type:`video_device`->
59:c:type:`ioctl_ops <v4l2_ioctl_ops>`-> ``vidioc_subscribe_event``,
60but the driver must check first if the driver is able to produce events
61with specified event id, and then should call
62:cpp:func:`v4l2_event_subscribe` to subscribe the event.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030063
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030064The elems argument is the size of the event queue for this event. If it is 0,
65then the framework will fill in a default value (this depends on the event
66type).
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030067
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030068The ops argument allows the driver to specify a number of callbacks:
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030069
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030070======== ==============================================================
71Callback Description
72======== ==============================================================
73add called when a new listener gets added (subscribing to the same
74 event twice will only cause this callback to get called once)
75del called when a listener stops listening
76replace replace event 'old' with event 'new'.
77merge merge event 'old' into event 'new'.
78======== ==============================================================
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030079
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030080All 4 callbacks are optional, if you don't want to specify any callbacks
81the ops argument itself maybe ``NULL``.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030082
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030083Unsubscribing an event
84~~~~~~~~~~~~~~~~~~~~~~
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030085
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030086Unsubscribing to an event is via:
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030087
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030088 :cpp:func:`v4l2_event_unsubscribe <v4l2_event_unsubscribe>`
89 (:c:type:`fh <v4l2_fh>`, :ref:`sub <v4l2-event-subscription>`)
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -030090
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -030091This function is used to implement :c:type:`video_device`->
92:c:type:`ioctl_ops <v4l2_ioctl_ops>`-> ``vidioc_unsubscribe_event``.
93A driver may call :cpp:func:`v4l2_event_unsubscribe` directly unless it
94wants to be involved in unsubscription process.
95
96The special type ``V4L2_EVENT_ALL`` may be used to unsubscribe all events. The
97drivers may want to handle this in a special way.
98
99Check if there's a pending event
100~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
101
102Checking if there's a pending event is via:
103
104 :cpp:func:`v4l2_event_pending <v4l2_event_pending>`
105 (:c:type:`fh <v4l2_fh>`)
106
107
108This function returns the number of pending events. Useful when implementing
109poll.
110
111How events work
112~~~~~~~~~~~~~~~
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -0300113
114Events are delivered to user space through the poll system call. The driver
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -0300115can use :c:type:`v4l2_fh`->wait (a wait_queue_head_t) as the argument for
116``poll_wait()``.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -0300117
118There are standard and private events. New standard events must use the
119smallest available event type. The drivers must allocate their events from
120their own class starting from class base. Class base is
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -0300121``V4L2_EVENT_PRIVATE_START`` + n * 1000 where n is the lowest available number.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -0300122The first event type in the class is reserved for future use, so the first
123available event type is 'class base + 1'.
124
125An example on how the V4L2 events may be used can be found in the OMAP
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -03001263 ISP driver (``drivers/media/platform/omap3isp``).
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -0300127
Mauro Carvalho Chehabd2316852016-07-22 08:43:30 -0300128A subdev can directly send an event to the :c:type:`v4l2_device` notify
129function with ``V4L2_DEVICE_NOTIFY_EVENT``. This allows the bridge to map
130the subdev that sends the event to the video node(s) associated with the
131subdev that need to be informed about such an event.
Mauro Carvalho Chehab8f511fc2016-07-22 06:54:48 -0300132
Mauro Carvalho Chehabf6fa8832016-07-22 10:15:42 -0300133V4L2 event functions and data structures
134^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mauro Carvalho Chehab58759872016-07-20 14:14:37 -0300135
136.. kernel-doc:: include/media/v4l2-event.h
Mauro Carvalho Chehabf6fa8832016-07-22 10:15:42 -0300137