dvb_frontend.h 12.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/*
 * dvb_frontend.h
 *
 * Copyright (C) 2001 convergence integrated media GmbH
 * Copyright (C) 2004 convergence GmbH
 *
 * Written by Ralph Metzler
 * Overhauled by Holger Waechtler
 * Kernel I2C stuff by Michael Hunold <hunold@convergence.de>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *

 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */

#ifndef _DVB_FRONTEND_H_
#define _DVB_FRONTEND_H_

#include <linux/types.h>
#include <linux/sched.h>
#include <linux/ioctl.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/delay.h>
38
#include <linux/mutex.h>
39
#include <linux/slab.h>
L
Linus Torvalds 已提交
40 41 42 43 44

#include <linux/dvb/frontend.h>

#include "dvbdev.h"

45 46 47 48 49 50
/*
 * Maximum number of Delivery systems per frontend. It
 * should be smaller or equal to 32
 */
#define MAX_DELSYS	8

L
Linus Torvalds 已提交
51
struct dvb_frontend_tune_settings {
52 53 54
	int min_delay_ms;
	int step_size;
	int max_drift;
L
Linus Torvalds 已提交
55 56 57 58
};

struct dvb_frontend;

59 60 61 62 63 64 65 66 67 68 69 70
struct dvb_tuner_info {
	char name[128];

	u32 frequency_min;
	u32 frequency_max;
	u32 frequency_step;

	u32 bandwidth_min;
	u32 bandwidth_max;
	u32 bandwidth_step;
};

71 72 73 74 75 76 77
struct analog_parameters {
	unsigned int frequency;
	unsigned int mode;
	unsigned int audmode;
	u64 std;
};

M
Manu Abraham 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
enum dvbfe_modcod {
	DVBFE_MODCOD_DUMMY_PLFRAME	= 0,
	DVBFE_MODCOD_QPSK_1_4,
	DVBFE_MODCOD_QPSK_1_3,
	DVBFE_MODCOD_QPSK_2_5,
	DVBFE_MODCOD_QPSK_1_2,
	DVBFE_MODCOD_QPSK_3_5,
	DVBFE_MODCOD_QPSK_2_3,
	DVBFE_MODCOD_QPSK_3_4,
	DVBFE_MODCOD_QPSK_4_5,
	DVBFE_MODCOD_QPSK_5_6,
	DVBFE_MODCOD_QPSK_8_9,
	DVBFE_MODCOD_QPSK_9_10,
	DVBFE_MODCOD_8PSK_3_5,
	DVBFE_MODCOD_8PSK_2_3,
	DVBFE_MODCOD_8PSK_3_4,
	DVBFE_MODCOD_8PSK_5_6,
	DVBFE_MODCOD_8PSK_8_9,
	DVBFE_MODCOD_8PSK_9_10,
	DVBFE_MODCOD_16APSK_2_3,
	DVBFE_MODCOD_16APSK_3_4,
	DVBFE_MODCOD_16APSK_4_5,
	DVBFE_MODCOD_16APSK_5_6,
	DVBFE_MODCOD_16APSK_8_9,
	DVBFE_MODCOD_16APSK_9_10,
	DVBFE_MODCOD_32APSK_3_4,
	DVBFE_MODCOD_32APSK_4_5,
	DVBFE_MODCOD_32APSK_5_6,
	DVBFE_MODCOD_32APSK_8_9,
	DVBFE_MODCOD_32APSK_9_10,
	DVBFE_MODCOD_RESERVED_1,
	DVBFE_MODCOD_BPSK_1_3,
	DVBFE_MODCOD_BPSK_1_4,
	DVBFE_MODCOD_RESERVED_2
};

