dvb_frontend.h 13.0 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

51 52 53 54 55 56 57 58 59
/**
 * struct dvb_frontend_tune_settings - parameters to adjust frontend tuning
 *
 * @min_delay_ms:	minimum delay for tuning, in ms
 * @step_size:		step size between two consecutive frequencies
 * @max_drift:		maximum drift
 *
 * NOTE: step_size is in Hz, for terrestrial/cable or kHz for satellite
 */
L
Linus Torvalds 已提交
60
struct dvb_frontend_tune_settings {
61 62 63
	int min_delay_ms;
	int step_size;
	int max_drift;
L
Linus Torvalds 已提交
64 65 66 67
};

struct dvb_frontend;

68 69 70 71 72 73 74 75 76 77 78 79
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;
};

80 81 82 83 84 85 86
struct analog_parameters {
	unsigned int frequency;
	unsigned int mode;
	unsigned int audmode;
	u64 std;
};

M
Manu Abraham 已提交
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
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)
};

133 134 135 136 137 138 139 140 141 142
/**
 * enum dvbfe_algo - defines the algorithm used to tune into a channel
 *
 * @DVBFE_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.
 *
 * @DVBFE_ALGO_SW: (Software Algorithm)
M
Manu Abraham 已提交
143 144
 * These are dumb devices, that require software to do everything
 *
145 146 147 148 149 150 151 152 153 154
 * @DVBFE_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.
 *
 * @DVBFE_ALGO_RECOVERY: (Recovery Algorithm)
 *	These devices have AUTO recovery capabilities from LOCK failure
M
Manu Abraham 已提交
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
 */
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;
};

172 173
/**
 * enum dvbfe_search - search callback possible return status
M
Manu Abraham 已提交
174
 *
175 176
 * @DVBFE_ALGO_SEARCH_SUCCESS:
 *	The frontend search algorithm completed and returned successfully
M
Manu Abraham 已提交
177
 *
178 179
 * @DVBFE_ALGO_SEARCH_ASLEEP:
 *	The frontend search algorithm is sleeping
M
Manu Abraham 已提交
180
 *
181 182
 * @DVBFE_ALGO_SEARCH_FAILED:
 *	The frontend search for a signal failed
M
Manu Abraham 已提交
183
 *
184 185 186
 * @DVBFE_ALGO_SEARCH_INVALID:
 *	The frontend search algorith was probably supplied with invalid
 *	parameters and the search is an invalid one
M
Manu Abraham 已提交
187
 *
188 189
 * @DVBFE_ALGO_SEARCH_ERROR:
 *	The frontend search algorithm failed due to some error
M
Manu Abraham 已提交
190
 *
191 192
 * @DVBFE_ALGO_SEARCH_AGAIN:
 *	The frontend search algorithm was requested to search again
M
Manu Abraham 已提交
193 194 195 196 197 198 199 200 201 202 203
 */
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),
};


204
struct dvb_tuner_ops {
205

206 207 208 209 210
	struct dvb_tuner_info info;

	int (*release)(struct dvb_frontend *fe);
	int (*init)(struct dvb_frontend *fe);
	int (*sleep)(struct dvb_frontend *fe);
211 212
	int (*suspend)(struct dvb_frontend *fe);
	int (*resume)(struct dvb_frontend *fe);
213

214
	/** This is for simple PLLs - set all parameters in one go. */
215
	int (*set_params)(struct dvb_frontend *fe);
216
	int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p);
217

218
	/** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */
219
	int (*calc_regs)(struct dvb_frontend *fe, u8 *buf, int buf_len);
220

221 222 223
	/** This is to allow setting tuner-specific configs */
	int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);

224
	int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
225
	int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
226
	int (*get_if_frequency)(struct dvb_frontend *fe, u32 *frequency);
227 228

#define TUNER_STATUS_LOCKED 1
229
#define TUNER_STATUS_STEREO 2
230
	int (*get_status)(struct dvb_frontend *fe, u32 *status);
231
	int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
232
	int (*get_afc)(struct dvb_frontend *fe, s32 *afc);
233

D
Daniel Mack 已提交
234 235
	/** These are provided separately from set_params in order to facilitate silicon
	 * tuners which require sophisticated tuning loops, controlling each parameter separately. */
236 237
	int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
	int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
M
Manu Abraham 已提交
238 239

	/*
D
Daniel Mack 已提交
240 241
	 * 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 已提交
242 243 244
	 */
	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);
245 246
};

247 248 249 250
struct analog_demod_info {
	char *name;
};

251
struct analog_demod_ops {
252 253 254 255 256

	struct analog_demod_info info;

	void (*set_params)(struct dvb_frontend *fe,
			   struct analog_parameters *params);
257
	int  (*has_signal)(struct dvb_frontend *fe, u16 *signal);
258
	int  (*get_afc)(struct dvb_frontend *fe, s32 *afc);
259 260 261 262 263 264 265 266 267
	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);
};

268 269
struct dtv_frontend_properties;

L
Linus Torvalds 已提交
270 271 272 273
struct dvb_frontend_ops {

