blob: bea16e3ee448289660247a8d13ec5006a878e25c [file] [log] [blame]
// 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