enum tuner_param {
	DVBFE_TUNER_FREQUENCY		= (1 <<  0),
	DVBFE_TUNER_TUNERSTEP		= (1 <<  1),
	DVBFE_TUNER_IFFREQ		= (1 <<  2),
	DVBFE_TUNER_BANDWIDTH		= (1 <<  3),
	DVBFE_TUNER_REFCLOCK		= (1 <<  4),
	DVBFE_TUNER_IQSENSE		= (1 <<  5),
	DVBFE_TUNER_DUMMY		= (1 << 31)
};

/*
 * ALGO_HW: (Hardware Algorithm)
 * ----------------------------------------------------------------
 * Devices that support this algorithm do everything in hardware
 * and no software support is needed to handle them.
 * Requesting these devices to LOCK is the only thing required,
 * device is supposed to do everything in the hardware.
 *
 * ALGO_SW: (Software Algorithm)
 * ----------------------------------------------------------------
 * These are dumb devices, that require software to do everything
 *
 * ALGO_CUSTOM: (Customizable Agorithm)
 * ----------------------------------------------------------------
 * Devices having this algorithm can be customized to have specific
 * algorithms in the frontend driver, rather than simply doing a
 * software zig-zag. In this case the zigzag maybe hardware assisted
 * or it maybe completely done in hardware. In all cases, usage of
 * this algorithm, in conjunction with the search and track
 * callbacks, utilizes the driver specific algorithm.
 *
 * ALGO_RECOVERY: (Recovery Algorithm)
 * ----------------------------------------------------------------
 * These devices have AUTO recovery capabilities from LOCK failure
 */
enum dvbfe_algo {
	DVBFE_ALGO_HW			= (1 <<  0),
	DVBFE_ALGO_SW			= (1 <<  1),
	DVBFE_ALGO_CUSTOM		= (1 <<  2),
	DVBFE_ALGO_RECOVERY		= (1 << 31)
};

struct tuner_state {
	u32 frequency;
	u32 tunerstep;
	u32 ifreq;
	u32 bandwidth;
	u32 iqsense;
	u32 refclock;
};

/*
 * search callback possible return status
 *
 * DVBFE_ALGO_SEARCH_SUCCESS
169
 * The frontend search algorithm completed and returned successfully
M
Manu Abraham 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
 *
 * DVBFE_ALGO_SEARCH_ASLEEP
 * The frontend search algorithm is sleeping
 *
 * DVBFE_ALGO_SEARCH_FAILED
 * The frontend search for a signal failed
 *
 * DVBFE_ALGO_SEARCH_INVALID
 * The frontend search algorith was probably supplied with invalid
 * parameters and the search is an invalid one
 *
 * DVBFE_ALGO_SEARCH_ERROR
 * The frontend search algorithm failed due to some error
 *
 * DVBFE_ALGO_SEARCH_AGAIN
 * The frontend search algorithm was requested to search again
 */
enum dvbfe_search {
	DVBFE_ALGO_SEARCH_SUCCESS	= (1 <<  0),
	DVBFE_ALGO_SEARCH_ASLEEP	= (1 <<  1),
	DVBFE_ALGO_SEARCH_FAILED	= (1 <<  2),
	DVBFE_ALGO_SEARCH_INVALID	= (1 <<  3),
	DVBFE_ALGO_SEARCH_AGAIN		= (1 <<  4),
	DVBFE_ALGO_SEARCH_ERROR		= (1 << 31),
};


197
struct dvb_tuner_ops {
198

199 200 201 202 203
	struct dvb_tuner_info info;

	int (*release)(struct dvb_frontend *fe);
	int (*init)(struct dvb_frontend *fe);
	int (*sleep)(struct dvb_frontend *fe);
204 205
	int (*suspend)(struct dvb_frontend *fe);
	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 215 216
	/** This is to allow setting tuner-specific configs */
	int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);

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

D
Daniel Mack 已提交
227 228
	/** These are provided separately from set_params in order to facilitate silicon
	 * tuners which require sophisticated tuning loops, controlling each parameter separately. */
229 230
	int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
	int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
