1 /*
2  * frontend.h
3  *
4  * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de>
5  *		    Ralph  Metzler <ralph@convergence.de>
6  *		    Holger Waechtler <holger@convergence.de>
7  *		    Andre Draszik <ad@convergence.de>
8  *		    for convergence integrated media GmbH
9  *
10  * Copyright (C) Manu Abraham <abraham.manu@gmail.com>
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public License
14  * as published by the Free Software Foundation; either version 2.1
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
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 _DVBFRONTEND_H_
29 #define _DVBFRONTEND_H_
30 
31 #ifdef __FreeBSD__
32 #define __u8 uint8_t
33 #define __u16 uint16_t
34 #define __u32 uint32_t
35 #define __u64 uint64_t
36 #define __s16 int16_t
37 #define __s32 int32_t
38 #endif
39 
40 typedef enum fe_type {
41 	FE_QPSK,
42 	FE_QAM,
43 	FE_OFDM,
44 	FE_ATSC
45 } fe_type_t;
46 
47 
48 typedef enum fe_caps {
49 	FE_IS_STUPID			= 0,
50 	FE_CAN_INVERSION_AUTO		= 0x1,
51 	FE_CAN_FEC_1_2			= 0x2,
52 	FE_CAN_FEC_2_3			= 0x4,
53 	FE_CAN_FEC_3_4			= 0x8,
54 	FE_CAN_FEC_4_5			= 0x10,
55 	FE_CAN_FEC_5_6			= 0x20,
56 	FE_CAN_FEC_6_7			= 0x40,
57 	FE_CAN_FEC_7_8			= 0x80,
58 	FE_CAN_FEC_8_9			= 0x100,
59 	FE_CAN_FEC_AUTO			= 0x200,
60 	FE_CAN_QPSK			= 0x400,
61 	FE_CAN_QAM_16			= 0x800,
62 	FE_CAN_QAM_32			= 0x1000,
63 	FE_CAN_QAM_64			= 0x2000,
64 	FE_CAN_QAM_128			= 0x4000,
65 	FE_CAN_QAM_256			= 0x8000,
66 	FE_CAN_QAM_AUTO			= 0x10000,
67 	FE_CAN_TRANSMISSION_MODE_AUTO	= 0x20000,
68 	FE_CAN_BANDWIDTH_AUTO		= 0x40000,
69 	FE_CAN_GUARD_INTERVAL_AUTO	= 0x80000,
70 	FE_CAN_HIERARCHY_AUTO		= 0x100000,
71 	FE_CAN_8VSB			= 0x200000,
72 	FE_CAN_16VSB			= 0x400000,
73 	FE_NEEDS_BENDING		= 0x20000000, // not supported anymore, don't use (frontend requires frequency bending)
74 	FE_CAN_RECOVER			= 0x40000000, // frontend can recover from a cable unplug automatically
75 	FE_CAN_MUTE_TS			= 0x80000000  // frontend can stop spurious TS data output
76 } fe_caps_t;
77 
78 
79 struct dvb_frontend_info {
80 	char       name[128];
81 	fe_type_t  type;
82 	__u32      frequency_min;
83 	__u32      frequency_max;
84 	__u32      frequency_stepsize;
85 	__u32      frequency_tolerance;
86 	__u32      symbol_rate_min;
87 	__u32      symbol_rate_max;
88 	__u32      symbol_rate_tolerance;	/* ppm */
89 	__u32      notifier_delay;		/* DEPRECATED */
90 	fe_caps_t  caps;
91 };
92 
93 
94 /**
95  *  Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for
96  *  the meaning of this struct...
97  */
98 struct dvb_diseqc_master_cmd {
99 	__u8 msg [6];	/*  { framing, address, command, data [3] } */
100 	__u8 msg_len;	/*  valid values are 3...6  */
101 };
102 
103 
104 struct dvb_diseqc_slave_reply {
105 	__u8 msg [4];	/*  { framing, data [3] } */
106 	__u8 msg_len;	/*  valid values are 0...4, 0 means no msg  */
107 	int  timeout;	/*  return from ioctl after timeout ms with */
108 };			/*  errorcode when no message was received  */
109 
110 
111 typedef enum fe_sec_voltage {
112 	SEC_VOLTAGE_13,
113 	SEC_VOLTAGE_18,
114 	SEC_VOLTAGE_OFF
115 } fe_sec_voltage_t;
116 
117 
118 typedef enum fe_sec_tone_mode {
119 	SEC_TONE_ON,
120 	SEC_TONE_OFF
121 } fe_sec_tone_mode_t;
122 
123 
124 typedef enum fe_sec_mini_cmd {
125 	SEC_MINI_A,
126 	SEC_MINI_B
127 } fe_sec_mini_cmd_t;
128 
129 
130 typedef enum fe_status {
131 	FE_HAS_SIGNAL	= 0x01,   /*  found something above the noise level */
132 	FE_HAS_CARRIER	= 0x02,   /*  found a DVB signal  */
133 	FE_HAS_VITERBI	= 0x04,   /*  FEC is stable  */
134 	FE_HAS_SYNC	= 0x08,   /*  found sync bytes  */
135 	FE_HAS_LOCK	= 0x10,   /*  everything's working... */
136 	FE_TIMEDOUT	= 0x20,   /*  no lock within the last ~2 seconds */
137 	FE_REINIT	= 0x40    /*  frontend was reinitialized,  */
138 } fe_status_t;			  /*  application is recommended to reset */
139 				  /*  DiSEqC, tone and parameters */
140 
141 typedef enum fe_spectral_inversion {
142 	INVERSION_OFF,
143 	INVERSION_ON,
144 	INVERSION_AUTO
145 } fe_spectral_inversion_t;
146 
147 
148 typedef enum fe_code_rate {
149 	FEC_NONE = 0,
150 	FEC_1_2,
151 	FEC_2_3,
152 	FEC_3_4,
153 	FEC_4_5,
154 	FEC_5_6,
155 	FEC_6_7,
156 	FEC_7_8,
157 	FEC_8_9,
158 	FEC_AUTO
159 } fe_code_rate_t;
160 
161 
162 typedef enum fe_modulation {
163 	QPSK,
164 	QAM_16,
165 	QAM_32,
166 	QAM_64,
167 	QAM_128,
168 	QAM_256,
169 	QAM_AUTO,
170 	VSB_8,
171 	VSB_16
172 } fe_modulation_t;
173 
174 typedef enum fe_transmit_mode {
175 	TRANSMISSION_MODE_2K,
176 	TRANSMISSION_MODE_8K,
177 	TRANSMISSION_MODE_AUTO
178 } fe_transmit_mode_t;
179 
180 typedef enum fe_bandwidth {
181 	BANDWIDTH_8_MHZ,
182 	BANDWIDTH_7_MHZ,
183 	BANDWIDTH_6_MHZ,
184 	BANDWIDTH_AUTO
185 } fe_bandwidth_t;
186 
187 
188 typedef enum fe_guard_interval {
189 	GUARD_INTERVAL_1_32,
190 	GUARD_INTERVAL_1_16,
191 	GUARD_INTERVAL_1_8,
192 	GUARD_INTERVAL_1_4,
193 	GUARD_INTERVAL_AUTO
194 } fe_guard_interval_t;
195 
196 
197 typedef enum fe_hierarchy {
198 	HIERARCHY_NONE,
199 	HIERARCHY_1,
200 	HIERARCHY_2,
201 	HIERARCHY_4,
202 	HIERARCHY_AUTO
203 } fe_hierarchy_t;
204 
205 
206 struct dvb_qpsk_parameters {
207 	__u32		symbol_rate;  /* symbol rate in Symbols per second */
208 	fe_code_rate_t	fec_inner;    /* forward error correction (see above) */
209 };
210 
211 struct dvb_qam_parameters {
212 	__u32		symbol_rate; /* symbol rate in Symbols per second */
213 	fe_code_rate_t	fec_inner;   /* forward error correction (see above) */
214 	fe_modulation_t	modulation;  /* modulation type (see above) */
215 };
216 
217 struct dvb_vsb_parameters {
218 	fe_modulation_t	modulation;  /* modulation type (see above) */
219 };
220 
221 struct dvb_ofdm_parameters {
222 	fe_bandwidth_t      bandwidth;
223 	fe_code_rate_t      code_rate_HP;  /* high priority stream code rate */
224 	fe_code_rate_t      code_rate_LP;  /* low priority stream code rate */
225 	fe_modulation_t     constellation; /* modulation type (see above) */
226 	fe_transmit_mode_t  transmission_mode;
227 	fe_guard_interval_t guard_interval;
228 	fe_hierarchy_t      hierarchy_information;
229 };
230 
231 
232 struct dvb_frontend_parameters {
233 	__u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
234 			     /* intermediate frequency in kHz for QPSK */
235 	fe_spectral_inversion_t inversion;
236 	union {
237 		struct dvb_qpsk_parameters qpsk;
238 		struct dvb_qam_parameters  qam;
239 		struct dvb_ofdm_parameters ofdm;
240 		struct dvb_vsb_parameters vsb;
241 	} u;
242 };
243 
244 
245 /**
246  * When set, this flag will disable any zigzagging or other "normal" tuning
247  * behaviour. Additionally, there will be no automatic monitoring of the lock
248  * status, and hence no frontend events will be generated. If a frontend device
249  * is closed, this flag will be automatically turned off when the device is
250  * reopened read-write.
251  */
252 #define FE_TUNE_MODE_ONESHOT 0x01
253 
254 
255 #define FE_GET_INFO		   _IOR('o', 61, struct dvb_frontend_info)
256 
257 #define FE_DISEQC_RESET_OVERLOAD   _IO('o', 62)
258 #define FE_DISEQC_SEND_MASTER_CMD  _IOW('o', 63, struct dvb_diseqc_master_cmd)
259 #define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply)
260 #define FE_DISEQC_SEND_BURST       _IO('o', 65)  /* fe_sec_mini_cmd_t */
261 
262 #define FE_SET_TONE		   _IO('o', 66)  /* fe_sec_tone_mode_t */
263 #define FE_SET_VOLTAGE		   _IO('o', 67)  /* fe_sec_voltage_t */
264 #define FE_ENABLE_HIGH_LNB_VOLTAGE _IO('o', 68)  /* int */
265 
266 #define FE_READ_STATUS		   _IOR('o', 69, fe_status_t)
267 #define FE_READ_BER		   _IOR('o', 70, __u32)
268 #define FE_READ_SIGNAL_STRENGTH    _IOR('o', 71, __u16)
269 #define FE_READ_SNR		   _IOR('o', 72, __u16)
270 #define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32)
271 
272 #define FE_SET_FRONTEND		   _IOW('o', 76, struct dvb_frontend_parameters)
273 #define FE_GET_FRONTEND		   _IOR('o', 77, struct dvb_frontend_parameters)
274 #define FE_SET_FRONTEND_TUNE_MODE  _IO('o', 81) /* unsigned int */
275 
276 #define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */
277 
278 /*
279  * References:
280  * DVB-S : EN 300 421
281  * DVB-S2: EN 302 307, TR 102 376, EN 301 210
282  * DVB-C : EN 300 429
283  * DVB-T : EN 300 744
284  * DVB-H : EN 300 304
285  * ATSC  : A/53A
286  */
287 
288 /*
289  * Delivery Systems
290  * needs to set/queried for multistandard frontends
291  */
292 enum dvbfe_delsys {
293 	DVBFE_DELSYS_DVBS		= (1 <<  0),
294 	DVBFE_DELSYS_DSS		= (1 <<  1),
295 	DVBFE_DELSYS_DVBS2		= (1 <<  2),
296 	DVBFE_DELSYS_DVBC		= (1 <<  3),
297 	DVBFE_DELSYS_DVBT		= (1 <<  4),
298 	DVBFE_DELSYS_DVBH		= (1 <<  5),
299 	DVBFE_DELSYS_ATSC		= (1 <<  6),
300 	DVBFE_DELSYS_DUMMY		= (1 << 31)
301 };
302 #define DVBFE_GET_DELSYS		_IOR('o', 82, enum dvbfe_delsys)
303 #define DVBFE_SET_DELSYS		_IOW('o', 87, enum dvbfe_delsys)
304 
305 /* Modulation types			*/
306 enum dvbfe_modulation {
307 	DVBFE_MOD_NONE			= (0 <<  0),
308 	DVBFE_MOD_BPSK			= (1 <<  0),
309 	DVBFE_MOD_QPSK			= (1 <<  1),
310 	DVBFE_MOD_OQPSK			= (1 <<  2),
311 	DVBFE_MOD_8PSK			= (1 <<  3),
312 	DVBFE_MOD_16APSK		= (1 <<  4),
313 	DVBFE_MOD_32APSK		= (1 <<  5),
314 	DVBFE_MOD_QAM4			= (1 <<  6),
315 	DVBFE_MOD_QAM16			= (1 <<  7),
316 	DVBFE_MOD_QAM32			= (1 <<  8),
317 	DVBFE_MOD_QAM64			= (1 <<  9),
318 	DVBFE_MOD_QAM128		= (1 << 10),
319 	DVBFE_MOD_QAM256		= (1 << 11),
320 	DVBFE_MOD_QAM512		= (1 << 12),
321 	DVBFE_MOD_QAM1024		= (1 << 13),
322 	DVBFE_MOD_QAMAUTO		= (1 << 14),
323 	DVBFE_MOD_OFDM			= (1 << 15),
324 	DVBFE_MOD_COFDM			= (1 << 16),
325 	DVBFE_MOD_VSB8			= (1 << 17),
326 	DVBFE_MOD_VSB16			= (1 << 18),
327 	DVBFE_MOD_AUTO			= (1 << 31)
328 };
329 
330 /*
331  * Convolution Code Rate (Viterbi Inner Code Rate)
332  * DVB-S2 uses LDPC. Information on LDPC can be found at
333  * http://www.ldpc-codes.com
334  */
335 enum dvbfe_fec {
336 	DVBFE_FEC_NONE			= (0 <<  0),
337 	DVBFE_FEC_1_4			= (1 <<  0),
338 	DVBFE_FEC_1_3			= (1 <<  1),
339 	DVBFE_FEC_2_5			= (1 <<  2),
340 	DVBFE_FEC_1_2			= (1 <<  3),
341 	DVBFE_FEC_3_5			= (1 <<  4),
342 	DVBFE_FEC_2_3			= (1 <<  5),
343 	DVBFE_FEC_3_4			= (1 <<  6),
344 	DVBFE_FEC_4_5			= (1 <<  7),
345 	DVBFE_FEC_5_6			= (1 <<  8),
346 	DVBFE_FEC_6_7			= (1 <<  9),
347 	DVBFE_FEC_7_8			= (1 << 10),
348 	DVBFE_FEC_8_9			= (1 << 11),
349 	DVBFE_FEC_9_10			= (1 << 12),
350 	DVBFE_FEC_AUTO			= (1 << 31)
351 };
352 
353 /* Frontend Inversion (I/Q Swap)	*/
354 enum dvbfe_inversion {
355 	DVBFE_INVERSION_OFF		= 0,
356 	DVBFE_INVERSION_ON		= 1,
357 	DVBFE_INVERSION_AUTO		= 2
358 };
359 
360 /* DVB-S parameters			*/
361 struct dvbs_params {
362 	__u32				symbol_rate;
363 
364 	enum dvbfe_modulation		modulation;
365 	enum dvbfe_fec			fec;
366 };
367 
368 /* DSS parameters			*/
369 struct dss_params {
370 	__u32				symbol_rate;
371 
372 	enum dvbfe_modulation		modulation;
373 	enum dvbfe_fec			fec;
374 };
375 
376 /*
377  * Rolloff Rate (Nyquist Filter Rolloff)
378  * NOTE: DVB-S2 has rates of 0.20, 0.25, 0.35
379  * Values are x100
380  * Applies to DVB-S2
381  */
382 enum dvbfe_rolloff {
383 	DVBFE_ROLLOFF_35		= 0,
384 	DVBFE_ROLLOFF_25		= 1,
385 	DVBFE_ROLLOFF_20		= 2,
386 	DVBFE_ROLLOFF_UNKNOWN		= 3
387 };
388 
389 /* DVB-S2 parameters			*/
390 struct dvbs2_params {
391 	__u32				symbol_rate;
392 
393 	enum dvbfe_modulation		modulation;
394 	enum dvbfe_fec			fec;
395 
396 	/* Informational fields only	*/
397 	enum dvbfe_rolloff		rolloff;
398 
399 	__u8				matype_1;
400 	__u8				matype_2;
401 	__u8				upl_1;
402 	__u8				upl_2;
403 	__u8				dfl_1;
404 	__u8				dfl_2;
405 	__u8				sync;
406 	__u8				syncd_1;
407 	__u8				syncd_2;
408 
409 	__u8				pad[32];
410 };
411 
412 /* DVB-C parameters			*/
413 struct dvbc_params {
414 	__u32				symbol_rate;
415 	enum dvbfe_modulation		modulation;
416 	enum dvbfe_fec			fec;
417 };
418 
419 /* DVB-T Channel bandwidth		*/
420 enum dvbfe_bandwidth {
421 	DVBFE_BANDWIDTH_8_MHZ		= (1 <<  0),
422 	DVBFE_BANDWIDTH_7_MHZ		= (1 <<  1),
423 	DVBFE_BANDWIDTH_6_MHZ		= (1 <<  2),
424 	DVBFE_BANDWIDTH_5_MHZ		= (1 <<  3),
425 	DVBFE_BANDWIDTH_AUTO		= (1 << 31)
426 };
427 
428 /* DVB-T/DVB-H transmission mode	*/
429 enum dvbfe_transmission_mode {
430 	DVBFE_TRANSMISSION_MODE_2K	= (1 <<  0),
431 	DVBFE_TRANSMISSION_MODE_4K	= (1 <<  1),
432 	DVBFE_TRANSMISSION_MODE_8K	= (1 <<  2),
433 	DVBFE_TRANSMISSION_MODE_AUTO	= (1 << 31)
434 };
435 
436 /* DVB-T/DVB-H Guard interval		*/
437 enum dvbfe_guard_interval {
438 	DVBFE_GUARD_INTERVAL_1_32	= (1 <<  1),
439 	DVBFE_GUARD_INTERVAL_1_16	= (1 <<  2),
440 	DVBFE_GUARD_INTERVAL_1_8	= (1 <<  3),
441 	DVBFE_GUARD_INTERVAL_1_4	= (1 <<  4),
442 	DVBFE_GUARD_INTERVAL_AUTO	= (1 << 31)
443 };
444 
445 /* DVB-T/DVB-H Hierarchial modulation	*/
446 enum dvbfe_hierarchy {
447 	DVBFE_HIERARCHY_OFF		= (1 <<  0),
448 	DVBFE_HIERARCHY_ON		= (1 <<  1),
449 	DVBFE_HIERARCHY_AUTO		= (1 <<  2)
450 };
451 
452 /* DVB-T/DVB-H Rolloff's		*/
453 enum dvbfe_alpha {
454 	DVBFE_ALPHA_1			= (1 <<  0),
455 	DVBFE_ALPHA_2			= (1 <<  1),
456 	DVBFE_ALPHA_4			= (1 <<  2)
457 };
458 
459 /* Stream priority (Hierachial coding)	*/
460 enum dvbfe_stream_priority {
461 	DVBFE_STREAM_PRIORITY_HP	= (0 << 0),
462 	DVBFE_STREAM_PRIORITY_LP	= (1 << 0)
463 };
464 
465 /* DVB-T parameters			*/
466 struct dvbt_params {
467 	enum dvbfe_modulation		constellation;
468 	enum dvbfe_bandwidth		bandwidth;
469 	enum dvbfe_fec			code_rate_HP;
470 	enum dvbfe_fec			code_rate_LP;
471 	enum dvbfe_transmission_mode	transmission_mode;
472 	enum dvbfe_guard_interval	guard_interval;
473 	enum dvbfe_hierarchy		hierarchy;
474 	enum dvbfe_alpha		alpha;
475 	enum dvbfe_stream_priority	priority;
476 
477 	__u8				pad[32];
478 };
479 
480 /* DVB-H Interleaver type		*/
481 enum dvbfe_interleaver {
482 	DVBFE_INTERLEAVER_NATIVE	= (1 <<  0),
483 	DVBFE_INTERLEAVER_INDEPTH	= (1 <<  1),
484 	DVBFE_INTERLEAVER_AUTO		= (1 << 31)
485 };
486 
487 /* DVB-H MPE-FEC Indicator		*/
488 enum dvbfe_mpefec {
489 	DVBFE_MPEFEC_OFF		= (1 <<  0),
490 	DVBFE_MPEFEC_ON			= (1 <<  1)
491 };
492 
493 /* DVB-H Timeslicing Indicator		*/
494 enum dvbfe_timeslicing {
495 	DVBFE_TIMESLICING_OFF		= (1 <<  0),
496 	DVBFE_TIMESLICING_ON		= (1 <<  1)
497 };
498 
499 /* DVB-H parameters			*/
500 struct dvbh_params {
501 	enum dvbfe_modulation		constellation;
502 	enum dvbfe_fec			code_rate_HP;
503 	enum dvbfe_fec			code_rate_LP;
504 	enum dvbfe_transmission_mode	transmission_mode;
505 	enum dvbfe_guard_interval	guard_interval;
506 	enum dvbfe_hierarchy		hierarchy;
507 	enum dvbfe_alpha		alpha;
508 	enum dvbfe_interleaver		interleaver;
509 	enum dvbfe_mpefec		mpefec;
510 	enum dvbfe_timeslicing		timeslicing;
511 	enum dvbfe_stream_priority	priority;
512 
513 	__u32				bandwidth;
514 	__u8				pad[32];
515 };
516 
517 /* ATSC parameters			*/
518 struct atsc_params {
519 	enum dvbfe_modulation		modulation;
520 
521 	__u8				pad[32];
522 };
523 
524 /* DVB Frontend Tuning Parameters	*/
525 struct dvbfe_params {
526 	__u32				frequency;
527 	enum fe_spectral_inversion	inversion;
528 	enum dvbfe_delsys		delivery;
529 
530 	__u8				pad[32];
531 
532 	union {
533 		struct dvbs_params	dvbs;
534 		struct dss_params	dss;
535 		struct dvbs2_params	dvbs2;
536 		struct dvbc_params	dvbc;
537 		struct dvbt_params	dvbt;
538 		struct dvbh_params	dvbh;
539 		struct atsc_params	atsc;
540 
541 		__u8			pad[128];
542 	} delsys;
543 };
544 #define DVBFE_SET_PARAMS		_IOW('o', 83, struct dvbfe_params)
545 #define DVBFE_GET_PARAMS		_IOWR('o', 84, struct dvbfe_params)
546 
547 /* DVB-S capability bitfields		*/
548 struct dvbfe_dvbs_info {
549 	enum dvbfe_modulation		modulation;
550 	enum dvbfe_fec			fec;
551 };
552 
553 /* DSS capability bitfields		*/
554 struct dvbfe_dss_info {
555 	enum dvbfe_modulation		modulation;
556 	enum dvbfe_fec			fec;
557 };
558 
559 /* DVB-S2 capability bitfields		*/
560 struct dvbfe_dvbs2_info {
561 	enum dvbfe_modulation		modulation;
562 	enum dvbfe_fec			fec;
563 
564 	__u8				pad[32];
565 };
566 
567 /* DVB-C capability bitfields		*/
568 struct dvbfe_dvbc_info {
569 	enum dvbfe_modulation		modulation;
570 };
571 
572 /* DVB-T capability bitfields		*/
573 struct dvbfe_dvbt_info {
574 	enum dvbfe_modulation		modulation;
575 	enum dvbfe_stream_priority	stream_priority;
576 
577 	__u8				pad[32];
578 };
579 
580 /* DVB-H capability bitfields		*/
581 struct dvbfe_dvbh_info {
582 	enum dvbfe_modulation		modulation;
583 	enum dvbfe_stream_priority	stream_priority;
584 
585 	__u8				pad[32];
586 };
587 
588 /* ATSC capability bitfields		*/
589 struct dvbfe_atsc_info {
590 	enum dvbfe_modulation		modulation;
591 
592 	__u8				pad[32];
593 };
594 
595 /* DVB Frontend related Information	*/
596 struct dvbfe_info {
597 	char				name[128];
598 
599 	union {
600 		struct dvbfe_dvbs_info	dvbs;
601 		struct dvbfe_dss_info	dss;
602 		struct dvbfe_dvbs2_info	dvbs2;
603 		struct dvbfe_dvbc_info	dvbc;
604 		struct dvbfe_dvbt_info	dvbt;
605 		struct dvbfe_dvbh_info	dvbh;
606 		struct dvbfe_atsc_info	atsc;
607 
608 		__u8			pad[128];
609 	} delsys;
610 
611 	__u32				frequency_min;
612 	__u32				frequency_max;
613 	__u32				frequency_step;
614 	__u32				frequency_tolerance;
615 	__u32				symbol_rate_min;
616 	__u32				symbol_rate_max;
617 	__u32				symbol_rate_tolerance;
618 
619 	enum fe_spectral_inversion	inversion;
620 
621 	__u8				pad[128];
622 };
623 #define DVBFE_GET_INFO			_IOR('o', 85, struct dvbfe_info)
624 
625 enum dvbfe_status {
626 	DVBFE_HAS_SIGNAL		= (1 <<  0),	/*  something above noise floor	*/
627 	DVBFE_HAS_CARRIER		= (1 <<  1),	/*  Signal found		*/
628 	DVBFE_HAS_VITERBI		= (1 <<  2),	/*  FEC is stable		*/
629 	DVBFE_HAS_SYNC			= (1 <<  3),	/*  SYNC found			*/
630 	DVBFE_HAS_LOCK			= (1 <<  4),	/*  OK ..			*/
631 	DVBFE_TIMEDOUT			= (1 <<  5),	/*  no lock in last ~2 s	*/
632 	DVBFE_STATUS_DUMMY		= (1 << 31)
633 };
634 
635 /* DVB Frontend events			*/
636 struct dvbfe_events {
637 	enum dvbfe_status		status;
638 
639 	__u8				pad[32];
640 };
641 
642 struct dvb_frontend_event {
643 	fe_status_t status;
644 	struct dvb_frontend_parameters parameters;
645 };
646 #define FE_GET_EVENT		   _IOR('o', 78, struct dvb_frontend_event)
647 
648 struct dvbfe_event {
649 	struct dvbfe_events fe_events;
650 	struct dvbfe_params fe_params;
651 };
652 #define DVBFE_GET_EVENT			_IOR('o', 86, struct dvbfe_event)
653 
654 #endif /*_DVBFRONTEND_H_*/
655