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        int (*suspend)(struct dvb_frontend *fe);
 205        int (*resume)(struct dvb_frontend *fe);
 206
 207        /** This is for simple PLLs - set all parameters in one go. */
 208        int (*set_params)(struct dvb_frontend *fe);
 209        int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p);
 210
 211        /** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */
 212        int (*calc_regs)(struct dvb_frontend *fe, u8 *buf, int buf_len);
 213
 214        /** This is to allow setting tuner-specific configs */
 215        int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
 216
 217        int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
 218        int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
 219        int (*get_if_frequency)(struct dvb_frontend *fe, u32 *frequency);
 220
 221#define TUNER_STATUS_LOCKED 1
 222#define TUNER_STATUS_STEREO 2
 223        int (*get_status)(struct dvb_frontend *fe, u32 *status);
 224        int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
 225        int (*get_afc)(struct dvb_frontend *fe, s32 *afc);
 226
 227        /** These are provided separately from set_params in order to facilitate silicon
 228         * tuners which require sophisticated tuning loops, controlling each parameter separately. */
 229        int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
 230        int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
 231
 232        /*
 233         * These are provided separately from set_params in order to facilitate silicon
 234         * tuners which require sophisticated tuning loops, controlling each parameter separately.
 235         */
 236        int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
 237        int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
 238};
 239
 240struct analog_demod_info {
 241        char *name;
 242};
 243
 244struct analog_demod_ops {
 245
 246        struct analog_demod_info info;
 247
 248        void (*set_params)(struct dvb_frontend *fe,
 249                           struct analog_parameters *params);
 250        int  (*has_signal)(struct dvb_frontend *fe, u16 *signal);
 251        int  (*get_afc)(struct dvb_frontend *fe, s32 *afc);
 252        void (*tuner_status)(struct dvb_frontend *fe);
 253        void (*standby)(struct dvb_frontend *fe);
 254        void (*release)(struct dvb_frontend *fe);
 255        int  (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable);
 256
 257        /** This is to allow setting tuner-specific configuration */
 258        int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
 259};
 260
 261struct dtv_frontend_properties;
 262
 263struct dvb_frontend_ops {
 264
 265        struct dvb_frontend_info info;
 266
 267        u8 delsys[MAX_DELSYS];
 268
 269        void (*release)(struct dvb_frontend* fe);
 270        void (*release_sec)(struct dvb_frontend* fe);
 271
 272        int (*init)(struct dvb_frontend* fe);
 273        int (*sleep)(struct dvb_frontend* fe);
 274
 275        int (*write)(struct dvb_frontend* fe, const u8 buf[], int len);
 276
 277        /* if this is set, it overrides the default swzigzag */
 278        int (*tune)(struct dvb_frontend* fe,
 279                    bool re_tune,
 280                    unsigned int mode_flags,
 281                    unsigned int *delay,
 282                    fe_status_t *status);
 283        /* get frontend tuning algorithm from the module */
 284        enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
 285
 286        /* these two are only used for the swzigzag code */
 287        int (*set_frontend)(struct dvb_frontend *fe);
 288        int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);
 289
 290        int (*get_frontend)(struct dvb_frontend *fe);
 291
 292        int (*read_status)(struct dvb_frontend* fe, fe_status_t* status);
 293        int (*read_ber)(struct dvb_frontend* fe, u32* ber);
 294        int (*read_signal_strength)(struct dvb_frontend* fe, u16* strength);
 295        int (*read_snr)(struct dvb_frontend* fe, u16* snr);
 296        int (*read_ucblocks)(struct dvb_frontend* fe, u32* ucblocks);
 297
 298        int (*diseqc_reset_overload)(struct dvb_frontend* fe);
 299        int (*diseqc_send_master_cmd)(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd);
 300        int (*diseqc_recv_slave_reply)(struct dvb_frontend* fe, struct dvb_diseqc_slave_reply* reply);
 301        int (*diseqc_send_burst)(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd);
 302        int (*set_tone)(struct dvb_frontend* fe, fe_sec_tone_mode_t tone);
 303        int (*set_voltage)(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
 304        int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
 305        int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
 306        int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
 307        int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
 308        int (*set_lna)(struct dvb_frontend *);
 309
 310        /* These callbacks are for devices that implement their own
 311         * tuning algorithms, rather than a simple swzigzag
 312         */
 313        enum dvbfe_search (*search)(struct dvb_frontend *fe);
 314
 315        struct dvb_tuner_ops tuner_ops;
 316        struct analog_demod_ops analog_ops;
 317
 318        int (*set_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
 319        int (*get_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
 320};
 321
 322#ifdef __DVB_CORE__
 323#define MAX_EVENT 8
 324
 325struct dvb_fe_events {
 326        struct dvb_frontend_event events[MAX_EVENT];
 327        int                       eventw;
 328        int                       eventr;
 329        int                       overflow;
 330        wait_queue_head_t         wait_queue;
 331        struct mutex              mtx;
 332};
 333#endif
 334
 335struct dtv_frontend_properties {
 336
 337        /* Cache State */
 338        u32                     state;
 339
 340        u32                     frequency;
 341        fe_modulation_t         modulation;
 342
 343        fe_sec_voltage_t        voltage;
 344        fe_sec_tone_mode_t      sectone;
 345        fe_spectral_inversion_t inversion;
 346        fe_code_rate_t          fec_inner;
 347        fe_transmit_mode_t      transmission_mode;
 348        u32                     bandwidth_hz;   /* 0 = AUTO */
 349        fe_guard_interval_t     guard_interval;
 350        fe_hierarchy_t          hierarchy;
 351        u32                     symbol_rate;
 352        fe_code_rate_t          code_rate_HP;
 353        fe_code_rate_t          code_rate_LP;
 354
 355        fe_pilot_t              pilot;
 356        fe_rolloff_t            rolloff;
 357
 358        fe_delivery_system_t    delivery_system;
 359
 360        enum fe_interleaving    interleaving;
 361
 362        /* ISDB-T specifics */
 363        u8                      isdbt_partial_reception;
 364        u8                      isdbt_sb_mode;
 365        u8                      isdbt_sb_subchannel;
 366        u32                     isdbt_sb_segment_idx;
 367        u32                     isdbt_sb_segment_count;
 368        u8                      isdbt_layer_enabled;
 369        struct {
 370            u8                  segment_count;
 371            fe_code_rate_t      fec;
 372            fe_modulation_t     modulation;
 373            u8                  interleaving;
 374        } layer[3];
 375
 376        /* Multistream specifics */
 377        u32                     stream_id;
 378
 379        /* ATSC-MH specifics */
 380        u8                      atscmh_fic_ver;
 381        u8                      atscmh_parade_id;
 382        u8                      atscmh_nog;
 383        u8                      atscmh_tnog;
 384        u8                      atscmh_sgn;
 385        u8                      atscmh_prc;
 386
 387        u8                      atscmh_rs_frame_mode;
 388        u8                      atscmh_rs_frame_ensemble;
 389        u8                      atscmh_rs_code_mode_pri;
 390        u8                      atscmh_rs_code_mode_sec;
 391        u8                      atscmh_sccc_block_mode;
 392        u8                      atscmh_sccc_code_mode_a;
 393        u8                      atscmh_sccc_code_mode_b;
 394        u8                      atscmh_sccc_code_mode_c;
 395        u8                      atscmh_sccc_code_mode_d;
 396
 397        u32                     lna;
 398
 399        /* statistics data */
 400        struct dtv_fe_stats     strength;
 401        struct dtv_fe_stats     cnr;
 402        struct dtv_fe_stats     pre_bit_error;
 403        struct dtv_fe_stats     pre_bit_count;
 404        struct dtv_fe_stats     post_bit_error;
 405        struct dtv_fe_stats     post_bit_count;
 406        struct dtv_fe_stats     block_error;
 407        struct dtv_fe_stats     block_count;
 408};
 409
 410#define DVB_FE_NO_EXIT  0
 411#define DVB_FE_NORMAL_EXIT      1
 412#define DVB_FE_DEVICE_REMOVED   2
 413#define DVB_FE_DEVICE_RESUME    3
 414
 415struct dvb_frontend {
 416        struct dvb_frontend_ops ops;
 417        struct dvb_adapter *dvb;
 418        void *demodulator_priv;
 419        void *tuner_priv;
 420        void *frontend_priv;
 421        void *sec_priv;
 422        void *analog_demod_priv;
 423        struct dtv_frontend_properties dtv_property_cache;
 424#define DVB_FRONTEND_COMPONENT_TUNER 0
 425#define DVB_FRONTEND_COMPONENT_DEMOD 1
 426        int (*callback)(void *adapter_priv, int component, int cmd, int arg);
 427        int id;
 428        unsigned int exit;
 429};
 430
 431extern int dvb_register_frontend(struct dvb_adapter *dvb,
 432                                 struct dvb_frontend *fe);
 433
 434extern int dvb_unregister_frontend(struct dvb_frontend *fe);
 435
 436extern void dvb_frontend_detach(struct dvb_frontend *fe);
 437
 438extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
 439extern int dvb_frontend_suspend(struct dvb_frontend *fe);
 440extern int dvb_frontend_resume(struct dvb_frontend *fe);
 441
 442extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
 443extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime);
 444
 445#endif
 446