1 /* $NetBSD: dtvio_frontend.h,v 1.3 2017/10/28 06:27:32 riastradh 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/types.h> 39 #include <sys/ioccom.h> 40 41 /* 42 * DVB Frontend API 43 */ 44 45 /* Frontend types */ 46 typedef enum fe_type { 47 FE_QPSK, /* DVB-S */ 48 FE_QAM, /* DVB-C annex A/C */ 49 FE_OFDM, /* DVB-T */ 50 FE_ATSC, /* ATSC or DVB-C annex B */ 51 } fe_type_t; 52 53 /* Frontend capabilities */ 54 typedef enum fe_caps { 55 FE_IS_STUPID = 0, 56 FE_CAN_INVERSION_AUTO = 0x1, 57 FE_CAN_FEC_1_2 = 0x2, 58 FE_CAN_FEC_2_3 = 0x4, 59 FE_CAN_FEC_3_4 = 0x8, 60 FE_CAN_FEC_4_5 = 0x10, 61 FE_CAN_FEC_5_6 = 0x20, 62 FE_CAN_FEC_6_7 = 0x40, 63 FE_CAN_FEC_7_8 = 0x80, 64 FE_CAN_FEC_8_9 = 0x100, 65 FE_CAN_FEC_AUTO = 0x200, 66 FE_CAN_QPSK = 0x400, 67 FE_CAN_QAM_16 = 0x800, 68 FE_CAN_QAM_32 = 0x1000, 69 FE_CAN_QAM_64 = 0x2000, 70 FE_CAN_QAM_128 = 0x4000, 71 FE_CAN_QAM_256 = 0x8000, 72 FE_CAN_QAM_AUTO = 0x10000, 73 FE_CAN_TRANSMISSION_MODE_AUTO = 0x20000, 74 FE_CAN_BANDWIDTH_AUTO = 0x40000, 75 FE_CAN_GUARD_INTERVAL_AUTO = 0x80000, 76 FE_CAN_HIERARCHY_AUTO = 0x100000, 77 FE_CAN_8VSB = 0x200000, 78 FE_CAN_16VSB = 0x400000, 79 FE_HAS_EXTENDED_CAPS = 0x800000, 80 FE_CAN_TURBO_FEC = 0x8000000, 81 FE_CAN_2G_MODULATION = 0x10000000, 82 FE_NEEDS_BENDING = 0x20000000, 83 FE_CAN_RECOVER = 0x40000000, 84 FE_CAN_MUTE_TS = 0x80000000, 85 } fe_caps_t; 86 87 /* Frontend information */ 88 struct dvb_frontend_info { 89 char name[128]; 90 fe_type_t type; 91 uint32_t frequency_min; 92 uint32_t frequency_max; 93 uint32_t frequency_stepsize; 94 uint32_t frequency_tolerance; 95 uint32_t symbol_rate_min; 96 uint32_t symbol_rate_max; 97 uint32_t symbol_rate_tolerance; /* ppm */ 98 uint32_t notifier_delay; /* ms */ 99 fe_caps_t caps; 100 }; 101 102 /* Frontend status */ 103 typedef enum fe_status { 104 FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ 105 FE_HAS_CARRIER = 0x02, /* found a DVB signal */ 106 FE_HAS_VITERBI = 0x04, /* FEC is stable */ 107 FE_HAS_SYNC = 0x08, /* found sync bytes */ 108 FE_HAS_LOCK = 0x10, /* everything's working... */ 109 FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ 110 FE_REINIT = 0x40, /* frontend was reinitialized */ 111 } fe_status_t; 112 113 /* Frontend spectral inversion */ 114 typedef enum fe_spectral_inversion { 115 INVERSION_OFF, 116 INVERSION_ON, 117 INVERSION_AUTO, 118 } fe_spectral_inversion_t; 119 120 /* Frontend code rate */ 121 typedef enum fe_code_rate { 122 FEC_NONE = 0, 123 FEC_1_2, 124 FEC_2_3, 125 FEC_3_4, 126 FEC_4_5, 127 FEC_5_6, 128 FEC_6_7, 129 FEC_7_8, 130 FEC_8_9, 131 FEC_AUTO, 132 FEC_3_5, 133 FEC_9_10, 134 } fe_code_rate_t; 135 136 /* Frontend modulation type for QAM, OFDM, and VSB */ 137 typedef enum fe_modulation { 138 QPSK, 139 QAM_16, 140 QAM_32, 141 QAM_64, 142 QAM_128, 143 QAM_256, 144 QAM_AUTO, 145 VSB_8, 146 VSB_16, 147 PSK_8, 148 APSK_16, 149 APSK_32, 150 DQPSK, 151 } fe_modulation_t; 152 153 /* Number of carriers per channel */ 154 typedef enum fe_transmit_mode { 155 TRANSMISSION_MODE_2K, 156 TRANSMISSION_MODE_8K, 157 TRANSMISSION_MODE_AUTO, 158 TRANSMISSION_MODE_4K, 159 TRANSMISSION_MODE_1K, 160 TRANSMISSION_MODE_16K, 161 TRANSMISSION_MODE_32K, 162 } fe_transmit_mode_t; 163 164 /* Frontend bandwidth */ 165 typedef enum fe_bandwidth { 166 BANDWIDTH_8_MHZ, 167 BANDWIDTH_7_MHZ, 168 BANDWIDTH_6_MHZ, 169 BANDWIDTH_AUTO, 170 BANDWIDTH_5_MHZ, 171 BANDWIDTH_10_MHZ, 172 BANDWIDTH_1_172_MHZ, 173 } fe_bandwidth_t; 174 175 /* Frontend guard interval */ 176 typedef enum fe_guard_interval { 177 GUARD_INTERVAL_1_32, 178 GUARD_INTERVAL_1_16, 179 GUARD_INTERVAL_1_8, 180 GUARD_INTERVAL_1_4, 181 GUARD_INTERVAL_AUTO, 182 GUARD_INTERVAL_1_128, 183 GUARD_INTERVAL_19_128, 184 GUARD_INTERVAL_19_256, 185 } fe_guard_interval_t; 186 187 /* Frontend hierarchy */ 188 typedef enum fe_hierarchy { 189 HIERARCHY_NONE, 190 HIERARCHY_1, 191 HIERARCHY_2, 192 HIERARCHY_4, 193 HIERARCHY_AUTO 194 } fe_hierarchy_t; 195 196 /* QPSK parameters */ 197 struct dvb_qpsk_parameters { 198 uint32_t symbol_rate; 199 fe_code_rate_t fec_inner; 200 }; 201 202 /* QAM parameters */ 203 struct dvb_qam_parameters { 204 uint32_t symbol_rate; 205 fe_code_rate_t fec_inner; 206 fe_modulation_t modulation; 207 }; 208 209 /* VSB parameters */ 210 struct dvb_vsb_parameters { 211 fe_modulation_t modulation; 212 }; 213 214 /* OFDM parameters */ 215 struct dvb_ofdm_parameters { 216 fe_bandwidth_t bandwidth; 217 fe_code_rate_t code_rate_HP; 218 fe_code_rate_t code_rate_LP; 219 fe_modulation_t constellation; 220 fe_transmit_mode_t transmission_mode; 221 fe_guard_interval_t guard_interval; 222 fe_hierarchy_t hierarchy_information; 223 }; 224 225 /* Frontend parameters */ 226 struct dvb_frontend_parameters { 227 uint32_t frequency; 228 fe_spectral_inversion_t inversion; 229 union { 230 struct dvb_qpsk_parameters qpsk; 231 struct dvb_qam_parameters qam; 232 struct dvb_ofdm_parameters ofdm; 233 struct dvb_vsb_parameters vsb; 234 } u; 235 }; 236 237 /* Frontend events */ 238 struct dvb_frontend_event { 239 fe_status_t status; 240 struct dvb_frontend_parameters parameters; 241 }; 242 243 /* DiSEqC master command */ 244 struct dvb_diseqc_master_cmd { 245 uint8_t msg[6]; 246 uint8_t msg_len; 247 }; 248 249 /* DiSEqC slave reply */ 250 struct dvb_diseqc_slave_reply { 251 uint8_t msg[4]; 252 uint8_t msg_len; 253 int timeout; 254 }; 255 256 /* SEC voltage */ 257 typedef enum fe_sec_voltage { 258 SEC_VOLTAGE_13, 259 SEC_VOLTAGE_18, 260 SEC_VOLTAGE_OFF, 261 } fe_sec_voltage_t; 262 263 /* SEC continuous tone */ 264 typedef enum fe_sec_tone_mode { 265 SEC_TONE_ON, 266 SEC_TONE_OFF, 267 } fe_sec_tone_mode_t; 268 269 /* SEC tone burst */ 270 typedef enum fe_sec_mini_cmd { 271 SEC_MINI_A, 272 SEC_MINI_B, 273 } fe_sec_mini_cmd_t; 274 275 #define FE_READ_STATUS _IOR('D', 0, fe_status_t) 276 #define FE_READ_BER _IOR('D', 1, uint32_t) 277 #define FE_READ_SNR _IOR('D', 2, uint16_t) 278 #define FE_READ_SIGNAL_STRENGTH _IOR('D', 3, uint16_t) 279 #define FE_READ_UNCORRECTED_BLOCKS _IOR('D', 4, uint32_t) 280 #define FE_SET_FRONTEND _IOWR('D', 5, struct dvb_frontend_parameters) 281 #define FE_GET_FRONTEND _IOR('D', 6, struct dvb_frontend_parameters) 282 #define FE_GET_EVENT _IOR('D', 7, struct dvb_frontend_event) 283 #define FE_GET_INFO _IOR('D', 8, struct dvb_frontend_info) 284 #define FE_DISEQC_RESET_OVERLOAD _IO('D', 9) 285 #define FE_DISEQC_SEND_MASTER_CMD _IOW('D', 10, struct dvb_diseqc_master_cmd) 286 #define FE_DISEQC_RECV_SLAVE_REPLY _IOR('D', 11, struct dvb_diseqc_slave_reply) 287 #define FE_DISEQC_SEND_BURST _IOW('D', 12, fe_sec_mini_cmd_t) 288 #define FE_SET_TONE _IOW('D', 13, fe_sec_tone_mode_t) 289 #define FE_SET_VOLTAGE _IOW('D', 14, fe_sec_voltage_t) 290 #define FE_ENABLE_HIGH_LNB_VOLTAGE _IOW('D', 15, int) 291 #define FE_SET_FRONTEND_TUNE_MODE _IOW('D', 16, unsigned int) 292 #define FE_DISHNETWORK_SEND_LEGACY_CMD _IOW('D', 17, unsigned long) 293 294 #endif /* !_DEV_DTV_DTVIO_FRONTEND_H */ 295