1 | /* $NetBSD: dtvio_frontend.h,v 1.2 2011/07/13 23:16:55 jmcneill Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2011 Jared D. McNeill <jmcneill@invisible.ca> |
5 | * All rights reserved. |
6 | * |
7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions |
9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * 3. All advertising materials mentioning features or use of this software |
16 | * must display the following acknowledgement: |
17 | * This product includes software developed by Jared D. McNeill. |
18 | * 4. Neither the name of The NetBSD Foundation nor the names of its |
19 | * contributors may be used to endorse or promote products derived |
20 | * from this software without specific prior written permission. |
21 | * |
22 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
23 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
24 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
25 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
26 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
29 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
30 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
31 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | * POSSIBILITY OF SUCH DAMAGE. |
33 | */ |
34 | |
35 | #ifndef _DEV_DTV_DTVIO_FRONTEND_H |
36 | #define _DEV_DTV_DTVIO_FRONTEND_H |
37 | |
38 | #include <sys/ioccom.h> |
39 | |
40 | /* |
41 | * DVB Frontend API |
42 | */ |
43 | |
44 | /* Frontend types */ |
45 | typedef enum fe_type { |
46 | FE_QPSK, /* DVB-S */ |
47 | FE_QAM, /* DVB-C annex A/C */ |
48 | FE_OFDM, /* DVB-T */ |
49 | FE_ATSC, /* ATSC or DVB-C annex B */ |
50 | } fe_type_t; |
51 | |
52 | /* Frontend capabilities */ |
53 | typedef enum fe_caps { |
54 | FE_IS_STUPID = 0, |
55 | FE_CAN_INVERSION_AUTO = 0x1, |
56 | FE_CAN_FEC_1_2 = 0x2, |
57 | FE_CAN_FEC_2_3 = 0x4, |
58 | FE_CAN_FEC_3_4 = 0x8, |
59 | FE_CAN_FEC_4_5 = 0x10, |
60 | FE_CAN_FEC_5_6 = 0x20, |
61 | FE_CAN_FEC_6_7 = 0x40, |
62 | FE_CAN_FEC_7_8 = 0x80, |
63 | FE_CAN_FEC_8_9 = 0x100, |
64 | FE_CAN_FEC_AUTO = 0x200, |
65 | FE_CAN_QPSK = 0x400, |
66 | FE_CAN_QAM_16 = 0x800, |
67 | FE_CAN_QAM_32 = 0x1000, |
68 | FE_CAN_QAM_64 = 0x2000, |
69 | FE_CAN_QAM_128 = 0x4000, |
70 | FE_CAN_QAM_256 = 0x8000, |
71 | FE_CAN_QAM_AUTO = 0x10000, |
72 | FE_CAN_TRANSMISSION_MODE_AUTO = 0x20000, |
73 | FE_CAN_BANDWIDTH_AUTO = 0x40000, |
74 | FE_CAN_GUARD_INTERVAL_AUTO = 0x80000, |
75 | FE_CAN_HIERARCHY_AUTO = 0x100000, |
76 | FE_CAN_8VSB = 0x200000, |
77 | FE_CAN_16VSB = 0x400000, |
78 | FE_HAS_EXTENDED_CAPS = 0x800000, |
79 | FE_CAN_TURBO_FEC = 0x8000000, |
80 | FE_CAN_2G_MODULATION = 0x10000000, |
81 | FE_NEEDS_BENDING = 0x20000000, |
82 | FE_CAN_RECOVER = 0x40000000, |
83 | FE_CAN_MUTE_TS = 0x80000000, |
84 | } fe_caps_t; |
85 | |
86 | /* Frontend information */ |
87 | struct dvb_frontend_info { |
88 | char name[128]; |
89 | fe_type_t type; |
90 | uint32_t frequency_min; |
91 | uint32_t frequency_max; |
92 | uint32_t frequency_stepsize; |
93 | uint32_t frequency_tolerance; |
94 | uint32_t symbol_rate_min; |
95 | uint32_t symbol_rate_max; |
96 | uint32_t symbol_rate_tolerance; /* ppm */ |
97 | uint32_t notifier_delay; /* ms */ |
98 | fe_caps_t caps; |
99 | }; |
100 | |
101 | /* Frontend status */ |
102 | typedef enum fe_status { |
103 | FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ |
104 | FE_HAS_CARRIER = 0x02, /* found a DVB signal */ |
105 | FE_HAS_VITERBI = 0x04, /* FEC is stable */ |
106 | FE_HAS_SYNC = 0x08, /* found sync bytes */ |
107 | FE_HAS_LOCK = 0x10, /* everything's working... */ |
108 | FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ |
109 | FE_REINIT = 0x40, /* frontend was reinitialized */ |
110 | } fe_status_t; |
111 | |
112 | /* Frontend spectral inversion */ |
113 | typedef enum fe_spectral_inversion { |
114 | INVERSION_OFF, |
115 | INVERSION_ON, |
116 | INVERSION_AUTO, |
117 | } fe_spectral_inversion_t; |
118 | |
119 | /* Frontend code rate */ |
120 | typedef enum fe_code_rate { |
121 | FEC_NONE = 0, |
122 | FEC_1_2, |
123 | FEC_2_3, |
124 | FEC_3_4, |
125 | FEC_4_5, |
126 | FEC_5_6, |
127 | FEC_6_7, |
128 | FEC_7_8, |
129 | FEC_8_9, |
130 | FEC_AUTO, |
131 | FEC_3_5, |
132 | FEC_9_10, |
133 | } fe_code_rate_t; |
134 | |
135 | /* Frontend modulation type for QAM, OFDM, and VSB */ |
136 | typedef enum fe_modulation { |
137 | QPSK, |
138 | QAM_16, |
139 | QAM_32, |
140 | QAM_64, |
141 | QAM_128, |
142 | QAM_256, |
143 | QAM_AUTO, |
144 | VSB_8, |
145 | VSB_16, |
146 | PSK_8, |
147 | APSK_16, |
148 | APSK_32, |
149 | DQPSK, |
150 | } fe_modulation_t; |
151 | |
152 | /* Number of carriers per channel */ |
153 | typedef enum fe_transmit_mode { |
154 | TRANSMISSION_MODE_2K, |
155 | TRANSMISSION_MODE_8K, |
156 | TRANSMISSION_MODE_AUTO, |
157 | TRANSMISSION_MODE_4K, |
158 | TRANSMISSION_MODE_1K, |
159 | TRANSMISSION_MODE_16K, |
160 | TRANSMISSION_MODE_32K, |
161 | } fe_transmit_mode_t; |
162 | |
163 | /* Frontend bandwidth */ |
164 | typedef enum fe_bandwidth { |
165 | BANDWIDTH_8_MHZ, |
166 | BANDWIDTH_7_MHZ, |
167 | BANDWIDTH_6_MHZ, |
168 | BANDWIDTH_AUTO, |
169 | BANDWIDTH_5_MHZ, |
170 | BANDWIDTH_10_MHZ, |
171 | BANDWIDTH_1_172_MHZ, |
172 | } fe_bandwidth_t; |
173 | |
174 | /* Frontend guard interval */ |
175 | typedef enum fe_guard_interval { |
176 | GUARD_INTERVAL_1_32, |
177 | GUARD_INTERVAL_1_16, |
178 | GUARD_INTERVAL_1_8, |
179 | GUARD_INTERVAL_1_4, |
180 | GUARD_INTERVAL_AUTO, |
181 | GUARD_INTERVAL_1_128, |
182 | GUARD_INTERVAL_19_128, |
183 | GUARD_INTERVAL_19_256, |
184 | } fe_guard_interval_t; |
185 | |
186 | /* Frontend hierarchy */ |
187 | typedef enum fe_hierarchy { |
188 | HIERARCHY_NONE, |
189 | HIERARCHY_1, |
190 | HIERARCHY_2, |
191 | HIERARCHY_4, |
192 | HIERARCHY_AUTO |
193 | } fe_hierarchy_t; |
194 | |
195 | /* QPSK parameters */ |
196 | struct dvb_qpsk_parameters { |
197 | uint32_t symbol_rate; |
198 | fe_code_rate_t fec_inner; |
199 | }; |
200 | |
201 | /* QAM parameters */ |
202 | struct dvb_qam_parameters { |
203 | uint32_t symbol_rate; |
204 | fe_code_rate_t fec_inner; |
205 | fe_modulation_t modulation; |
206 | }; |
207 | |
208 | /* VSB parameters */ |
209 | struct dvb_vsb_parameters { |
210 | fe_modulation_t modulation; |
211 | }; |
212 | |
213 | /* OFDM parameters */ |
214 | struct dvb_ofdm_parameters { |
215 | fe_bandwidth_t bandwidth; |
216 | fe_code_rate_t code_rate_HP; |
217 | fe_code_rate_t code_rate_LP; |
218 | fe_modulation_t constellation; |
219 | fe_transmit_mode_t transmission_mode; |
220 | fe_guard_interval_t guard_interval; |
221 | fe_hierarchy_t hierarchy_information; |
222 | }; |
223 | |
224 | /* Frontend parameters */ |
225 | struct dvb_frontend_parameters { |
226 | uint32_t frequency; |
227 | fe_spectral_inversion_t inversion; |
228 | union { |
229 | struct dvb_qpsk_parameters qpsk; |
230 | struct dvb_qam_parameters qam; |
231 | struct dvb_ofdm_parameters ofdm; |
232 | struct dvb_vsb_parameters vsb; |
233 | } u; |
234 | }; |
235 | |
236 | /* Frontend events */ |
237 | struct dvb_frontend_event { |
238 | fe_status_t status; |
239 | struct dvb_frontend_parameters parameters; |
240 | }; |
241 | |
242 | /* DiSEqC master command */ |
243 | struct dvb_diseqc_master_cmd { |
244 | uint8_t msg[6]; |
245 | uint8_t msg_len; |
246 | }; |
247 | |
248 | /* DiSEqC slave reply */ |
249 | struct dvb_diseqc_slave_reply { |
250 | uint8_t msg[4]; |
251 | uint8_t msg_len; |
252 | int timeout; |
253 | }; |
254 | |
255 | /* SEC voltage */ |
256 | typedef enum fe_sec_voltage { |
257 | SEC_VOLTAGE_13, |
258 | SEC_VOLTAGE_18, |
259 | SEC_VOLTAGE_OFF, |
260 | } fe_sec_voltage_t; |
261 | |
262 | /* SEC continuous tone */ |
263 | typedef enum fe_sec_tone_mode { |
264 | SEC_TONE_ON, |
265 | SEC_TONE_OFF, |
266 | } fe_sec_tone_mode_t; |
267 | |
268 | /* SEC tone burst */ |
269 | typedef enum fe_sec_mini_cmd { |
270 | SEC_MINI_A, |
271 | SEC_MINI_B, |
272 | } fe_sec_mini_cmd_t; |
273 | |
274 | #define FE_READ_STATUS _IOR('D', 0, fe_status_t) |
275 | #define FE_READ_BER _IOR('D', 1, uint32_t) |
276 | #define FE_READ_SNR _IOR('D', 2, uint16_t) |
277 | #define FE_READ_SIGNAL_STRENGTH _IOR('D', 3, uint16_t) |
278 | #define FE_READ_UNCORRECTED_BLOCKS _IOR('D', 4, uint32_t) |
279 | #define FE_SET_FRONTEND _IOWR('D', 5, struct dvb_frontend_parameters) |
280 | #define FE_GET_FRONTEND _IOR('D', 6, struct dvb_frontend_parameters) |
281 | #define FE_GET_EVENT _IOR('D', 7, struct dvb_frontend_event) |
282 | #define FE_GET_INFO _IOR('D', 8, struct dvb_frontend_info) |
283 | #define FE_DISEQC_RESET_OVERLOAD _IO('D', 9) |
284 | #define FE_DISEQC_SEND_MASTER_CMD _IOW('D', 10, struct dvb_diseqc_master_cmd) |
285 | #define FE_DISEQC_RECV_SLAVE_REPLY _IOR('D', 11, struct dvb_diseqc_slave_reply) |
286 | #define FE_DISEQC_SEND_BURST _IOW('D', 12, fe_sec_mini_cmd_t) |
287 | #define FE_SET_TONE _IOW('D', 13, fe_sec_tone_mode_t) |
288 | #define FE_SET_VOLTAGE _IOW('D', 14, fe_sec_voltage_t) |
289 | #define FE_ENABLE_HIGH_LNB_VOLTAGE _IOW('D', 15, int) |
290 | #define FE_SET_FRONTEND_TUNE_MODE _IOW('D', 16, unsigned int) |
291 | #define FE_DISHNETWORK_SEND_LEGACY_CMD _IOW('D', 17, unsigned long) |
292 | |
293 | #endif /* !_DEV_DTV_DTVIO_FRONTEND_H */ |
294 | |