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 | ||