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