linux/drivers/media/dvb-core/dvb_frontend.h
<<
>>
Prefs
   1/*
   2 * dvb_frontend.h
   3 *
   4 * Copyright (C) 2001 convergence integrated media GmbH
   5 * Copyright (C) 2004 convergence GmbH
   6 *
   7 * Written by Ralph Metzler
   8 * Overhauled by Holger Waechtler
   9 * Kernel I2C stuff by Michael Hunold <hunold@convergence.de>
  10 *
  11 * This program is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU Lesser General Public License
  13 * as published by the Free Software Foundation; either version 2.1
  14 * of the License, or (at your option) any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 *
  21
  22 * You should have received a copy of the GNU Lesser General Public License
  23 * along with this program; if not, write to the Free Software
  24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  25 *
  26 */
  27
  28#ifndef _DVB_FRONTEND_H_
  29#define _DVB_FRONTEND_H_
  30
  31#include <linux/types.h>
  32#include <linux/sched.h>
  33#include <linux/ioctl.h>
  34#include <linux/i2c.h>
  35#include <linux/module.h>
  36#include <linux/errno.h>
  37#include <linux/delay.h>
  38#include <linux/mutex.h>
  39#include <linux/slab.h>
  40
  41#include <linux/dvb/frontend.h>
  42
  43#include "dvbdev.h"
  44
  45/*
  46 * Maximum number of Delivery systems per frontend. It
  47 * should be smaller or equal to 32
  48 */
  49#define MAX_DELSYS      8
  50
  51struct dvb_frontend_tune_settings {
  52        int min_delay_ms;
  53        int step_size;
  54        int max_drift;
  55};
  56
  57struct dvb_frontend;
  58
  59struct dvb_tuner_info {
  60        char name[128];
  61
  62        u32 frequency_min;
  63        u32 frequency_max;
  64        u32 frequency_step;
  65
  66        u32 bandwidth_min;
  67        u32 bandwidth_max;
  68        u32 bandwidth_step;
  69};
  70
  71struct analog_parameters {
  72        unsigned int frequency;
  73        unsigned int mode;
  74        unsigned int audmode;
  75        u64 std;
  76};
  77
  78enum dvbfe_modcod {
  79        DVBFE_MODCOD_DUMMY_PLFRAME      = 0,
  80        DVBFE_MODCOD_QPSK_1_4,
  81        DVBFE_MODCOD_QPSK_1_3,
  82        DVBFE_MODCOD_QPSK_2_5,
  83        DVBFE_MODCOD_QPSK_1_2,
  84        DVBFE_MODCOD_QPSK_3_5,
  85        DVBFE_MODCOD_QPSK_2_3,
  86        DVBFE_MODCOD_QPSK_3_4,
  87        DVBFE_MODCOD_QPSK_4_5,
  88        DVBFE_MODCOD_QPSK_5_6,
  89        DVBFE_MODCOD_QPSK_8_9,
  90        DVBFE_MODCOD_QPSK_9_10,
  91        DVBFE_MODCOD_8PSK_3_5,
  92        DVBFE_MODCOD_8PSK_2_3,
  93        DVBFE_MODCOD_8PSK_3_4,
  94        DVBFE_MODCOD_8PSK_5_6,
  95        DVBFE_MODCOD_8PSK_8_9,
  96        DVBFE_MODCOD_8PSK_9_10,
  97        DVBFE_MODCOD_16APSK_2_3,
  98        DVBFE_MODCOD_16APSK_3_4,
  99        DVBFE_MODCOD_16APSK_4_5,
 100        DVBFE_MODCOD_16APSK_5_6,
 101        DVBFE_MODCOD_16APSK_8_9,
 102        DVBFE_MODCOD_16APSK_9_10,
 103        DVBFE_MODCOD_32APSK_3_4,
 104        DVBFE_MODCOD_32APSK_4_5,
 105        DVBFE_MODCOD_32APSK_5_6,
 106        DVBFE_MODCOD_32APSK_8_9,
 107        DVBFE_MODCOD_32APSK_9_10,
 108        DVBFE_MODCOD_RESERVED_1,
 109        DVBFE_MODCOD_BPSK_1_3,
 110        DVBFE_MODCOD_BPSK_1_4,
 111        DVBFE_MODCOD_RESERVED_2
 112};
 113
 114enum tuner_param {
 115        DVBFE_TUNER_FREQUENCY           = (1 <<  0),
 116        DVBFE_TUNER_TUNERSTEP           = (1 <<  1),
 117        DVBFE_TUNER_IFFREQ              = (1 <<  2),
 118        DVBFE_TUNER_BANDWIDTH           = (1 <<  3),
 119        DVBFE_TUNER_REFCLOCK            = (1 <<  4),
 120        DVBFE_TUNER_IQSENSE             = (1 <<  5),
 121        DVBFE_TUNER_DUMMY               = (1 << 31)
 122};
 123
 124/*
 125 * ALGO_HW: (Hardware Algorithm)
 126 * ----------------------------------------------------------------
 127 * Devices that support this algorithm do everything in hardware
 128 * and no software support is needed to handle them.
 129 * Requesting these devices to LOCK is the only thing required,
 130 * device is supposed to do everything in the hardware.
 131 *
 132 * ALGO_SW: (Software Algorithm)
 133 * ----------------------------------------------------------------
 134 * These are dumb devices, that require software to do everything
 135 *
 136 * ALGO_CUSTOM: (Customizable Agorithm)
 137 * ----------------------------------------------------------------
 138 * Devices having this algorithm can be customized to have specific
 139 * algorithms in the frontend driver, rather than simply doing a
 140 * software zig-zag. In this case the zigzag maybe hardware assisted
 141 * or it maybe completely done in hardware. In all cases, usage of
 142 * this algorithm, in conjunction with the search and track
 143 * callbacks, utilizes the driver specific algorithm.
 144 *
 145 * ALGO_RECOVERY: (Recovery Algorithm)
 146 * ----------------------------------------------------------------
 147 * These devices have AUTO recovery capabilities from LOCK failure
 148 */
 149enum dvbfe_algo {
 150        DVBFE_ALGO_HW                   = (1 <<  0),
 151        DVBFE_ALGO_SW                   = (1 <<  1),
 152        DVBFE_ALGO_CUSTOM               = (1 <<  2),
 153        DVBFE_ALGO_RECOVERY             = (1 << 31)
 154};
 155
 156struct tuner_state {
 157        u32 frequency;
 158        u32 tunerstep;
 159        u32 ifreq;
 160        u32 bandwidth;
 161        u32 iqsense;
 162        u32 refclock;
 163};
 164
 165/*
 166 * search callback possible return status
 167 *
 168 * DVBFE_ALGO_SEARCH_SUCCESS
 169 * The frontend search algorithm completed and returned successfully
 170 *
 171 * DVBFE_ALGO_SEARCH_ASLEEP
 172 * The frontend search algorithm is sleeping
 173 *
 174 * DVBFE_ALGO_SEARCH_FAILED
 175 * The frontend search for a signal failed
 176 *
 177 * DVBFE_ALGO_SEARCH_INVALID
 178 * The frontend search algorith was probably supplied with invalid
 179 * parameters and the search is an invalid one
 180 *
 181 * DVBFE_ALGO_SEARCH_ERROR
 182 * The frontend search algorithm failed due to some error
 183 *
 184 * DVBFE_ALGO_SEARCH_AGAIN
 185 * The frontend search algorithm was requested to search again
 186 */
 187enum dvbfe_search {
 188        DVBFE_ALGO_SEARCH_SUCCESS       = (1 <<  0),
 189        DVBFE_ALGO_SEARCH_ASLEEP        = (1 <<  1),
 190        DVBFE_ALGO_SEARCH_FAILED        = (1 <<  2),
 191        DVBFE_ALGO_SEARCH_INVALID       = (1 <<  3),
 192        DVBFE_ALGO_SEARCH_AGAIN         = (1 <<  4),
 193        DVBFE_ALGO_SEARCH_ERROR         = (1 << 31),
 194};
 195
 196
 197struct dvb_tuner_ops {
 198
 199        struct dvb_tuner_info info;
 200
 201        int (*release)(struct dvb_frontend *fe);
 202        int (*init)(struct dvb_frontend *fe);
 203        int (*sleep)(struct dvb_frontend *fe);
 204
 205        /** This is for simple PLLs - set all parameters in one go. */
 206        int (*set_params)(struct dvb_frontend *fe);
 207        int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p);
 208
 209        /** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */
 210        int (*calc_regs)(struct dvb_frontend *fe, u8 *buf, int buf_len);
 211
 212        /** This is to allow setting tuner-specific configs */
 213        int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
 214
 215        int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
 216        int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
 217        int (*get_if_frequency)(struct dvb_frontend *fe, u32 *frequency);
 218
 219#define TUNER_STATUS_LOCKED 1
 220#define TUNER_STATUS_STEREO 2
 221        int (*get_status)(struct dvb_frontend *fe, u32 *status);
 222        int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
 223        int (*get_afc)(struct dvb_frontend *fe, s32 *afc);
 224
 225        /** These are provided separately from set_params in order to facilitate silicon
 226         * tuners which require sophisticated tuning loops, controlling each parameter separately. */
 227        int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
 228        int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
 229
 230        /*
 231         * These are provided separately from set_params in order to facilitate silicon
 232         * tuners which require sophisticated tuning loops, controlling each parameter separately.
 233         */
 234        int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
 235        int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
 236};
 237
 238struct analog_demod_info {
 239        char *name;
 240};
 241
 242struct analog_demod_ops {
 243
 244        struct analog_demod_info info;
 245
 246        void (*set_params)(struct dvb_frontend *fe,
 247                           struct analog_parameters *params);
 248        int  (*has_signal)(struct dvb_frontend *fe);
 249        int  (*get_afc)(struct dvb_frontend *fe);
 250        void (*tuner_status)(struct dvb_frontend *fe);
 251        void (*standby)(struct dvb_frontend *fe);
 252        void (*release)(struct dvb_frontend *fe);
 253        int  (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable);
 254
 255        /** This is to allow setting tuner-specific configuration */
 256        int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
 257};
 258
 259struct dtv_frontend_properties;
 260
 261struct dvb_frontend_ops {
 262
 263        struct dvb_frontend_info info;
 264
 265        u8 delsys[MAX_DELSYS];
 266
 267        void (*release)(struct dvb_frontend* fe);
 268        void (*release_sec)(struct dvb_frontend* fe);
 269
 270        int (*init)(struct dvb_frontend* fe);
 271        int (*sleep)(struct dvb_frontend* fe);
 272
 273        int (*write)(struct dvb_frontend* fe, const u8 buf[], int len);
 274
 275        /* if this is set, it overrides the default swzigzag */
 276        int (*tune)(struct dvb_frontend* fe,
 277                    bool re_tune,
 278                    unsigned int mode_flags,
 279                    unsigned int *delay,
 280                    fe_status_t *status);
 281        /* get frontend tuning algorithm from the module */
 282        enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
 283
 284        /* these two are only used for the swzigzag code */
 285        int (*set_frontend)(struct dvb_frontend *fe);
 286        int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);
 287
 288        int (*get_frontend)(struct dvb_frontend *fe);
 289
 290        int (*read_status)(struct dvb_frontend* fe, fe_status_t* status);
 291        int (*read_ber)(struct dvb_frontend* fe, u32* ber);
 292        int (*read_signal_strength)(struct dvb_frontend* fe, u16* strength);
 293        int (*read_snr)(struct dvb_frontend* fe, u16* snr);
 294        int (*read_ucblocks)(struct dvb_frontend* fe, u32* ucblocks);
 295
 296        int (*diseqc_reset_overload)(struct dvb_frontend* fe);
 297        int (*diseqc_send_master_cmd)(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd);
 298        int (*diseqc_recv_slave_reply)(struct dvb_frontend* fe, struct dvb_diseqc_slave_reply* reply);
 299        int (*diseqc_send_burst)(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd);
 300        int (*set_tone)(struct dvb_frontend* fe, fe_sec_tone_mode_t tone);
 301        int (*set_voltage)(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
 302        int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
 303        int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
 304        int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
 305        int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
 306        int (*set_lna)(struct dvb_frontend *);
 307
 308        /* These callbacks are for devices that implement their own
 309         * tuning algorithms, rather than a simple swzigzag
 310         */
 311        enum dvbfe_search (*search)(struct dvb_frontend *fe);
 312
 313        struct dvb_tuner_ops tuner_ops;
 314        struct analog_demod_ops analog_ops;
 315
 316        int (*set_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
 317        int (*get_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
 318};
 319
 320#ifdef __DVB_CORE__
 321#define MAX_EVENT 8
 322
 323struct dvb_fe_events {
 324        struct dvb_frontend_event events[MAX_EVENT];
 325        int                       eventw;
 326        int                       eventr;
 327        int                       overflow;
 328        wait_queue_head_t         wait_queue;
 329        struct mutex              mtx;
 330};
 331#endif
 332
 333struct dtv_frontend_properties {
 334
 335        /* Cache State */
 336        u32                     state;
 337
 338        u32                     frequency;
 339        fe_modulation_t         modulation;
 340
 341        fe_sec_voltage_t        voltage;
 342        fe_sec_tone_mode_t      sectone;
 343        fe_spectral_inversion_t inversion;
 344        fe_code_rate_t          fec_inner;
 345        fe_transmit_mode_t      transmission_mode;
 346        u32                     bandwidth_hz;   /* 0 = AUTO */
 347        fe_guard_interval_t     guard_interval;
 348        fe_hierarchy_t          hierarchy;
 349        u32                     symbol_rate;
 350        fe_code_rate_t          code_rate_HP;
 351        fe_code_rate_t          code_rate_LP;
 352
 353        fe_pilot_t              pilot;
 354        fe_rolloff_t            rolloff;
 355
 356        fe_delivery_system_t    delivery_system;
 357
 358        enum fe_interleaving    interleaving;
 359
 360        /* ISDB-T specifics */
 361        u8                      isdbt_partial_reception;
 362        u8                      isdbt_sb_mode;
 363        u8                      isdbt_sb_subchannel;
 364        u32                     isdbt_sb_segment_idx;
 365        u32                     isdbt_sb_segment_count;
 366        u8                      isdbt_layer_enabled;
 367        struct {
 368            u8                  segment_count;
 369            fe_code_rate_t      fec;
 370            fe_modulation_t     modulation;
 371            u8                  interleaving;
 372        } layer[3];
 373
 374        /* Multistream specifics */
 375        u32                     stream_id;
 376
 377        /* ATSC-MH specifics */
 378        u8                      atscmh_fic_ver;
 379        u8                      atscmh_parade_id;
 380        u8                      atscmh_nog;
 381        u8                      atscmh_tnog;
 382        u8                      atscmh_sgn;
 383        u8                      atscmh_prc;
 384
 385        u8                      atscmh_rs_frame_mode;
 386        u8                      atscmh_rs_frame_ensemble;
 387        u8                      atscmh_rs_code_mode_pri;
 388        u8                      atscmh_rs_code_mode_sec;
 389        u8                      atscmh_sccc_block_mode;
 390        u8                      atscmh_sccc_code_mode_a;
 391        u8                      atscmh_sccc_code_mode_b;
 392        u8                      atscmh_sccc_code_mode_c;
 393        u8                      atscmh_sccc_code_mode_d;
 394
 395        u32                     lna;
 396
 397        /* statistics data */
 398        struct dtv_fe_stats     strength;
 399        struct dtv_fe_stats     cnr;
 400        struct dtv_fe_stats     pre_bit_error;
 401        struct dtv_fe_stats     pre_bit_count;
 402        struct dtv_fe_stats     post_bit_error;
 403        struct dtv_fe_stats     post_bit_count;
 404        struct dtv_fe_stats     block_error;
 405        struct dtv_fe_stats     block_count;
 406};
 407
 408struct dvb_frontend {
 409        struct dvb_frontend_ops ops;
 410        struct dvb_adapter *dvb;
 411        void *demodulator_priv;
 412        void *tuner_priv;
 413        void *frontend_priv;
 414        void *sec_priv;
 415        void *analog_demod_priv;
 416        struct dtv_frontend_properties dtv_property_cache;
 417#define DVB_FRONTEND_COMPONENT_TUNER 0
 418#define DVB_FRONTEND_COMPONENT_DEMOD 1
 419        int (*callback)(void *adapter_priv, int component, int cmd, int arg);
 420        int id;
 421};
 422
 423extern int dvb_register_frontend(struct dvb_adapter *dvb,
 424                                 struct dvb_frontend *fe);
 425
 426extern int dvb_unregister_frontend(struct dvb_frontend *fe);
 427
 428extern void dvb_frontend_detach(struct dvb_frontend *fe);
 429
 430extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
 431extern int dvb_frontend_suspend(struct dvb_frontend *fe);
 432extern int dvb_frontend_resume(struct dvb_frontend *fe);
 433
 434extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
 435extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime);
 436
 437#endif
 438