diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
| commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
| tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/media/dvb/dvb-core/dvb_frontend.h | |
| parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) | |
Diffstat (limited to 'drivers/media/dvb/dvb-core/dvb_frontend.h')
| -rw-r--r-- | drivers/media/dvb/dvb-core/dvb_frontend.h | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h new file mode 100644 index 00000000000..5590eb6eb40 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h | |||
| @@ -0,0 +1,392 @@ | |||
| 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 | struct dvb_frontend_tune_settings { | ||
| 46 | int min_delay_ms; | ||
| 47 | int step_size; | ||
| 48 | int max_drift; | ||
| 49 | struct dvb_frontend_parameters parameters; | ||
| 50 | }; | ||
| 51 | |||
| 52 | struct dvb_frontend; | ||
| 53 | |||
| 54 | struct dvb_tuner_info { | ||
| 55 | char name[128]; | ||
| 56 | |||
| 57 | u32 frequency_min; | ||
| 58 | u32 frequency_max; | ||
| 59 | u32 frequency_step; | ||
| 60 | |||
| 61 | u32 bandwidth_min; | ||
| 62 | u32 bandwidth_max; | ||
| 63 | u32 bandwidth_step; | ||
| 64 | }; | ||
| 65 | |||
| 66 | struct analog_parameters { | ||
| 67 | unsigned int frequency; | ||
| 68 | unsigned int mode; | ||
| 69 | unsigned int audmode; | ||
| 70 | u64 std; | ||
| 71 | }; | ||
| 72 | |||
| 73 | enum dvbfe_modcod { | ||
| 74 | DVBFE_MODCOD_DUMMY_PLFRAME = 0, | ||
| 75 | DVBFE_MODCOD_QPSK_1_4, | ||
| 76 | DVBFE_MODCOD_QPSK_1_3, | ||
| 77 | DVBFE_MODCOD_QPSK_2_5, | ||
| 78 | DVBFE_MODCOD_QPSK_1_2, | ||
| 79 | DVBFE_MODCOD_QPSK_3_5, | ||
| 80 | DVBFE_MODCOD_QPSK_2_3, | ||
| 81 | DVBFE_MODCOD_QPSK_3_4, | ||
| 82 | DVBFE_MODCOD_QPSK_4_5, | ||
| 83 | DVBFE_MODCOD_QPSK_5_6, | ||
| 84 | DVBFE_MODCOD_QPSK_8_9, | ||
| 85 | DVBFE_MODCOD_QPSK_9_10, | ||
| 86 | DVBFE_MODCOD_8PSK_3_5, | ||
| 87 | DVBFE_MODCOD_8PSK_2_3, | ||
| 88 | DVBFE_MODCOD_8PSK_3_4, | ||
| 89 | DVBFE_MODCOD_8PSK_5_6, | ||
| 90 | DVBFE_MODCOD_8PSK_8_9, | ||
| 91 | DVBFE_MODCOD_8PSK_9_10, | ||
| 92 | DVBFE_MODCOD_16APSK_2_3, | ||
| 93 | DVBFE_MODCOD_16APSK_3_4, | ||
| 94 | DVBFE_MODCOD_16APSK_4_5, | ||
| 95 | DVBFE_MODCOD_16APSK_5_6, | ||
| 96 | DVBFE_MODCOD_16APSK_8_9, | ||
| 97 | DVBFE_MODCOD_16APSK_9_10, | ||
| 98 | DVBFE_MODCOD_32APSK_3_4, | ||
| 99 | DVBFE_MODCOD_32APSK_4_5, | ||
| 100 | DVBFE_MODCOD_32APSK_5_6, | ||
| 101 | DVBFE_MODCOD_32APSK_8_9, | ||
| 102 | DVBFE_MODCOD_32APSK_9_10, | ||
| 103 | DVBFE_MODCOD_RESERVED_1, | ||
| 104 | DVBFE_MODCOD_BPSK_1_3, | ||
| 105 | DVBFE_MODCOD_BPSK_1_4, | ||
| 106 | DVBFE_MODCOD_RESERVED_2 | ||
| 107 | }; | ||
| 108 | |||
| 109 | enum tuner_param { | ||
| 110 | DVBFE_TUNER_FREQUENCY = (1 << 0), | ||
| 111 | DVBFE_TUNER_TUNERSTEP = (1 << 1), | ||
| 112 | DVBFE_TUNER_IFFREQ = (1 << 2), | ||
| 113 | DVBFE_TUNER_BANDWIDTH = (1 << 3), | ||
| 114 | DVBFE_TUNER_REFCLOCK = (1 << 4), | ||
| 115 | DVBFE_TUNER_IQSENSE = (1 << 5), | ||
| 116 | DVBFE_TUNER_DUMMY = (1 << 31) | ||
| 117 | }; | ||
| 118 | |||
| 119 | /* | ||
| 120 | * ALGO_HW: (Hardware Algorithm) | ||
| 121 | * ---------------------------------------------------------------- | ||
| 122 | * Devices that support this algorithm do everything in hardware | ||
| 123 | * and no software support is needed to handle them. | ||
| 124 | * Requesting these devices to LOCK is the only thing required, | ||
| 125 | * device is supposed to do everything in the hardware. | ||
| 126 | * | ||
| 127 | * ALGO_SW: (Software Algorithm) | ||
| 128 | * ---------------------------------------------------------------- | ||
| 129 | * These are dumb devices, that require software to do everything | ||
| 130 | * | ||
| 131 | * ALGO_CUSTOM: (Customizable Agorithm) | ||
| 132 | * ---------------------------------------------------------------- | ||
| 133 | * Devices having this algorithm can be customized to have specific | ||
| 134 | * algorithms in the frontend driver, rather than simply doing a | ||
| 135 | * software zig-zag. In this case the zigzag maybe hardware assisted | ||
| 136 | * or it maybe completely done in hardware. In all cases, usage of | ||
| 137 | * this algorithm, in conjunction with the search and track | ||
| 138 | * callbacks, utilizes the driver specific algorithm. | ||
| 139 | * | ||
| 140 | * ALGO_RECOVERY: (Recovery Algorithm) | ||
| 141 | * ---------------------------------------------------------------- | ||
| 142 | * These devices have AUTO recovery capabilities from LOCK failure | ||
| 143 | */ | ||
| 144 | enum dvbfe_algo { | ||
| 145 | DVBFE_ALGO_HW = (1 << 0), | ||
| 146 | DVBFE_ALGO_SW = (1 << 1), | ||
| 147 | DVBFE_ALGO_CUSTOM = (1 << 2), | ||
| 148 | DVBFE_ALGO_RECOVERY = (1 << 31) | ||
| 149 | }; | ||
| 150 | |||
| 151 | struct tuner_state { | ||
| 152 | u32 frequency; | ||
| 153 | u32 tunerstep; | ||
| 154 | u32 ifreq; | ||
| 155 | u32 bandwidth; | ||
| 156 | u32 iqsense; | ||
| 157 | u32 refclock; | ||
| 158 | }; | ||
| 159 | |||
| 160 | /* | ||
| 161 | * search callback possible return status | ||
| 162 | * | ||
| 163 | * DVBFE_ALGO_SEARCH_SUCCESS | ||
| 164 | * The frontend search algorithm completed and returned successfully | ||
| 165 | * | ||
| 166 | * DVBFE_ALGO_SEARCH_ASLEEP | ||
| 167 | * The frontend search algorithm is sleeping | ||
| 168 | * | ||
| 169 | * DVBFE_ALGO_SEARCH_FAILED | ||
| 170 | * The frontend search for a signal failed | ||
| 171 | * | ||
| 172 | * DVBFE_ALGO_SEARCH_INVALID | ||
| 173 | * The frontend search algorith was probably supplied with invalid | ||
| 174 | * parameters and the search is an invalid one | ||
| 175 | * | ||
| 176 | * DVBFE_ALGO_SEARCH_ERROR | ||
| 177 | * The frontend search algorithm failed due to some error | ||
| 178 | * | ||
| 179 | * DVBFE_ALGO_SEARCH_AGAIN | ||
| 180 | * The frontend search algorithm was requested to search again | ||
| 181 | */ | ||
| 182 | enum dvbfe_search { | ||
| 183 | DVBFE_ALGO_SEARCH_SUCCESS = (1 << 0), | ||
| 184 | DVBFE_ALGO_SEARCH_ASLEEP = (1 << 1), | ||
| 185 | DVBFE_ALGO_SEARCH_FAILED = (1 << 2), | ||
| 186 | DVBFE_ALGO_SEARCH_INVALID = (1 << 3), | ||
| 187 | DVBFE_ALGO_SEARCH_AGAIN = (1 << 4), | ||
| 188 | DVBFE_ALGO_SEARCH_ERROR = (1 << 31), | ||
| 189 | }; | ||
| 190 | |||
| 191 | |||
| 192 | struct dvb_tuner_ops { | ||
| 193 | |||
| 194 | struct dvb_tuner_info info; | ||
| 195 | |||
| 196 | int (*release)(struct dvb_frontend *fe); | ||
| 197 | int (*init)(struct dvb_frontend *fe); | ||
| 198 | int (*sleep)(struct dvb_frontend *fe); | ||
| 199 | |||
| 200 | /** This is for simple PLLs - set all parameters in one go. */ | ||
| 201 | int (*set_params)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p); | ||
| 202 | int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p); | ||
| 203 | |||
| 204 | /** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */ | ||
| 205 | int (*calc_regs)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p, u8 *buf, int buf_len); | ||
| 206 | |||
| 207 | /** This is to allow setting tuner-specific configs */ | ||
| 208 | int (*set_config)(struct dvb_frontend *fe, void *priv_cfg); | ||
| 209 | |||
| 210 | int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency); | ||
| 211 | int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth); | ||
| 212 | |||
| 213 | #define TUNER_STATUS_LOCKED 1 | ||
| 214 | #define TUNER_STATUS_STEREO 2 | ||
| 215 | int (*get_status)(struct dvb_frontend *fe, u32 *status); | ||
| 216 | int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength); | ||
| 217 | |||
| 218 | /** These are provided separately from set_params in order to facilitate silicon | ||
| 219 | * tuners which require sophisticated tuning loops, controlling each parameter separately. */ | ||
| 220 | int (*set_frequency)(struct dvb_frontend *fe, u32 frequency); | ||
| 221 | int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth); | ||
| 222 | |||
| 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 | */ | ||
| 227 | int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state); | ||
| 228 | int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state); | ||
| 229 | }; | ||
| 230 | |||
| 231 | struct analog_demod_info { | ||
| 232 | char *name; | ||
| 233 | }; | ||
| 234 | |||
| 235 | struct analog_demod_ops { | ||
| 236 | |||
| 237 | struct analog_demod_info info; | ||
| 238 | |||
| 239 | void (*set_params)(struct dvb_frontend *fe, | ||
| 240 | struct analog_parameters *params); | ||
| 241 | int (*has_signal)(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 | |||
| 252 | struct 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, const 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 | |||
| 311 | struct 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 | |||
| 320 | struct 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 | /* DVB-T2 specifics */ | ||
| 363 | u32 dvbt2_plp_id; | ||
| 364 | }; | ||
| 365 | |||
| 366 | struct dvb_frontend { | ||
| 367 | struct dvb_frontend_ops ops; | ||
| 368 | struct dvb_adapter *dvb; | ||
| 369 | void *demodulator_priv; | ||
| 370 | void *tuner_priv; | ||
| 371 | void *frontend_priv; | ||
| 372 | void *sec_priv; | ||
| 373 | void *analog_demod_priv; | ||
| 374 | struct dtv_frontend_properties dtv_property_cache; | ||
| 375 | #define DVB_FRONTEND_COMPONENT_TUNER 0 | ||
| 376 | int (*callback)(void *adapter_priv, int component, int cmd, int arg); | ||
| 377 | int id; | ||
| 378 | }; | ||
| 379 | |||
| 380 | extern int dvb_register_frontend(struct dvb_adapter *dvb, | ||
| 381 | struct dvb_frontend *fe); | ||
| 382 | |||
| 383 | extern int dvb_unregister_frontend(struct dvb_frontend *fe); | ||
| 384 | |||
| 385 | extern void dvb_frontend_detach(struct dvb_frontend *fe); | ||
| 386 | |||
| 387 | extern void dvb_frontend_reinitialise(struct dvb_frontend *fe); | ||
| 388 | |||
| 389 | extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec); | ||
| 390 | extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime); | ||
| 391 | |||
| 392 | #endif | ||