	struct dvb_frontend_info info;

274 275
	u8 delsys[MAX_DELSYS];

L
Linus Torvalds 已提交
276
	void (*release)(struct dvb_frontend* fe);
277
	void (*release_sec)(struct dvb_frontend* fe);
L
Linus Torvalds 已提交
278 279 280 281

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

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

284 285
	/* if this is set, it overrides the default swzigzag */
	int (*tune)(struct dvb_frontend* fe,
286
		    bool re_tune,
287
		    unsigned int mode_flags,
288
		    unsigned int *delay,
289
		    enum fe_status *status);
290
	/* get frontend tuning algorithm from the module */
M
Manu Abraham 已提交
291
	enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
292 293

	/* these two are only used for the swzigzag code */
294
	int (*set_frontend)(struct dvb_frontend *fe);
L
Linus Torvalds 已提交
295 296
	int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);

297
	int (*get_frontend)(struct dvb_frontend *fe);
298

299
	int (*read_status)(struct dvb_frontend *fe, enum fe_status *status);
L
Linus Torvalds 已提交
300 301 302 303 304 305 306 307
	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);
308 309 310 311 312
	int (*diseqc_send_burst)(struct dvb_frontend *fe,
				 enum fe_sec_mini_cmd minicmd);
	int (*set_tone)(struct dvb_frontend *fe, enum fe_sec_tone_mode tone);
	int (*set_voltage)(struct dvb_frontend *fe,
			   enum fe_sec_voltage voltage);
313 314
	int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
	int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
315
	int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
316
	int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
317
	int (*set_lna)(struct dvb_frontend *);
318

M
Manu Abraham 已提交
319 320 321
	/* These callbacks are for devices that implement their own
	 * tuning algorithms, rather than a simple swzigzag
	 */
322
	enum dvbfe_search (*search)(struct dvb_frontend *fe);
M
Manu Abraham 已提交
323

324
	struct dvb_tuner_ops tuner_ops;
325
	struct analog_demod_ops analog_ops;
326

327 328
	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 已提交
329 330
};

331
#ifdef __DVB_CORE__
L
Linus Torvalds 已提交
332 333 334 335 336 337 338 339
#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;
340
	struct mutex		  mtx;
L
Linus Torvalds 已提交
341
};
342
#endif
L
Linus Torvalds 已提交
343

344
struct dtv_frontend_properties {
345 346 347 348 349

	/* Cache State */
	u32			state;

	u32			frequency;
350
	enum fe_modulation		modulation;
351

352 353 354 355 356
	enum fe_sec_voltage	voltage;
	enum fe_sec_tone_mode	sectone;
	enum fe_spectral_inversion	inversion;
	enum fe_code_rate		fec_inner;
	enum fe_transmit_mode	transmission_mode;
357
	u32			bandwidth_hz;	/* 0 = AUTO */
358 359
	enum fe_guard_interval	guard_interval;
	enum fe_hierarchy		hierarchy;
360
	u32			symbol_rate;
361 362
	enum fe_code_rate		code_rate_HP;
	enum fe_code_rate		code_rate_LP;
363

364 365
	enum fe_pilot		pilot;
	enum fe_rolloff		rolloff;
366

367
	enum fe_delivery_system	delivery_system;
368

369 370
	enum fe_interleaving	interleaving;

371 372 373 374 375 376 377 378 379
	/* 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;
380 381
	    enum fe_code_rate	fec;
	    enum fe_modulation	modulation;
382 383
	    u8			interleaving;
	} layer[3];
384

385 386
	/* Multistream specifics */
	u32			stream_id;
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404

	/* 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;
405 406

	u32			lna;
407 408 409 410 411 412 413 414 415 416

	/* 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;
417 418
};

419 420 421
#define DVB_FE_NO_EXIT  0
#define DVB_FE_NORMAL_EXIT      1
#define DVB_FE_DEVICE_REMOVED   2
422
#define DVB_FE_DEVICE_RESUME    3
423

L
Linus Torvalds 已提交
424
struct dvb_frontend {
425
	struct dvb_frontend_ops ops;
L
Linus Torvalds 已提交
426
	struct dvb_adapter *dvb;
427 428 429 430 431
	void *demodulator_priv;
	void *tuner_priv;
	void *frontend_priv;
	void *sec_priv;
	void *analog_demod_priv;
432
	struct dtv_frontend_properties dtv_property_cache;
433
#define DVB_FRONTEND_COMPONENT_TUNER 0
434
#define DVB_FRONTEND_COMPONENT_DEMOD 1
435
	int (*callback)(void *adapter_priv, int component, int cmd, int arg);
436
	int id;
437
	unsigned int exit;
L
Linus Torvalds 已提交
438 439
};

440 441
extern int dvb_register_frontend(struct dvb_adapter *dvb,
				 struct dvb_frontend *fe);
L
Linus Torvalds 已提交
442

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

445
extern void dvb_frontend_detach(struct dvb_frontend *fe);
446

447
extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
448 449
extern int dvb_frontend_suspend(struct dvb_frontend *fe);
extern int dvb_frontend_resume(struct dvb_frontend *fe);
450

451
extern void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec);
452

L
Linus Torvalds 已提交
453
#endif