1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef _CEC_UAPI_H
38#define _CEC_UAPI_H
39
40#include <linux/types.h>
41#include <linux/string.h>
42
43#define CEC_MAX_MSG_SIZE 16
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86struct cec_msg {
87 __u64 tx_ts;
88 __u64 rx_ts;
89 __u32 len;
90 __u32 timeout;
91 __u32 sequence;
92 __u32 flags;
93 __u8 msg[CEC_MAX_MSG_SIZE];
94 __u8 reply;
95 __u8 rx_status;
96 __u8 tx_status;
97 __u8 tx_arb_lost_cnt;
98 __u8 tx_nack_cnt;
99 __u8 tx_low_drive_cnt;
100 __u8 tx_error_cnt;
101};
102
103
104
105
106
107static inline __u8 cec_msg_initiator(const struct cec_msg *msg)
108{
109 return msg->msg[0] >> 4;
110}
111
112
113
114
115
116static inline __u8 cec_msg_destination(const struct cec_msg *msg)
117{
118 return msg->msg[0] & 0xf;
119}
120
121
122
123
124
125static inline int cec_msg_opcode(const struct cec_msg *msg)
126{
127 return msg->len > 1 ? msg->msg[1] : -1;
128}
129
130
131
132
133
134static inline int cec_msg_is_broadcast(const struct cec_msg *msg)
135{
136 return (msg->msg[0] & 0xf) == 0xf;
137}
138
139
140
141
142
143
144
145
146
147
148static inline void cec_msg_init(struct cec_msg *msg,
149 __u8 initiator, __u8 destination)
150{
151 memset(msg, 0, sizeof(*msg));
152 msg->msg[0] = (initiator << 4) | destination;
153 msg->len = 1;
154}
155
156
157
158
159
160
161
162
163
164
165static inline void cec_msg_set_reply_to(struct cec_msg *msg,
166 struct cec_msg *orig)
167{
168
169 msg->msg[0] = (cec_msg_destination(orig) << 4) |
170 cec_msg_initiator(orig);
171 msg->reply = msg->timeout = 0;
172}
173
174
175#define CEC_MSG_FL_REPLY_TO_FOLLOWERS (1 << 0)
176
177
178#define CEC_TX_STATUS_OK (1 << 0)
179#define CEC_TX_STATUS_ARB_LOST (1 << 1)
180#define CEC_TX_STATUS_NACK (1 << 2)
181#define CEC_TX_STATUS_LOW_DRIVE (1 << 3)
182#define CEC_TX_STATUS_ERROR (1 << 4)
183#define CEC_TX_STATUS_MAX_RETRIES (1 << 5)
184
185#define CEC_RX_STATUS_OK (1 << 0)
186#define CEC_RX_STATUS_TIMEOUT (1 << 1)
187#define CEC_RX_STATUS_FEATURE_ABORT (1 << 2)
188
189static inline int cec_msg_status_is_ok(const struct cec_msg *msg)
190{
191 if (msg->tx_status && !(msg->tx_status & CEC_TX_STATUS_OK))
192 return 0;
193 if (msg->rx_status && !(msg->rx_status & CEC_RX_STATUS_OK))
194 return 0;
195 if (!msg->tx_status && !msg->rx_status)
196 return 0;
197 return !(msg->rx_status & CEC_RX_STATUS_FEATURE_ABORT);
198}
199
200#define CEC_LOG_ADDR_INVALID 0xff
201#define CEC_PHYS_ADDR_INVALID 0xffff
202
203
204
205
206
207
208#define CEC_MAX_LOG_ADDRS 4
209
210
211#define CEC_LOG_ADDR_TV 0
212#define CEC_LOG_ADDR_RECORD_1 1
213#define CEC_LOG_ADDR_RECORD_2 2
214#define CEC_LOG_ADDR_TUNER_1 3
215#define CEC_LOG_ADDR_PLAYBACK_1 4
216#define CEC_LOG_ADDR_AUDIOSYSTEM 5
217#define CEC_LOG_ADDR_TUNER_2 6
218#define CEC_LOG_ADDR_TUNER_3 7
219#define CEC_LOG_ADDR_PLAYBACK_2 8
220#define CEC_LOG_ADDR_RECORD_3 9
221#define CEC_LOG_ADDR_TUNER_4 10
222#define CEC_LOG_ADDR_PLAYBACK_3 11
223#define CEC_LOG_ADDR_BACKUP_1 12
224#define CEC_LOG_ADDR_BACKUP_2 13
225#define CEC_LOG_ADDR_SPECIFIC 14
226#define CEC_LOG_ADDR_UNREGISTERED 15
227#define CEC_LOG_ADDR_BROADCAST 15
228
229
230#define CEC_LOG_ADDR_TYPE_TV 0
231#define CEC_LOG_ADDR_TYPE_RECORD 1
232#define CEC_LOG_ADDR_TYPE_TUNER 2
233#define CEC_LOG_ADDR_TYPE_PLAYBACK 3
234#define CEC_LOG_ADDR_TYPE_AUDIOSYSTEM 4
235#define CEC_LOG_ADDR_TYPE_SPECIFIC 5
236#define CEC_LOG_ADDR_TYPE_UNREGISTERED 6
237
238
239
240
241
242#define CEC_LOG_ADDR_MASK_TV (1 << CEC_LOG_ADDR_TV)
243#define CEC_LOG_ADDR_MASK_RECORD ((1 << CEC_LOG_ADDR_RECORD_1) | \
244 (1 << CEC_LOG_ADDR_RECORD_2) | \
245 (1 << CEC_LOG_ADDR_RECORD_3))
246#define CEC_LOG_ADDR_MASK_TUNER ((1 << CEC_LOG_ADDR_TUNER_1) | \
247 (1 << CEC_LOG_ADDR_TUNER_2) | \
248 (1 << CEC_LOG_ADDR_TUNER_3) | \
249 (1 << CEC_LOG_ADDR_TUNER_4))
250#define CEC_LOG_ADDR_MASK_PLAYBACK ((1 << CEC_LOG_ADDR_PLAYBACK_1) | \
251 (1 << CEC_LOG_ADDR_PLAYBACK_2) | \
252 (1 << CEC_LOG_ADDR_PLAYBACK_3))
253#define CEC_LOG_ADDR_MASK_AUDIOSYSTEM (1 << CEC_LOG_ADDR_AUDIOSYSTEM)
254#define CEC_LOG_ADDR_MASK_BACKUP ((1 << CEC_LOG_ADDR_BACKUP_1) | \
255 (1 << CEC_LOG_ADDR_BACKUP_2))
256#define CEC_LOG_ADDR_MASK_SPECIFIC (1 << CEC_LOG_ADDR_SPECIFIC)
257#define CEC_LOG_ADDR_MASK_UNREGISTERED (1 << CEC_LOG_ADDR_UNREGISTERED)
258
259static inline int cec_has_tv(__u16 log_addr_mask)
260{
261 return log_addr_mask & CEC_LOG_ADDR_MASK_TV;
262}
263
264static inline int cec_has_record(__u16 log_addr_mask)
265{
266 return log_addr_mask & CEC_LOG_ADDR_MASK_RECORD;
267}
268
269static inline int cec_has_tuner(__u16 log_addr_mask)
270{
271 return log_addr_mask & CEC_LOG_ADDR_MASK_TUNER;
272}
273
274static inline int cec_has_playback(__u16 log_addr_mask)
275{
276 return log_addr_mask & CEC_LOG_ADDR_MASK_PLAYBACK;
277}
278
279static inline int cec_has_audiosystem(__u16 log_addr_mask)
280{
281 return log_addr_mask & CEC_LOG_ADDR_MASK_AUDIOSYSTEM;
282}
283
284static inline int cec_has_backup(__u16 log_addr_mask)
285{
286 return log_addr_mask & CEC_LOG_ADDR_MASK_BACKUP;
287}
288
289static inline int cec_has_specific(__u16 log_addr_mask)
290{
291 return log_addr_mask & CEC_LOG_ADDR_MASK_SPECIFIC;
292}
293
294static inline int cec_is_unregistered(__u16 log_addr_mask)
295{
296 return log_addr_mask & CEC_LOG_ADDR_MASK_UNREGISTERED;
297}
298
299static inline int cec_is_unconfigured(__u16 log_addr_mask)
300{
301 return log_addr_mask == 0;
302}
303
304
305
306
307
308#define CEC_VENDOR_ID_NONE 0xffffffff
309
310
311
312#define CEC_MODE_NO_INITIATOR (0x0 << 0)
313#define CEC_MODE_INITIATOR (0x1 << 0)
314#define CEC_MODE_EXCL_INITIATOR (0x2 << 0)
315#define CEC_MODE_INITIATOR_MSK 0x0f
316
317
318#define CEC_MODE_NO_FOLLOWER (0x0 << 4)
319#define CEC_MODE_FOLLOWER (0x1 << 4)
320#define CEC_MODE_EXCL_FOLLOWER (0x2 << 4)
321#define CEC_MODE_EXCL_FOLLOWER_PASSTHRU (0x3 << 4)
322#define CEC_MODE_MONITOR_PIN (0xd << 4)
323#define CEC_MODE_MONITOR (0xe << 4)
324#define CEC_MODE_MONITOR_ALL (0xf << 4)
325#define CEC_MODE_FOLLOWER_MSK 0xf0
326
327
328#define CEC_CAP_PHYS_ADDR (1 << 0)
329
330#define CEC_CAP_LOG_ADDRS (1 << 1)
331
332#define CEC_CAP_TRANSMIT (1 << 2)
333
334
335
336#define CEC_CAP_PASSTHROUGH (1 << 3)
337
338#define CEC_CAP_RC (1 << 4)
339
340#define CEC_CAP_MONITOR_ALL (1 << 5)
341
342#define CEC_CAP_NEEDS_HPD (1 << 6)
343
344#define CEC_CAP_MONITOR_PIN (1 << 7)
345
346
347
348
349
350
351
352
353
354struct cec_caps {
355 char driver[32];
356 char name[32];
357 __u32 available_log_addrs;
358 __u32 capabilities;
359 __u32 version;
360};
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380struct cec_log_addrs {
381 __u8 log_addr[CEC_MAX_LOG_ADDRS];
382 __u16 log_addr_mask;
383 __u8 cec_version;
384 __u8 num_log_addrs;
385 __u32 vendor_id;
386 __u32 flags;
387 char osd_name[15];
388 __u8 primary_device_type[CEC_MAX_LOG_ADDRS];
389 __u8 log_addr_type[CEC_MAX_LOG_ADDRS];
390
391
392 __u8 all_device_types[CEC_MAX_LOG_ADDRS];
393 __u8 features[CEC_MAX_LOG_ADDRS][12];
394};
395
396
397#define CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK (1 << 0)
398
399#define CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU (1 << 1)
400
401#define CEC_LOG_ADDRS_FL_CDC_ONLY (1 << 2)
402
403
404
405
406#define CEC_EVENT_STATE_CHANGE 1
407
408
409
410
411#define CEC_EVENT_LOST_MSGS 2
412#define CEC_EVENT_PIN_CEC_LOW 3
413#define CEC_EVENT_PIN_CEC_HIGH 4
414
415#define CEC_EVENT_FL_INITIAL_STATE (1 << 0)
416#define CEC_EVENT_FL_DROPPED_EVENTS (1 << 1)
417
418
419
420
421
422
423struct cec_event_state_change {
424 __u16 phys_addr;
425 __u16 log_addr_mask;
426};
427
428
429
430
431
432struct cec_event_lost_msgs {
433 __u32 lost_msgs;
434};
435
436
437
438
439
440
441
442
443
444
445struct cec_event {
446 __u64 ts;
447 __u32 event;
448 __u32 flags;
449 union {
450 struct cec_event_state_change state_change;
451 struct cec_event_lost_msgs lost_msgs;
452 __u32 raw[16];
453 };
454};
455
456
457
458
459#define CEC_ADAP_G_CAPS _IOWR('a', 0, struct cec_caps)
460
461
462
463
464
465
466
467
468
469
470
471
472
473#define CEC_ADAP_G_PHYS_ADDR _IOR('a', 1, __u16)
474#define CEC_ADAP_S_PHYS_ADDR _IOW('a', 2, __u16)
475
476
477
478
479
480
481
482
483
484#define CEC_ADAP_G_LOG_ADDRS _IOR('a', 3, struct cec_log_addrs)
485#define CEC_ADAP_S_LOG_ADDRS _IOWR('a', 4, struct cec_log_addrs)
486
487
488#define CEC_TRANSMIT _IOWR('a', 5, struct cec_msg)
489#define CEC_RECEIVE _IOWR('a', 6, struct cec_msg)
490
491
492#define CEC_DQEVENT _IOWR('a', 7, struct cec_event)
493
494
495
496
497#define CEC_G_MODE _IOR('a', 8, __u32)
498#define CEC_S_MODE _IOW('a', 9, __u32)
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518#define CEC_MSG_ACTIVE_SOURCE 0x82
519#define CEC_MSG_IMAGE_VIEW_ON 0x04
520#define CEC_MSG_TEXT_VIEW_ON 0x0d
521
522
523
524
525
526
527
528
529
530#define CEC_MSG_INACTIVE_SOURCE 0x9d
531#define CEC_MSG_REQUEST_ACTIVE_SOURCE 0x85
532#define CEC_MSG_ROUTING_CHANGE 0x80
533#define CEC_MSG_ROUTING_INFORMATION 0x81
534#define CEC_MSG_SET_STREAM_PATH 0x86
535
536
537
538#define CEC_MSG_STANDBY 0x36
539
540
541
542#define CEC_MSG_RECORD_OFF 0x0b
543#define CEC_MSG_RECORD_ON 0x09
544
545#define CEC_OP_RECORD_SRC_OWN 1
546#define CEC_OP_RECORD_SRC_DIGITAL 2
547#define CEC_OP_RECORD_SRC_ANALOG 3
548#define CEC_OP_RECORD_SRC_EXT_PLUG 4
549#define CEC_OP_RECORD_SRC_EXT_PHYS_ADDR 5
550
551#define CEC_OP_SERVICE_ID_METHOD_BY_DIG_ID 0
552#define CEC_OP_SERVICE_ID_METHOD_BY_CHANNEL 1
553
554#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN 0x00
555#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN 0x01
556#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN 0x02
557#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS 0x08
558#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS 0x09
559#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_T 0x0a
560#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE 0x10
561#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT 0x11
562#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T 0x12
563#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_C 0x18
564#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S 0x19
565#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S2 0x1a
566#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_T 0x1b
567
568#define CEC_OP_ANA_BCAST_TYPE_CABLE 0
569#define CEC_OP_ANA_BCAST_TYPE_SATELLITE 1
570#define CEC_OP_ANA_BCAST_TYPE_TERRESTRIAL 2
571
572#define CEC_OP_BCAST_SYSTEM_PAL_BG 0x00
573#define CEC_OP_BCAST_SYSTEM_SECAM_LQ 0x01
574#define CEC_OP_BCAST_SYSTEM_PAL_M 0x02
575#define CEC_OP_BCAST_SYSTEM_NTSC_M 0x03
576#define CEC_OP_BCAST_SYSTEM_PAL_I 0x04
577#define CEC_OP_BCAST_SYSTEM_SECAM_DK 0x05
578#define CEC_OP_BCAST_SYSTEM_SECAM_BG 0x06
579#define CEC_OP_BCAST_SYSTEM_SECAM_L 0x07
580#define CEC_OP_BCAST_SYSTEM_PAL_DK 0x08
581#define CEC_OP_BCAST_SYSTEM_OTHER 0x1f
582
583#define CEC_OP_CHANNEL_NUMBER_FMT_1_PART 0x01
584#define CEC_OP_CHANNEL_NUMBER_FMT_2_PART 0x02
585
586#define CEC_MSG_RECORD_STATUS 0x0a
587
588#define CEC_OP_RECORD_STATUS_CUR_SRC 0x01
589#define CEC_OP_RECORD_STATUS_DIG_SERVICE 0x02
590#define CEC_OP_RECORD_STATUS_ANA_SERVICE 0x03
591#define CEC_OP_RECORD_STATUS_EXT_INPUT 0x04
592#define CEC_OP_RECORD_STATUS_NO_DIG_SERVICE 0x05
593#define CEC_OP_RECORD_STATUS_NO_ANA_SERVICE 0x06
594#define CEC_OP_RECORD_STATUS_NO_SERVICE 0x07
595#define CEC_OP_RECORD_STATUS_INVALID_EXT_PLUG 0x09
596#define CEC_OP_RECORD_STATUS_INVALID_EXT_PHYS_ADDR 0x0a
597#define CEC_OP_RECORD_STATUS_UNSUP_CA 0x0b
598#define CEC_OP_RECORD_STATUS_NO_CA_ENTITLEMENTS 0x0c
599#define CEC_OP_RECORD_STATUS_CANT_COPY_SRC 0x0d
600#define CEC_OP_RECORD_STATUS_NO_MORE_COPIES 0x0e
601#define CEC_OP_RECORD_STATUS_NO_MEDIA 0x10
602#define CEC_OP_RECORD_STATUS_PLAYING 0x11
603#define CEC_OP_RECORD_STATUS_ALREADY_RECORDING 0x12
604#define CEC_OP_RECORD_STATUS_MEDIA_PROT 0x13
605#define CEC_OP_RECORD_STATUS_NO_SIGNAL 0x14
606#define CEC_OP_RECORD_STATUS_MEDIA_PROBLEM 0x15
607#define CEC_OP_RECORD_STATUS_NO_SPACE 0x16
608#define CEC_OP_RECORD_STATUS_PARENTAL_LOCK 0x17
609#define CEC_OP_RECORD_STATUS_TERMINATED_OK 0x1a
610#define CEC_OP_RECORD_STATUS_ALREADY_TERM 0x1b
611#define CEC_OP_RECORD_STATUS_OTHER 0x1f
612
613#define CEC_MSG_RECORD_TV_SCREEN 0x0f
614
615
616
617#define CEC_MSG_CLEAR_ANALOGUE_TIMER 0x33
618
619#define CEC_OP_REC_SEQ_SUNDAY 0x01
620#define CEC_OP_REC_SEQ_MONDAY 0x02
621#define CEC_OP_REC_SEQ_TUESDAY 0x04
622#define CEC_OP_REC_SEQ_WEDNESDAY 0x08
623#define CEC_OP_REC_SEQ_THURSDAY 0x10
624#define CEC_OP_REC_SEQ_FRIDAY 0x20
625#define CEC_OP_REC_SEQ_SATERDAY 0x40
626#define CEC_OP_REC_SEQ_ONCE_ONLY 0x00
627
628#define CEC_MSG_CLEAR_DIGITAL_TIMER 0x99
629
630#define CEC_MSG_CLEAR_EXT_TIMER 0xa1
631
632#define CEC_OP_EXT_SRC_PLUG 0x04
633#define CEC_OP_EXT_SRC_PHYS_ADDR 0x05
634
635#define CEC_MSG_SET_ANALOGUE_TIMER 0x34
636#define CEC_MSG_SET_DIGITAL_TIMER 0x97
637#define CEC_MSG_SET_EXT_TIMER 0xa2
638
639#define CEC_MSG_SET_TIMER_PROGRAM_TITLE 0x67
640#define CEC_MSG_TIMER_CLEARED_STATUS 0x43
641
642#define CEC_OP_TIMER_CLR_STAT_RECORDING 0x00
643#define CEC_OP_TIMER_CLR_STAT_NO_MATCHING 0x01
644#define CEC_OP_TIMER_CLR_STAT_NO_INFO 0x02
645#define CEC_OP_TIMER_CLR_STAT_CLEARED 0x80
646
647#define CEC_MSG_TIMER_STATUS 0x35
648
649#define CEC_OP_TIMER_OVERLAP_WARNING_NO_OVERLAP 0
650#define CEC_OP_TIMER_OVERLAP_WARNING_OVERLAP 1
651
652#define CEC_OP_MEDIA_INFO_UNPROT_MEDIA 0
653#define CEC_OP_MEDIA_INFO_PROT_MEDIA 1
654#define CEC_OP_MEDIA_INFO_NO_MEDIA 2
655
656#define CEC_OP_PROG_IND_NOT_PROGRAMMED 0
657#define CEC_OP_PROG_IND_PROGRAMMED 1
658
659#define CEC_OP_PROG_INFO_ENOUGH_SPACE 0x08
660#define CEC_OP_PROG_INFO_NOT_ENOUGH_SPACE 0x09
661#define CEC_OP_PROG_INFO_MIGHT_NOT_BE_ENOUGH_SPACE 0x0b
662#define CEC_OP_PROG_INFO_NONE_AVAILABLE 0x0a
663
664#define CEC_OP_PROG_ERROR_NO_FREE_TIMER 0x01
665#define CEC_OP_PROG_ERROR_DATE_OUT_OF_RANGE 0x02
666#define CEC_OP_PROG_ERROR_REC_SEQ_ERROR 0x03
667#define CEC_OP_PROG_ERROR_INV_EXT_PLUG 0x04
668#define CEC_OP_PROG_ERROR_INV_EXT_PHYS_ADDR 0x05
669#define CEC_OP_PROG_ERROR_CA_UNSUPP 0x06
670#define CEC_OP_PROG_ERROR_INSUF_CA_ENTITLEMENTS 0x07
671#define CEC_OP_PROG_ERROR_RESOLUTION_UNSUPP 0x08
672#define CEC_OP_PROG_ERROR_PARENTAL_LOCK 0x09
673#define CEC_OP_PROG_ERROR_CLOCK_FAILURE 0x0a
674#define CEC_OP_PROG_ERROR_DUPLICATE 0x0e
675
676
677
678#define CEC_MSG_CEC_VERSION 0x9e
679
680#define CEC_OP_CEC_VERSION_1_3A 4
681#define CEC_OP_CEC_VERSION_1_4 5
682#define CEC_OP_CEC_VERSION_2_0 6
683
684#define CEC_MSG_GET_CEC_VERSION 0x9f
685#define CEC_MSG_GIVE_PHYSICAL_ADDR 0x83
686#define CEC_MSG_GET_MENU_LANGUAGE 0x91
687#define CEC_MSG_REPORT_PHYSICAL_ADDR 0x84
688
689#define CEC_OP_PRIM_DEVTYPE_TV 0
690#define CEC_OP_PRIM_DEVTYPE_RECORD 1
691#define CEC_OP_PRIM_DEVTYPE_TUNER 3
692#define CEC_OP_PRIM_DEVTYPE_PLAYBACK 4
693#define CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM 5
694#define CEC_OP_PRIM_DEVTYPE_SWITCH 6
695#define CEC_OP_PRIM_DEVTYPE_PROCESSOR 7
696
697#define CEC_MSG_SET_MENU_LANGUAGE 0x32
698#define CEC_MSG_REPORT_FEATURES 0xa6
699
700#define CEC_OP_ALL_DEVTYPE_TV 0x80
701#define CEC_OP_ALL_DEVTYPE_RECORD 0x40
702#define CEC_OP_ALL_DEVTYPE_TUNER 0x20
703#define CEC_OP_ALL_DEVTYPE_PLAYBACK 0x10
704#define CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM 0x08
705#define CEC_OP_ALL_DEVTYPE_SWITCH 0x04
706
707
708
709
710
711
712#define CEC_OP_FEAT_EXT 0x80
713
714#define CEC_OP_FEAT_RC_TV_PROFILE_NONE 0x00
715#define CEC_OP_FEAT_RC_TV_PROFILE_1 0x02
716#define CEC_OP_FEAT_RC_TV_PROFILE_2 0x06
717#define CEC_OP_FEAT_RC_TV_PROFILE_3 0x0a
718#define CEC_OP_FEAT_RC_TV_PROFILE_4 0x0e
719#define CEC_OP_FEAT_RC_SRC_HAS_DEV_ROOT_MENU 0x50
720#define CEC_OP_FEAT_RC_SRC_HAS_DEV_SETUP_MENU 0x48
721#define CEC_OP_FEAT_RC_SRC_HAS_CONTENTS_MENU 0x44
722#define CEC_OP_FEAT_RC_SRC_HAS_MEDIA_TOP_MENU 0x42
723#define CEC_OP_FEAT_RC_SRC_HAS_MEDIA_CONTEXT_MENU 0x41
724
725#define CEC_OP_FEAT_DEV_HAS_RECORD_TV_SCREEN 0x40
726#define CEC_OP_FEAT_DEV_HAS_SET_OSD_STRING 0x20
727#define CEC_OP_FEAT_DEV_HAS_DECK_CONTROL 0x10
728#define CEC_OP_FEAT_DEV_HAS_SET_AUDIO_RATE 0x08
729#define CEC_OP_FEAT_DEV_SINK_HAS_ARC_TX 0x04
730#define CEC_OP_FEAT_DEV_SOURCE_HAS_ARC_RX 0x02
731
732#define CEC_MSG_GIVE_FEATURES 0xa5
733
734
735
736#define CEC_MSG_DECK_CONTROL 0x42
737
738#define CEC_OP_DECK_CTL_MODE_SKIP_FWD 1
739#define CEC_OP_DECK_CTL_MODE_SKIP_REV 2
740#define CEC_OP_DECK_CTL_MODE_STOP 3
741#define CEC_OP_DECK_CTL_MODE_EJECT 4
742
743#define CEC_MSG_DECK_STATUS 0x1b
744
745#define CEC_OP_DECK_INFO_PLAY 0x11
746#define CEC_OP_DECK_INFO_RECORD 0x12
747#define CEC_OP_DECK_INFO_PLAY_REV 0x13
748#define CEC_OP_DECK_INFO_STILL 0x14
749#define CEC_OP_DECK_INFO_SLOW 0x15
750#define CEC_OP_DECK_INFO_SLOW_REV 0x16
751#define CEC_OP_DECK_INFO_FAST_FWD 0x17
752#define CEC_OP_DECK_INFO_FAST_REV 0x18
753#define CEC_OP_DECK_INFO_NO_MEDIA 0x19
754#define CEC_OP_DECK_INFO_STOP 0x1a
755#define CEC_OP_DECK_INFO_SKIP_FWD 0x1b
756#define CEC_OP_DECK_INFO_SKIP_REV 0x1c
757#define CEC_OP_DECK_INFO_INDEX_SEARCH_FWD 0x1d
758#define CEC_OP_DECK_INFO_INDEX_SEARCH_REV 0x1e
759#define CEC_OP_DECK_INFO_OTHER 0x1f
760
761#define CEC_MSG_GIVE_DECK_STATUS 0x1a
762
763#define CEC_OP_STATUS_REQ_ON 1
764#define CEC_OP_STATUS_REQ_OFF 2
765#define CEC_OP_STATUS_REQ_ONCE 3
766
767#define CEC_MSG_PLAY 0x41
768
769#define CEC_OP_PLAY_MODE_PLAY_FWD 0x24
770#define CEC_OP_PLAY_MODE_PLAY_REV 0x20
771#define CEC_OP_PLAY_MODE_PLAY_STILL 0x25
772#define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MIN 0x05
773#define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MED 0x06
774#define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MAX 0x07
775#define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MIN 0x09
776#define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MED 0x0a
777#define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MAX 0x0b
778#define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MIN 0x15
779#define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MED 0x16
780#define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MAX 0x17
781#define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MIN 0x19
782#define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MED 0x1a
783#define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MAX 0x1b
784
785
786
787#define CEC_MSG_GIVE_TUNER_DEVICE_STATUS 0x08
788#define CEC_MSG_SELECT_ANALOGUE_SERVICE 0x92
789#define CEC_MSG_SELECT_DIGITAL_SERVICE 0x93
790#define CEC_MSG_TUNER_DEVICE_STATUS 0x07
791
792#define CEC_OP_REC_FLAG_USED 0
793#define CEC_OP_REC_FLAG_NOT_USED 1
794
795#define CEC_OP_TUNER_DISPLAY_INFO_DIGITAL 0
796#define CEC_OP_TUNER_DISPLAY_INFO_NONE 1
797#define CEC_OP_TUNER_DISPLAY_INFO_ANALOGUE 2
798
799#define CEC_MSG_TUNER_STEP_DECREMENT 0x06
800#define CEC_MSG_TUNER_STEP_INCREMENT 0x05
801
802
803
804
805
806
807
808
809
810#define CEC_MSG_DEVICE_VENDOR_ID 0x87
811#define CEC_MSG_GIVE_DEVICE_VENDOR_ID 0x8c
812#define CEC_MSG_VENDOR_COMMAND 0x89
813#define CEC_MSG_VENDOR_COMMAND_WITH_ID 0xa0
814#define CEC_MSG_VENDOR_REMOTE_BUTTON_DOWN 0x8a
815#define CEC_MSG_VENDOR_REMOTE_BUTTON_UP 0x8b
816
817
818
819#define CEC_MSG_SET_OSD_STRING 0x64
820
821#define CEC_OP_DISP_CTL_DEFAULT 0x00
822#define CEC_OP_DISP_CTL_UNTIL_CLEARED 0x40
823#define CEC_OP_DISP_CTL_CLEAR 0x80
824
825
826
827#define CEC_MSG_GIVE_OSD_NAME 0x46
828#define CEC_MSG_SET_OSD_NAME 0x47
829
830
831
832#define CEC_MSG_MENU_REQUEST 0x8d
833
834#define CEC_OP_MENU_REQUEST_ACTIVATE 0x00
835#define CEC_OP_MENU_REQUEST_DEACTIVATE 0x01
836#define CEC_OP_MENU_REQUEST_QUERY 0x02
837
838#define CEC_MSG_MENU_STATUS 0x8e
839
840#define CEC_OP_MENU_STATE_ACTIVATED 0x00
841#define CEC_OP_MENU_STATE_DEACTIVATED 0x01
842
843#define CEC_MSG_USER_CONTROL_PRESSED 0x44
844
845#define CEC_OP_UI_BCAST_TYPE_TOGGLE_ALL 0x00
846#define CEC_OP_UI_BCAST_TYPE_TOGGLE_DIG_ANA 0x01
847#define CEC_OP_UI_BCAST_TYPE_ANALOGUE 0x10
848#define CEC_OP_UI_BCAST_TYPE_ANALOGUE_T 0x20
849#define CEC_OP_UI_BCAST_TYPE_ANALOGUE_CABLE 0x30
850#define CEC_OP_UI_BCAST_TYPE_ANALOGUE_SAT 0x40
851#define CEC_OP_UI_BCAST_TYPE_DIGITAL 0x50
852#define CEC_OP_UI_BCAST_TYPE_DIGITAL_T 0x60
853#define CEC_OP_UI_BCAST_TYPE_DIGITAL_CABLE 0x70
854#define CEC_OP_UI_BCAST_TYPE_DIGITAL_SAT 0x80
855#define CEC_OP_UI_BCAST_TYPE_DIGITAL_COM_SAT 0x90
856#define CEC_OP_UI_BCAST_TYPE_DIGITAL_COM_SAT2 0x91
857#define CEC_OP_UI_BCAST_TYPE_IP 0xa0
858
859#define CEC_OP_UI_SND_PRES_CTL_DUAL_MONO 0x10
860#define CEC_OP_UI_SND_PRES_CTL_KARAOKE 0x20
861#define CEC_OP_UI_SND_PRES_CTL_DOWNMIX 0x80
862#define CEC_OP_UI_SND_PRES_CTL_REVERB 0x90
863#define CEC_OP_UI_SND_PRES_CTL_EQUALIZER 0xa0
864#define CEC_OP_UI_SND_PRES_CTL_BASS_UP 0xb1
865#define CEC_OP_UI_SND_PRES_CTL_BASS_NEUTRAL 0xb2
866#define CEC_OP_UI_SND_PRES_CTL_BASS_DOWN 0xb3
867#define CEC_OP_UI_SND_PRES_CTL_TREBLE_UP 0xc1
868#define CEC_OP_UI_SND_PRES_CTL_TREBLE_NEUTRAL 0xc2
869#define CEC_OP_UI_SND_PRES_CTL_TREBLE_DOWN 0xc3
870
871#define CEC_MSG_USER_CONTROL_RELEASED 0x45
872
873
874
875
876
877
878
879
880
881
882
883
884#define CEC_MSG_GIVE_DEVICE_POWER_STATUS 0x8f
885#define CEC_MSG_REPORT_POWER_STATUS 0x90
886
887#define CEC_OP_POWER_STATUS_ON 0
888#define CEC_OP_POWER_STATUS_STANDBY 1
889#define CEC_OP_POWER_STATUS_TO_ON 2
890#define CEC_OP_POWER_STATUS_TO_STANDBY 3
891
892
893
894#define CEC_MSG_FEATURE_ABORT 0x00
895
896#define CEC_OP_ABORT_UNRECOGNIZED_OP 0
897#define CEC_OP_ABORT_INCORRECT_MODE 1
898#define CEC_OP_ABORT_NO_SOURCE 2
899#define CEC_OP_ABORT_INVALID_OP 3
900#define CEC_OP_ABORT_REFUSED 4
901#define CEC_OP_ABORT_UNDETERMINED 5
902
903#define CEC_MSG_ABORT 0xff
904
905
906
907
908
909
910
911
912
913#define CEC_MSG_GIVE_AUDIO_STATUS 0x71
914#define CEC_MSG_GIVE_SYSTEM_AUDIO_MODE_STATUS 0x7d
915#define CEC_MSG_REPORT_AUDIO_STATUS 0x7a
916
917#define CEC_OP_AUD_MUTE_STATUS_OFF 0
918#define CEC_OP_AUD_MUTE_STATUS_ON 1
919
920#define CEC_MSG_REPORT_SHORT_AUDIO_DESCRIPTOR 0xa3
921#define CEC_MSG_REQUEST_SHORT_AUDIO_DESCRIPTOR 0xa4
922#define CEC_MSG_SET_SYSTEM_AUDIO_MODE 0x72
923
924#define CEC_OP_SYS_AUD_STATUS_OFF 0
925#define CEC_OP_SYS_AUD_STATUS_ON 1
926
927#define CEC_MSG_SYSTEM_AUDIO_MODE_REQUEST 0x70
928#define CEC_MSG_SYSTEM_AUDIO_MODE_STATUS 0x7e
929
930#define CEC_OP_AUD_FMT_ID_CEA861 0
931#define CEC_OP_AUD_FMT_ID_CEA861_CXT 1
932
933
934
935#define CEC_MSG_SET_AUDIO_RATE 0x9a
936
937#define CEC_OP_AUD_RATE_OFF 0
938#define CEC_OP_AUD_RATE_WIDE_STD 1
939#define CEC_OP_AUD_RATE_WIDE_FAST 2
940#define CEC_OP_AUD_RATE_WIDE_SLOW 3
941#define CEC_OP_AUD_RATE_NARROW_STD 4
942#define CEC_OP_AUD_RATE_NARROW_FAST 5
943#define CEC_OP_AUD_RATE_NARROW_SLOW 6
944
945
946
947#define CEC_MSG_INITIATE_ARC 0xc0
948#define CEC_MSG_REPORT_ARC_INITIATED 0xc1
949#define CEC_MSG_REPORT_ARC_TERMINATED 0xc2
950#define CEC_MSG_REQUEST_ARC_INITIATION 0xc3
951#define CEC_MSG_REQUEST_ARC_TERMINATION 0xc4
952#define CEC_MSG_TERMINATE_ARC 0xc5
953
954
955
956
957#define CEC_MSG_REQUEST_CURRENT_LATENCY 0xa7
958#define CEC_MSG_REPORT_CURRENT_LATENCY 0xa8
959
960#define CEC_OP_LOW_LATENCY_MODE_OFF 0
961#define CEC_OP_LOW_LATENCY_MODE_ON 1
962
963#define CEC_OP_AUD_OUT_COMPENSATED_NA 0
964#define CEC_OP_AUD_OUT_COMPENSATED_DELAY 1
965#define CEC_OP_AUD_OUT_COMPENSATED_NO_DELAY 2
966#define CEC_OP_AUD_OUT_COMPENSATED_PARTIAL_DELAY 3
967
968
969
970#define CEC_MSG_CDC_MESSAGE 0xf8
971
972#define CEC_MSG_CDC_HEC_INQUIRE_STATE 0x00
973#define CEC_MSG_CDC_HEC_REPORT_STATE 0x01
974
975#define CEC_OP_HEC_FUNC_STATE_NOT_SUPPORTED 0
976#define CEC_OP_HEC_FUNC_STATE_INACTIVE 1
977#define CEC_OP_HEC_FUNC_STATE_ACTIVE 2
978#define CEC_OP_HEC_FUNC_STATE_ACTIVATION_FIELD 3
979
980#define CEC_OP_HOST_FUNC_STATE_NOT_SUPPORTED 0
981#define CEC_OP_HOST_FUNC_STATE_INACTIVE 1
982#define CEC_OP_HOST_FUNC_STATE_ACTIVE 2
983
984#define CEC_OP_ENC_FUNC_STATE_EXT_CON_NOT_SUPPORTED 0
985#define CEC_OP_ENC_FUNC_STATE_EXT_CON_INACTIVE 1
986#define CEC_OP_ENC_FUNC_STATE_EXT_CON_ACTIVE 2
987
988#define CEC_OP_CDC_ERROR_CODE_NONE 0
989#define CEC_OP_CDC_ERROR_CODE_CAP_UNSUPPORTED 1
990#define CEC_OP_CDC_ERROR_CODE_WRONG_STATE 2
991#define CEC_OP_CDC_ERROR_CODE_OTHER 3
992
993#define CEC_OP_HEC_SUPPORT_NO 0
994#define CEC_OP_HEC_SUPPORT_YES 1
995
996#define CEC_OP_HEC_ACTIVATION_ON 0
997#define CEC_OP_HEC_ACTIVATION_OFF 1
998
999#define CEC_MSG_CDC_HEC_SET_STATE_ADJACENT 0x02
1000#define CEC_MSG_CDC_HEC_SET_STATE 0x03
1001
1002#define CEC_OP_HEC_SET_STATE_DEACTIVATE 0
1003#define CEC_OP_HEC_SET_STATE_ACTIVATE 1
1004
1005#define CEC_MSG_CDC_HEC_REQUEST_DEACTIVATION 0x04
1006#define CEC_MSG_CDC_HEC_NOTIFY_ALIVE 0x05
1007#define CEC_MSG_CDC_HEC_DISCOVER 0x06
1008
1009#define CEC_MSG_CDC_HPD_SET_STATE 0x10
1010
1011#define CEC_OP_HPD_STATE_CP_EDID_DISABLE 0
1012#define CEC_OP_HPD_STATE_CP_EDID_ENABLE 1
1013#define CEC_OP_HPD_STATE_CP_EDID_DISABLE_ENABLE 2
1014#define CEC_OP_HPD_STATE_EDID_DISABLE 3
1015#define CEC_OP_HPD_STATE_EDID_ENABLE 4
1016#define CEC_OP_HPD_STATE_EDID_DISABLE_ENABLE 5
1017#define CEC_MSG_CDC_HPD_REPORT_STATE 0x11
1018
1019#define CEC_OP_HPD_ERROR_NONE 0
1020#define CEC_OP_HPD_ERROR_INITIATOR_NOT_CAPABLE 1
1021#define CEC_OP_HPD_ERROR_INITIATOR_WRONG_STATE 2
1022#define CEC_OP_HPD_ERROR_OTHER 3
1023#define CEC_OP_HPD_ERROR_NONE_NO_VIDEO 4
1024
1025
1026
1027
1028
1029static inline int cec_is_2nd_tv(const struct cec_log_addrs *las)
1030{
1031
1032
1033
1034
1035 return las->num_log_addrs &&
1036 las->log_addr[0] >= CEC_LOG_ADDR_SPECIFIC &&
1037 las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_TV;
1038}
1039
1040static inline int cec_is_processor(const struct cec_log_addrs *las)
1041{
1042
1043
1044
1045
1046 return las->num_log_addrs &&
1047 las->log_addr[0] >= CEC_LOG_ADDR_BACKUP_1 &&
1048 las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_PROCESSOR;
1049}
1050
1051static inline int cec_is_switch(const struct cec_log_addrs *las)
1052{
1053
1054
1055
1056
1057 return las->num_log_addrs == 1 &&
1058 las->log_addr[0] == CEC_LOG_ADDR_UNREGISTERED &&
1059 las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_SWITCH &&
1060 !(las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY);
1061}
1062
1063static inline int cec_is_cdc_only(const struct cec_log_addrs *las)
1064{
1065
1066
1067
1068
1069 return las->num_log_addrs == 1 &&
1070 las->log_addr[0] == CEC_LOG_ADDR_UNREGISTERED &&
1071 las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_SWITCH &&
1072 (las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY);
1073}
1074
1075#endif
1076