~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/driver-api/media/cec-core.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0
  2 
  3 CEC Kernel Support
  4 ==================
  5 
  6 The CEC framework provides a unified kernel interface for use with HDMI CEC
  7 hardware. It is designed to handle a multiple types of hardware (receivers,
  8 transmitters, USB dongles). The framework also gives the option to decide
  9 what to do in the kernel driver and what should be handled by userspace
 10 applications. In addition it integrates the remote control passthrough
 11 feature into the kernel's remote control framework.
 12 
 13 
 14 The CEC Protocol
 15 ----------------
 16 
 17 The CEC protocol enables consumer electronic devices to communicate with each
 18 other through the HDMI connection. The protocol uses logical addresses in the
 19 communication. The logical address is strictly connected with the functionality
 20 provided by the device. The TV acting as the communication hub is always
 21 assigned address 0. The physical address is determined by the physical
 22 connection between devices.
 23 
 24 The CEC framework described here is up to date with the CEC 2.0 specification.
 25 It is documented in the HDMI 1.4 specification with the new 2.0 bits documented
 26 in the HDMI 2.0 specification. But for most of the features the freely available
 27 HDMI 1.3a specification is sufficient:
 28 
 29 https://www.hdmi.org/spec/index
 30 
 31 
 32 CEC Adapter Interface
 33 ---------------------
 34 
 35 The struct cec_adapter represents the CEC adapter hardware. It is created by
 36 calling cec_allocate_adapter() and deleted by calling cec_delete_adapter():
 37 
 38 .. c:function::
 39    struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, \
 40                                             void *priv, const char *name, \
 41                                             u32 caps, u8 available_las);
 42 
 43 .. c:function::
 44    void cec_delete_adapter(struct cec_adapter *adap);
 45 
 46 To create an adapter you need to pass the following information:
 47 
 48 ops:
 49         adapter operations which are called by the CEC framework and that you
 50         have to implement.
 51 
 52 priv:
 53         will be stored in adap->priv and can be used by the adapter ops.
 54         Use cec_get_drvdata(adap) to get the priv pointer.
 55 
 56 name:
 57         the name of the CEC adapter. Note: this name will be copied.
 58 
 59 caps:
 60         capabilities of the CEC adapter. These capabilities determine the
 61         capabilities of the hardware and which parts are to be handled
 62         by userspace and which parts are handled by kernelspace. The
 63         capabilities are returned by CEC_ADAP_G_CAPS.
 64 
 65 available_las:
 66         the number of simultaneous logical addresses that this
 67         adapter can handle. Must be 1 <= available_las <= CEC_MAX_LOG_ADDRS.
 68 
 69 To obtain the priv pointer use this helper function:
 70 
 71 .. c:function::
 72         void *cec_get_drvdata(const struct cec_adapter *adap);
 73 
 74 To register the /dev/cecX device node and the remote control device (if
 75 CEC_CAP_RC is set) you call:
 76 
 77 .. c:function::
 78         int cec_register_adapter(struct cec_adapter *adap, \
 79                                  struct device *parent);
 80 
 81 where parent is the parent device.
 82 
 83 To unregister the devices call:
 84 
 85 .. c:function::
 86         void cec_unregister_adapter(struct cec_adapter *adap);
 87 
 88 Note: if cec_register_adapter() fails, then call cec_delete_adapter() to
 89 clean up. But if cec_register_adapter() succeeded, then only call
 90 cec_unregister_adapter() to clean up, never cec_delete_adapter(). The
 91 unregister function will delete the adapter automatically once the last user
 92 of that /dev/cecX device has closed its file handle.
 93 
 94 
 95 Implementing the Low-Level CEC Adapter
 96 --------------------------------------
 97 
 98 The following low-level adapter operations have to be implemented in
 99 your driver:
