dvb_frontend.h 12.3 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 204
	struct dvb_tuner_info info;

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

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 213 214
	/** This is to allow setting tuner-specific configs */
	int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);

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
	int (*get_afc)(struct dvb_frontend *fe, s32 *afc);
224

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

	/*
D
Daniel Mack 已提交
231 232
	 * 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 已提交
233 234 235
	 */
	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);
236 237
};

238 239 240 241
struct analog_demod_info {
	char *name;
};

242
struct analog_demod_ops {
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258

	struct analog_demod_info info;

	void (*set_params)(struct dvb_frontend *fe,
			   struct analog_parameters *params);
	int  (*has_signal)(struct dvb_frontend *fe);
	int  (*get_afc)(struct dvb_frontend *fe);
	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);
};

259 260
struct dtv_frontend_properties;

L
Linus Torvalds 已提交
261 262 263 264
struct dvb_frontend_ops {

	struct dvb_frontend_info info;

265 266
	u8 delsys[MAX_DELSYS];

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

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

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

275 276
	/* if this is set, it overrides the default swzigzag */
	int (*tune)(struct dvb_frontend* fe,
277
		    bool re_tune,
278
		    unsigned int mode_flags,
279
		    unsigned int *delay,
280
		    fe_status_t *status);
281
	/* get frontend tuning algorithm from the module */
M
Manu Abraham 已提交
282
	enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
283 284

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

288
	int (*get_frontend)(struct dvb_frontend *fe);
289

L
Linus Torvalds 已提交
290 291 292 293 294 295 296 297 298 299 300 301
	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);
302 303
	int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
	int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
304
	int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
305
	int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
306
	int (*set_lna)(struct dvb_frontend *, int);
307

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

313
	struct dvb_tuner_ops tuner_ops;
314
	struct analog_demod_ops analog_ops;
315

316 317
	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 已提交
318 319
};

320
#ifdef __DVB_CORE__
L
Linus Torvalds 已提交
321 322 323 324 325 326 327 328
#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;
329
	struct mutex		  mtx;
L
Linus Torvalds 已提交
330
};
331
#endif
L
Linus Torvalds 已提交
332

333
struct dtv_frontend_properties {
334 335 336 337 338 339 340 341 342 343 344 345

	/* 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;
346
	u32			bandwidth_hz;	/* 0 = AUTO */
347 348 349 350 351 352 353 354 355 356
	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;
357

358 359
	enum fe_interleaving	interleaving;

360 361 362 363 364 365 366 367 368 369 370 371 372
	/* 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];
373

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

	/* 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;
394 395
};

L
Linus Torvalds 已提交
396
struct dvb_frontend {
397
	struct dvb_frontend_ops ops;
L
Linus Torvalds 已提交
398
	struct dvb_adapter *dvb;
399 400 401 402 403
	void *demodulator_priv;
	void *tuner_priv;
	void *frontend_priv;
	void *sec_priv;
	void *analog_demod_priv;
404
	struct dtv_frontend_properties dtv_property_cache;
405
#define DVB_FRONTEND_COMPONENT_TUNER 0
406
#define DVB_FRONTEND_COMPONENT_DEMOD 1
407
	int (*callback)(void *adapter_priv, int component, int cmd, int arg);
408
	int id;
L
Linus Torvalds 已提交
409 410
};

411 412
extern int dvb_register_frontend(struct dvb_adapter *dvb,
				 struct dvb_frontend *fe);
L
Linus Torvalds 已提交
413

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

416
extern void dvb_frontend_detach(struct dvb_frontend *fe);
417

418
extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
419 420
extern int dvb_frontend_suspend(struct dvb_frontend *fe);
extern int dvb_frontend_resume(struct dvb_frontend *fe);
421

422 423 424
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 已提交
425
#endif