root/headers/private/drivers/dvb.h
/*
 * Copyright (c) 2005 Marcus Overhagen <marcus@overhagen.de>
 *
 * 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 <Drivers.h>

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