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
  40#include <linux/dvb/frontend.h>
  41
  42#include "dvbdev.h"
  43
  44struct dvb_frontend_tune_settings {
  45        int min_delay_ms;
  46        int step_size;
  47        int max_drift;
  48        struct dvb_frontend_parameters parameters;
  49};
  50
  51struct dvb_frontend;
  52
  53struct dvb_tuner_info {
  54        char name[128];
  55
  56        u32 frequency_min;
  57        u32 frequency_max;
  58        u32 frequency_step;
  59
  60        u32 bandwidth_min;
  61        u32 bandwidth_max;
  62        u32 bandwidth_step;
  63};
  64
  65struct analog_parameters {
  66        unsigned int frequency;
  67        unsigned int mode;
  68        unsigned int audmode;
  69        u64 std;
  70};
  71
  72enum dvbfe_modcod {
  73        DVBFE_MODCOD_DUMMY_PLFRAME      = 0,
  74        DVBFE_MODCOD_QPSK_1_4,
  75        DVBFE_MODCOD_QPSK_1_3,
  76        DVBFE_MODCOD_QPSK_2_5,
  77        DVBFE_MODCOD_QPSK_1_2,
  78        DVBFE_MODCOD_QPSK_3_5,
  79        DVBFE_MODCOD_QPSK_2_3,
  80        DVBFE_MODCOD_QPSK_3_4,
  81        DVBFE_MODCOD_QPSK_4_5,
  82        DVBFE_MODCOD_QPSK_5_6,
  83        DVBFE_MODCOD_QPSK_8_9,
  84        DVBFE_MODCOD_QPSK_9_10,
  85        DVBFE_MODCOD_8PSK_3_5,
  86        DVBFE_MODCOD_8PSK_2_3,
  87        DVBFE_MODCOD_8PSK_3_4,
  88        DVBFE_MODCOD_8PSK_5_6,
  89        DVBFE_MODCOD_8PSK_8_9,
  90        DVBFE_MODCOD_8PSK_9_10,
  91        DVBFE_MODCOD_16APSK_2_3,
  92        DVBFE_MODCOD_16APSK_3_4,
  93        DVBFE_MODCOD_16APSK_4_5,
  94        DVBFE_MODCOD_16APSK_5_6,
  95        DVBFE_MODCOD_16APSK_8_9,
  96        DVBFE_MODCOD_16APSK_9_10,
  97        DVBFE_MODCOD_32APSK_3_4,
  98        DVBFE_MODCOD_32APSK_4_5,
  99        DVBFE_MODCOD_32APSK_5_6,
 100        DVBFE_MODCOD_32APSK_8_9,
 101        DVBFE_MODCOD_32APSK_9_10,
 102        DVBFE_MODCOD_RESERVED_1,
 103        DVBFE_MODCOD_BPSK_1_3,
 104        DVBFE_MODCOD_BPSK_1_4,
 105        DVBFE_MODCOD_RESERVED_2
 106};
 107
 108enum tuner_param {
 109        DVBFE_TUNER_FREQUENCY           = (1 <<  0),
 110        DVBFE_TUNER_TUNERSTEP           = (1 <<  1),
 111        DVBFE_TUNER_IFFREQ              = (1 <<  2),
 112        DVBFE_TUNER_BANDWIDTH           = (1 <<  3),
 113        DVBFE_TUNER_REFCLOCK            = (1 <<  4),
 114        DVBFE_TUNER_IQSENSE             = (1 <<  5),
 115        DVBFE_TUNER_DUMMY               = (1 << 31)
 116};
 117
 118/*
 119 * ALGO_HW: (Hardware Algorithm)
 120 * ----------------------------------------------------------------
 121 * Devices that support this algorithm do everything in hardware
 122 * and no software support is needed to handle them.
 123 * Requesting these devices to LOCK is the only thing required,
 124 * device is supposed to do everything in the hardware.
 125 *
 126 * ALGO_SW: (Software Algorithm)
 127 * ----------------------------------------------------------------
 128 * These are dumb devices, that require software to do everything
 129 *
 130 * ALGO_CUSTOM: (Customizable Agorithm)
 131 * ----------------------------------------------------------------
 132 * Devices having this algorithm can be customized to have specific
 133 * algorithms in the frontend driver, rather than simply doing a
 134 * software zig-zag. In this case the zigzag maybe hardware assisted
 135 * or it maybe completely done in hardware. In all cases, usage of
 136 * this algorithm, in conjunction with the search and track
 137 * callbacks, utilizes the driver specific algorithm.
 138 *
 139 * ALGO_RECOVERY: (Recovery Algorithm)
 140 * ----------------------------------------------------------------
 141 * These devices have AUTO recovery capabilities from LOCK failure
 142 */
 143enum dvbfe_algo {
 144        DVBFE_ALGO_HW                   = (1 <<  0),
 145        DVBFE_ALGO_SW                   = (1 <<  1),
 146        DVBFE_ALGO_CUSTOM               = (1 <<  2),
 147        DVBFE_ALGO_RECOVERY             = (1 << 31)
 148};
 149
 150struct tuner_state {
 151        u32 frequency;
 152        u32 tunerstep;
 153        u32 ifreq;
 154        u32 bandwidth;
 155        u32 iqsense;
 156        u32 refclock;
 157};
 158
 159/*
 160 * search callback possible return status
 161 *
 162 * DVBFE_ALGO_SEARCH_SUCCESS
 163 * The frontend search algorithm completed and returned succesfully
 164 *
 165 * DVBFE_ALGO_SEARCH_ASLEEP
 166 * The frontend search algorithm is sleeping
 167 *
 168 * DVBFE_ALGO_SEARCH_FAILED
 169 * The frontend search for a signal failed
 170 *
 171 * DVBFE_ALGO_SEARCH_INVALID
 172 * The frontend search algorith was probably supplied with invalid
 173 * parameters and the search is an invalid one
 174 *
 175 * DVBFE_ALGO_SEARCH_ERROR
 176 * The frontend search algorithm failed due to some error
 177 *
 178 * DVBFE_ALGO_SEARCH_AGAIN
 179 * The frontend search algorithm was requested to search again
 180 */
 181enum dvbfe_search {
 182        DVBFE_ALGO_SEARCH_SUCCESS       = (1 <<  0),
 183        DVBFE_ALGO_SEARCH_ASLEEP        = (1 <<  1),
 184        DVBFE_ALGO_SEARCH_FAILED        = (1 <<  2),
 185        DVBFE_ALGO_SEARCH_INVALID       = (1 <<  3),
 186        DVBFE_ALGO_SEARCH_AGAIN         = (1 <<  4),
 187        DVBFE_ALGO_SEARCH_ERROR         = (1 << 31),
 188};
 189
 190
 191struct dvb_tuner_ops {
 192
 193        struct dvb_tuner_info info;
 194
 195        int (*release)(struct dvb_frontend *fe);
 196        int (*init)(struct dvb_frontend *fe);
 197        int (*sleep)(struct dvb_frontend *fe);
 198
 199        /** This is for simple PLLs - set all parameters in one go. */
 200        int (*set_params)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
 201        int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p);
 202
 203        /** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */
 204        int (*calc_regs)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p, u8 *buf, int buf_len);
 205
 206        /** This is to allow setting tuner-specific configs */
 207        int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
 208
 209        int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
 210        int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
 211
 212#define TUNER_STATUS_LOCKED 1
 213#define TUNER_STATUS_STEREO 2
 214        int (*get_status)(struct dvb_frontend *fe, u32 *status);
 215        int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
 216
 217        /** These are provided seperately from set_params in order to facilitate silicon
 218         * tuners which require sophisticated tuning loops, controlling each parameter seperately. */
 219        int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
 220        int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
 221
 222        /*
 223         * These are provided seperately from set_params in order to facilitate silicon
 224         * tuners which require sophisticated tuning loops, controlling each parameter seperately.
 225         */
 226        int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
 227        int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
 228};
 229
 230struct analog_demod_info {
 231        char *name;
 232};
 233
 234struct analog_demod_ops {
 235
 236        struct analog_demod_info info;
 237
 238        void (*set_params)(struct dvb_frontend *fe,
 239                           struct analog_parameters *params);
 240        int  (*has_signal)(struct dvb_frontend *fe);
 241        int  (*is_stereo)(struct dvb_frontend *fe);
 242        int  (*get_afc)(struct dvb_frontend *fe);
 243        void (*tuner_status)(struct dvb_frontend *fe);
 244        void (*standby)(struct dvb_frontend *fe);
 245        void (*release)(struct dvb_frontend *fe);
 246        int  (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable);
 247
 248        /** This is to allow setting tuner-specific configuration */
 249        int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
 250};
 251
 252struct dvb_frontend_ops {
 253
 254        struct dvb_frontend_info info;
 255
 256        void (*release)(struct dvb_frontend* fe);
 257        void (*release_sec)(struct dvb_frontend* fe);
 258
 259        int (*init)(struct dvb_frontend* fe);
 260        int (*sleep)(struct dvb_frontend* fe);
 261
 262        int (*write)(struct dvb_frontend* fe, u8* buf, int len);
 263
 264        /* if this is set, it overrides the default swzigzag */
 265        int (*tune)(struct dvb_frontend* fe,
 266                    struct dvb_frontend_parameters* params,
 267                    unsigned int mode_flags,
 268                    unsigned int *delay,
 269                    fe_status_t *status);
 270        /* get frontend tuning algorithm from the module */
 271        enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
 272
 273        /* these two are only used for the swzigzag code */
 274        int (*set_frontend)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
 275        int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);
 276
 277        int (*get_frontend)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
 278
 279        int (*read_status)(struct dvb_frontend* fe, fe_status_t* status);
 280        int (*read_ber)(struct dvb_frontend* fe, u32* ber);
 281        int (*read_signal_strength)(struct dvb_frontend* fe, u16* strength);
 282        int (*read_snr)(struct dvb_frontend* fe, u16* snr);
 283        int (*read_ucblocks)(struct dvb_frontend* fe, u32* ucblocks);
 284
 285        int (*diseqc_reset_overload)(struct dvb_frontend* fe);
 286        int (*diseqc_send_master_cmd)(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd);
 287        int (*diseqc_recv_slave_reply)(struct dvb_frontend* fe, struct dvb_diseqc_slave_reply* reply);
 288        int (*diseqc_send_burst)(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd);
 289        int (*set_tone)(struct dvb_frontend* fe, fe_sec_tone_mode_t tone);
 290        int (*set_voltage)(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
 291        int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
 292        int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
 293        int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
 294        int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
 295
 296        /* These callbacks are for devices that implement their own
 297         * tuning algorithms, rather than a simple swzigzag
 298         */
 299        enum dvbfe_search (*search)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
 300        int (*track)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
 301
 302        struct dvb_tuner_ops tuner_ops;
 303        struct analog_demod_ops analog_ops;
 304
 305        int (*set_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
 306        int (*get_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
 307};
 308
 309#define MAX_EVENT 8
 310
 311struct dvb_fe_events {
 312        struct dvb_frontend_event events[MAX_EVENT];
 313        int                       eventw;
 314        int                       eventr;
 315        int                       overflow;
 316        wait_queue_head_t         wait_queue;
 317        struct mutex              mtx;
 318};
 319
 320struct dtv_frontend_properties {
 321
 322        /* Cache State */
 323        u32                     state;
 324
 325        u32                     frequency;
 326        fe_modulation_t         modulation;
 327
 328        fe_sec_voltage_t        voltage;
 329        fe_sec_tone_mode_t      sectone;
 330        fe_spectral_inversion_t inversion;
 331        fe_code_rate_t          fec_inner;
 332        fe_transmit_mode_t      transmission_mode;
 333        u32                     bandwidth_hz;   /* 0 = AUTO */
 334        fe_guard_interval_t     guard_interval;
 335        fe_hierarchy_t          hierarchy;
 336        u32                     symbol_rate;
 337        fe_code_rate_t          code_rate_HP;
 338        fe_code_rate_t          code_rate_LP;
 339
 340        fe_pilot_t              pilot;
 341        fe_rolloff_t            rolloff;
 342
 343        fe_delivery_system_t    delivery_system;
 344
 345        /* ISDB-T specifics */
 346        u8                      isdbt_partial_reception;
 347        u8                      isdbt_sb_mode;
 348        u8                      isdbt_sb_subchannel;
 349        u32                     isdbt_sb_segment_idx;
 350        u32                     isdbt_sb_segment_count;
 351        u8                      isdbt_layer_enabled;
 352        struct {
 353            u8                  segment_count;
 354            fe_code_rate_t      fec;
 355            fe_modulation_t     modulation;
 356            u8                  interleaving;
 357        } layer[3];
 358
 359        /* ISDB-T specifics */
 360        u32                     isdbs_ts_id;
 361};
 362
 363struct dvb_frontend {
 364        struct dvb_frontend_ops ops;
 365        struct dvb_adapter *dvb;
 366        void *demodulator_priv;
 367        void *tuner_priv;
 368        void *frontend_priv;
 369        void *sec_priv;
 370        void *analog_demod_priv;
 371        struct dtv_frontend_properties dtv_property_cache;
 372#define DVB_FRONTEND_COMPONENT_TUNER 0
 373        int (*callback)(void *adapter_priv, int component, int cmd, int arg);
 374        int id;
 375};
 376
 377extern int dvb_register_frontend(struct dvb_adapter *dvb,
 378                                 struct dvb_frontend *fe);
 379
 380extern int dvb_unregister_frontend(struct dvb_frontend *fe);
 381
 382extern void dvb_frontend_detach(struct dvb_frontend *fe);
 383
 384extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
 385
 386extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
 387extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime);
 388
 389#endif
 390