M
Manu Abraham 已提交
231 232

	/*
D
Daniel Mack 已提交
233 234
	 * These are provided separately from set_params in order to facilitate silicon
	 * tuners which require sophisticated tuning loops, controlling each parameter separately.
M
Manu Abraham 已提交
235 236 237
	 */
	int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
	int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
238 239
};

240 241 242 243
struct analog_demod_info {
	char *name;
};

244
struct analog_demod_ops {
245 246 247 248 249

	struct analog_demod_info info;

	void (*set_params)(struct dvb_frontend *fe,
			   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 253 254 255 256 257 258 259 260
	void (*tuner_status)(struct dvb_frontend *fe);
	void (*standby)(struct dvb_frontend *fe);
	void (*release)(struct dvb_frontend *fe);
	int  (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable);

	/** This is to allow setting tuner-specific configuration */
	int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
};

261 262
struct dtv_frontend_properties;

L
Linus Torvalds 已提交
263 264 265 266
struct dvb_frontend_ops {

	struct dvb_frontend_info info;

267 268
	u8 delsys[MAX_DELSYS];

L
Linus Torvalds 已提交
269
	void (*release)(struct dvb_frontend* fe);
270
	void (*release_sec)(struct dvb_frontend* fe);
L
Linus Torvalds 已提交
271 272 273 274

	int (*init)(struct dvb_frontend* fe);
	int (*sleep)(struct dvb_frontend* fe);

275
	int (*write)(struct dvb_frontend* fe, const u8 buf[], int len);
276

277 278
	/* if this is set, it overrides the default swzigzag */
	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 */
M
Manu Abraham 已提交
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);
L
Linus Torvalds 已提交
288 289
	int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);

290
	int (*get_frontend)(struct dvb_frontend *fe);
291

