1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Lin 1 2 /* 3 * cec - HDMI Consumer Electronics Control mes 4 * 5 * Copyright 2016 Cisco Systems, Inc. and/or i 6 */ 7 8 #ifndef _CEC_UAPI_FUNCS_H 9 #define _CEC_UAPI_FUNCS_H 10 11 #include <linux/cec.h> 12 13 /* One Touch Play Feature */ 14 static inline void cec_msg_active_source(struc 15 { 16 msg->len = 4; 17 msg->msg[0] |= 0xf; /* broadcast */ 18 msg->msg[1] = CEC_MSG_ACTIVE_SOURCE; 19 msg->msg[2] = phys_addr >> 8; 20 msg->msg[3] = phys_addr & 0xff; 21 } 22 23 static inline void cec_ops_active_source(const 24 __u16 25 { 26 *phys_addr = (msg->msg[2] << 8) | msg- 27 } 28 29 static inline void cec_msg_image_view_on(struc 30 { 31 msg->len = 2; 32 msg->msg[1] = CEC_MSG_IMAGE_VIEW_ON; 33 } 34 35 static inline void cec_msg_text_view_on(struct 36 { 37 msg->len = 2; 38 msg->msg[1] = CEC_MSG_TEXT_VIEW_ON; 39 } 40 41 42 /* Routing Control Feature */ 43 static inline void cec_msg_inactive_source(str 44 __u 45 { 46 msg->len = 4; 47 msg->msg[1] = CEC_MSG_INACTIVE_SOURCE; 48 msg->msg[2] = phys_addr >> 8; 49 msg->msg[3] = phys_addr & 0xff; 50 } 51 52 static inline void cec_ops_inactive_source(con 53 __u 54 { 55 *phys_addr = (msg->msg[2] << 8) | msg- 56 } 57 58 static inline void cec_msg_request_active_sour 59 60 { 61 msg->len = 2; 62 msg->msg[0] |= 0xf; /* broadcast */ 63 msg->msg[1] = CEC_MSG_REQUEST_ACTIVE_S 64 msg->reply = reply ? CEC_MSG_ACTIVE_SO 65 } 66 67 static inline void cec_msg_routing_information 68 69 { 70 msg->len = 4; 71 msg->msg[0] |= 0xf; /* broadcast */ 72 msg->msg[1] = CEC_MSG_ROUTING_INFORMAT 73 msg->msg[2] = phys_addr >> 8; 74 msg->msg[3] = phys_addr & 0xff; 75 } 76 77 static inline void cec_ops_routing_information 78 79 { 80 *phys_addr = (msg->msg[2] << 8) | msg- 81 } 82 83 static inline void cec_msg_routing_change(stru 84 int 85 __u1 86 __u1 87 { 88 msg->len = 6; 89 msg->msg[0] |= 0xf; /* broadcast */ 90 msg->msg[1] = CEC_MSG_ROUTING_CHANGE; 91 msg->msg[2] = orig_phys_addr >> 8; 92 msg->msg[3] = orig_phys_addr & 0xff; 93 msg->msg[4] = new_phys_addr >> 8; 94 msg->msg[5] = new_phys_addr & 0xff; 95 msg->reply = reply ? CEC_MSG_ROUTING_I 96 } 97 98 static inline void cec_ops_routing_change(cons 99 __u1 100 __u1 101 { 102 *orig_phys_addr = (msg->msg[2] << 8) | 103 *new_phys_addr = (msg->msg[4] << 8) | 104 } 105 106 static inline void cec_msg_set_stream_path(str 107 { 108 msg->len = 4; 109 msg->msg[0] |= 0xf; /* broadcast */ 110 msg->msg[1] = CEC_MSG_SET_STREAM_PATH; 111 msg->msg[2] = phys_addr >> 8; 112 msg->msg[3] = phys_addr & 0xff; 113 } 114 115 static inline void cec_ops_set_stream_path(con 116 __u 117 { 118 *phys_addr = (msg->msg[2] << 8) | msg- 119 } 120 121 122 /* Standby Feature */ 123 static inline void cec_msg_standby(struct cec_ 124 { 125 msg->len = 2; 126 msg->msg[1] = CEC_MSG_STANDBY; 127 } 128 129 130 /* One Touch Record Feature */ 131 static inline void cec_msg_record_off(struct c 132 { 133 msg->len = 2; 134 msg->msg[1] = CEC_MSG_RECORD_OFF; 135 msg->reply = reply ? CEC_MSG_RECORD_ST 136 } 137 138 struct cec_op_arib_data { 139 __u16 transport_id; 140 __u16 service_id; 141 __u16 orig_network_id; 142 }; 143 144 struct cec_op_atsc_data { 145 __u16 transport_id; 146 __u16 program_number; 147 }; 148 149 struct cec_op_dvb_data { 150 __u16 transport_id; 151 __u16 service_id; 152 __u16 orig_network_id; 153 }; 154 155 struct cec_op_channel_data { 156 __u8 channel_number_fmt; 157 __u16 major; 158 __u16 minor; 159 }; 160 161 struct cec_op_digital_service_id { 162 __u8 service_id_method; 163 __u8 dig_bcast_system; 164 union { 165 struct cec_op_arib_data arib; 166 struct cec_op_atsc_data atsc; 167 struct cec_op_dvb_data dvb; 168 struct cec_op_channel_data cha 169 }; 170 }; 171 172 struct cec_op_record_src { 173 __u8 type; 174 union { 175 struct cec_op_digital_service_ 176 struct { 177 __u8 ana_bcast_type; 178 __u16 ana_freq; 179 __u8 bcast_system; 180 } analog; 181 struct { 182 __u8 plug; 183 } ext_plug; 184 struct { 185 __u16 phys_addr; 186 } ext_phys_addr; 187 }; 188 }; 189 190 static inline void cec_set_digital_service_id( 191 const struct cec_op_digital_serv 192 { 193 *msg++ = (digital->service_id_method < 194 if (digital->service_id_method == CEC_ 195 *msg++ = (digital->channel.cha 196 (digital->channel.maj 197 *msg++ = digital->channel.majo 198 *msg++ = digital->channel.mino 199 *msg++ = digital->channel.mino 200 *msg++ = 0; 201 *msg++ = 0; 202 return; 203 } 204 switch (digital->dig_bcast_system) { 205 case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_A 206 case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_A 207 case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_A 208 case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_A 209 *msg++ = digital->atsc.transpo 210 *msg++ = digital->atsc.transpo 211 *msg++ = digital->atsc.program 212 *msg++ = digital->atsc.program 213 *msg++ = 0; 214 *msg++ = 0; 215 break; 216 default: 217 *msg++ = digital->dvb.transpor 218 *msg++ = digital->dvb.transpor 219 *msg++ = digital->dvb.service_ 220 *msg++ = digital->dvb.service_ 221 *msg++ = digital->dvb.orig_net 222 *msg++ = digital->dvb.orig_net 223 break; 224 } 225 } 226 227 static inline void cec_get_digital_service_id( 228 struct cec_op_digital_service_id 229 { 230 digital->service_id_method = msg[0] >> 231 digital->dig_bcast_system = msg[0] & 0 232 if (digital->service_id_method == CEC_ 233 digital->channel.channel_numbe 234 digital->channel.major = ((msg 235 digital->channel.minor = (msg[ 236 return; 237 } 238 digital->dvb.transport_id = (msg[1] << 239 digital->dvb.service_id = (msg[3] << 8 240 digital->dvb.orig_network_id = (msg[5] 241 } 242 243 static inline void cec_msg_record_on_own(struc 244 { 245 msg->len = 3; 246 msg->msg[1] = CEC_MSG_RECORD_ON; 247 msg->msg[2] = CEC_OP_RECORD_SRC_OWN; 248 } 249 250 static inline void cec_msg_record_on_digital(s 251 const struct cec_ 252 { 253 msg->len = 10; 254 msg->msg[1] = CEC_MSG_RECORD_ON; 255 msg->msg[2] = CEC_OP_RECORD_SRC_DIGITA 256 cec_set_digital_service_id(msg->msg + 257 } 258 259 static inline void cec_msg_record_on_analog(st 260 __ 261 __ 262 __ 263 { 264 msg->len = 7; 265 msg->msg[1] = CEC_MSG_RECORD_ON; 266 msg->msg[2] = CEC_OP_RECORD_SRC_ANALOG 267 msg->msg[3] = ana_bcast_type; 268 msg->msg[4] = ana_freq >> 8; 269 msg->msg[5] = ana_freq & 0xff; 270 msg->msg[6] = bcast_system; 271 } 272 273 static inline void cec_msg_record_on_plug(stru 274 __u8 275 { 276 msg->len = 4; 277 msg->msg[1] = CEC_MSG_RECORD_ON; 278 msg->msg[2] = CEC_OP_RECORD_SRC_EXT_PL 279 msg->msg[3] = plug; 280 } 281 282 static inline void cec_msg_record_on_phys_addr 283 284 { 285 msg->len = 5; 286 msg->msg[1] = CEC_MSG_RECORD_ON; 287 msg->msg[2] = CEC_OP_RECORD_SRC_EXT_PH 288 msg->msg[3] = phys_addr >> 8; 289 msg->msg[4] = phys_addr & 0xff; 290 } 291 292 static inline void cec_msg_record_on(struct ce 293 int reply 294 const str 295 { 296 switch (rec_src->type) { 297 case CEC_OP_RECORD_SRC_OWN: 298 cec_msg_record_on_own(msg); 299 break; 300 case CEC_OP_RECORD_SRC_DIGITAL: 301 cec_msg_record_on_digital(msg, 302 break; 303 case CEC_OP_RECORD_SRC_ANALOG: 304 cec_msg_record_on_analog(msg, 305 rec_s 306 rec_s 307 rec_s 308 break; 309 case CEC_OP_RECORD_SRC_EXT_PLUG: 310 cec_msg_record_on_plug(msg, re 311 break; 312 case CEC_OP_RECORD_SRC_EXT_PHYS_ADDR: 313 cec_msg_record_on_phys_addr(ms 314 re 315 break; 316 } 317 msg->reply = reply ? CEC_MSG_RECORD_ST 318 } 319 320 static inline void cec_ops_record_on(const str 321 struct ce 322 { 323 rec_src->type = msg->msg[2]; 324 switch (rec_src->type) { 325 case CEC_OP_RECORD_SRC_OWN: 326 break; 327 case CEC_OP_RECORD_SRC_DIGITAL: 328 cec_get_digital_service_id(msg 329 break; 330 case CEC_OP_RECORD_SRC_ANALOG: 331 rec_src->analog.ana_bcast_type 332 rec_src->analog.ana_freq = 333 (msg->msg[4] << 8) | m 334 rec_src->analog.bcast_system = 335 break; 336 case CEC_OP_RECORD_SRC_EXT_PLUG: 337 rec_src->ext_plug.plug = msg-> 338 break; 339 case CEC_OP_RECORD_SRC_EXT_PHYS_ADDR: 340 rec_src->ext_phys_addr.phys_ad 341 (msg->msg[3] << 8) | m 342 break; 343 } 344 } 345 346 static inline void cec_msg_record_status(struc 347 { 348 msg->len = 3; 349 msg->msg[1] = CEC_MSG_RECORD_STATUS; 350 msg->msg[2] = rec_status; 351 } 352 353 static inline void cec_ops_record_status(const 354 __u8 355 { 356 *rec_status = msg->msg[2]; 357 } 358 359 static inline void cec_msg_record_tv_screen(st 360 in 361 { 362 msg->len = 2; 363 msg->msg[1] = CEC_MSG_RECORD_TV_SCREEN 364 msg->reply = reply ? CEC_MSG_RECORD_ON 365 } 366 367 368 /* Timer Programming Feature */ 369 static inline void cec_msg_timer_status(struct 370 __u8 t 371 __u8 m 372 __u8 p 373 __u8 p 374 __u8 d 375 __u8 d 376 { 377 msg->len = 3; 378 msg->msg[1] = CEC_MSG_TIMER_STATUS; 379 msg->msg[2] = (timer_overlap_warning < 380 (media_info << 5) | 381 (prog_info ? 0x10 : 0) | 382 (prog_info ? prog_info : prog_ 383 if (prog_info == CEC_OP_PROG_INFO_NOT_ 384 prog_info == CEC_OP_PROG_INFO_MIGH 385 prog_error == CEC_OP_PROG_ERROR_DU 386 msg->len += 2; 387 msg->msg[3] = ((duration_hr / 388 msg->msg[4] = ((duration_min / 389 } 390 } 391 392 static inline void cec_ops_timer_status(const 393 __u8 * 394 __u8 * 395 __u8 * 396 __u8 * 397 __u8 * 398 __u8 * 399 { 400 *timer_overlap_warning = msg->msg[2] > 401 *media_info = (msg->msg[2] >> 5) & 3; 402 if (msg->msg[2] & 0x10) { 403 *prog_info = msg->msg[2] & 0xf 404 *prog_error = 0; 405 } else { 406 *prog_info = 0; 407 *prog_error = msg->msg[2] & 0x 408 } 409 if (*prog_info == CEC_OP_PROG_INFO_NOT 410 *prog_info == CEC_OP_PROG_INFO_MIG 411 *prog_error == CEC_OP_PROG_ERROR_D 412 *duration_hr = (msg->msg[3] >> 413 *duration_min = (msg->msg[4] > 414 } else { 415 *duration_hr = *duration_min = 416 } 417 } 418 419 static inline void cec_msg_timer_cleared_statu 420 421 { 422 msg->len = 3; 423 msg->msg[1] = CEC_MSG_TIMER_CLEARED_ST 424 msg->msg[2] = timer_cleared_status; 425 } 426 427 static inline void cec_ops_timer_cleared_statu 428 429 { 430 *timer_cleared_status = msg->msg[2]; 431 } 432 433 static inline void cec_msg_clear_analogue_time 434 435 436 437 438 439 440 441 442 443 444 445 { 446 msg->len = 13; 447 msg->msg[1] = CEC_MSG_CLEAR_ANALOGUE_T 448 msg->msg[2] = day; 449 msg->msg[3] = month; 450 /* Hours and minutes are in BCD format 451 msg->msg[4] = ((start_hr / 10) << 4) | 452 msg->msg[5] = ((start_min / 10) << 4) 453 msg->msg[6] = ((duration_hr / 10) << 4 454 msg->msg[7] = ((duration_min / 10) << 455 msg->msg[8] = recording_seq; 456 msg->msg[9] = ana_bcast_type; 457 msg->msg[10] = ana_freq >> 8; 458 msg->msg[11] = ana_freq & 0xff; 459 msg->msg[12] = bcast_system; 460 msg->reply = reply ? CEC_MSG_TIMER_CLE 461 } 462 463 static inline void cec_ops_clear_analogue_time 464 465 466 467 468 469 470 471 472 473 474 { 475 *day = msg->msg[2]; 476 *month = msg->msg[3]; 477 /* Hours and minutes are in BCD format 478 *start_hr = (msg->msg[4] >> 4) * 10 + 479 *start_min = (msg->msg[5] >> 4) * 10 + 480 *duration_hr = (msg->msg[6] >> 4) * 10 481 *duration_min = (msg->msg[7] >> 4) * 1 482 *recording_seq = msg->msg[8]; 483 *ana_bcast_type = msg->msg[9]; 484 *ana_freq = (msg->msg[10] << 8) | msg- 485 *bcast_system = msg->msg[12]; 486 } 487 488 static inline void cec_msg_clear_digital_timer 489 int reply, 490 __u8 day, 491 __u8 month, 492 __u8 start_hr, 493 __u8 start_min 494 __u8 duration_ 495 __u8 duration_ 496 __u8 recording 497 const struct c 498 { 499 msg->len = 16; 500 msg->reply = reply ? CEC_MSG_TIMER_CLE 501 msg->msg[1] = CEC_MSG_CLEAR_DIGITAL_TI 502 msg->msg[2] = day; 503 msg->msg[3] = month; 504 /* Hours and minutes are in BCD format 505 msg->msg[4] = ((start_hr / 10) << 4) | 506 msg->msg[5] = ((start_min / 10) << 4) 507 msg->msg[6] = ((duration_hr / 10) << 4 508 msg->msg[7] = ((duration_min / 10) << 509 msg->msg[8] = recording_seq; 510 cec_set_digital_service_id(msg->msg + 511 } 512 513 static inline void cec_ops_clear_digital_timer 514 __u8 *day, 515 __u8 *month, 516 __u8 *start_hr 517 __u8 *start_mi 518 __u8 *duration 519 __u8 *duration 520 __u8 *recordin 521 struct cec_op_ 522 { 523 *day = msg->msg[2]; 524 *month = msg->msg[3]; 525 /* Hours and minutes are in BCD format 526 *start_hr = (msg->msg[4] >> 4) * 10 + 527 *start_min = (msg->msg[5] >> 4) * 10 + 528 *duration_hr = (msg->msg[6] >> 4) * 10 529 *duration_min = (msg->msg[7] >> 4) * 1 530 *recording_seq = msg->msg[8]; 531 cec_get_digital_service_id(msg->msg + 532 } 533 534 static inline void cec_msg_clear_ext_timer(str 535 int 536 __u 537 __u 538 __u 539 __u 540 __u 541 __u 542 __u 543 __u 544 __u 545 __u 546 { 547 msg->len = 13; 548 msg->msg[1] = CEC_MSG_CLEAR_EXT_TIMER; 549 msg->msg[2] = day; 550 msg->msg[3] = month; 551 /* Hours and minutes are in BCD format 552 msg->msg[4] = ((start_hr / 10) << 4) | 553 msg->msg[5] = ((start_min / 10) << 4) 554 msg->msg[6] = ((duration_hr / 10) << 4 555 msg->msg[7] = ((duration_min / 10) << 556 msg->msg[8] = recording_seq; 557 msg->msg[9] = ext_src_spec; 558 msg->msg[10] = plug; 559 msg->msg[11] = phys_addr >> 8; 560 msg->msg[12] = phys_addr & 0xff; 561 msg->reply = reply ? CEC_MSG_TIMER_CLE 562 } 563 564 static inline void cec_ops_clear_ext_timer(con 565 __u 566 __u 567 __u 568 __u 569 __u 570 __u 571 __u 572 __u 573 __u 574 __u 575 { 576 *day = msg->msg[2]; 577 *month = msg->msg[3]; 578 /* Hours and minutes are in BCD format 579 *start_hr = (msg->msg[4] >> 4) * 10 + 580 *start_min = (msg->msg[5] >> 4) * 10 + 581 *duration_hr = (msg->msg[6] >> 4) * 10 582 *duration_min = (msg->msg[7] >> 4) * 1 583 *recording_seq = msg->msg[8]; 584 *ext_src_spec = msg->msg[9]; 585 *plug = msg->msg[10]; 586 *phys_addr = (msg->msg[11] << 8) | msg 587 } 588 589 static inline void cec_msg_set_analogue_timer( 590 591 592 593 594 595 596 597 598 599 600 601 { 602 msg->len = 13; 603 msg->msg[1] = CEC_MSG_SET_ANALOGUE_TIM 604 msg->msg[2] = day; 605 msg->msg[3] = month; 606 /* Hours and minutes are in BCD format 607 msg->msg[4] = ((start_hr / 10) << 4) | 608 msg->msg[5] = ((start_min / 10) << 4) 609 msg->msg[6] = ((duration_hr / 10) << 4 610 msg->msg[7] = ((duration_min / 10) << 611 msg->msg[8] = recording_seq; 612 msg->msg[9] = ana_bcast_type; 613 msg->msg[10] = ana_freq >> 8; 614 msg->msg[11] = ana_freq & 0xff; 615 msg->msg[12] = bcast_system; 616 msg->reply = reply ? CEC_MSG_TIMER_STA 617 } 618 619 static inline void cec_ops_set_analogue_timer( 620 621 622 623 624 625 626 627 628 629 630 { 631 *day = msg->msg[2]; 632 *month = msg->msg[3]; 633 /* Hours and minutes are in BCD format 634 *start_hr = (msg->msg[4] >> 4) * 10 + 635 *start_min = (msg->msg[5] >> 4) * 10 + 636 *duration_hr = (msg->msg[6] >> 4) * 10 637 *duration_min = (msg->msg[7] >> 4) * 1 638 *recording_seq = msg->msg[8]; 639 *ana_bcast_type = msg->msg[9]; 640 *ana_freq = (msg->msg[10] << 8) | msg- 641 *bcast_system = msg->msg[12]; 642 } 643 644 static inline void cec_msg_set_digital_timer(s 645 int reply, 646 __u8 day, 647 __u8 month, 648 __u8 start_hr, 649 __u8 start_min, 650 __u8 duration_hr, 651 __u8 duration_min, 652 __u8 recording_seq, 653 const struct cec_op_di 654 { 655 msg->len = 16; 656 msg->reply = reply ? CEC_MSG_TIMER_STA 657 msg->msg[1] = CEC_MSG_SET_DIGITAL_TIME 658 msg->msg[2] = day; 659 msg->msg[3] = month; 660 /* Hours and minutes are in BCD format 661 msg->msg[4] = ((start_hr / 10) << 4) | 662 msg->msg[5] = ((start_min / 10) << 4) 663 msg->msg[6] = ((duration_hr / 10) << 4 664 msg->msg[7] = ((duration_min / 10) << 665 msg->msg[8] = recording_seq; 666 cec_set_digital_service_id(msg->msg + 667 } 668 669 static inline void cec_ops_set_digital_timer(c 670 __u8 *day, 671 __u8 *month, 672 __u8 *start_hr, 673 __u8 *start_min, 674 __u8 *duration_hr, 675 __u8 *duration_min, 676 __u8 *recording_seq, 677 struct cec_op_digital_ 678 { 679 *day = msg->msg[2]; 680 *month = msg->msg[3]; 681 /* Hours and minutes are in BCD format 682 *start_hr = (msg->msg[4] >> 4) * 10 + 683 *start_min = (msg->msg[5] >> 4) * 10 + 684 *duration_hr = (msg->msg[6] >> 4) * 10 685 *duration_min = (msg->msg[7] >> 4) * 1 686 *recording_seq = msg->msg[8]; 687 cec_get_digital_service_id(msg->msg + 688 } 689 690 static inline void cec_msg_set_ext_timer(struc 691 int r 692 __u8 693 __u8 694 __u8 695 __u8 696 __u8 697 __u8 698 __u8 699 __u8 700 __u8 701 __u16 702 { 703 msg->len = 13; 704 msg->msg[1] = CEC_MSG_SET_EXT_TIMER; 705 msg->msg[2] = day; 706 msg->msg[3] = month; 707 /* Hours and minutes are in BCD format 708 msg->msg[4] = ((start_hr / 10) << 4) | 709 msg->msg[5] = ((start_min / 10) << 4) 710 msg->msg[6] = ((duration_hr / 10) << 4 711 msg->msg[7] = ((duration_min / 10) << 712 msg->msg[8] = recording_seq; 713 msg->msg[9] = ext_src_spec; 714 msg->msg[10] = plug; 715 msg->msg[11] = phys_addr >> 8; 716 msg->msg[12] = phys_addr & 0xff; 717 msg->reply = reply ? CEC_MSG_TIMER_STA 718 } 719 720 static inline void cec_ops_set_ext_timer(const 721 __u8 722 __u8 723 __u8 724 __u8 725 __u8 726 __u8 727 __u8 728 __u8 729 __u8 730 __u16 731 { 732 *day = msg->msg[2]; 733 *month = msg->msg[3]; 734 /* Hours and minutes are in BCD format 735 *start_hr = (msg->msg[4] >> 4) * 10 + 736 *start_min = (msg->msg[5] >> 4) * 10 + 737 *duration_hr = (msg->msg[6] >> 4) * 10 738 *duration_min = (msg->msg[7] >> 4) * 1 739 *recording_seq = msg->msg[8]; 740 *ext_src_spec = msg->msg[9]; 741 *plug = msg->msg[10]; 742 *phys_addr = (msg->msg[11] << 8) | msg 743 } 744 745 static inline void cec_msg_set_timer_program_t 746 747 { 748 unsigned int len = strlen(prog_title); 749 750 if (len > 14) 751 len = 14; 752 msg->len = 2 + len; 753 msg->msg[1] = CEC_MSG_SET_TIMER_PROGRA 754 memcpy(msg->msg + 2, prog_title, len); 755 } 756 757 static inline void cec_ops_set_timer_program_t 758 759 { 760 unsigned int len = msg->len > 2 ? msg- 761 762 if (len > 14) 763 len = 14; 764 memcpy(prog_title, msg->msg + 2, len); 765 prog_title[len] = '\0'; 766 } 767 768 /* System Information Feature */ 769 static inline void cec_msg_cec_version(struct 770 { 771 msg->len = 3; 772 msg->msg[1] = CEC_MSG_CEC_VERSION; 773 msg->msg[2] = cec_version; 774 } 775 776 static inline void cec_ops_cec_version(const s 777 __u8 *c 778 { 779 *cec_version = msg->msg[2]; 780 } 781 782 static inline void cec_msg_get_cec_version(str 783 int 784 { 785 msg->len = 2; 786 msg->msg[1] = CEC_MSG_GET_CEC_VERSION; 787 msg->reply = reply ? CEC_MSG_CEC_VERSI 788 } 789 790 static inline void cec_msg_report_physical_add 791 __u16 792 { 793 msg->len = 5; 794 msg->msg[0] |= 0xf; /* broadcast */ 795 msg->msg[1] = CEC_MSG_REPORT_PHYSICAL_ 796 msg->msg[2] = phys_addr >> 8; 797 msg->msg[3] = phys_addr & 0xff; 798 msg->msg[4] = prim_devtype; 799 } 800 801 static inline void cec_ops_report_physical_add 802 __u16 803 { 804 *phys_addr = (msg->msg[2] << 8) | msg- 805 *prim_devtype = msg->msg[4]; 806 } 807 808 static inline void cec_msg_give_physical_addr( 809 810 { 811 msg->len = 2; 812 msg->msg[1] = CEC_MSG_GIVE_PHYSICAL_AD 813 msg->reply = reply ? CEC_MSG_REPORT_PH 814 } 815 816 static inline void cec_msg_set_menu_language(s 817 c 818 { 819 msg->len = 5; 820 msg->msg[0] |= 0xf; /* broadcast */ 821 msg->msg[1] = CEC_MSG_SET_MENU_LANGUAG 822 memcpy(msg->msg + 2, language, 3); 823 } 824 825 static inline void cec_ops_set_menu_language(c 826 c 827 { 828 memcpy(language, msg->msg + 2, 3); 829 language[3] = '\0'; 830 } 831 832 static inline void cec_msg_get_menu_language(s 833 i 834 { 835 msg->len = 2; 836 msg->msg[1] = CEC_MSG_GET_MENU_LANGUAG 837 msg->reply = reply ? CEC_MSG_SET_MENU_ 838 } 839 840 /* 841 * Assumes a single RC Profile byte and a sing 842 * i.e. no extended features are supported by 843 * 844 * As of CEC 2.0 no extended features are defi 845 * in the future, then this function needs to 846 * should be added. 847 */ 848 static inline void cec_msg_report_features(str 849 __u8 cec_versi 850 __u8 rc_profil 851 { 852 msg->len = 6; 853 msg->msg[0] |= 0xf; /* broadcast */ 854 msg->msg[1] = CEC_MSG_REPORT_FEATURES; 855 msg->msg[2] = cec_version; 856 msg->msg[3] = all_device_types; 857 msg->msg[4] = rc_profile; 858 msg->msg[5] = dev_features; 859 } 860 861 static inline void cec_ops_report_features(con 862 __u8 *cec_version, __u 863 const __u8 **rc_profil 864 { 865 const __u8 *p = &msg->msg[4]; 866 867 *cec_version = msg->msg[2]; 868 *all_device_types = msg->msg[3]; 869 *rc_profile = p; 870 *dev_features = NULL; 871 while (p < &msg->msg[14] && (*p & CEC_ 872 p++; 873 if (!(*p & CEC_OP_FEAT_EXT)) { 874 *dev_features = p + 1; 875 while (p < &msg->msg[15] && (* 876 p++; 877 } 878 if (*p & CEC_OP_FEAT_EXT) 879 *rc_profile = *dev_features = 880 } 881 882 static inline void cec_msg_give_features(struc 883 int r 884 { 885 msg->len = 2; 886 msg->msg[1] = CEC_MSG_GIVE_FEATURES; 887 msg->reply = reply ? CEC_MSG_REPORT_FE 888 } 889 890 /* Deck Control Feature */ 891 static inline void cec_msg_deck_control(struct 892 __u8 d 893 { 894 msg->len = 3; 895 msg->msg[1] = CEC_MSG_DECK_CONTROL; 896 msg->msg[2] = deck_control_mode; 897 } 898 899 static inline void cec_ops_deck_control(const 900 __u8 * 901 { 902 *deck_control_mode = msg->msg[2]; 903 } 904 905 static inline void cec_msg_deck_status(struct 906 __u8 de 907 { 908 msg->len = 3; 909 msg->msg[1] = CEC_MSG_DECK_STATUS; 910 msg->msg[2] = deck_info; 911 } 912 913 static inline void cec_ops_deck_status(const s 914 __u8 *d 915 { 916 *deck_info = msg->msg[2]; 917 } 918 919 static inline void cec_msg_give_deck_status(st 920 in 921 __ 922 { 923 msg->len = 3; 924 msg->msg[1] = CEC_MSG_GIVE_DECK_STATUS 925 msg->msg[2] = status_req; 926 msg->reply = (reply && status_req != C 927 CEC_MSG_DECK_S 928 } 929 930 static inline void cec_ops_give_deck_status(co 931 __ 932 { 933 *status_req = msg->msg[2]; 934 } 935 936 static inline void cec_msg_play(struct cec_msg 937 __u8 play_mode 938 { 939 msg->len = 3; 940 msg->msg[1] = CEC_MSG_PLAY; 941 msg->msg[2] = play_mode; 942 } 943 944 static inline void cec_ops_play(const struct c 945 __u8 *play_mod 946 { 947 *play_mode = msg->msg[2]; 948 } 949 950 951 /* Tuner Control Feature */ 952 struct cec_op_tuner_device_info { 953 __u8 rec_flag; 954 __u8 tuner_display_info; 955 __u8 is_analog; 956 union { 957 struct cec_op_digital_service_ 958 struct { 959 __u8 ana_bcast_type; 960 __u16 ana_freq; 961 __u8 bcast_system; 962 } analog; 963 }; 964 }; 965 966 static inline void cec_msg_tuner_device_status 967 968 969 970 971 972 { 973 msg->len = 7; 974 msg->msg[1] = CEC_MSG_TUNER_DEVICE_STA 975 msg->msg[2] = (rec_flag << 7) | tuner_ 976 msg->msg[3] = ana_bcast_type; 977 msg->msg[4] = ana_freq >> 8; 978 msg->msg[5] = ana_freq & 0xff; 979 msg->msg[6] = bcast_system; 980 } 981 982 static inline void cec_msg_tuner_device_status 983 __u8 rec_flag, __u8 tuner_d 984 const struct cec_op_digital 985 { 986 msg->len = 10; 987 msg->msg[1] = CEC_MSG_TUNER_DEVICE_STA 988 msg->msg[2] = (rec_flag << 7) | tuner_ 989 cec_set_digital_service_id(msg->msg + 990 } 991 992 static inline void cec_msg_tuner_device_status 993 const struct cec_op_tu 994 { 995 if (tuner_dev_info->is_analog) 996 cec_msg_tuner_device_status_an 997 tuner_dev_info->rec_fl 998 tuner_dev_info->tuner_ 999 tuner_dev_info->analog 1000 tuner_dev_info->analo 1001 tuner_dev_info->analo 1002 else 1003 cec_msg_tuner_device_status_d 1004 tuner_dev_info->rec_f 1005 tuner_dev_info->tuner 1006 &tuner_dev_info->digi 1007 } 1008 1009 static inline void cec_ops_tuner_device_statu 1010 struct cec_op 1011 { 1012 tuner_dev_info->is_analog = msg->len 1013 tuner_dev_info->rec_flag = msg->msg[2 1014 tuner_dev_info->tuner_display_info = 1015 if (tuner_dev_info->is_analog) { 1016 tuner_dev_info->analog.ana_bc 1017 tuner_dev_info->analog.ana_fr 1018 tuner_dev_info->analog.bcast_ 1019 return; 1020 } 1021 cec_get_digital_service_id(msg->msg + 1022 } 1023 1024 static inline void cec_msg_give_tuner_device_ 1025 1026 1027 { 1028 msg->len = 3; 1029 msg->msg[1] = CEC_MSG_GIVE_TUNER_DEVI 1030 msg->msg[2] = status_req; 1031 msg->reply = (reply && status_req != 1032 CEC_MSG_TUNER 1033 } 1034 1035 static inline void cec_ops_give_tuner_device_ 1036 1037 { 1038 *status_req = msg->msg[2]; 1039 } 1040 1041 static inline void cec_msg_select_analogue_se 1042 1043 1044 1045 { 1046 msg->len = 6; 1047 msg->msg[1] = CEC_MSG_SELECT_ANALOGUE 1048 msg->msg[2] = ana_bcast_type; 1049 msg->msg[3] = ana_freq >> 8; 1050 msg->msg[4] = ana_freq & 0xff; 1051 msg->msg[5] = bcast_system; 1052 } 1053 1054 static inline void cec_ops_select_analogue_se 1055 1056 1057 1058 { 1059 *ana_bcast_type = msg->msg[2]; 1060 *ana_freq = (msg->msg[3] << 8) | msg- 1061 *bcast_system = msg->msg[5]; 1062 } 1063 1064 static inline void cec_msg_select_digital_ser 1065 const struct 1066 { 1067 msg->len = 9; 1068 msg->msg[1] = CEC_MSG_SELECT_DIGITAL_ 1069 cec_set_digital_service_id(msg->msg + 1070 } 1071 1072 static inline void cec_ops_select_digital_ser 1073 struct cec_op 1074 { 1075 cec_get_digital_service_id(msg->msg + 1076 } 1077 1078 static inline void cec_msg_tuner_step_decreme 1079 { 1080 msg->len = 2; 1081 msg->msg[1] = CEC_MSG_TUNER_STEP_DECR 1082 } 1083 1084 static inline void cec_msg_tuner_step_increme 1085 { 1086 msg->len = 2; 1087 msg->msg[1] = CEC_MSG_TUNER_STEP_INCR 1088 } 1089 1090 1091 /* Vendor Specific Commands Feature */ 1092 static inline void cec_msg_device_vendor_id(s 1093 { 1094 msg->len = 5; 1095 msg->msg[0] |= 0xf; /* broadcast */ 1096 msg->msg[1] = CEC_MSG_DEVICE_VENDOR_I 1097 msg->msg[2] = vendor_id >> 16; 1098 msg->msg[3] = (vendor_id >> 8) & 0xff 1099 msg->msg[4] = vendor_id & 0xff; 1100 } 1101 1102 static inline void cec_ops_device_vendor_id(c 1103 _ 1104 { 1105 *vendor_id = (msg->msg[2] << 16) | (m 1106 } 1107 1108 static inline void cec_msg_give_device_vendor 1109 1110 { 1111 msg->len = 2; 1112 msg->msg[1] = CEC_MSG_GIVE_DEVICE_VEN 1113 msg->reply = reply ? CEC_MSG_DEVICE_V 1114 } 1115 1116 static inline void cec_msg_vendor_command(str 1117 __u 1118 { 1119 if (size > 14) 1120 size = 14; 1121 msg->len = 2 + size; 1122 msg->msg[1] = CEC_MSG_VENDOR_COMMAND; 1123 memcpy(msg->msg + 2, vendor_cmd, size 1124 } 1125 1126 static inline void cec_ops_vendor_command(con 1127 __u 1128 con 1129 { 1130 *size = msg->len - 2; 1131 1132 if (*size > 14) 1133 *size = 14; 1134 *vendor_cmd = msg->msg + 2; 1135 } 1136 1137 static inline void cec_msg_vendor_command_wit 1138 1139 1140 { 1141 if (size > 11) 1142 size = 11; 1143 msg->len = 5 + size; 1144 msg->msg[1] = CEC_MSG_VENDOR_COMMAND_ 1145 msg->msg[2] = vendor_id >> 16; 1146 msg->msg[3] = (vendor_id >> 8) & 0xff 1147 msg->msg[4] = vendor_id & 0xff; 1148 memcpy(msg->msg + 5, vendor_cmd, size 1149 } 1150 1151 static inline void cec_ops_vendor_command_wit 1152 1153 1154 { 1155 *size = msg->len - 5; 1156 1157 if (*size > 11) 1158 *size = 11; 1159 *vendor_id = (msg->msg[2] << 16) | (m 1160 *vendor_cmd = msg->msg + 5; 1161 } 1162 1163 static inline void cec_msg_vendor_remote_butt 1164 1165 1166 { 1167 if (size > 14) 1168 size = 14; 1169 msg->len = 2 + size; 1170 msg->msg[1] = CEC_MSG_VENDOR_REMOTE_B 1171 memcpy(msg->msg + 2, rc_code, size); 1172 } 1173 1174 static inline void cec_ops_vendor_remote_butt 1175 1176 1177 { 1178 *size = msg->len - 2; 1179 1180 if (*size > 14) 1181 *size = 14; 1182 *rc_code = msg->msg + 2; 1183 } 1184 1185 static inline void cec_msg_vendor_remote_butt 1186 { 1187 msg->len = 2; 1188 msg->msg[1] = CEC_MSG_VENDOR_REMOTE_B 1189 } 1190 1191 1192 /* OSD Display Feature */ 1193 static inline void cec_msg_set_osd_string(str 1194 __u 1195 con 1196 { 1197 unsigned int len = strlen(osd); 1198 1199 if (len > 13) 1200 len = 13; 1201 msg->len = 3 + len; 1202 msg->msg[1] = CEC_MSG_SET_OSD_STRING; 1203 msg->msg[2] = disp_ctl; 1204 memcpy(msg->msg + 3, osd, len); 1205 } 1206 1207 static inline void cec_ops_set_osd_string(con 1208 __u 1209 cha 1210 { 1211 unsigned int len = msg->len > 3 ? msg 1212 1213 *disp_ctl = msg->msg[2]; 1214 if (len > 13) 1215 len = 13; 1216 memcpy(osd, msg->msg + 3, len); 1217 osd[len] = '\0'; 1218 } 1219 1220 1221 /* Device OSD Transfer Feature */ 1222 static inline void cec_msg_set_osd_name(struc 1223 { 1224 unsigned int len = strlen(name); 1225 1226 if (len > 14) 1227 len = 14; 1228 msg->len = 2 + len; 1229 msg->msg[1] = CEC_MSG_SET_OSD_NAME; 1230 memcpy(msg->msg + 2, name, len); 1231 } 1232 1233 static inline void cec_ops_set_osd_name(const 1234 char 1235 { 1236 unsigned int len = msg->len > 2 ? msg 1237 1238 if (len > 14) 1239 len = 14; 1240 memcpy(name, msg->msg + 2, len); 1241 name[len] = '\0'; 1242 } 1243 1244 static inline void cec_msg_give_osd_name(stru 1245 int 1246 { 1247 msg->len = 2; 1248 msg->msg[1] = CEC_MSG_GIVE_OSD_NAME; 1249 msg->reply = reply ? CEC_MSG_SET_OSD_ 1250 } 1251 1252 1253 /* Device Menu Control Feature */ 1254 static inline void cec_msg_menu_status(struct 1255 __u8 m 1256 { 1257 msg->len = 3; 1258 msg->msg[1] = CEC_MSG_MENU_STATUS; 1259 msg->msg[2] = menu_state; 1260 } 1261 1262 static inline void cec_ops_menu_status(const 1263 __u8 * 1264 { 1265 *menu_state = msg->msg[2]; 1266 } 1267 1268 static inline void cec_msg_menu_request(struc 1269 int r 1270 __u8 1271 { 1272 msg->len = 3; 1273 msg->msg[1] = CEC_MSG_MENU_REQUEST; 1274 msg->msg[2] = menu_req; 1275 msg->reply = reply ? CEC_MSG_MENU_STA 1276 } 1277 1278 static inline void cec_ops_menu_request(const 1279 __u8 1280 { 1281 *menu_req = msg->msg[2]; 1282 } 1283 1284 struct cec_op_ui_command { 1285 __u8 ui_cmd; 1286 __u8 has_opt_arg; 1287 union { 1288 struct cec_op_channel_data ch 1289 __u8 ui_broadcast_type; 1290 __u8 ui_sound_presentation_co 1291 __u8 play_mode; 1292 __u8 ui_function_media; 1293 __u8 ui_function_select_av_in 1294 __u8 ui_function_select_audio 1295 }; 1296 }; 1297 1298 static inline void cec_msg_user_control_press 1299 const 1300 { 1301 msg->len = 3; 1302 msg->msg[1] = CEC_MSG_USER_CONTROL_PR 1303 msg->msg[2] = ui_cmd->ui_cmd; 1304 if (!ui_cmd->has_opt_arg) 1305 return; 1306 switch (ui_cmd->ui_cmd) { 1307 case CEC_OP_UI_CMD_SELECT_BROADCAST_T 1308 case CEC_OP_UI_CMD_SELECT_SOUND_PRESE 1309 case CEC_OP_UI_CMD_PLAY_FUNCTION: 1310 case CEC_OP_UI_CMD_SELECT_MEDIA_FUNCT 1311 case CEC_OP_UI_CMD_SELECT_AV_INPUT_FU 1312 case CEC_OP_UI_CMD_SELECT_AUDIO_INPUT 1313 /* The optional operand is on 1314 msg->len++; 1315 msg->msg[3] = ui_cmd->play_mo 1316 break; 1317 case CEC_OP_UI_CMD_TUNE_FUNCTION: 1318 msg->len += 4; 1319 msg->msg[3] = (ui_cmd->channe 1320 (ui_cmd->channe 1321 msg->msg[4] = ui_cmd->channel 1322 msg->msg[5] = ui_cmd->channel 1323 msg->msg[6] = ui_cmd->channel 1324 break; 1325 } 1326 } 1327 1328 static inline void cec_ops_user_control_press 1329 1330 { 1331 ui_cmd->ui_cmd = msg->msg[2]; 1332 ui_cmd->has_opt_arg = 0; 1333 if (msg->len == 3) 1334 return; 1335 switch (ui_cmd->ui_cmd) { 1336 case CEC_OP_UI_CMD_SELECT_BROADCAST_T 1337 case CEC_OP_UI_CMD_SELECT_SOUND_PRESE 1338 case CEC_OP_UI_CMD_PLAY_FUNCTION: 1339 case CEC_OP_UI_CMD_SELECT_MEDIA_FUNCT 1340 case CEC_OP_UI_CMD_SELECT_AV_INPUT_FU 1341 case CEC_OP_UI_CMD_SELECT_AUDIO_INPUT 1342 /* The optional operand is on 1343 ui_cmd->play_mode = msg->msg[ 1344 ui_cmd->has_opt_arg = 1; 1345 break; 1346 case CEC_OP_UI_CMD_TUNE_FUNCTION: 1347 if (msg->len < 7) 1348 break; 1349 ui_cmd->has_opt_arg = 1; 1350 ui_cmd->channel_identifier.ch 1351 ui_cmd->channel_identifier.ma 1352 ui_cmd->channel_identifier.mi 1353 break; 1354 } 1355 } 1356 1357 static inline void cec_msg_user_control_relea 1358 { 1359 msg->len = 2; 1360 msg->msg[1] = CEC_MSG_USER_CONTROL_RE 1361 } 1362 1363 /* Remote Control Passthrough Feature */ 1364 1365 /* Power Status Feature */ 1366 static inline void cec_msg_report_power_statu 1367 1368 { 1369 msg->len = 3; 1370 msg->msg[1] = CEC_MSG_REPORT_POWER_ST 1371 msg->msg[2] = pwr_state; 1372 } 1373 1374 static inline void cec_ops_report_power_statu 1375 1376 { 1377 *pwr_state = msg->msg[2]; 1378 } 1379 1380 static inline void cec_msg_give_device_power_ 1381 1382 { 1383 msg->len = 2; 1384 msg->msg[1] = CEC_MSG_GIVE_DEVICE_POW 1385 msg->reply = reply ? CEC_MSG_REPORT_P 1386 } 1387 1388 /* General Protocol Messages */ 1389 static inline void cec_msg_feature_abort(stru 1390 __u8 1391 { 1392 msg->len = 4; 1393 msg->msg[1] = CEC_MSG_FEATURE_ABORT; 1394 msg->msg[2] = abort_msg; 1395 msg->msg[3] = reason; 1396 } 1397 1398 static inline void cec_ops_feature_abort(cons 1399 __u8 1400 { 1401 *abort_msg = msg->msg[2]; 1402 *reason = msg->msg[3]; 1403 } 1404 1405 /* This changes the current message into a fe 1406 static inline void cec_msg_reply_feature_abor 1407 { 1408 cec_msg_set_reply_to(msg, msg); 1409 msg->len = 4; 1410 msg->msg[2] = msg->msg[1]; 1411 msg->msg[3] = reason; 1412 msg->msg[1] = CEC_MSG_FEATURE_ABORT; 1413 } 1414 1415 static inline void cec_msg_abort(struct cec_m 1416 { 1417 msg->len = 2; 1418 msg->msg[1] = CEC_MSG_ABORT; 1419 } 1420 1421 1422 /* System Audio Control Feature */ 1423 static inline void cec_msg_report_audio_statu 1424 1425 1426 { 1427 msg->len = 3; 1428 msg->msg[1] = CEC_MSG_REPORT_AUDIO_ST 1429 msg->msg[2] = (aud_mute_status << 7) 1430 } 1431 1432 static inline void cec_ops_report_audio_statu 1433 1434 1435 { 1436 *aud_mute_status = msg->msg[2] >> 7; 1437 *aud_vol_status = msg->msg[2] & 0x7f; 1438 } 1439 1440 static inline void cec_msg_give_audio_status( 1441 1442 { 1443 msg->len = 2; 1444 msg->msg[1] = CEC_MSG_GIVE_AUDIO_STAT 1445 msg->reply = reply ? CEC_MSG_REPORT_A 1446 } 1447 1448 static inline void cec_msg_set_system_audio_m 1449 1450 { 1451 msg->len = 3; 1452 msg->msg[1] = CEC_MSG_SET_SYSTEM_AUDI 1453 msg->msg[2] = sys_aud_status; 1454 } 1455 1456 static inline void cec_ops_set_system_audio_m 1457 1458 { 1459 *sys_aud_status = msg->msg[2]; 1460 } 1461 1462 static inline void cec_msg_system_audio_mode_ 1463 1464 1465 { 1466 msg->len = phys_addr == 0xffff ? 2 : 1467 msg->msg[1] = CEC_MSG_SYSTEM_AUDIO_MO 1468 msg->msg[2] = phys_addr >> 8; 1469 msg->msg[3] = phys_addr & 0xff; 1470 msg->reply = reply ? CEC_MSG_SET_SYST 1471 1472 } 1473 1474 static inline void cec_ops_system_audio_mode_ 1475 1476 { 1477 if (msg->len < 4) 1478 *phys_addr = 0xffff; 1479 else 1480 *phys_addr = (msg->msg[2] << 1481 } 1482 1483 static inline void cec_msg_system_audio_mode_ 1484 1485 { 1486 msg->len = 3; 1487 msg->msg[1] = CEC_MSG_SYSTEM_AUDIO_MO 1488 msg->msg[2] = sys_aud_status; 1489 } 1490 1491 static inline void cec_ops_system_audio_mode_ 1492 1493 { 1494 *sys_aud_status = msg->msg[2]; 1495 } 1496 1497 static inline void cec_msg_give_system_audio_ 1498 1499 { 1500 msg->len = 2; 1501 msg->msg[1] = CEC_MSG_GIVE_SYSTEM_AUD 1502 msg->reply = reply ? CEC_MSG_SYSTEM_A 1503 } 1504 1505 static inline void cec_msg_report_short_audio 1506 __u8 1507 const 1508 { 1509 unsigned int i; 1510 1511 if (num_descriptors > 4) 1512 num_descriptors = 4; 1513 msg->len = 2 + num_descriptors * 3; 1514 msg->msg[1] = CEC_MSG_REPORT_SHORT_AU 1515 for (i = 0; i < num_descriptors; i++) 1516 msg->msg[2 + i * 3] = (descri 1517 msg->msg[3 + i * 3] = (descri 1518 msg->msg[4 + i * 3] = descrip 1519 } 1520 } 1521 1522 static inline void cec_ops_report_short_audio 1523 1524 1525 { 1526 unsigned int i; 1527 1528 *num_descriptors = (msg->len - 2) / 3 1529 if (*num_descriptors > 4) 1530 *num_descriptors = 4; 1531 for (i = 0; i < *num_descriptors; i++ 1532 descriptors[i] = (msg->msg[2 1533 (msg->msg[3 + i * 3] 1534 msg->msg[4 + i * 3]; 1535 } 1536 1537 static inline void cec_msg_request_short_audi 1538 int r 1539 __u8 1540 const 1541 const 1542 { 1543 unsigned int i; 1544 1545 if (num_descriptors > 4) 1546 num_descriptors = 4; 1547 msg->len = 2 + num_descriptors; 1548 msg->msg[1] = CEC_MSG_REQUEST_SHORT_A 1549 msg->reply = reply ? CEC_MSG_REPORT_S 1550 for (i = 0; i < num_descriptors; i++) 1551 msg->msg[2 + i] = (audio_form 1552 (audio_form 1553 } 1554 1555 static inline void cec_ops_request_short_audi 1556 __u8 1557 __u8 1558 __u8 1559 { 1560 unsigned int i; 1561 1562 *num_descriptors = msg->len - 2; 1563 if (*num_descriptors > 4) 1564 *num_descriptors = 4; 1565 for (i = 0; i < *num_descriptors; i++ 1566 audio_format_id[i] = msg->msg 1567 audio_format_code[i] = msg->m 1568 } 1569 } 1570 1571 static inline void cec_msg_set_audio_volume_l 1572 1573 { 1574 msg->len = 3; 1575 msg->msg[1] = CEC_MSG_SET_AUDIO_VOLUM 1576 msg->msg[2] = audio_volume_level; 1577 } 1578 1579 static inline void cec_ops_set_audio_volume_l 1580 1581 { 1582 *audio_volume_level = msg->msg[2]; 1583 } 1584 1585 1586 /* Audio Rate Control Feature */ 1587 static inline void cec_msg_set_audio_rate(str 1588 __u 1589 { 1590 msg->len = 3; 1591 msg->msg[1] = CEC_MSG_SET_AUDIO_RATE; 1592 msg->msg[2] = audio_rate; 1593 } 1594 1595 static inline void cec_ops_set_audio_rate(con 1596 __u 1597 { 1598 *audio_rate = msg->msg[2]; 1599 } 1600 1601 1602 /* Audio Return Channel Control Feature */ 1603 static inline void cec_msg_report_arc_initiat 1604 { 1605 msg->len = 2; 1606 msg->msg[1] = CEC_MSG_REPORT_ARC_INIT 1607 } 1608 1609 static inline void cec_msg_initiate_arc(struc 1610 int r 1611 { 1612 msg->len = 2; 1613 msg->msg[1] = CEC_MSG_INITIATE_ARC; 1614 msg->reply = reply ? CEC_MSG_REPORT_A 1615 } 1616 1617 static inline void cec_msg_request_arc_initia 1618 1619 { 1620 msg->len = 2; 1621 msg->msg[1] = CEC_MSG_REQUEST_ARC_INI 1622 msg->reply = reply ? CEC_MSG_INITIATE 1623 } 1624 1625 static inline void cec_msg_report_arc_termina 1626 { 1627 msg->len = 2; 1628 msg->msg[1] = CEC_MSG_REPORT_ARC_TERM 1629 } 1630 1631 static inline void cec_msg_terminate_arc(stru 1632 int 1633 { 1634 msg->len = 2; 1635 msg->msg[1] = CEC_MSG_TERMINATE_ARC; 1636 msg->reply = reply ? CEC_MSG_REPORT_A 1637 } 1638 1639 static inline void cec_msg_request_arc_termin 1640 1641 { 1642 msg->len = 2; 1643 msg->msg[1] = CEC_MSG_REQUEST_ARC_TER 1644 msg->reply = reply ? CEC_MSG_TERMINAT 1645 } 1646 1647 1648 /* Dynamic Audio Lipsync Feature */ 1649 /* Only for CEC 2.0 and up */ 1650 static inline void cec_msg_report_current_lat 1651 1652 1653 1654 1655 1656 { 1657 msg->len = 6; 1658 msg->msg[0] |= 0xf; /* broadcast */ 1659 msg->msg[1] = CEC_MSG_REPORT_CURRENT_ 1660 msg->msg[2] = phys_addr >> 8; 1661 msg->msg[3] = phys_addr & 0xff; 1662 msg->msg[4] = video_latency; 1663 msg->msg[5] = (low_latency_mode << 2) 1664 if (audio_out_compensated == 3) 1665 msg->msg[msg->len++] = audio_ 1666 } 1667 1668 static inline void cec_ops_report_current_lat 1669 1670 1671 1672 1673 1674 { 1675 *phys_addr = (msg->msg[2] << 8) | msg 1676 *video_latency = msg->msg[4]; 1677 *low_latency_mode = (msg->msg[5] >> 2 1678 *audio_out_compensated = msg->msg[5] 1679 if (*audio_out_compensated == 3 && ms 1680 *audio_out_delay = msg->msg[6 1681 else 1682 *audio_out_delay = 1; 1683 } 1684 1685 static inline void cec_msg_request_current_la 1686 1687 1688 { 1689 msg->len = 4; 1690 msg->msg[0] |= 0xf; /* broadcast */ 1691 msg->msg[1] = CEC_MSG_REQUEST_CURRENT 1692 msg->msg[2] = phys_addr >> 8; 1693 msg->msg[3] = phys_addr & 0xff; 1694 msg->reply = reply ? CEC_MSG_REPORT_C 1695 } 1696 1697 static inline void cec_ops_request_current_la 1698 1699 { 1700 *phys_addr = (msg->msg[2] << 8) | msg 1701 } 1702 1703 1704 /* Capability Discovery and Control Feature * 1705 static inline void cec_msg_cdc_hec_inquire_st 1706 1707 1708 { 1709 msg->len = 9; 1710 msg->msg[0] |= 0xf; /* broadcast */ 1711 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1712 /* msg[2] and msg[3] (phys_addr) are 1713 msg->msg[4] = CEC_MSG_CDC_HEC_INQUIRE 1714 msg->msg[5] = phys_addr1 >> 8; 1715 msg->msg[6] = phys_addr1 & 0xff; 1716 msg->msg[7] = phys_addr2 >> 8; 1717 msg->msg[8] = phys_addr2 & 0xff; 1718 } 1719 1720 static inline void cec_ops_cdc_hec_inquire_st 1721 1722 1723 1724 { 1725 *phys_addr = (msg->msg[2] << 8) | msg 1726 *phys_addr1 = (msg->msg[5] << 8) | ms 1727 *phys_addr2 = (msg->msg[7] << 8) | ms 1728 } 1729 1730 static inline void cec_msg_cdc_hec_report_sta 1731 1732 1733 1734 1735 1736 1737 1738 { 1739 msg->len = has_field ? 10 : 8; 1740 msg->msg[0] |= 0xf; /* broadcast */ 1741 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1742 /* msg[2] and msg[3] (phys_addr) are 1743 msg->msg[4] = CEC_MSG_CDC_HEC_REPORT_ 1744 msg->msg[5] = target_phys_addr >> 8; 1745 msg->msg[6] = target_phys_addr & 0xff 1746 msg->msg[7] = (hec_func_state << 6) | 1747 (host_func_state << 4) 1748 (enc_func_state << 2) | 1749 cdc_errcode; 1750 if (has_field) { 1751 msg->msg[8] = hec_field >> 8; 1752 msg->msg[9] = hec_field & 0xf 1753 } 1754 } 1755 1756 static inline void cec_ops_cdc_hec_report_sta 1757 1758 1759 1760 1761 1762 1763 1764 1765 { 1766 *phys_addr = (msg->msg[2] << 8) | msg 1767 *target_phys_addr = (msg->msg[5] << 8 1768 *hec_func_state = msg->msg[7] >> 6; 1769 *host_func_state = (msg->msg[7] >> 4) 1770 *enc_func_state = (msg->msg[7] >> 4) 1771 *cdc_errcode = msg->msg[7] & 3; 1772 *has_field = msg->len >= 10; 1773 *hec_field = *has_field ? ((msg->msg[ 1774 } 1775 1776 static inline void cec_msg_cdc_hec_set_state( 1777 1778 1779 1780 1781 1782 1783 { 1784 msg->len = 10; 1785 msg->msg[0] |= 0xf; /* broadcast */ 1786 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1787 /* msg[2] and msg[3] (phys_addr) are 1788 msg->msg[4] = CEC_MSG_CDC_HEC_INQUIRE 1789 msg->msg[5] = phys_addr1 >> 8; 1790 msg->msg[6] = phys_addr1 & 0xff; 1791 msg->msg[7] = phys_addr2 >> 8; 1792 msg->msg[8] = phys_addr2 & 0xff; 1793 msg->msg[9] = hec_set_state; 1794 if (phys_addr3 != CEC_PHYS_ADDR_INVAL 1795 msg->msg[msg->len++] = phys_a 1796 msg->msg[msg->len++] = phys_a 1797 if (phys_addr4 != CEC_PHYS_AD 1798 msg->msg[msg->len++] 1799 msg->msg[msg->len++] 1800 if (phys_addr5 != CEC 1801 msg->msg[msg- 1802 msg->msg[msg- 1803 } 1804 } 1805 } 1806 } 1807 1808 static inline void cec_ops_cdc_hec_set_state( 1809 1810 1811 1812 1813 1814 1815 1816 { 1817 *phys_addr = (msg->msg[2] << 8) | msg 1818 *phys_addr1 = (msg->msg[5] << 8) | ms 1819 *phys_addr2 = (msg->msg[7] << 8) | ms 1820 *hec_set_state = msg->msg[9]; 1821 *phys_addr3 = *phys_addr4 = *phys_add 1822 if (msg->len >= 12) 1823 *phys_addr3 = (msg->msg[10] < 1824 if (msg->len >= 14) 1825 *phys_addr4 = (msg->msg[12] < 1826 if (msg->len >= 16) 1827 *phys_addr5 = (msg->msg[14] < 1828 } 1829 1830 static inline void cec_msg_cdc_hec_set_state_ 1831 1832 1833 { 1834 msg->len = 8; 1835 msg->msg[0] |= 0xf; /* broadcast */ 1836 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1837 /* msg[2] and msg[3] (phys_addr) are 1838 msg->msg[4] = CEC_MSG_CDC_HEC_SET_STA 1839 msg->msg[5] = phys_addr1 >> 8; 1840 msg->msg[6] = phys_addr1 & 0xff; 1841 msg->msg[7] = hec_set_state; 1842 } 1843 1844 static inline void cec_ops_cdc_hec_set_state_ 1845 1846 1847 1848 { 1849 *phys_addr = (msg->msg[2] << 8) | msg 1850 *phys_addr1 = (msg->msg[5] << 8) | ms 1851 *hec_set_state = msg->msg[7]; 1852 } 1853 1854 static inline void cec_msg_cdc_hec_request_de 1855 1856 1857 1858 { 1859 msg->len = 11; 1860 msg->msg[0] |= 0xf; /* broadcast */ 1861 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1862 /* msg[2] and msg[3] (phys_addr) are 1863 msg->msg[4] = CEC_MSG_CDC_HEC_REQUEST 1864 msg->msg[5] = phys_addr1 >> 8; 1865 msg->msg[6] = phys_addr1 & 0xff; 1866 msg->msg[7] = phys_addr2 >> 8; 1867 msg->msg[8] = phys_addr2 & 0xff; 1868 msg->msg[9] = phys_addr3 >> 8; 1869 msg->msg[10] = phys_addr3 & 0xff; 1870 } 1871 1872 static inline void cec_ops_cdc_hec_request_de 1873 1874 1875 1876 1877 { 1878 *phys_addr = (msg->msg[2] << 8) | msg 1879 *phys_addr1 = (msg->msg[5] << 8) | ms 1880 *phys_addr2 = (msg->msg[7] << 8) | ms 1881 *phys_addr3 = (msg->msg[9] << 8) | ms 1882 } 1883 1884 static inline void cec_msg_cdc_hec_notify_ali 1885 { 1886 msg->len = 5; 1887 msg->msg[0] |= 0xf; /* broadcast */ 1888 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1889 /* msg[2] and msg[3] (phys_addr) are 1890 msg->msg[4] = CEC_MSG_CDC_HEC_NOTIFY_ 1891 } 1892 1893 static inline void cec_ops_cdc_hec_notify_ali 1894 1895 { 1896 *phys_addr = (msg->msg[2] << 8) | msg 1897 } 1898 1899 static inline void cec_msg_cdc_hec_discover(s 1900 { 1901 msg->len = 5; 1902 msg->msg[0] |= 0xf; /* broadcast */ 1903 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1904 /* msg[2] and msg[3] (phys_addr) are 1905 msg->msg[4] = CEC_MSG_CDC_HEC_DISCOVE 1906 } 1907 1908 static inline void cec_ops_cdc_hec_discover(c 1909 _ 1910 { 1911 *phys_addr = (msg->msg[2] << 8) | msg 1912 } 1913 1914 static inline void cec_msg_cdc_hpd_set_state( 1915 1916 1917 { 1918 msg->len = 6; 1919 msg->msg[0] |= 0xf; /* broadcast */ 1920 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1921 /* msg[2] and msg[3] (phys_addr) are 1922 msg->msg[4] = CEC_MSG_CDC_HPD_SET_STA 1923 msg->msg[5] = (input_port << 4) | hpd 1924 } 1925 1926 static inline void cec_ops_cdc_hpd_set_state( 1927 _ 1928 _ 1929 _ 1930 { 1931 *phys_addr = (msg->msg[2] << 8) | msg 1932 *input_port = msg->msg[5] >> 4; 1933 *hpd_state = msg->msg[5] & 0xf; 1934 } 1935 1936 static inline void cec_msg_cdc_hpd_report_sta 1937 1938 1939 { 1940 msg->len = 6; 1941 msg->msg[0] |= 0xf; /* broadcast */ 1942 msg->msg[1] = CEC_MSG_CDC_MESSAGE; 1943 /* msg[2] and msg[3] (phys_addr) are 1944 msg->msg[4] = CEC_MSG_CDC_HPD_REPORT_ 1945 msg->msg[5] = (hpd_state << 4) | hpd_ 1946 } 1947 1948 static inline void cec_ops_cdc_hpd_report_sta 1949 1950 1951 1952 { 1953 *phys_addr = (msg->msg[2] << 8) | msg 1954 *hpd_state = msg->msg[5] >> 4; 1955 *hpd_error = msg->msg[5] & 0xf; 1956 } 1957 1958 #endif 1959
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.