/*
libdvbfe - a DVB frontend library
Copyright (C) 2005 Manu Abraham <manu@kromtek.com>
Copyright (C) 2006 Andrew de Quincey <adq_dvb@lidskialf.net>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef DVBFE_SEC_H
#define DVBFE_SEC_H 1
#include <stdint.h>
enum dvbfe_diseqc_framing {
DISEQC_FRAMING_MASTER_NOREPLY = 0xE0,
DISEQC_FRAMING_MASTER_NOREPLY_REPEAT = 0xE1,
DISEQC_FRAMING_MASTER_REPLY = 0xE2,
DISEQC_FRAMING_MASTER_REPLY_REPEAT = 0xE3,
DISEQC_FRAMING_SLAVE_OK = 0xE4,
DISEQC_FRAMING_SLAVE_UNSUPPORTED = 0xE5,
DISEQC_FRAMING_SLAVE_PARITY_ERROR = 0xE6,
DISEQC_FRAMING_SLAVE_UNRECOGNISED = 0xE7,
};
enum dvbfe_diseqc_address {
DISEQC_ADDRESS_ANY_DEVICE = 0x00,
DISEQC_ADDRESS_ANY_LNB_SWITCHER_SMATV = 0x10,
DISEQC_ADDRESS_LNB = 0x11,
DISEQC_ADDRESS_LNB_WITH_LOOP = 0x12,
DISEQC_ADDRESS_SWITCHER = 0x14,
DISEQC_ADDRESS_SWITCHER_WITH_LOOP = 0x15,
DISEQC_ADDRESS_SMATV = 0x18,
DISEQC_ADDRESS_ANY_POLARISER = 0x20,
DISEQC_ADDRESS_LINEAR_POLARISER = 0x21,
DISEQC_ADDRESS_ANY_POSITIONER = 0x30,
DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER = 0x31,
DISEQC_ADDRESS_ELEVATION_POSITIONER = 0x32,
DISEQC_ADDRESS_ANY_INSTALLER_AID = 0x40,
DISEQC_ADDRESS_SIGNAL_STRENGTH = 0x41,
DISEQC_ADDRESS_ANY_INTERFACE = 0x70,
DISEQC_ADDRESS_HEADEND_INTERFACE = 0x71,
DISEQC_ADDRESS_REALLOC_BASE = 0x60,
DISEQC_ADDRESS_OEM_BASE = 0xf0,
};
enum dvbfe_diseqc_reset {
DISEQC_RESET,
DISEQC_RESET_CLEAR,
};
enum dvbfe_diseqc_power {
DISEQC_POWER_OFF,
DISEQC_POWER_ON,
};
enum dvbfe_diseqc_listen {
DISEQC_LISTEN_SLEEP,
DISEQC_LISTEN_AWAKE,
};
enum dvbfe_diseqc_oscillator {
DISEQC_OSCILLATOR_LOW,
DISEQC_OSCILLATOR_HIGH,
DISEQC_OSCILLATOR_UNCHANGED,
};
enum dvbfe_diseqc_switch {
DISEQC_SWITCH_A,
DISEQC_SWITCH_B,
DISEQC_SWITCH_UNCHANGED,
};
enum dvbfe_diseqc_analog_id {
DISEQC_ANALOG_ID_A0,
DISEQC_ANALOG_ID_A1,
};
enum dvbfe_diseqc_drive_mode {
DISEQC_DRIVE_MODE_STEPS,
DISEQC_DRIVE_MODE_TIMEOUT,
};
enum dvbfe_diseqc_direction {
DISEQC_DIRECTION_EAST,
DISEQC_DIRECTION_WEST,
};
enum dvbfe_sec_config_type {
DVBFE_SEC_CONFIG_NONE = 0,
DVBFE_SEC_CONFIG_SIMPLE,
DVBFE_SEC_CONFIG_ADVANCED,
};
#define MAX_SEC_CMD_LEN 100
struct dvbfe_sec_config
{
char id[32]; /* ID of this SEC config structure */
uint32_t switch_frequency; /* switching frequency - supply 0 for none. */
uint32_t lof_lo; /* frequency to subtract for LOW band channels - or for switch_frequency == 0 */
uint32_t lof_hi; /* frequency to subtract for HIGH band channels */
/**
* The SEC control to be used depends on the type:
*
* NONE - no SEC commands will be issued. (Frequency adjustment will still be performed).
*
* SIMPLE - the standard DISEQC back compatable sequence is used.
*
* ADVANCED - SEC strings are supplied by the user describing the exact sequence
* of operations to use.
*/
enum dvbfe_sec_config_type config_type;
/* stuff for type == DVBFE_SEC_CONFIG_ADVANCED */
char adv_cmd_lo_h[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for LOW/H. */
char adv_cmd_lo_v[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for LOW/V. */
char adv_cmd_lo_l[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for LOW/L. */
char adv_cmd_lo_r[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for LOW/R. */
char adv_cmd_hi_h[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for HI/H. */
char adv_cmd_hi_v[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for HI/V. */
char adv_cmd_hi_l[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for HI/L. */
char adv_cmd_hi_r[MAX_SEC_CMD_LEN]; /* ADVANCED SEC command to use for HI/R. */
};
/**
* Helper function for tuning adapters with SEC support. This function will do
* everything required, including frequency adjustment based on the parameters
* in sec_config.
*
* Note: Since the SEC configuration structure can be set to disable any SEC
* operations, this function can be reused for ALL DVB style devices (just
* set LOF=0,type=DVBFE_SEC_CONFIG_NONE for devices which do not require
* SEC control).
*
* The sec configuration structures can be looked up using the dvbcfg_sec library.
*
* @param fe Frontend concerned.
* @param sec_config SEC configuration structure. May be NULL to disable SEC/frequency adjustment.
* @param sat_pos Satellite position - only used if type == DISEQC_SEC_CONFIG_SIMPLE.
* @param switch_option Switch option - only used if type == DISEQC_SEC_CONFIG_SIMPLE.
* @param params Tuning parameters.
* @param timeout <0 => wait forever for lock. 0=>return immediately, >0=>
* number of milliseconds to wait for a lock.
* @return 0 on locked (or if timeout==0 and everything else worked), or
* nonzero on failure (including no lock).
*/
extern int dvbfe_sec_set(struct dvbfe_handle *fe,
struct dvbfe_sec_config *sec_config,
enum dvbfe_diseqc_switch sat_pos,
enum dvbfe_diseqc_switch switch_option,
struct dvbfe_parameters *params,
int timeout);
/**
* This will issue the standardised back-compatable DISEQC/SEC command
* sequence as defined in the DISEQC spec:
*
* i.e. tone off, set voltage, wait15, DISEQC, wait15, toneburst, wait15, set tone.
*
* @param fe Frontend concerned.
* @param oscillator Value to set the lo/hi switch to.
* @param polarization Value to set the polarisation switch to.
* @param sat_pos Value to set the satellite position switch to.
* @param switch_option Value to set the "swtch option" switch to.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_sec_std_sequence(struct dvbfe_handle *fe,
enum dvbfe_diseqc_oscillator oscillator,
enum dvbfe_polarization polarization,
enum dvbfe_diseqc_switch sat_pos,
enum dvbfe_diseqc_switch switch_option);
/**
* Execute an SEC command string on the provided frontend. Please see the documentation
* in dvbcfg_sec.h on the command format,
*
* @param fe Frontend concerned.
* @param command The command to execute.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_sec_command(struct dvbfe_handle *fe, char *command);
/**
* Control the reset status of an attached DISEQC device.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param state The state to set.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_reset(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_reset state);
/**
* Control the power status of an attached DISEQC peripheral.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param state The state to set.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_power(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_power state);
/**
* Control the listening status of an attached DISEQC peripheral.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param state The state to set.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_listen(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_listen state);
/**
* Set the state of the committed switches of a DISEQC device.
* These are switches which are defined to have a standard name.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param oscillator Value to set the lo/hi switch to.
* @param polarization Value to set the polarization switch to, or -1 to not change it.
* @param sat_pos Value to set the satellite position switch to.
* @param switch_option Value to set the switch option switch to.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_committed_switches(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_oscillator oscillator,
int polarization,
enum dvbfe_diseqc_switch sat_pos,
enum dvbfe_diseqc_switch switch_option);
/**
* Set the state of the uncommitted switches of a DISEQC device.
* These provide another four switching possibilities.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param s1 Value to set the S1 switch to.
* @param s2 Value to set the S2 switch to.
* @param s3 Value to set the S3 switch to.
* @param s3 Value to set the S4 switch to.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_uncommitted_switches(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_switch s1,
enum dvbfe_diseqc_switch s2,
enum dvbfe_diseqc_switch s3,
enum dvbfe_diseqc_switch s4);
/**
* Set an analogue value.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param id The id of the analogue value to set.
* @param value The value to set.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_analog_value(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_analog_id id,
uint8_t value);
/**
* Set the desired frequency.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param frequency The frequency to set in GHz.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_frequency(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
uint32_t frequency);
/**
* Set the desired channel.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param channel ID of the channel to set.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_channel(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
uint16_t channel);
/**
* Halt the satellite positioner.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_halt_satpos(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address);
/**
* Disable satellite positioner limits.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_disable_satpos_limits(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address);
/**
* Set satellite positioner limits.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_set_satpos_limit(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_direction direction);
/**
* Drive satellite positioner motor.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param direction Direction to drive in.
* @param mode Drive mode to use
* (TIMEOUT=>value is a timeout in seconds, or STEPS=>value is a count of steps to use)
* @param value Value associated with the drive mode (range 0->127)
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_drive_satpos_motor(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
enum dvbfe_diseqc_direction direction,
enum dvbfe_diseqc_drive_mode mode,
uint8_t value);
/**
* Store satellite positioner preset id at current position.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param id ID of the preset.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_store_satpos_preset(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
uint8_t id);
/**
* Send a satellite positioner to a pre-set position.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param id ID of the preset.
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_goto_satpos_preset(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
uint8_t id);
/**
* Recalculate satellite positions based on the current position, using
* magic positioner specific values.
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param val1 value1 (range 0->255, pass -1 to ignore).
* @param val2 value2 (range 0->255, pass -1 to ignore).
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_recalculate_satpos_positions(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
int val1,
int val2);
/**
* Send a terrestrial aerial rotator to a particular bearing
* (0 degrees = north, fractional angles allowed).
*
* @param fe Frontend concerned.
* @param address Address of the device.
* @param angle Angle to rotate to (-256.0 -> 512.0)
* @return 0 on success, or nonzero on error.
*/
extern int dvbfe_diseqc_goto_rotator_bearing(struct dvbfe_handle *fe,
enum dvbfe_diseqc_address address,
float angle);
#endif