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