100 
101 .. c:struct:: cec_adap_ops
102 
103 .. code-block:: none
104 
105         struct cec_adap_ops
106         {
107                 /* Low-level callbacks */
108                 int (*adap_enable)(struct cec_adapter *adap, bool enable);
109                 int (*adap_monitor_all_enable)(struct cec_adapter *adap, bool enable);
110                 int (*adap_monitor_pin_enable)(struct cec_adapter *adap, bool enable);
111                 int (*adap_log_addr)(struct cec_adapter *adap, u8 logical_addr);
112                 void (*adap_unconfigured)(struct cec_adapter *adap);
113                 int (*adap_transmit)(struct cec_adapter *adap, u8 attempts,
114                                       u32 signal_free_time, struct cec_msg *msg);
115                 void (*adap_nb_transmit_canceled)(struct cec_adapter *adap,
116                                                   const struct cec_msg *msg);
117                 void (*adap_status)(struct cec_adapter *adap, struct seq_file *file);
118                 void (*adap_free)(struct cec_adapter *adap);
119 
120                 /* Error injection callbacks */
121                 ...
122 
123                 /* High-level callback */
124                 ...
125         };
126 
127 These low-level ops deal with various aspects of controlling the CEC adapter
128 hardware. They are all called with the mutex adap->lock held.
129 
130 
131 To enable/disable the hardware::
132 
133         int (*adap_enable)(struct cec_adapter *adap, bool enable);
134 
135 This callback enables or disables the CEC hardware. Enabling the CEC hardware
136 means powering it up in a state where no logical addresses are claimed. The
137 physical address will always be valid if CEC_CAP_NEEDS_HPD is set. If that
138 capability is not set, then the physical address can change while the CEC
139 hardware is enabled. CEC drivers should not set CEC_CAP_NEEDS_HPD unless
140 the hardware design requires that as this will make it impossible to wake
141 up displays that pull the HPD low when in standby mode.  The initial
142 state of the CEC adapter after calling cec_allocate_adapter() is disabled.
143 
144 Note that adap_enable must return 0 if enable is false.
145 
146 
147 To enable/disable the 'monitor all' mode::
148 
149         int (*adap_monitor_all_enable)(struct cec_adapter *adap, bool enable);
150 
151 If enabled, then the adapter should be put in a mode to also monitor messages
152 that are not for us. Not all hardware supports this and this function is only
153 called if the CEC_CAP_MONITOR_ALL capability is set. This callback is optional
154 (some hardware may always be in 'monitor all' mode).
155 
156 Note that adap_monitor_all_enable must return 0 if enable is false.
157 
158 
159 To enable/disable the 'monitor pin' mode::
160 
161         int (*adap_monitor_pin_enable)(struct cec_adapter *adap, bool enable);
162 
163 If enabled, then the adapter should be put in a mode to also monitor CEC pin
164 changes. Not all hardware supports this and this function is only called if
165 the CEC_CAP_MONITOR_PIN capability is set. This callback is optional
166 (some hardware may always be in 'monitor pin' mode).
167 
168 Note that adap_monitor_pin_enable must return 0 if enable is false.
169 
170 
171 To program a new logical address::
172 
173         int (*adap_log_addr)(struct cec_adapter *adap, u8 logical_addr);
174 
175 If logical_addr == CEC_LOG_ADDR_INVALID then all programmed logical addresses
176 are to be erased. Otherwise the given logical address should be programmed.
177 If the maximum number of available logical addresses is exceeded, then it
178 should return -ENXIO. Once a logical address is programmed the CEC hardware
179 can receive directed messages to that address.
180 
181 Note that adap_log_addr must return 0 if logical_addr is CEC_LOG_ADDR_INVALID.
182 
183 
184 Called when the adapter is unconfigured::
185 
186         void (*adap_unconfigured)(struct cec_adapter *adap);
187 
188 The adapter is unconfigured. If the driver has to take specific actions after
189 unconfiguration, then that can be done through this optional callback.
190 
191 
192 To transmit a new message::
193 
194         int (*adap_transmit)(struct cec_adapter *adap, u8 attempts,
195                              u32 signal_free_time, struct cec_msg *msg);
196 
197 This transmits a new message. The attempts argument is the suggested number of
198 attempts for the transmit.
199 
200 The signal_free_time is the number of data bit periods that the adapter should
201 wait when the line is free before attempting to send a message. This value
202 depends on whether this transmit is a retry, a message from a new initiator or
203 a new message for the same initiator. Most hardware will handle this
204 automatically, but in some cases this information is needed.
205 
206 The CEC_FREE_TIME_TO_USEC macro can be used to convert signal_free_time to
207 microseconds (one data bit period is 2.4 ms).
208 
209 
210 To pass on the result of a canceled non-blocking transmit::
211 
212         void (*adap_nb_transmit_canceled)(struct cec_adapter *adap,
213                                           const struct cec_msg *msg);
214 
215 This optional callback can be used to obtain the result of a canceled
216 non-blocking transmit with sequence number msg->sequence. This is
217 called if the transmit was aborted, the transmit timed out (i.e. the
218 hardware never signaled that the transmit finished), or the transmit
219 was successful, but the wait for the expected reply was either aborted
220 or it timed out.
221 
222 
223 To log the current CEC hardware status::
224 
225         void (*adap_status)(struct cec_adapter *adap, struct seq_file *file);
226 
227 This optional callback can be used to show the status of the CEC hardware.
228 The status is available through debugfs: cat /sys/kernel/debug/cec/cecX/status
229 
230 To free any resources when the adapter is deleted::
231 
232         void (*adap_free)(struct cec_adapter *adap);
233 
234 This optional callback can be used to free any resources that might have been
235 allocated by the driver. It's called from cec_delete_adapter.
236 
237 
238 Your adapter driver will also have to react to events (typically interrupt
239 driven) by calling into the framework in the following situations:
240 
241 When a transmit finished (successfully or otherwise)::
242 
243         void cec_transmit_done(struct cec_adapter *adap, u8 status,
244                                u8 arb_lost_cnt,  u8 nack_cnt, u8 low_drive_cnt,
245                                u8 error_cnt);
246 
247 or::
248 
249         void cec_transmit_attempt_done(struct cec_adapter *adap, u8 status);
250 
251 The status can be one of:
252 
253 CEC_TX_STATUS_OK:
254         the transmit was successful.
255 
256 CEC_TX_STATUS_ARB_LOST:
257         arbitration was lost: another CEC initiator
258         took control of the CEC line and you lost the arbitration.
259 
260 CEC_TX_STATUS_NACK:
261         the message was nacked (for a directed message) or
262         acked (for a broadcast message). A retransmission is needed.
263 
264 CEC_TX_STATUS_LOW_DRIVE:
265         low drive was detected on the CEC bus. This indicates that
266         a follower detected an error on the bus and requested a
267         retransmission.
268 
269 CEC_TX_STATUS_ERROR:
270         some unspecified error occurred: this can be one of ARB_LOST
271         or LOW_DRIVE if the hardware cannot differentiate or something
272         else entirely. Some hardware only supports OK and FAIL as the
273         result of a transmit, i.e. there is no way to differentiate
274         between the different possible errors. In that case map FAIL
275         to CEC_TX_STATUS_NACK and not to CEC_TX_STATUS_ERROR.
276 
277 CEC_TX_STATUS_MAX_RETRIES:
278         could not transmit the message after trying multiple times.
279         Should only be set by the driver if it has hardware support for
280         retrying messages. If set, then the framework assumes that it
281         doesn't have to make another attempt to transmit the message
282         since the hardware did that already.
283 
284 The hardware must be able to differentiate between OK, NACK and 'something
285 else'.
286 
287 The \*_cnt arguments are the number of error conditions that were seen.
288 This may be 0 if no information is available. Drivers that do not support
289 hardware retry can just set the counter corresponding to the transmit error
290 to 1, if the hardware does support retry then either set these counters to
291 0 if the hardware provides no feedback of which errors occurred and how many
292 times, or fill in the correct values as reported by the hardware.
293 
294 Be aware that calling these functions can immediately start a new transmit
295 if there is one pending in the queue. So make sure that the hardware is in
296 a state where new transmits can be started *before* calling these functions.
297 
298 The cec_transmit_attempt_done() function is a helper for cases where the
299 hardware never retries, so the transmit is always for just a single
300 attempt. It will call cec_transmit_done() in turn, filling in 1 for the
301 count argument corresponding to the status. Or all 0 if the status was OK.
302 
303 When a CEC message was received:
304 
305 .. c:function::
306         void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg);
307 
308 Speaks for itself.
309 
310 Implementing the interrupt handler
311 ----------------------------------
312 
313 Typically the CEC hardware provides interrupts that signal when a transmit
314 finished and whether it was successful or not, and it provides and interrupt
315 when a CEC message was received.
316 
317 The CEC driver should always process the transmit interrupts first before
318 handling the receive interrupt. The framework expects to see the cec_transmit_done
319 call before the cec_received_msg call, otherwise it can get confused if the
320 received message was in reply to the transmitted message.
321 
322 Optional: Implementing Error Injection Support
323 ----------------------------------------------
324 
325 If the CEC adapter supports Error Injection functionality, then that can
326 be exposed through the Error Injection callbacks:
327 
328 .. code-block:: none
329 
330         struct cec_adap_ops {
331                 /* Low-level callbacks */
332                 ...
333 
334                 /* Error injection callbacks */
335                 int (*error_inj_show)(struct cec_adapter *adap, struct seq_file *sf);
336                 bool (*error_inj_parse_line)(struct cec_adapter *adap, char *line);
337 
338                 /* High-level CEC message callback */
339                 ...
340         };
341 
342 If both callbacks are set, then an ``error-inj`` file will appear in debugfs.
343 The basic syntax is as follows:
344 
345 Leading spaces/tabs are ignored. If the next character is a ``#`` or the end of the
346 line was reached, then the whole line is ignored. Otherwise a command is expected.
347 
348 This basic parsing is done in the CEC Framework. It is up to the driver to decide
349 what commands to implement. The only requirement is that the command ``clear`` without
350 any arguments must be implemented and that it will remove all current error injection
351 commands.
352 
353 This ensures that you can always do ``echo clear >error-inj`` to clear any error
354 injections without having to know the details of the driver-specific commands.
355 
356 Note that the output of ``error-inj`` shall be valid as input to ``error-inj``.
357 So this must work:
358 
359 .. code-block:: none
360 
361         $ cat error-inj >einj.txt
362         $ cat einj.txt >error-inj
363 
364 The first callback is called when this file is read and it should show the
365 current error injection state::
366 
367         int (*error_inj_show)(struct cec_adapter *adap, struct seq_file *sf);
368 
369 It is recommended that it starts with a comment block with basic usage
370 information. It returns 0 for success and an error otherwise.
371 
372 The second callback will parse commands written to the ``error-inj`` file::
373 
374         bool (*error_inj_parse_line)(struct cec_adapter *adap, char *line);
375 
376 The ``line`` argument points to the start of the command. Any leading
377 spaces or tabs have already been skipped. It is a single line only (so there
378 are no embedded newlines) and it is 0-terminated. The callback is free to
379 modify the contents of the buffer. It is only called for lines containing a
380 command, so this callback is never called for empty lines or comment lines.
381 
382 Return true if the command was valid or false if there were syntax errors.
383 
384 Implementing the High-Level CEC Adapter
385 ---------------------------------------
386 
387 The low-level operations drive the hardware, the high-level operations are
388 CEC protocol driven. The high-level callbacks are called without the adap->lock
389 mutex being held. The following high-level callbacks are available:
390 
391 .. code-block:: none
392 
393         struct cec_adap_ops {
394                 /* Low-level callbacks */
395                 ...
396 
397                 /* Error injection callbacks */
398                 ...
399 
400                 /* High-level CEC message callback */
401                 void (*configured)(struct cec_adapter *adap);
402                 int (*received)(struct cec_adapter *adap, struct cec_msg *msg);
403         };
404 
405 Called when the adapter is configured::
406 
407         void (*configured)(struct cec_adapter *adap);
408 
409 The adapter is fully configured, i.e. all logical addresses have been
410 successfully claimed. If the driver has to take specific actions after
411 configuration, then that can be done through this optional callback.
412 
413 
414 The received() callback allows the driver to optionally handle a newly
415 received CEC message::
416 
417         int (*received)(struct cec_adapter *adap, struct cec_msg *msg);
418 
419 If the driver wants to process a CEC message, then it can implement this
420 callback. If it doesn't want to handle this message, then it should return
421 -ENOMSG, otherwise the CEC framework assumes it processed this message and
422 it will not do anything with it.
423 
424 
425 CEC framework functions
426 -----------------------
427 
428 CEC Adapter drivers can call the following CEC framework functions:
429 
430 .. c:function::
431    int cec_transmit_msg(struct cec_adapter *adap, struct cec_msg *msg, \
432                         bool block);
433 
434 Transmit a CEC message. If block is true, then wait until the message has been
435 transmitted, otherwise just queue it and return.
436 
437 .. c:function::
438    void cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr, bool block);
439 
440 Change the physical address. This function will set adap->phys_addr and
441 send an event if it has changed. If cec_s_log_addrs() has been called and
442 the physical address has become valid, then the CEC framework will start
443 claiming the logical addresses. If block is true, then this function won't
444 return until this process has finished.
445 
446 When the physical address is set to a valid value the CEC adapter will
447 be enabled (see the adap_enable op). When it is set to CEC_PHYS_ADDR_INVALID,
448 then the CEC adapter will be disabled. If you change a valid physical address
449 to another valid physical address, then this function will first set the
450 address to CEC_PHYS_ADDR_INVALID before enabling the new physical address.
451 
452 .. c:function::
453    void cec_s_phys_addr_from_edid(struct cec_adapter *adap, \
454                                   const struct edid *edid);
455 
456 A helper function that extracts the physical address from the edid struct
457 and calls cec_s_phys_addr() with that address, or CEC_PHYS_ADDR_INVALID
458 if the EDID did not contain a physical address or edid was a NULL pointer.
459 
460 .. c:function::
461         int cec_s_log_addrs(struct cec_adapter *adap, \
462                             struct cec_log_addrs *log_addrs, bool block);
463 
464 Claim the CEC logical addresses. Should never be called if CEC_CAP_LOG_ADDRS
465 is set. If block is true, then wait until the logical addresses have been
466 claimed, otherwise just queue it and return. To unconfigure all logical
467 addresses call this function with log_addrs set to NULL or with
468 log_addrs->num_log_addrs set to 0. The block argument is ignored when
469 unconfiguring. This function will just return if the physical address is
470 invalid. Once the physical address becomes valid, then the framework will
471 attempt to claim these logical addresses.
472 
473 CEC Pin framework
474 -----------------
475 
476 Most CEC hardware operates on full CEC messages where the software provides
477 the message and the hardware handles the low-level CEC protocol. But some
478 hardware only drives the CEC pin and software has to handle the low-level
479 CEC protocol. The CEC pin framework was created to handle such devices.
480 
481 Note that due to the close-to-realtime requirements it can never be guaranteed
482 to work 100%. This framework uses highres timers internally, but if a
483 timer goes off too late by more than 300 microseconds wrong results can
484 occur. In reality it appears to be fairly reliable.
485 
486 One advantage of this low-level implementation is that it can be used as
487 a cheap CEC analyser, especially if interrupts can be used to detect
488 CEC pin transitions from low to high or vice versa.
489 
490 .. kernel-doc:: include/media/cec-pin.h
491 
492 CEC Notifier framework
493 ----------------------
494 
495 Most drm HDMI implementations have an integrated CEC implementation and no
496 notifier support is needed. But some have independent CEC implementations
497 that have their own driver. This could be an IP block for an SoC or a
498 completely separate chip that deals with the CEC pin. For those cases a
499 drm driver can install a notifier and use the notifier to inform the
500 CEC driver about changes in the physical address.
501 
502 .. kernel-doc:: include/media/cec-notifier.h

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php