L
Linus Torvalds 已提交
292 293 294 295 296 297 298 299 300 301 302 303
	int (*read_status)(struct dvb_frontend* fe, fe_status_t* status);
	int (*read_ber)(struct dvb_frontend* fe, u32* ber);
	int (*read_signal_strength)(struct dvb_frontend* fe, u16* strength);
	int (*read_snr)(struct dvb_frontend* fe, u16* snr);
	int (*read_ucblocks)(struct dvb_frontend* fe, u32* ucblocks);

	int (*diseqc_reset_overload)(struct dvb_frontend* fe);
	int (*diseqc_send_master_cmd)(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd);
	int (*diseqc_recv_slave_reply)(struct dvb_frontend* fe, struct dvb_diseqc_slave_reply* reply);
	int (*diseqc_send_burst)(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd);
	int (*set_tone)(struct dvb_frontend* fe, fe_sec_tone_mode_t tone);
	int (*set_voltage)(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
304 305
	int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
	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

M
Manu Abraham 已提交
310 311 312
	/* These callbacks are for devices that implement their own
	 * tuning algorithms, rather than a simple swzigzag
	 */
313
	enum dvbfe_search (*search)(struct dvb_frontend *fe);
M
Manu Abraham 已提交
314

315
	struct dvb_tuner_ops tuner_ops;
316
	struct analog_demod_ops analog_ops;
317

318 319
	int (*set_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
	int (*get_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
L
Linus Torvalds 已提交
320 321
};

322
#ifdef __DVB_CORE__
L
Linus Torvalds 已提交
323 324 325 326 327 328 329 330
#define MAX_EVENT 8

struct dvb_fe_events {
	struct dvb_frontend_event events[MAX_EVENT];
	int			  eventw;
	int			  eventr;
	int			  overflow;
	wait_queue_head_t	  wait_queue;
331
	struct mutex		  mtx;
L
Linus Torvalds 已提交
332
};
333
#endif
L
Linus Torvalds 已提交
334

335
struct dtv_frontend_properties {
336 337 338 339 340 341 342 343 344 345 346 347

	/* Cache State */
	u32			state;

	u32			frequency;
	fe_modulation_t		modulation;

	fe_sec_voltage_t	voltage;
	fe_sec_tone_mode_t	sectone;
	fe_spectral_inversion_t	inversion;
	fe_code_rate_t		fec_inner;
	fe_transmit_mode_t	transmission_mode;
348
	u32			bandwidth_hz;	/* 0 = AUTO */
349 350 351 352 353 354 355 356 357 358
	fe_guard_interval_t	guard_interval;
	fe_hierarchy_t		hierarchy;
	u32			symbol_rate;
	fe_code_rate_t		code_rate_HP;
	fe_code_rate_t		code_rate_LP;

	fe_pilot_t		pilot;
	fe_rolloff_t		rolloff;

	fe_delivery_system_t	delivery_system;
359

360 361
	enum fe_interleaving	interleaving;

362 363 364 365 366 367 368 369 370 371 372 373 374
	/* ISDB-T specifics */
	u8			isdbt_partial_reception;
	u8			isdbt_sb_mode;
	u8			isdbt_sb_subchannel;
	u32			isdbt_sb_segment_idx;
	u32			isdbt_sb_segment_count;
	u8			isdbt_layer_enabled;
	struct {
	    u8			segment_count;
	    fe_code_rate_t	fec;
	    fe_modulation_t	modulation;
	    u8			interleaving;
	} layer[3];
375

376 377
	/* Multistream specifics */
	u32			stream_id;
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395

	/* ATSC-MH specifics */
	u8			atscmh_fic_ver;
	u8			atscmh_parade_id;
	u8			atscmh_nog;
	u8			atscmh_tnog;
	u8			atscmh_sgn;
	u8			atscmh_prc;

	u8			atscmh_rs_frame_mode;
	u8			atscmh_rs_frame_ensemble;
	u8			atscmh_rs_code_mode_pri;
	u8			atscmh_rs_code_mode_sec;
	u8			atscmh_sccc_block_mode;
	u8			atscmh_sccc_code_mode_a;
	u8			atscmh_sccc_code_mode_b;
	u8			atscmh_sccc_code_mode_c;
	u8			atscmh_sccc_code_mode_d;
396 397

	u32			lna;
398 399 400 401 402 403 404 405 406 407

	/* statistics data */
	struct dtv_fe_stats	strength;
	struct dtv_fe_stats	cnr;
	struct dtv_fe_stats	pre_bit_error;
	struct dtv_fe_stats	pre_bit_count;
	struct dtv_fe_stats	post_bit_error;
	struct dtv_fe_stats	post_bit_count;
	struct dtv_fe_stats	block_error;
	struct dtv_fe_stats	block_count;
408 409
};

410 411 412
#define DVB_FE_NO_EXIT  0
#define DVB_FE_NORMAL_EXIT      1
#define DVB_FE_DEVICE_REMOVED   2
413
#define DVB_FE_DEVICE_RESUME    3
414

L
Linus Torvalds 已提交
415
struct dvb_frontend {
416
	struct dvb_frontend_ops ops;
L
Linus Torvalds 已提交
417
	struct dvb_adapter *dvb;
418 419 420 421 422
	void *demodulator_priv;
	void *tuner_priv;
	void *frontend_priv;
	void *sec_priv;
	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;
L
Linus Torvalds 已提交
429 430
};

431 432
extern int dvb_register_frontend(struct dvb_adapter *dvb,
				 struct dvb_frontend *fe);
L
Linus Torvalds 已提交
433

434
extern int dvb_unregister_frontend(struct dvb_frontend *fe);
L
Linus Torvalds 已提交
435

436
extern void dvb_frontend_detach(struct dvb_frontend *fe);
437

438
extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
439 440
extern int dvb_frontend_suspend(struct dvb_frontend *fe);
extern int dvb_frontend_resume(struct dvb_frontend *fe);
441

442 443 444
extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime);

L
Linus Torvalds 已提交
445
#endif