/* * Copyright (c) 2005 Marcus Overhagen * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /* This is the driver ioctl interface used for DVB on BeOS * it is not final, and will be changed before a public release * is made of the DVB framework (media add-on and example player). * * The driver should publish in /dev/dvb/cardname/n (with n=1..). * It must implement the ioctl codes from dvb_ioctl_t. * The driver must have buffers readable by userspace, it * should directly use DMA buffers for that. * The DVB add-on expects DVB_CAPTURE to block until data is * available, or a timeout has expired. If the timeout expired, * it must return B_TIMED_OUT. This ensures that the driver * doesn't block when reception conditions are going bad, and * allows user space programs to recognize this. * If the ioctl succeeds, the driver must record the capture end time * and report the data pointer and size. The data must stay valid * for a few ms, to give the user space thread, running at realtime * priority, a chance to read it. The driver must do at least * double buffering to achieve this. * For DVB-T, two buffers of 61 kByte give about 16 ms validity period * for each buffer, thats enough. A 100 ms timout is used, to ensure * that DVB_CAPTURE doesn't block when no data is available. * * A normal ioctl sequence is: * - DVB_GET_INTERFACE_INFO * - DVB_SET_TUNING_PARAMETERS * - DVB_GET_STATUS * - DVB_START_CAPTURE * - DVB_CAPTURE (repeated) * - DVB_STOP_CAPTURE * * The following ioctls can be called at any time, * including when capture is active: * - DVB_GET_INTERFACE_INFO * - DVB_GET_FREQUENCY_INFO * - DVB_GET_TUNING_PARAMETERS * - DVB_GET_STATUS * - DVB_GET_SS * - DVB_GET_BER * - DVB_GET_SNR * - DVB_GET_UPC * * In future releases, other ioctls that are not yet defined may * be called. It's important that the driver does not crash, but * instead returnes an error code. * * Parameter reference for ioctl() functions: * * opcode | parameter | description * --------------------------+-------------------------+----------------------------------------- * DVB_GET_INTERFACE_INFO | dvb_interface_info_t | get interface capabilites (memset to 0 first) * DVB_GET_FREQUENCY_INFO | dvb_frequency_info_t | get interface capabilites (memset to 0 first) * DVB_SET_TUNING_PARAMETERS | dvb_tuning_parameters_t | perform tuning information * DVB_GET_TUNING_PARAMETERS | dvb_tuning_parameters_t | get active parameters (after autotuning) (memset to 0 first) * DVB_START_CAPTURE | (none) | start the capture * DVB_STOP_CAPTURE | (none) | stop the capture * DVB_GET_STATUS | dvb_status_t | get current status * DVB_GET_SS | uint32 | signal strength, range 0 to 1000 * DVB_GET_BER | uint32 | block error rate, range 0 to 1000 * DVB_GET_SNR | uint32 | signal noise ratio, range 0 to 1000 * DVB_GET_UPC | uint32 | XXX ???, range 0 to 1000 * DVB_CAPTURE | dvb_capture_t | get information about captured data * */ #ifndef __DVB_H #define __DVB_H #include typedef enum { DVB_TYPE_UNKNOWN = -1, DVB_TYPE_DVB_C = 0x10, DVB_TYPE_DVB_H = 0x20, DVB_TYPE_DVB_S = 0x30, DVB_TYPE_DVB_T = 0x40, } dvb_type_t; // channel bandwith typedef enum { DVB_BANDWIDTH_AUTO = 0, DVB_BANDWIDTH_5_MHZ = 5000, DVB_BANDWIDTH_6_MHZ = 6000, DVB_BANDWIDTH_7_MHZ = 7000, DVB_BANDWIDTH_8_MHZ = 8000, } dvb_bandwidth_t; // channel polarity typedef enum { DVB_POLARITY_UNKNOWN = -1, DVB_POLARITY_VERTICAL = 1, DVB_POLARITY_HORIZONTAL = 2, } dvb_polarity_t; // "modulation" or "constellation" typedef enum { DVB_MODULATION_AUTO, DVB_MODULATION_QPSK, DVB_MODULATION_16_QAM, DVB_MODULATION_32_QAM, DVB_MODULATION_64_QAM, DVB_MODULATION_128_QAM, DVB_MODULATION_256_QAM, } dvb_modulation_t; // dvb_cofdm_mode, dvb_transmission_mode typedef enum { DVB_TRANSMISSION_MODE_AUTO, DVB_TRANSMISSION_MODE_2K, DVB_TRANSMISSION_MODE_4K, DVB_TRANSMISSION_MODE_8K, } dvb_transmission_mode_t; // code rate, specified by inner FEC (forward error correction) scheme typedef enum { DVB_FEC_AUTO, DVB_FEC_NONE, DVB_FEC_1_2, DVB_FEC_2_3, DVB_FEC_3_4, DVB_FEC_4_5, DVB_FEC_5_6, DVB_FEC_6_7, DVB_FEC_7_8, DVB_FEC_8_9, } dvb_code_rate_t; // guard interval typedef enum { DVB_GUARD_INTERVAL_AUTO, DVB_GUARD_INTERVAL_1_4, DVB_GUARD_INTERVAL_1_8, DVB_GUARD_INTERVAL_1_16, DVB_GUARD_INTERVAL_1_32, } dvb_guard_interval_t; // alpha value for hierarchical transmission typedef enum { DVB_HIERARCHY_AUTO, DVB_HIERARCHY_NONE, DVB_HIERARCHY_1, DVB_HIERARCHY_2, DVB_HIERARCHY_4, } dvb_hierarchy_t; // spectral inversion typedef enum { DVB_INVERSION_AUTO, DVB_INVERSION_ON, DVB_INVERSION_OFF, } dvb_inversion_t; typedef enum { DVB_STATUS_SIGNAL = 0x0001, DVB_STATUS_CARRIER = 0x0002, DVB_STATUS_LOCK = 0x0004, DVB_STATUS_VITERBI = 0x0008, DVB_STATUS_SYNC = 0x0010, } dvb_status_t; typedef enum { DVB_GET_INTERFACE_INFO = (B_DEVICE_OP_CODES_END + 0x100), DVB_GET_FREQUENCY_INFO = (B_DEVICE_OP_CODES_END + 0x120), DVB_SET_TUNING_PARAMETERS, DVB_GET_TUNING_PARAMETERS, DVB_START_CAPTURE, DVB_STOP_CAPTURE, DVB_GET_STATUS, DVB_GET_SS, DVB_GET_BER, DVB_GET_SNR, DVB_GET_UPC, DVB_CAPTURE, } dvb_ioctl_t; typedef struct { uint32 version; // set this to 1 uint32 flags; // set this to 0 dvb_type_t type; uint32 _res1[16]; char name[100]; char info[500]; uint32 _res2[16]; } dvb_interface_info_t; typedef struct { uint32 _res1[16]; uint64 frequency_min; uint64 frequency_max; uint64 frequency_step; uint32 _res2[64]; } dvb_frequency_info_t; typedef struct { uint64 frequency; dvb_inversion_t inversion; dvb_bandwidth_t bandwidth; dvb_modulation_t modulation; dvb_hierarchy_t hierarchy; dvb_code_rate_t code_rate_hp; dvb_code_rate_t code_rate_lp; dvb_transmission_mode_t transmission_mode; dvb_guard_interval_t guard_interval; } dvb_t_tuning_parameters_t; typedef struct { uint64 frequency; dvb_inversion_t inversion; dvb_modulation_t modulation; uint32 symbolrate; dvb_polarity_t polarity; } dvb_s_tuning_parameters_t; typedef struct { union { dvb_t_tuning_parameters_t dvb_t; dvb_s_tuning_parameters_t dvb_s; uint32 _pad[32]; } u; } dvb_tuning_parameters_t; typedef struct { void * data; size_t size; bigtime_t end_time; uint32 _res[2]; } dvb_capture_t; #endif