// SPDX-License-Identifier: (LGPL-2.1-only OR BSD-3-Clause) /* * cec-htng-funcs - HDMI CEC wrapper functions for Hospitality Profile * * Copyright 2016-2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved. */ #ifndef _CEC_HTNG_FUNCS_H #define _CEC_HTNG_FUNCS_H #include "cec-htng.h" static inline void cec_msg_htng_init(struct cec_msg *msg, __u8 op) { msg->len = 6; msg->msg[1] = CEC_MSG_VENDOR_COMMAND_WITH_ID; msg->msg[2] = VENDOR_ID_HTNG >> 16; msg->msg[3] = (VENDOR_ID_HTNG >> 8) & 0xff; msg->msg[4] = VENDOR_ID_HTNG & 0xff; msg->msg[5] = op; } /* HTNG Feature */ static inline void cec_msg_htng_tuner_1part_chan(struct cec_msg *msg, __u8 htng_tuner_type, __u16 chan) { cec_msg_htng_init(msg, CEC_MSG_HTNG_TUNER_1PART_CHAN); msg->msg[msg->len++] = htng_tuner_type; msg->msg[msg->len++] = chan >> 8; msg->msg[msg->len++] = chan & 0xff; } static inline void cec_ops_htng_tuner_1part_chan(const struct cec_msg *msg, __u8 *htng_tuner_type, __u16 *chan) { *htng_tuner_type = msg->msg[6]; *chan = (msg->msg[7] << 8) | msg->msg[8]; } static inline void cec_msg_htng_tuner_2part_chan(struct cec_msg *msg, __u8 htng_tuner_type, __u8 major_chan, __u16 minor_chan) { cec_msg_htng_init(msg, CEC_MSG_HTNG_TUNER_2PART_CHAN); msg->msg[msg->len++] = htng_tuner_type; msg->msg[msg->len++] = major_chan; msg->msg[msg->len++] = minor_chan >> 8; msg->msg[msg->len++] = minor_chan & 0xff; } static inline void cec_ops_htng_tuner_2part_chan(const struct cec_msg *msg, __u8 *htng_tuner_type, __u8 *major_chan, __u16 *minor_chan) { *htng_tuner_type = msg->msg[6]; *major_chan = msg->msg[7]; *minor_chan = (msg->msg[8] << 8) | msg->msg[9]; } static inline void cec_msg_htng_input_sel_av(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_AV); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_av(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_input_sel_pc(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_PC); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_pc(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_input_sel_hdmi(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_HDMI); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_hdmi(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_input_sel_component(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_COMPONENT); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_component(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_input_sel_dvi(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_DVI); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_dvi(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_input_sel_dp(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_DP); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_dp(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_input_sel_usb(struct cec_msg *msg, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_INPUT_SEL_USB); msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; } static inline void cec_ops_htng_input_sel_usb(const struct cec_msg *msg, __u16 *input) { *input = (msg->msg[6] << 8) | msg->msg[7]; } static inline void cec_msg_htng_set_def_pwr_on_input_src(struct cec_msg *msg, __u8 htng_input_src, __u8 htng_tuner_type, __u8 major, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_DEF_PWR_ON_INPUT_SRC); msg->msg[msg->len++] = htng_input_src; msg->msg[msg->len++] = htng_tuner_type; if (htng_input_src == CEC_OP_HTNG_INPUT_SRC_TUNER_2PART) msg->msg[msg->len++] = major; msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; if (htng_input_src != CEC_OP_HTNG_INPUT_SRC_TUNER_2PART) msg->msg[msg->len++] = 0; } static inline void cec_ops_htng_set_def_pwr_on_input_src(const struct cec_msg *msg, __u8 *htng_input_src, __u8 *htng_tuner_type, __u8 *major, __u16 *input) { *htng_input_src = msg->msg[6]; *htng_tuner_type = msg->msg[7]; if (*htng_input_src == CEC_OP_HTNG_INPUT_SRC_TUNER_2PART) { *major = msg->msg[8]; *input = (msg->msg[9] << 8) | msg->msg[10]; } else { *major = 0; *input = (msg->msg[8] << 8) | msg->msg[9]; } } static inline void cec_msg_htng_set_tv_speakers(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_TV_SPEAKERS); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_set_tv_speakers(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_set_dig_audio(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_DIG_AUDIO); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_set_dig_audio(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_set_ana_audio(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_ANA_AUDIO); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_set_ana_audio(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_set_def_pwr_on_vol(struct cec_msg *msg, __u8 vol) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_DEF_PWR_ON_VOL); msg->msg[msg->len++] = vol; } static inline void cec_ops_htng_set_def_pwr_on_vol(const struct cec_msg *msg, __u8 *vol) { *vol = msg->msg[6]; } static inline void cec_msg_htng_set_max_vol(struct cec_msg *msg, __u8 vol) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_MAX_VOL); msg->msg[msg->len++] = vol; } static inline void cec_ops_htng_set_max_vol(const struct cec_msg *msg, __u8 *vol) { *vol = msg->msg[6]; } static inline void cec_msg_htng_set_min_vol(struct cec_msg *msg, __u8 vol) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_MIN_VOL); msg->msg[msg->len++] = vol; } static inline void cec_ops_htng_set_min_vol(const struct cec_msg *msg, __u8 *vol) { *vol = msg->msg[6]; } static inline void cec_msg_htng_set_blue_screen(struct cec_msg *msg, __u8 blue) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_BLUE_SCREEN); msg->msg[msg->len++] = blue; } static inline void cec_ops_htng_set_blue_screen(const struct cec_msg *msg, __u8 *blue) { *blue = msg->msg[6]; } static inline void cec_msg_htng_set_brightness(struct cec_msg *msg, __u8 brightness) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_BRIGHTNESS); msg->msg[msg->len++] = brightness; } static inline void cec_ops_htng_set_brightness(const struct cec_msg *msg, __u8 *brightness) { *brightness = msg->msg[6]; } static inline void cec_msg_htng_set_color(struct cec_msg *msg, __u8 color) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_COLOR); msg->msg[msg->len++] = color; } static inline void cec_ops_htng_set_color(const struct cec_msg *msg, __u8 *color) { *color = msg->msg[6]; } static inline void cec_msg_htng_set_contrast(struct cec_msg *msg, __u8 contrast) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_CONTRAST); msg->msg[msg->len++] = contrast; } static inline void cec_ops_htng_set_contrast(const struct cec_msg *msg, __u8 *contrast) { *contrast = msg->msg[6]; } static inline void cec_msg_htng_set_sharpness(struct cec_msg *msg, __u8 sharpness) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_SHARPNESS); msg->msg[msg->len++] = sharpness; } static inline void cec_ops_htng_set_sharpness(const struct cec_msg *msg, __u8 *sharpness) { *sharpness = msg->msg[6]; } static inline void cec_msg_htng_set_hue(struct cec_msg *msg, __u8 hue) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_HUE); msg->msg[msg->len++] = hue; } static inline void cec_ops_htng_set_hue(const struct cec_msg *msg, __u8 *hue) { *hue = msg->msg[6]; } static inline void cec_msg_htng_set_led_backlight(struct cec_msg *msg, __u8 led_backlight) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_LED_BACKLIGHT); msg->msg[msg->len++] = led_backlight; } static inline void cec_ops_htng_set_led_backlight(const struct cec_msg *msg, __u8 *led_backlight) { *led_backlight = msg->msg[6]; } static inline void cec_msg_htng_set_tv_osd_control(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_TV_OSD_CONTROL); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_set_tv_osd_control(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_set_audio_only_display(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_AUDIO_ONLY_DISPLAY); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_set_audio_only_display(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_set_date(struct cec_msg *msg, const char *date) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_DATE); memcpy(msg->msg + msg->len, date, 8); msg->len += 8; } static inline void cec_ops_htng_set_date(const struct cec_msg *msg, char *date) { memcpy(date, msg->msg + 6, 8); date[8] = '\0'; } static inline void cec_msg_htng_set_date_format(struct cec_msg *msg, __u8 ddmm) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_DATE_FORMAT); msg->msg[msg->len++] = ddmm; } static inline void cec_ops_htng_set_date_format(const struct cec_msg *msg, __u8 *ddmm) { *ddmm = msg->msg[6]; } static inline void cec_msg_htng_set_time(struct cec_msg *msg, const char *time) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_TIME); memcpy(msg->msg + msg->len, time, 6); msg->len += 6; } static inline void cec_ops_htng_set_time(const struct cec_msg *msg, char *time) { memcpy(time, msg->msg + 6, 6); time[6] = '\0'; } static inline void cec_msg_htng_set_clk_brightness_standby(struct cec_msg *msg, __u8 brightness) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_CLK_BRIGHTNESS_STANDBY); msg->msg[msg->len++] = brightness; } static inline void cec_ops_htng_set_clk_brightness_standby(const struct cec_msg *msg, __u8 *brightness) { *brightness = msg->msg[6]; } static inline void cec_msg_htng_set_clk_brightness_on(struct cec_msg *msg, __u8 brightness) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_CLK_BRIGHTNESS_ON); msg->msg[msg->len++] = brightness; } static inline void cec_ops_htng_set_clk_brightness_on(const struct cec_msg *msg, __u8 *brightness) { *brightness = msg->msg[6]; } static inline void cec_msg_htng_led_control(struct cec_msg *msg, __u8 htng_led_control) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LED_CONTROL); msg->msg[msg->len++] = htng_led_control; } static inline void cec_ops_htng_led_control(const struct cec_msg *msg, __u8 *htng_led_control) { *htng_led_control = msg->msg[6]; } static inline void cec_msg_htng_lock_tv_pwr_button(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_TV_PWR_BUTTON); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_tv_pwr_button(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_lock_tv_vol_buttons(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_TV_VOL_BUTTONS); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_tv_vol_buttons(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_lock_tv_chan_buttons(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_TV_CHAN_BUTTONS); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_tv_chan_buttons(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_lock_tv_input_buttons(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_TV_INPUT_BUTTONS); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_tv_input_buttons(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_lock_tv_other_buttons(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_TV_OTHER_BUTTONS); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_tv_other_buttons(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_lock_everything(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_EVERYTHING); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_everything(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_lock_everything_but_pwr(struct cec_msg *msg, __u8 on) { cec_msg_htng_init(msg, CEC_MSG_HTNG_LOCK_EVERYTHING_BUT_PWR); msg->msg[msg->len++] = on; } static inline void cec_ops_htng_lock_everything_but_pwr(const struct cec_msg *msg, __u8 *on) { *on = msg->msg[6]; } static inline void cec_msg_htng_hotel_mode(struct cec_msg *msg, __u8 on, __u8 options) { cec_msg_htng_init(msg, CEC_MSG_HTNG_HOTEL_MODE); msg->msg[msg->len++] = on; msg->msg[msg->len++] = options; } static inline void cec_ops_htng_hotel_mode(const struct cec_msg *msg, __u8 *on, __u8 *options) { *on = msg->msg[6]; *options = msg->msg[7]; } static inline void cec_msg_htng_set_pwr_saving_profile(struct cec_msg *msg, __u8 on, __u8 val) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_PWR_SAVING_PROFILE); msg->msg[msg->len++] = on; msg->msg[msg->len++] = val; } static inline void cec_ops_htng_set_pwr_saving_profile(const struct cec_msg *msg, __u8 *on, __u8 *val) { *on = msg->msg[6]; *val = msg->msg[7]; } static inline void cec_msg_htng_set_sleep_timer(struct cec_msg *msg, __u8 minutes) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_SLEEP_TIMER); msg->msg[msg->len++] = minutes; } static inline void cec_ops_htng_set_sleep_timer(const struct cec_msg *msg, __u8 *minutes) { *minutes = msg->msg[6]; } static inline void cec_msg_htng_set_wakeup_time(struct cec_msg *msg, const char *time) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_WAKEUP_TIME); memcpy(msg->msg + 6, time, 4); msg->len += 4; } static inline void cec_ops_htng_set_wakeup_time(const struct cec_msg *msg, char *time) { memcpy(time, msg->msg + 6, 4); time[4] = '\0'; } static inline void cec_msg_htng_set_auto_off_time(struct cec_msg *msg, const char *time) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_AUTO_OFF_TIME); memcpy(msg->msg + 6, time, 4); msg->len += 4; } static inline void cec_ops_htng_set_auto_off_time(const struct cec_msg *msg, char *time) { memcpy(time, msg->msg + 6, 4); time[4] = '\0'; } static inline void cec_msg_htng_set_wakeup_src(struct cec_msg *msg, __u8 htng_input_src, __u8 htng_tuner_type, __u8 major, __u16 input) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_WAKEUP_SRC); msg->msg[msg->len++] = htng_input_src; msg->msg[msg->len++] = htng_tuner_type; if (htng_input_src == CEC_OP_HTNG_INPUT_SRC_TUNER_2PART) msg->msg[msg->len++] = major; msg->msg[msg->len++] = input >> 8; msg->msg[msg->len++] = input & 0xff; if (htng_input_src != CEC_OP_HTNG_INPUT_SRC_TUNER_2PART) msg->msg[msg->len++] = 0; } static inline void cec_ops_htng_set_wakeup_src(const struct cec_msg *msg, __u8 *htng_input_src, __u8 *htng_tuner_type, __u8 *major, __u16 *input) { *htng_input_src = msg->msg[6]; *htng_tuner_type = msg->msg[7]; if (*htng_input_src == CEC_OP_HTNG_INPUT_SRC_TUNER_2PART) { *major = msg->msg[8]; *input = (msg->msg[9] << 8) | msg->msg[10]; } else { *major = 0; *input = (msg->msg[8] << 8) | msg->msg[9]; } } static inline void cec_msg_htng_set_init_wakeup_vol(struct cec_msg *msg, __u8 vol, __u8 minutes) { cec_msg_htng_init(msg, CEC_MSG_HTNG_SET_INIT_WAKEUP_VOL); msg->msg[msg->len++] = vol; msg->msg[msg->len++] = minutes; } static inline void cec_ops_htng_set_init_wakeup_vol(const struct cec_msg *msg, __u8 *vol, __u8 *minutes) { *vol = msg->msg[6]; *minutes = msg->msg[7]; } static inline void cec_msg_htng_clr_all_sleep_wake(struct cec_msg *msg) { cec_msg_htng_init(msg, CEC_MSG_HTNG_CLR_ALL_SLEEP_WAKE); } static inline void cec_msg_htng_global_direct_tune_freq(struct cec_msg *msg, __u8 htng_chan_type, __u8 htng_prog_type, __u8 htng_system_type, __u16 freq, __u16 service_id, __u8 htng_mod_type, __u8 htng_symbol_rate, __u16 symbol_rate) { cec_msg_htng_init(msg, CEC_MSG_HTNG_GLOBAL_DIRECT_TUNE_FREQ); msg->msg[msg->len++] = (htng_chan_type & 7) | ((htng_prog_type & 1) << 3) | (htng_system_type << 4); msg->msg[msg->len++] = freq >> 8; msg->msg[msg->len++] = freq & 0xff; msg->msg[msg->len++] = service_id >> 8; msg->msg[msg->len++] = service_id & 0xff; msg->msg[msg->len++] = (htng_mod_type & 0xf) | ((htng_symbol_rate & 1) << 7); if (htng_symbol_rate == CEC_OP_HTNG_SYMBOL_RATE_MANUAL) { msg->msg[msg->len++] = symbol_rate >> 8; msg->msg[msg->len++] = symbol_rate & 0xff; } } static inline void cec_ops_htng_global_direct_tune_freq(const struct cec_msg *msg, __u8 *htng_chan_type, __u8 *htng_prog_type, __u8 *htng_system_type, __u16 *freq, __u16 *service_id, __u8 *htng_mod_type, __u8 *htng_symbol_rate, __u16 *symbol_rate) { *htng_chan_type = msg->msg[6] & 7; *htng_prog_type = (msg->msg[6] >> 3) & 1; *htng_system_type = (msg->msg[6] >> 4) & 0xf; *freq = (msg->msg[7] << 8) | msg->msg[8]; *service_id = (msg->msg[9] << 8) | msg->msg[10]; *htng_mod_type = msg->msg[11] & 0xf; *htng_symbol_rate = (msg->msg[11] >> 7) & 1; if (*htng_symbol_rate == CEC_OP_HTNG_SYMBOL_RATE_MANUAL) *symbol_rate = (msg->msg[12] << 8) | msg->msg[13]; else *symbol_rate = 0; } static inline void cec_msg_htng_global_direct_tune_chan(struct cec_msg *msg, __u8 htng_chan_type, __u8 htng_prog_type, __u16 chan) { cec_msg_htng_init(msg, CEC_MSG_HTNG_GLOBAL_DIRECT_TUNE_CHAN); msg->msg[msg->len++] = (htng_chan_type & 7) | ((htng_prog_type & 1) << 3); msg->msg[msg->len++] = chan >> 8; msg->msg[msg->len++] = chan & 0xff; } static inline void cec_ops_htng_global_direct_tune_chan(const struct cec_msg *msg, __u8 *htng_chan_type, __u8 *htng_prog_type, __u16 *chan) { *htng_chan_type = msg->msg[6] & 7; *htng_prog_type = (msg->msg[6] >> 3) & 1; *chan = (msg->msg[7] << 8) | msg->msg[8]; } static inline void cec_msg_htng_global_direct_tune_ext_freq(struct cec_msg *msg, __u8 htng_ext_chan_type, __u8 htng_prog_type, __u8 htng_system_type, __u16 freq, __u16 service_id, __u8 htng_mod_type, __u8 htng_onid, __u16 onid, __u8 htng_nid, __u16 nid, __u8 htng_tsid_plp, __u16 tsid_plp, __u8 htng_symbol_rate, __u16 symbol_rate) { cec_msg_htng_init(msg, CEC_MSG_HTNG_GLOBAL_DIRECT_TUNE_EXT_FREQ); msg->msg[msg->len++] = (htng_ext_chan_type & 7) | ((htng_prog_type & 1) << 3) | (htng_system_type << 4); msg->msg[msg->len++] = freq >> 8; msg->msg[msg->len++] = freq & 0xff; msg->msg[msg->len++] = service_id >> 8; msg->msg[msg->len++] = service_id & 0xff; msg->msg[msg->len++] = (htng_mod_type & 0xf) | ((htng_onid & 1) << 4) | ((htng_nid & 1) << 5) | ((htng_tsid_plp & 1) << 6) | ((htng_symbol_rate & 1) << 7); if (htng_onid == CEC_OP_HTNG_ONID_MANUAL) { msg->msg[msg->len++] = onid >> 8; msg->msg[msg->len++] = onid & 0xff; } if (htng_nid == CEC_OP_HTNG_NID_MANUAL) { msg->msg[msg->len++] = nid >> 8; msg->msg[msg->len++] = nid & 0xff; } if (msg->len < CEC_MAX_MSG_SIZE && htng_tsid_plp == CEC_OP_HTNG_TSID_PLP_MANUAL) { msg->msg[msg->len++] = tsid_plp >> 8; msg->msg[msg->len++] = tsid_plp & 0xff; } if (msg->len < CEC_MAX_MSG_SIZE && htng_symbol_rate == CEC_OP_HTNG_SYMBOL_RATE_MANUAL) { msg->msg[msg->len++] = symbol_rate >> 8; msg->msg[msg->len++] = symbol_rate & 0xff; } } static inline void cec_ops_htng_global_direct_tune_ext_freq(const struct cec_msg *msg, __u8 *htng_ext_chan_type, __u8 *htng_prog_type, __u8 *htng_system_type, __u16 *freq, __u16 *service_id, __u8 *htng_mod_type, __u8 *htng_onid, __u16 *onid, __u8 *htng_nid, __u16 *nid, __u8 *htng_tsid_plp, __u16 *tsid_plp, __u8 *htng_symbol_rate, __u16 *symbol_rate) { unsigned offset = 12; *htng_ext_chan_type = msg->msg[6] & 7; *htng_prog_type = (msg->msg[6] >> 3) & 1; *htng_system_type = (msg->msg[6] >> 4) & 0xf; *freq = (msg->msg[7] << 8) | msg->msg[8]; *service_id = (msg->msg[9] << 8) | msg->msg[10]; *htng_mod_type = msg->msg[11] & 0xf; *htng_onid = (msg->msg[11] >> 4) & 1; *htng_nid = (msg->msg[11] >> 5) & 1; *htng_tsid_plp = (msg->msg[11] >> 6) & 1; *htng_symbol_rate = (msg->msg[11] >> 7) & 1; if (*htng_onid == CEC_OP_HTNG_ONID_MANUAL) { *onid = (msg->msg[offset] << 8) | msg->msg[offset + 1]; offset += 2; } else { *onid = 0; } if (*htng_nid == CEC_OP_HTNG_NID_MANUAL) { *nid = (msg->msg[offset] << 8) | msg->msg[offset + 1]; offset += 2; } else { *nid = 0; } if (offset < CEC_MAX_MSG_SIZE && *htng_tsid_plp == CEC_OP_HTNG_TSID_PLP_MANUAL) { *tsid_plp = (msg->msg[offset] << 8) | msg->msg[offset + 1]; offset += 2; } else { *tsid_plp = 0; } if (offset < CEC_MAX_MSG_SIZE && *htng_symbol_rate == CEC_OP_HTNG_SYMBOL_RATE_MANUAL) { *symbol_rate = (msg->msg[offset] << 8) | msg->msg[offset + 1]; offset += 2; } else { *symbol_rate = 0; } } #endif