dvb_frontend.h 7.6 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>
L
Linus Torvalds 已提交
39 40 41 42 43 44

#include <linux/dvb/frontend.h>

#include "dvbdev.h"

struct dvb_frontend_tune_settings {
45 46 47 48
	int min_delay_ms;
	int step_size;
	int max_drift;
	struct dvb_frontend_parameters parameters;
L
Linus Torvalds 已提交
49 50 51 52
};

struct dvb_frontend;

53 54 55 56 57 58 59 60 61 62 63 64
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;
};

65 66 67 68 69 70 71
struct analog_parameters {
	unsigned int frequency;
	unsigned int mode;
	unsigned int audmode;
	u64 std;
};

72
struct dvb_tuner_ops {
73

74 75 76 77 78 79
	struct dvb_tuner_info info;

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

80
	/** This is for simple PLLs - set all parameters in one go. */
81
	int (*set_params)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
82
	int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p);
83

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

87 88 89
	/** This is to allow setting tuner-specific configs */
	int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);

90
	int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
91 92 93
	int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);

#define TUNER_STATUS_LOCKED 1
94
#define TUNER_STATUS_STEREO 2
95
	int (*get_status)(struct dvb_frontend *fe, u32 *status);
96
	int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
97

98 99
	/** These are provided seperately from set_params in order to facilitate silicon
	 * tuners which require sophisticated tuning loops, controlling each parameter seperately. */
100 101 102 103
	int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
	int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
};

104 105 106 107
struct analog_demod_info {
	char *name;
};

108
struct analog_demod_ops {
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

	struct analog_demod_info info;

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

L
Linus Torvalds 已提交
126 127 128 129 130
struct dvb_frontend_ops {

	struct dvb_frontend_info info;

	void (*release)(struct dvb_frontend* fe);
131
	void (*release_sec)(struct dvb_frontend* fe);
L
Linus Torvalds 已提交
132 133 134 135

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

136 137
	int (*write)(struct dvb_frontend* fe, u8* buf, int len);

138 139 140 141
	/* if this is set, it overrides the default swzigzag */
	int (*tune)(struct dvb_frontend* fe,
		    struct dvb_frontend_parameters* params,
		    unsigned int mode_flags,
142
		    unsigned int *delay,
143
		    fe_status_t *status);
144 145
	/* get frontend tuning algorithm from the module */
	int (*get_frontend_algo)(struct dvb_frontend *fe);
146 147

	/* these two are only used for the swzigzag code */
L
Linus Torvalds 已提交
148 149 150
	int (*set_frontend)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
	int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);

151 152
	int (*get_frontend)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);

L
Linus Torvalds 已提交
153 154 155 156 157 158 159 160 161 162 163 164
	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);
165 166
	int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
	int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
167
	int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
168
	int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
169 170

	struct dvb_tuner_ops tuner_ops;
171
	struct analog_demod_ops analog_ops;
172 173 174 175

	int (*set_property)(struct dvb_frontend* fe, tv_property_t* tvp);
	int (*get_property)(struct dvb_frontend* fe, tv_property_t* tvp);
	int (*set_params)(struct dvb_frontend* fe);
L
Linus Torvalds 已提交
176 177 178 179 180 181 182 183 184 185
};

#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;
186
	struct mutex		  mtx;
L
Linus Torvalds 已提交
187 188
};

189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
struct tv_frontend_properties {

	/* 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;
	fe_bandwidth_t		bandwidth;
	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;

	/* ISDB-T specifics */
	u32			isdb_segment_num;
	u32			isdb_segment_width;
	fe_code_rate_t		isdb_layera_fec;
	fe_modulation_t		isdb_layera_modulation;
	u32			isdb_layera_segment_width;
	fe_code_rate_t		isdb_layerb_fec;
	fe_modulation_t		isdb_layerb_modulation;
	u32			isdb_layerb_segment_width;
	fe_code_rate_t		isdb_layerc_fec;
	fe_modulation_t		isdb_layerc_modulation;
	u32			isdb_layerc_segment_width;
};

L
Linus Torvalds 已提交
228
struct dvb_frontend {
229
	struct dvb_frontend_ops ops;
L
Linus Torvalds 已提交
230
	struct dvb_adapter *dvb;
231 232 233 234 235
	void *demodulator_priv;
	void *tuner_priv;
	void *frontend_priv;
	void *sec_priv;
	void *analog_demod_priv;
236
	struct tv_frontend_properties tv_property_cache;
L
Linus Torvalds 已提交
237 238
};

239 240
extern int dvb_register_frontend(struct dvb_adapter *dvb,
				 struct dvb_frontend *fe);
L
Linus Torvalds 已提交
241

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

244
extern void dvb_frontend_detach(struct dvb_frontend *fe);
245

246 247
extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);

248 249 250
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 已提交
251
#endif