2329 lines
77 KiB
C
2329 lines
77 KiB
C
/*
|
|
Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc.
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
* Redistributions of source code must retain the above copyright notice,
|
|
this list of conditions and the following disclaimer.
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
this list of conditions and the following disclaimer in the documentation
|
|
and/or other materials provided with the distribution.
|
|
* Neither the name of Trident Microsystems nor Hauppauge Computer Works
|
|
nor the names of its contributors may be used to endorse or promote
|
|
products derived from this software without specific prior written
|
|
permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __DRXDRIVER_H__
|
|
#define __DRXDRIVER_H__
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/i2c.h>
|
|
|
|
/*
|
|
* This structure contains the I2C address, the device ID and a user_data pointer.
|
|
* The user_data pointer can be used for application specific purposes.
|
|
*/
|
|
struct i2c_device_addr {
|
|
u16 i2c_addr; /* The I2C address of the device. */
|
|
u16 i2c_dev_id; /* The device identifier. */
|
|
void *user_data; /* User data pointer */
|
|
};
|
|
|
|
/**
|
|
* \def IS_I2C_10BIT( addr )
|
|
* \brief Determine if I2C address 'addr' is a 10 bits address or not.
|
|
* \param addr The I2C address.
|
|
* \return int.
|
|
* \retval 0 if address is not a 10 bits I2C address.
|
|
* \retval 1 if address is a 10 bits I2C address.
|
|
*/
|
|
#define IS_I2C_10BIT(addr) \
|
|
(((addr) & 0xF8) == 0xF0)
|
|
|
|
/*------------------------------------------------------------------------------
|
|
Exported FUNCTIONS
|
|
------------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* \fn drxbsp_i2c_init()
|
|
* \brief Initialize I2C communication module.
|
|
* \return int Return status.
|
|
* \retval 0 Initialization successful.
|
|
* \retval -EIO Initialization failed.
|
|
*/
|
|
int drxbsp_i2c_init(void);
|
|
|
|
/**
|
|
* \fn drxbsp_i2c_term()
|
|
* \brief Terminate I2C communication module.
|
|
* \return int Return status.
|
|
* \retval 0 Termination successful.
|
|
* \retval -EIO Termination failed.
|
|
*/
|
|
int drxbsp_i2c_term(void);
|
|
|
|
/**
|
|
* \fn int drxbsp_i2c_write_read( struct i2c_device_addr *w_dev_addr,
|
|
* u16 w_count,
|
|
* u8 * wData,
|
|
* struct i2c_device_addr *r_dev_addr,
|
|
* u16 r_count,
|
|
* u8 * r_data)
|
|
* \brief Read and/or write count bytes from I2C bus, store them in data[].
|
|
* \param w_dev_addr The device i2c address and the device ID to write to
|
|
* \param w_count The number of bytes to write
|
|
* \param wData The array to write the data to
|
|
* \param r_dev_addr The device i2c address and the device ID to read from
|
|
* \param r_count The number of bytes to read
|
|
* \param r_data The array to read the data from
|
|
* \return int Return status.
|
|
* \retval 0 Succes.
|
|
* \retval -EIO Failure.
|
|
* \retval -EINVAL Parameter 'wcount' is not zero but parameter
|
|
* 'wdata' contains NULL.
|
|
* Idem for 'rcount' and 'rdata'.
|
|
* Both w_dev_addr and r_dev_addr are NULL.
|
|
*
|
|
* This function must implement an atomic write and/or read action on the I2C bus
|
|
* No other process may use the I2C bus when this function is executing.
|
|
* The critical section of this function runs from and including the I2C
|
|
* write, up to and including the I2C read action.
|
|
*
|
|
* The device ID can be useful if several devices share an I2C address.
|
|
* It can be used to control a "switch" on the I2C bus to the correct device.
|
|
*/
|
|
int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr,
|
|
u16 w_count,
|
|
u8 *wData,
|
|
struct i2c_device_addr *r_dev_addr,
|
|
u16 r_count, u8 *r_data);
|
|
|
|
/**
|
|
* \fn drxbsp_i2c_error_text()
|
|
* \brief Returns a human readable error.
|
|
* Counter part of numerical drx_i2c_error_g.
|
|
*
|
|
* \return char* Pointer to human readable error text.
|
|
*/
|
|
char *drxbsp_i2c_error_text(void);
|
|
|
|
/**
|
|
* \var drx_i2c_error_g;
|
|
* \brief I2C specific error codes, platform dependent.
|
|
*/
|
|
extern int drx_i2c_error_g;
|
|
|
|
#define TUNER_MODE_SUB0 0x0001 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB1 0x0002 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB2 0x0004 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB3 0x0008 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB4 0x0010 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB5 0x0020 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB6 0x0040 /* for sub-mode (e.g. RF-AGC setting) */
|
|
#define TUNER_MODE_SUB7 0x0080 /* for sub-mode (e.g. RF-AGC setting) */
|
|
|
|
#define TUNER_MODE_DIGITAL 0x0100 /* for digital channel (e.g. DVB-T) */
|
|
#define TUNER_MODE_ANALOG 0x0200 /* for analog channel (e.g. PAL) */
|
|
#define TUNER_MODE_SWITCH 0x0400 /* during channel switch & scanning */
|
|
#define TUNER_MODE_LOCK 0x0800 /* after tuner has locked */
|
|
#define TUNER_MODE_6MHZ 0x1000 /* for 6MHz bandwidth channels */
|
|
#define TUNER_MODE_7MHZ 0x2000 /* for 7MHz bandwidth channels */
|
|
#define TUNER_MODE_8MHZ 0x4000 /* for 8MHz bandwidth channels */
|
|
|
|
#define TUNER_MODE_SUB_MAX 8
|
|
#define TUNER_MODE_SUBALL (TUNER_MODE_SUB0 | TUNER_MODE_SUB1 | \
|
|
TUNER_MODE_SUB2 | TUNER_MODE_SUB3 | \
|
|
TUNER_MODE_SUB4 | TUNER_MODE_SUB5 | \
|
|
TUNER_MODE_SUB6 | TUNER_MODE_SUB7)
|
|
|
|
|
|
enum tuner_lock_status {
|
|
TUNER_LOCKED,
|
|
TUNER_NOT_LOCKED
|
|
};
|
|
|
|
struct tuner_common {
|
|
char *name; /* Tuner brand & type name */
|
|
s32 min_freq_rf; /* Lowest RF input frequency, in kHz */
|
|
s32 max_freq_rf; /* Highest RF input frequency, in kHz */
|
|
|
|
u8 sub_mode; /* Index to sub-mode in use */
|
|
char ***sub_mode_descriptions; /* Pointer to description of sub-modes */
|
|
u8 sub_modes; /* Number of available sub-modes */
|
|
|
|
/* The following fields will be either 0, NULL or false and do not need
|
|
initialisation */
|
|
void *self_check; /* gives proof of initialization */
|
|
bool programmed; /* only valid if self_check is OK */
|
|
s32 r_ffrequency; /* only valid if programmed */
|
|
s32 i_ffrequency; /* only valid if programmed */
|
|
|
|
void *my_user_data; /* pointer to associated demod instance */
|
|
u16 my_capabilities; /* value for storing application flags */
|
|
};
|
|
|
|
struct tuner_instance;
|
|
|
|
typedef int(*tuner_open_func_t) (struct tuner_instance *tuner);
|
|
typedef int(*tuner_close_func_t) (struct tuner_instance *tuner);
|
|
|
|
typedef int(*tuner_set_frequency_func_t) (struct tuner_instance *tuner,
|
|
u32 mode,
|
|
s32
|
|
frequency);
|
|
|
|
typedef int(*tuner_get_frequency_func_t) (struct tuner_instance *tuner,
|
|
u32 mode,
|
|
s32 *
|
|
r_ffrequency,
|
|
s32 *
|
|
i_ffrequency);
|
|
|
|
typedef int(*tuner_lock_status_func_t) (struct tuner_instance *tuner,
|
|
enum tuner_lock_status *
|
|
lock_stat);
|
|
|
|
typedef int(*tune_ri2c_write_read_func_t) (struct tuner_instance *tuner,
|
|
struct i2c_device_addr *
|
|
w_dev_addr, u16 w_count,
|
|
u8 *wData,
|
|
struct i2c_device_addr *
|
|
r_dev_addr, u16 r_count,
|
|
u8 *r_data);
|
|
|
|
struct tuner_ops {
|
|
tuner_open_func_t open_func;
|
|
tuner_close_func_t close_func;
|
|
tuner_set_frequency_func_t set_frequency_func;
|
|
tuner_get_frequency_func_t get_frequency_func;
|
|
tuner_lock_status_func_t lock_status_func;
|
|
tune_ri2c_write_read_func_t i2c_write_read_func;
|
|
|
|
};
|
|
|
|
struct tuner_instance {
|
|
struct i2c_device_addr my_i2c_dev_addr;
|
|
struct tuner_common *my_common_attr;
|
|
void *my_ext_attr;
|
|
struct tuner_ops *my_funct;
|
|
};
|
|
|
|
int drxbsp_tuner_set_frequency(struct tuner_instance *tuner,
|
|
u32 mode,
|
|
s32 frequency);
|
|
|
|
int drxbsp_tuner_get_frequency(struct tuner_instance *tuner,
|
|
u32 mode,
|
|
s32 *r_ffrequency,
|
|
s32 *i_ffrequency);
|
|
|
|
int drxbsp_tuner_default_i2c_write_read(struct tuner_instance *tuner,
|
|
struct i2c_device_addr *w_dev_addr,
|
|
u16 w_count,
|
|
u8 *wData,
|
|
struct i2c_device_addr *r_dev_addr,
|
|
u16 r_count, u8 *r_data);
|
|
|
|
/**************
|
|
*
|
|
* This section configures the DRX Data Access Protocols (DAPs).
|
|
*
|
|
**************/
|
|
|
|
/**
|
|
* \def DRXDAP_SINGLE_MASTER
|
|
* \brief Enable I2C single or I2C multimaster mode on host.
|
|
*
|
|
* Set to 1 to enable single master mode
|
|
* Set to 0 to enable multi master mode
|
|
*
|
|
* The actual DAP implementation may be restricted to only one of the modes.
|
|
* A compiler warning or error will be generated if the DAP implementation
|
|
* overrides or cannot handle the mode defined below.
|
|
*/
|
|
#ifndef DRXDAP_SINGLE_MASTER
|
|
#define DRXDAP_SINGLE_MASTER 1
|
|
#endif
|
|
|
|
/**
|
|
* \def DRXDAP_MAX_WCHUNKSIZE
|
|
* \brief Defines maximum chunksize of an i2c write action by host.
|
|
*
|
|
* This indicates the maximum size of data the I2C device driver is able to
|
|
* write at a time. This includes I2C device address and register addressing.
|
|
*
|
|
* This maximum size may be restricted by the actual DAP implementation.
|
|
* A compiler warning or error will be generated if the DAP implementation
|
|
* overrides or cannot handle the chunksize defined below.
|
|
*
|
|
* Beware that the DAP uses DRXDAP_MAX_WCHUNKSIZE to create a temporary data
|
|
* buffer. Do not undefine or choose too large, unless your system is able to
|
|
* handle a stack buffer of that size.
|
|
*
|
|
*/
|
|
#ifndef DRXDAP_MAX_WCHUNKSIZE
|
|
#define DRXDAP_MAX_WCHUNKSIZE 60
|
|
#endif
|
|
|
|
/**
|
|
* \def DRXDAP_MAX_RCHUNKSIZE
|
|
* \brief Defines maximum chunksize of an i2c read action by host.
|
|
*
|
|
* This indicates the maximum size of data the I2C device driver is able to read
|
|
* at a time. Minimum value is 2. Also, the read chunk size must be even.
|
|
*
|
|
* This maximum size may be restricted by the actual DAP implementation.
|
|
* A compiler warning or error will be generated if the DAP implementation
|
|
* overrides or cannot handle the chunksize defined below.
|
|
*/
|
|
#ifndef DRXDAP_MAX_RCHUNKSIZE
|
|
#define DRXDAP_MAX_RCHUNKSIZE 60
|
|
#endif
|
|
|
|
/**************
|
|
*
|
|
* This section describes drxdriver defines.
|
|
*
|
|
**************/
|
|
|
|
/**
|
|
* \def DRX_UNKNOWN
|
|
* \brief Generic UNKNOWN value for DRX enumerated types.
|
|
*
|
|
* Used to indicate that the parameter value is unknown or not yet initialized.
|
|
*/
|
|
#ifndef DRX_UNKNOWN
|
|
#define DRX_UNKNOWN (254)
|
|
#endif
|
|
|
|
/**
|
|
* \def DRX_AUTO
|
|
* \brief Generic AUTO value for DRX enumerated types.
|
|
*
|
|
* Used to instruct the driver to automatically determine the value of the
|
|
* parameter.
|
|
*/
|
|
#ifndef DRX_AUTO
|
|
#define DRX_AUTO (255)
|
|
#endif
|
|
|
|
/**************
|
|
*
|
|
* This section describes flag definitions for the device capbilities.
|
|
*
|
|
**************/
|
|
|
|
/**
|
|
* \brief LNA capability flag
|
|
*
|
|
* Device has a Low Noise Amplifier
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_LNA (1UL << 0)
|
|
/**
|
|
* \brief OOB-RX capability flag
|
|
*
|
|
* Device has OOB-RX
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_OOBRX (1UL << 1)
|
|
/**
|
|
* \brief ATV capability flag
|
|
*
|
|
* Device has ATV
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_ATV (1UL << 2)
|
|
/**
|
|
* \brief DVB-T capability flag
|
|
*
|
|
* Device has DVB-T
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_DVBT (1UL << 3)
|
|
/**
|
|
* \brief ITU-B capability flag
|
|
*
|
|
* Device has ITU-B
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_ITUB (1UL << 4)
|
|
/**
|
|
* \brief Audio capability flag
|
|
*
|
|
* Device has Audio
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_AUD (1UL << 5)
|
|
/**
|
|
* \brief SAW switch capability flag
|
|
*
|
|
* Device has SAW switch
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_SAWSW (1UL << 6)
|
|
/**
|
|
* \brief GPIO1 capability flag
|
|
*
|
|
* Device has GPIO1
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_GPIO1 (1UL << 7)
|
|
/**
|
|
* \brief GPIO2 capability flag
|
|
*
|
|
* Device has GPIO2
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_GPIO2 (1UL << 8)
|
|
/**
|
|
* \brief IRQN capability flag
|
|
*
|
|
* Device has IRQN
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_IRQN (1UL << 9)
|
|
/**
|
|
* \brief 8VSB capability flag
|
|
*
|
|
* Device has 8VSB
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_8VSB (1UL << 10)
|
|
/**
|
|
* \brief SMA-TX capability flag
|
|
*
|
|
* Device has SMATX
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_SMATX (1UL << 11)
|
|
/**
|
|
* \brief SMA-RX capability flag
|
|
*
|
|
* Device has SMARX
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_SMARX (1UL << 12)
|
|
/**
|
|
* \brief ITU-A/C capability flag
|
|
*
|
|
* Device has ITU-A/C
|
|
*
|
|
*/
|
|
#define DRX_CAPABILITY_HAS_ITUAC (1UL << 13)
|
|
|
|
/*-------------------------------------------------------------------------
|
|
MACROS
|
|
-------------------------------------------------------------------------*/
|
|
/* Macros to stringify the version number */
|
|
#define DRX_VERSIONSTRING(MAJOR, MINOR, PATCH) \
|
|
DRX_VERSIONSTRING_HELP(MAJOR)"." \
|
|
DRX_VERSIONSTRING_HELP(MINOR)"." \
|
|
DRX_VERSIONSTRING_HELP(PATCH)
|
|
#define DRX_VERSIONSTRING_HELP(NUM) #NUM
|
|
|
|
/**
|
|
* \brief Macro to create byte array elements from 16 bit integers.
|
|
* This macro is used to create byte arrays for block writes.
|
|
* Block writes speed up I2C traffic between host and demod.
|
|
* The macro takes care of the required byte order in a 16 bits word.
|
|
* x->lowbyte(x), highbyte(x)
|
|
*/
|
|
#define DRX_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
|
|
((u8)((((u16)x)>>8)&0xFF))
|
|
|
|
/**
|
|
* \brief Macro to convert 16 bit register value to a s32
|
|
*/
|
|
#define DRX_U16TODRXFREQ(x) ((x & 0x8000) ? \
|
|
((s32) \
|
|
(((u32) x) | 0xFFFF0000)) : \
|
|
((s32) x))
|
|
|
|
/*-------------------------------------------------------------------------
|
|
ENUM
|
|
-------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* \enum enum drx_standard
|
|
* \brief Modulation standards.
|
|
*/
|
|
enum drx_standard {
|
|
DRX_STANDARD_DVBT = 0, /**< Terrestrial DVB-T. */
|
|
DRX_STANDARD_8VSB, /**< Terrestrial 8VSB. */
|
|
DRX_STANDARD_NTSC, /**< Terrestrial\Cable analog NTSC. */
|
|
DRX_STANDARD_PAL_SECAM_BG,
|
|
/**< Terrestrial analog PAL/SECAM B/G */
|
|
DRX_STANDARD_PAL_SECAM_DK,
|
|
/**< Terrestrial analog PAL/SECAM D/K */
|
|
DRX_STANDARD_PAL_SECAM_I,
|
|
/**< Terrestrial analog PAL/SECAM I */
|
|
DRX_STANDARD_PAL_SECAM_L,
|
|
/**< Terrestrial analog PAL/SECAM L
|
|
with negative modulation */
|
|
DRX_STANDARD_PAL_SECAM_LP,
|
|
/**< Terrestrial analog PAL/SECAM L
|
|
with positive modulation */
|
|
DRX_STANDARD_ITU_A, /**< Cable ITU ANNEX A. */
|
|
DRX_STANDARD_ITU_B, /**< Cable ITU ANNEX B. */
|
|
DRX_STANDARD_ITU_C, /**< Cable ITU ANNEX C. */
|
|
DRX_STANDARD_ITU_D, /**< Cable ITU ANNEX D. */
|
|
DRX_STANDARD_FM, /**< Terrestrial\Cable FM radio */
|
|
DRX_STANDARD_DTMB, /**< Terrestrial DTMB standard (China)*/
|
|
DRX_STANDARD_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Standard unknown. */
|
|
DRX_STANDARD_AUTO = DRX_AUTO
|
|
/**< Autodetect standard. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_standard
|
|
* \brief Modulation sub-standards.
|
|
*/
|
|
enum drx_substandard {
|
|
DRX_SUBSTANDARD_MAIN = 0, /**< Main subvariant of standard */
|
|
DRX_SUBSTANDARD_ATV_BG_SCANDINAVIA,
|
|
DRX_SUBSTANDARD_ATV_DK_POLAND,
|
|
DRX_SUBSTANDARD_ATV_DK_CHINA,
|
|
DRX_SUBSTANDARD_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Sub-standard unknown. */
|
|
DRX_SUBSTANDARD_AUTO = DRX_AUTO
|
|
/**< Auto (default) sub-standard */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_bandwidth
|
|
* \brief Channel bandwidth or channel spacing.
|
|
*/
|
|
enum drx_bandwidth {
|
|
DRX_BANDWIDTH_8MHZ = 0, /**< Bandwidth 8 MHz. */
|
|
DRX_BANDWIDTH_7MHZ, /**< Bandwidth 7 MHz. */
|
|
DRX_BANDWIDTH_6MHZ, /**< Bandwidth 6 MHz. */
|
|
DRX_BANDWIDTH_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Bandwidth unknown. */
|
|
DRX_BANDWIDTH_AUTO = DRX_AUTO
|
|
/**< Auto Set Bandwidth */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_mirror
|
|
* \brief Indicate if channel spectrum is mirrored or not.
|
|
*/
|
|
enum drx_mirror {
|
|
DRX_MIRROR_NO = 0, /**< Spectrum is not mirrored. */
|
|
DRX_MIRROR_YES, /**< Spectrum is mirrored. */
|
|
DRX_MIRROR_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Unknown if spectrum is mirrored. */
|
|
DRX_MIRROR_AUTO = DRX_AUTO
|
|
/**< Autodetect if spectrum is mirrored. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_modulation
|
|
* \brief Constellation type of the channel.
|
|
*/
|
|
enum drx_modulation {
|
|
DRX_CONSTELLATION_BPSK = 0, /**< Modulation is BPSK. */
|
|
DRX_CONSTELLATION_QPSK, /**< Constellation is QPSK. */
|
|
DRX_CONSTELLATION_PSK8, /**< Constellation is PSK8. */
|
|
DRX_CONSTELLATION_QAM16, /**< Constellation is QAM16. */
|
|
DRX_CONSTELLATION_QAM32, /**< Constellation is QAM32. */
|
|
DRX_CONSTELLATION_QAM64, /**< Constellation is QAM64. */
|
|
DRX_CONSTELLATION_QAM128, /**< Constellation is QAM128. */
|
|
DRX_CONSTELLATION_QAM256, /**< Constellation is QAM256. */
|
|
DRX_CONSTELLATION_QAM512, /**< Constellation is QAM512. */
|
|
DRX_CONSTELLATION_QAM1024, /**< Constellation is QAM1024. */
|
|
DRX_CONSTELLATION_QPSK_NR, /**< Constellation is QPSK_NR */
|
|
DRX_CONSTELLATION_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Constellation unknown. */
|
|
DRX_CONSTELLATION_AUTO = DRX_AUTO
|
|
/**< Autodetect constellation. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_hierarchy
|
|
* \brief Hierarchy of the channel.
|
|
*/
|
|
enum drx_hierarchy {
|
|
DRX_HIERARCHY_NONE = 0, /**< None hierarchical channel. */
|
|
DRX_HIERARCHY_ALPHA1, /**< Hierarchical channel, alpha=1. */
|
|
DRX_HIERARCHY_ALPHA2, /**< Hierarchical channel, alpha=2. */
|
|
DRX_HIERARCHY_ALPHA4, /**< Hierarchical channel, alpha=4. */
|
|
DRX_HIERARCHY_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Hierarchy unknown. */
|
|
DRX_HIERARCHY_AUTO = DRX_AUTO
|
|
/**< Autodetect hierarchy. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_priority
|
|
* \brief Channel priority in case of hierarchical transmission.
|
|
*/
|
|
enum drx_priority {
|
|
DRX_PRIORITY_LOW = 0, /**< Low priority channel. */
|
|
DRX_PRIORITY_HIGH, /**< High priority channel. */
|
|
DRX_PRIORITY_UNKNOWN = DRX_UNKNOWN
|
|
/**< Priority unknown. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_coderate
|
|
* \brief Channel priority in case of hierarchical transmission.
|
|
*/
|
|
enum drx_coderate {
|
|
DRX_CODERATE_1DIV2 = 0, /**< Code rate 1/2nd. */
|
|
DRX_CODERATE_2DIV3, /**< Code rate 2/3nd. */
|
|
DRX_CODERATE_3DIV4, /**< Code rate 3/4nd. */
|
|
DRX_CODERATE_5DIV6, /**< Code rate 5/6nd. */
|
|
DRX_CODERATE_7DIV8, /**< Code rate 7/8nd. */
|
|
DRX_CODERATE_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Code rate unknown. */
|
|
DRX_CODERATE_AUTO = DRX_AUTO
|
|
/**< Autodetect code rate. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_guard
|
|
* \brief Guard interval of a channel.
|
|
*/
|
|
enum drx_guard {
|
|
DRX_GUARD_1DIV32 = 0, /**< Guard interval 1/32nd. */
|
|
DRX_GUARD_1DIV16, /**< Guard interval 1/16th. */
|
|
DRX_GUARD_1DIV8, /**< Guard interval 1/8th. */
|
|
DRX_GUARD_1DIV4, /**< Guard interval 1/4th. */
|
|
DRX_GUARD_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Guard interval unknown. */
|
|
DRX_GUARD_AUTO = DRX_AUTO
|
|
/**< Autodetect guard interval. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_fft_mode
|
|
* \brief FFT mode.
|
|
*/
|
|
enum drx_fft_mode {
|
|
DRX_FFTMODE_2K = 0, /**< 2K FFT mode. */
|
|
DRX_FFTMODE_4K, /**< 4K FFT mode. */
|
|
DRX_FFTMODE_8K, /**< 8K FFT mode. */
|
|
DRX_FFTMODE_UNKNOWN = DRX_UNKNOWN,
|
|
/**< FFT mode unknown. */
|
|
DRX_FFTMODE_AUTO = DRX_AUTO
|
|
/**< Autodetect FFT mode. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_classification
|
|
* \brief Channel classification.
|
|
*/
|
|
enum drx_classification {
|
|
DRX_CLASSIFICATION_GAUSS = 0, /**< Gaussion noise. */
|
|
DRX_CLASSIFICATION_HVY_GAUSS, /**< Heavy Gaussion noise. */
|
|
DRX_CLASSIFICATION_COCHANNEL, /**< Co-channel. */
|
|
DRX_CLASSIFICATION_STATIC, /**< Static echo. */
|
|
DRX_CLASSIFICATION_MOVING, /**< Moving echo. */
|
|
DRX_CLASSIFICATION_ZERODB, /**< Zero dB echo. */
|
|
DRX_CLASSIFICATION_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Unknown classification */
|
|
DRX_CLASSIFICATION_AUTO = DRX_AUTO
|
|
/**< Autodetect classification. */
|
|
};
|
|
|
|
/**
|
|
* /enum enum drx_interleave_mode
|
|
* /brief Interleave modes
|
|
*/
|
|
enum drx_interleave_mode {
|
|
DRX_INTERLEAVEMODE_I128_J1 = 0,
|
|
DRX_INTERLEAVEMODE_I128_J1_V2,
|
|
DRX_INTERLEAVEMODE_I128_J2,
|
|
DRX_INTERLEAVEMODE_I64_J2,
|
|
DRX_INTERLEAVEMODE_I128_J3,
|
|
DRX_INTERLEAVEMODE_I32_J4,
|
|
DRX_INTERLEAVEMODE_I128_J4,
|
|
DRX_INTERLEAVEMODE_I16_J8,
|
|
DRX_INTERLEAVEMODE_I128_J5,
|
|
DRX_INTERLEAVEMODE_I8_J16,
|
|
DRX_INTERLEAVEMODE_I128_J6,
|
|
DRX_INTERLEAVEMODE_RESERVED_11,
|
|
DRX_INTERLEAVEMODE_I128_J7,
|
|
DRX_INTERLEAVEMODE_RESERVED_13,
|
|
DRX_INTERLEAVEMODE_I128_J8,
|
|
DRX_INTERLEAVEMODE_RESERVED_15,
|
|
DRX_INTERLEAVEMODE_I12_J17,
|
|
DRX_INTERLEAVEMODE_I5_J4,
|
|
DRX_INTERLEAVEMODE_B52_M240,
|
|
DRX_INTERLEAVEMODE_B52_M720,
|
|
DRX_INTERLEAVEMODE_B52_M48,
|
|
DRX_INTERLEAVEMODE_B52_M0,
|
|
DRX_INTERLEAVEMODE_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Unknown interleave mode */
|
|
DRX_INTERLEAVEMODE_AUTO = DRX_AUTO
|
|
/**< Autodetect interleave mode */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_carrier_mode
|
|
* \brief Channel Carrier Mode.
|
|
*/
|
|
enum drx_carrier_mode {
|
|
DRX_CARRIER_MULTI = 0, /**< Multi carrier mode */
|
|
DRX_CARRIER_SINGLE, /**< Single carrier mode */
|
|
DRX_CARRIER_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Carrier mode unknown. */
|
|
DRX_CARRIER_AUTO = DRX_AUTO /**< Autodetect carrier mode */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_frame_mode
|
|
* \brief Channel Frame Mode.
|
|
*/
|
|
enum drx_frame_mode {
|
|
DRX_FRAMEMODE_420 = 0, /**< 420 with variable PN */
|
|
DRX_FRAMEMODE_595, /**< 595 */
|
|
DRX_FRAMEMODE_945, /**< 945 with variable PN */
|
|
DRX_FRAMEMODE_420_FIXED_PN,
|
|
/**< 420 with fixed PN */
|
|
DRX_FRAMEMODE_945_FIXED_PN,
|
|
/**< 945 with fixed PN */
|
|
DRX_FRAMEMODE_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Frame mode unknown. */
|
|
DRX_FRAMEMODE_AUTO = DRX_AUTO
|
|
/**< Autodetect frame mode */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_tps_frame
|
|
* \brief Frame number in current super-frame.
|
|
*/
|
|
enum drx_tps_frame {
|
|
DRX_TPS_FRAME1 = 0, /**< TPS frame 1. */
|
|
DRX_TPS_FRAME2, /**< TPS frame 2. */
|
|
DRX_TPS_FRAME3, /**< TPS frame 3. */
|
|
DRX_TPS_FRAME4, /**< TPS frame 4. */
|
|
DRX_TPS_FRAME_UNKNOWN = DRX_UNKNOWN
|
|
/**< TPS frame unknown. */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_ldpc
|
|
* \brief TPS LDPC .
|
|
*/
|
|
enum drx_ldpc {
|
|
DRX_LDPC_0_4 = 0, /**< LDPC 0.4 */
|
|
DRX_LDPC_0_6, /**< LDPC 0.6 */
|
|
DRX_LDPC_0_8, /**< LDPC 0.8 */
|
|
DRX_LDPC_UNKNOWN = DRX_UNKNOWN,
|
|
/**< LDPC unknown. */
|
|
DRX_LDPC_AUTO = DRX_AUTO /**< Autodetect LDPC */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_pilot_mode
|
|
* \brief Pilot modes in DTMB.
|
|
*/
|
|
enum drx_pilot_mode {
|
|
DRX_PILOT_ON = 0, /**< Pilot On */
|
|
DRX_PILOT_OFF, /**< Pilot Off */
|
|
DRX_PILOT_UNKNOWN = DRX_UNKNOWN,
|
|
/**< Pilot unknown. */
|
|
DRX_PILOT_AUTO = DRX_AUTO /**< Autodetect Pilot */
|
|
};
|
|
|
|
/**
|
|
* enum drxu_code_action - indicate if firmware has to be uploaded or verified.
|
|
* @UCODE_UPLOAD: Upload the microcode image to device
|
|
* @UCODE_VERIFY: Compare microcode image with code on device
|
|
*/
|
|
enum drxu_code_action {
|
|
UCODE_UPLOAD,
|
|
UCODE_VERIFY
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_lock_status * \brief Used to reflect current lock status of demodulator.
|
|
*
|
|
* The generic lock states have device dependent semantics.
|
|
|
|
DRX_NEVER_LOCK = 0,
|
|
**< Device will never lock on this signal *
|
|
DRX_NOT_LOCKED,
|
|
**< Device has no lock at all *
|
|
DRX_LOCK_STATE_1,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_2,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_3,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_4,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_5,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_6,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_7,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_8,
|
|
**< Generic lock state *
|
|
DRX_LOCK_STATE_9,
|
|
**< Generic lock state *
|
|
DRX_LOCKED **< Device is in lock *
|
|
*/
|
|
|
|
enum drx_lock_status {
|
|
DRX_NEVER_LOCK = 0,
|
|
DRX_NOT_LOCKED,
|
|
DRX_LOCK_STATE_1,
|
|
DRX_LOCK_STATE_2,
|
|
DRX_LOCK_STATE_3,
|
|
DRX_LOCK_STATE_4,
|
|
DRX_LOCK_STATE_5,
|
|
DRX_LOCK_STATE_6,
|
|
DRX_LOCK_STATE_7,
|
|
DRX_LOCK_STATE_8,
|
|
DRX_LOCK_STATE_9,
|
|
DRX_LOCKED
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_uio* \brief Used to address a User IO (UIO).
|
|
*/
|
|
enum drx_uio {
|
|
DRX_UIO1,
|
|
DRX_UIO2,
|
|
DRX_UIO3,
|
|
DRX_UIO4,
|
|
DRX_UIO5,
|
|
DRX_UIO6,
|
|
DRX_UIO7,
|
|
DRX_UIO8,
|
|
DRX_UIO9,
|
|
DRX_UIO10,
|
|
DRX_UIO11,
|
|
DRX_UIO12,
|
|
DRX_UIO13,
|
|
DRX_UIO14,
|
|
DRX_UIO15,
|
|
DRX_UIO16,
|
|
DRX_UIO17,
|
|
DRX_UIO18,
|
|
DRX_UIO19,
|
|
DRX_UIO20,
|
|
DRX_UIO21,
|
|
DRX_UIO22,
|
|
DRX_UIO23,
|
|
DRX_UIO24,
|
|
DRX_UIO25,
|
|
DRX_UIO26,
|
|
DRX_UIO27,
|
|
DRX_UIO28,
|
|
DRX_UIO29,
|
|
DRX_UIO30,
|
|
DRX_UIO31,
|
|
DRX_UIO32,
|
|
DRX_UIO_MAX = DRX_UIO32
|
|
};
|
|
|
|
/**
|
|
* \enum enum drxuio_mode * \brief Used to configure the modus oprandi of a UIO.
|
|
*
|
|
* DRX_UIO_MODE_FIRMWARE is an old uio mode.
|
|
* It is replaced by the modes DRX_UIO_MODE_FIRMWARE0 .. DRX_UIO_MODE_FIRMWARE9.
|
|
* To be backward compatible DRX_UIO_MODE_FIRMWARE is equivalent to
|
|
* DRX_UIO_MODE_FIRMWARE0.
|
|
*/
|
|
enum drxuio_mode {
|
|
DRX_UIO_MODE_DISABLE = 0x01,
|
|
/**< not used, pin is configured as input */
|
|
DRX_UIO_MODE_READWRITE = 0x02,
|
|
/**< used for read/write by application */
|
|
DRX_UIO_MODE_FIRMWARE = 0x04,
|
|
/**< controlled by firmware, function 0 */
|
|
DRX_UIO_MODE_FIRMWARE0 = DRX_UIO_MODE_FIRMWARE,
|
|
/**< same as above */
|
|
DRX_UIO_MODE_FIRMWARE1 = 0x08,
|
|
/**< controlled by firmware, function 1 */
|
|
DRX_UIO_MODE_FIRMWARE2 = 0x10,
|
|
/**< controlled by firmware, function 2 */
|
|
DRX_UIO_MODE_FIRMWARE3 = 0x20,
|
|
/**< controlled by firmware, function 3 */
|
|
DRX_UIO_MODE_FIRMWARE4 = 0x40,
|
|
/**< controlled by firmware, function 4 */
|
|
DRX_UIO_MODE_FIRMWARE5 = 0x80
|
|
/**< controlled by firmware, function 5 */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drxoob_downstream_standard * \brief Used to select OOB standard.
|
|
*
|
|
* Based on ANSI 55-1 and 55-2
|
|
*/
|
|
enum drxoob_downstream_standard {
|
|
DRX_OOB_MODE_A = 0,
|
|
/**< ANSI 55-1 */
|
|
DRX_OOB_MODE_B_GRADE_A,
|
|
/**< ANSI 55-2 A */
|
|
DRX_OOB_MODE_B_GRADE_B
|
|
/**< ANSI 55-2 B */
|
|
};
|
|
|
|
/*-------------------------------------------------------------------------
|
|
STRUCTS
|
|
-------------------------------------------------------------------------*/
|
|
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
/*== CTRL CFG related data structures ========================================*/
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
|
|
#ifndef DRX_CFG_BASE
|
|
#define DRX_CFG_BASE 0
|
|
#endif
|
|
|
|
#define DRX_CFG_MPEG_OUTPUT (DRX_CFG_BASE + 0) /* MPEG TS output */
|
|
#define DRX_CFG_PKTERR (DRX_CFG_BASE + 1) /* Packet Error */
|
|
#define DRX_CFG_SYMCLK_OFFS (DRX_CFG_BASE + 2) /* Symbol Clk Offset */
|
|
#define DRX_CFG_SMA (DRX_CFG_BASE + 3) /* Smart Antenna */
|
|
#define DRX_CFG_PINSAFE (DRX_CFG_BASE + 4) /* Pin safe mode */
|
|
#define DRX_CFG_SUBSTANDARD (DRX_CFG_BASE + 5) /* substandard */
|
|
#define DRX_CFG_AUD_VOLUME (DRX_CFG_BASE + 6) /* volume */
|
|
#define DRX_CFG_AUD_RDS (DRX_CFG_BASE + 7) /* rds */
|
|
#define DRX_CFG_AUD_AUTOSOUND (DRX_CFG_BASE + 8) /* ASS & ASC */
|
|
#define DRX_CFG_AUD_ASS_THRES (DRX_CFG_BASE + 9) /* ASS Thresholds */
|
|
#define DRX_CFG_AUD_DEVIATION (DRX_CFG_BASE + 10) /* Deviation */
|
|
#define DRX_CFG_AUD_PRESCALE (DRX_CFG_BASE + 11) /* Prescale */
|
|
#define DRX_CFG_AUD_MIXER (DRX_CFG_BASE + 12) /* Mixer */
|
|
#define DRX_CFG_AUD_AVSYNC (DRX_CFG_BASE + 13) /* AVSync */
|
|
#define DRX_CFG_AUD_CARRIER (DRX_CFG_BASE + 14) /* Audio carriers */
|
|
#define DRX_CFG_I2S_OUTPUT (DRX_CFG_BASE + 15) /* I2S output */
|
|
#define DRX_CFG_ATV_STANDARD (DRX_CFG_BASE + 16) /* ATV standard */
|
|
#define DRX_CFG_SQI_SPEED (DRX_CFG_BASE + 17) /* SQI speed */
|
|
#define DRX_CTRL_CFG_MAX (DRX_CFG_BASE + 18) /* never to be used */
|
|
|
|
#define DRX_CFG_PINS_SAFE_MODE DRX_CFG_PINSAFE
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
/*== CTRL related data structures ============================================*/
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
|
|
/**
|
|
* struct drxu_code_info Parameters for microcode upload and verfiy.
|
|
*
|
|
* @mc_file: microcode file name
|
|
*
|
|
* Used by DRX_CTRL_LOAD_UCODE and DRX_CTRL_VERIFY_UCODE
|
|
*/
|
|
struct drxu_code_info {
|
|
char *mc_file;
|
|
};
|
|
|
|
/**
|
|
* \struct drx_mc_version_rec_t
|
|
* \brief Microcode version record
|
|
* Version numbers are stored in BCD format, as usual:
|
|
* o major number = bits 31-20 (first three nibbles of MSW)
|
|
* o minor number = bits 19-16 (fourth nibble of MSW)
|
|
* o patch number = bits 15-0 (remaining nibbles in LSW)
|
|
*
|
|
* The device type indicates for which the device is meant. It is based on the
|
|
* JTAG ID, using everything except the bond ID and the metal fix.
|
|
*
|
|
* Special values:
|
|
* - mc_dev_type == 0 => any device allowed
|
|
* - mc_base_version == 0.0.0 => full microcode (mc_version is the version)
|
|
* - mc_base_version != 0.0.0 => patch microcode, the base microcode version
|
|
* (mc_version is the version)
|
|
*/
|
|
#define AUX_VER_RECORD 0x8000
|
|
|
|
struct drx_mc_version_rec {
|
|
u16 aux_type; /* type of aux data - 0x8000 for version record */
|
|
u32 mc_dev_type; /* device type, based on JTAG ID */
|
|
u32 mc_version; /* version of microcode */
|
|
u32 mc_base_version; /* in case of patch: the original microcode version */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct drx_filter_info_t
|
|
* \brief Parameters for loading filter coefficients
|
|
*
|
|
* Used by DRX_CTRL_LOAD_FILTER
|
|
*/
|
|
struct drx_filter_info {
|
|
u8 *data_re;
|
|
/**< pointer to coefficients for RE */
|
|
u8 *data_im;
|
|
/**< pointer to coefficients for IM */
|
|
u16 size_re;
|
|
/**< size of coefficients for RE */
|
|
u16 size_im;
|
|
/**< size of coefficients for IM */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct struct drx_channel * \brief The set of parameters describing a single channel.
|
|
*
|
|
* Used by DRX_CTRL_SET_CHANNEL and DRX_CTRL_GET_CHANNEL.
|
|
* Only certain fields need to be used for a specfic standard.
|
|
*
|
|
*/
|
|
struct drx_channel {
|
|
s32 frequency;
|
|
/**< frequency in kHz */
|
|
enum drx_bandwidth bandwidth;
|
|
/**< bandwidth */
|
|
enum drx_mirror mirror; /**< mirrored or not on RF */
|
|
enum drx_modulation constellation;
|
|
/**< constellation */
|
|
enum drx_hierarchy hierarchy;
|
|
/**< hierarchy */
|
|
enum drx_priority priority; /**< priority */
|
|
enum drx_coderate coderate; /**< coderate */
|
|
enum drx_guard guard; /**< guard interval */
|
|
enum drx_fft_mode fftmode; /**< fftmode */
|
|
enum drx_classification classification;
|
|
/**< classification */
|
|
u32 symbolrate;
|
|
/**< symbolrate in symbols/sec */
|
|
enum drx_interleave_mode interleavemode;
|
|
/**< interleaveMode QAM */
|
|
enum drx_ldpc ldpc; /**< ldpc */
|
|
enum drx_carrier_mode carrier; /**< carrier */
|
|
enum drx_frame_mode framemode;
|
|
/**< frame mode */
|
|
enum drx_pilot_mode pilot; /**< pilot mode */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
enum drx_cfg_sqi_speed {
|
|
DRX_SQI_SPEED_FAST = 0,
|
|
DRX_SQI_SPEED_MEDIUM,
|
|
DRX_SQI_SPEED_SLOW,
|
|
DRX_SQI_SPEED_UNKNOWN = DRX_UNKNOWN
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct struct drx_complex * A complex number.
|
|
*
|
|
* Used by DRX_CTRL_CONSTEL.
|
|
*/
|
|
struct drx_complex {
|
|
s16 im;
|
|
/**< Imaginary part. */
|
|
s16 re;
|
|
/**< Real part. */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct struct drx_frequency_plan * Array element of a frequency plan.
|
|
*
|
|
* Used by DRX_CTRL_SCAN_INIT.
|
|
*/
|
|
struct drx_frequency_plan {
|
|
s32 first;
|
|
/**< First centre frequency in this band */
|
|
s32 last;
|
|
/**< Last centre frequency in this band */
|
|
s32 step;
|
|
/**< Stepping frequency in this band */
|
|
enum drx_bandwidth bandwidth;
|
|
/**< Bandwidth within this frequency band */
|
|
u16 ch_number;
|
|
/**< First channel number in this band, or first
|
|
index in ch_names */
|
|
char **ch_names;
|
|
/**< Optional list of channel names in this
|
|
band */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct struct drx_scan_param * Parameters for channel scan.
|
|
*
|
|
* Used by DRX_CTRL_SCAN_INIT.
|
|
*/
|
|
struct drx_scan_param {
|
|
struct drx_frequency_plan *frequency_plan;
|
|
/**< Frequency plan (array)*/
|
|
u16 frequency_plan_size; /**< Number of bands */
|
|
u32 num_tries; /**< Max channels tried */
|
|
s32 skip; /**< Minimum frequency step to take
|
|
after a channel is found */
|
|
void *ext_params; /**< Standard specific params */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Scan commands.
|
|
* Used by scanning algorithms.
|
|
*/
|
|
enum drx_scan_command {
|
|
DRX_SCAN_COMMAND_INIT = 0,/**< Initialize scanning */
|
|
DRX_SCAN_COMMAND_NEXT, /**< Next scan */
|
|
DRX_SCAN_COMMAND_STOP /**< Stop scanning */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Inner scan function prototype.
|
|
*/
|
|
typedef int(*drx_scan_func_t) (void *scan_context,
|
|
enum drx_scan_command scan_command,
|
|
struct drx_channel *scan_channel,
|
|
bool *get_next_channel);
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct struct drxtps_info * TPS information, DVB-T specific.
|
|
*
|
|
* Used by DRX_CTRL_TPS_INFO.
|
|
*/
|
|
struct drxtps_info {
|
|
enum drx_fft_mode fftmode; /**< Fft mode */
|
|
enum drx_guard guard; /**< Guard interval */
|
|
enum drx_modulation constellation;
|
|
/**< Constellation */
|
|
enum drx_hierarchy hierarchy;
|
|
/**< Hierarchy */
|
|
enum drx_coderate high_coderate;
|
|
/**< High code rate */
|
|
enum drx_coderate low_coderate;
|
|
/**< Low cod rate */
|
|
enum drx_tps_frame frame; /**< Tps frame */
|
|
u8 length; /**< Length */
|
|
u16 cell_id; /**< Cell id */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Power mode of device.
|
|
*
|
|
* Used by DRX_CTRL_SET_POWER_MODE.
|
|
*/
|
|
enum drx_power_mode {
|
|
DRX_POWER_UP = 0,
|
|
/**< Generic , Power Up Mode */
|
|
DRX_POWER_MODE_1,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_2,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_3,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_4,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_5,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_6,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_7,
|
|
/**< Device specific , Power Up Mode */
|
|
DRX_POWER_MODE_8,
|
|
/**< Device specific , Power Up Mode */
|
|
|
|
DRX_POWER_MODE_9,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_10,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_11,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_12,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_13,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_14,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_15,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_MODE_16,
|
|
/**< Device specific , Power Down Mode */
|
|
DRX_POWER_DOWN = 255
|
|
/**< Generic , Power Down Mode */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \enum enum drx_module * \brief Software module identification.
|
|
*
|
|
* Used by DRX_CTRL_VERSION.
|
|
*/
|
|
enum drx_module {
|
|
DRX_MODULE_DEVICE,
|
|
DRX_MODULE_MICROCODE,
|
|
DRX_MODULE_DRIVERCORE,
|
|
DRX_MODULE_DEVICEDRIVER,
|
|
DRX_MODULE_DAP,
|
|
DRX_MODULE_BSP_I2C,
|
|
DRX_MODULE_BSP_TUNER,
|
|
DRX_MODULE_BSP_HOST,
|
|
DRX_MODULE_UNKNOWN
|
|
};
|
|
|
|
/**
|
|
* \enum struct drx_version * \brief Version information of one software module.
|
|
*
|
|
* Used by DRX_CTRL_VERSION.
|
|
*/
|
|
struct drx_version {
|
|
enum drx_module module_type;
|
|
/**< Type identifier of the module */
|
|
char *module_name;
|
|
/**< Name or description of module */
|
|
u16 v_major; /**< Major version number */
|
|
u16 v_minor; /**< Minor version number */
|
|
u16 v_patch; /**< Patch version number */
|
|
char *v_string; /**< Version as text string */
|
|
};
|
|
|
|
/**
|
|
* \enum struct drx_version_list * \brief List element of NULL terminated, linked list for version information.
|
|
*
|
|
* Used by DRX_CTRL_VERSION.
|
|
*/
|
|
struct drx_version_list {
|
|
struct drx_version *version;/**< Version information */
|
|
struct drx_version_list *next;
|
|
/**< Next list element */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Parameters needed to confiugure a UIO.
|
|
*
|
|
* Used by DRX_CTRL_UIO_CFG.
|
|
*/
|
|
struct drxuio_cfg {
|
|
enum drx_uio uio;
|
|
/**< UIO identifier */
|
|
enum drxuio_mode mode;
|
|
/**< UIO operational mode */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Parameters needed to read from or write to a UIO.
|
|
*
|
|
* Used by DRX_CTRL_UIO_READ and DRX_CTRL_UIO_WRITE.
|
|
*/
|
|
struct drxuio_data {
|
|
enum drx_uio uio;
|
|
/**< UIO identifier */
|
|
bool value;
|
|
/**< UIO value (true=1, false=0) */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Parameters needed to configure OOB.
|
|
*
|
|
* Used by DRX_CTRL_SET_OOB.
|
|
*/
|
|
struct drxoob {
|
|
s32 frequency; /**< Frequency in kHz */
|
|
enum drxoob_downstream_standard standard;
|
|
/**< OOB standard */
|
|
bool spectrum_inverted; /**< If true, then spectrum
|
|
is inverted */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Metrics from OOB.
|
|
*
|
|
* Used by DRX_CTRL_GET_OOB.
|
|
*/
|
|
struct drxoob_status {
|
|
s32 frequency; /**< Frequency in Khz */
|
|
enum drx_lock_status lock; /**< Lock status */
|
|
u32 mer; /**< MER */
|
|
s32 symbol_rate_offset; /**< Symbolrate offset in ppm */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \brief Device dependent configuration data.
|
|
*
|
|
* Used by DRX_CTRL_SET_CFG and DRX_CTRL_GET_CFG.
|
|
* A sort of nested drx_ctrl() functionality for device specific controls.
|
|
*/
|
|
struct drx_cfg {
|
|
u32 cfg_type;
|
|
/**< Function identifier */
|
|
void *cfg_data;
|
|
/**< Function data */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* /struct DRXMpegStartWidth_t
|
|
* MStart width [nr MCLK cycles] for serial MPEG output.
|
|
*/
|
|
|
|
enum drxmpeg_str_width {
|
|
DRX_MPEG_STR_WIDTH_1,
|
|
DRX_MPEG_STR_WIDTH_8
|
|
};
|
|
|
|
/* CTRL CFG MPEG output */
|
|
/**
|
|
* \struct struct drx_cfg_mpeg_output * \brief Configuration parameters for MPEG output control.
|
|
*
|
|
* Used by DRX_CFG_MPEG_OUTPUT, in combination with DRX_CTRL_SET_CFG and
|
|
* DRX_CTRL_GET_CFG.
|
|
*/
|
|
|
|
struct drx_cfg_mpeg_output {
|
|
bool enable_mpeg_output;/**< If true, enable MPEG output */
|
|
bool insert_rs_byte; /**< If true, insert RS byte */
|
|
bool enable_parallel; /**< If true, parallel out otherwise
|
|
serial */
|
|
bool invert_data; /**< If true, invert DATA signals */
|
|
bool invert_err; /**< If true, invert ERR signal */
|
|
bool invert_str; /**< If true, invert STR signals */
|
|
bool invert_val; /**< If true, invert VAL signals */
|
|
bool invert_clk; /**< If true, invert CLK signals */
|
|
bool static_clk; /**< If true, static MPEG clockrate
|
|
will be used, otherwise clockrate
|
|
will adapt to the bitrate of the
|
|
TS */
|
|
u32 bitrate; /**< Maximum bitrate in b/s in case
|
|
static clockrate is selected */
|
|
enum drxmpeg_str_width width_str;
|
|
/**< MPEG start width */
|
|
};
|
|
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \struct struct drxi2c_data * \brief Data for I2C via 2nd or 3rd or etc I2C port.
|
|
*
|
|
* Used by DRX_CTRL_I2C_READWRITE.
|
|
* If port_nr is equal to primairy port_nr BSPI2C will be used.
|
|
*
|
|
*/
|
|
struct drxi2c_data {
|
|
u16 port_nr; /**< I2C port number */
|
|
struct i2c_device_addr *w_dev_addr;
|
|
/**< Write device address */
|
|
u16 w_count; /**< Size of write data in bytes */
|
|
u8 *wData; /**< Pointer to write data */
|
|
struct i2c_device_addr *r_dev_addr;
|
|
/**< Read device address */
|
|
u16 r_count; /**< Size of data to read in bytes */
|
|
u8 *r_data; /**< Pointer to read buffer */
|
|
};
|
|
|
|
/*========================================*/
|
|
|
|
/**
|
|
* \enum enum drx_aud_standard * \brief Audio standard identifier.
|
|
*
|
|
* Used by DRX_CTRL_SET_AUD.
|
|
*/
|
|
enum drx_aud_standard {
|
|
DRX_AUD_STANDARD_BTSC, /**< set BTSC standard (USA) */
|
|
DRX_AUD_STANDARD_A2, /**< set A2-Korea FM Stereo */
|
|
DRX_AUD_STANDARD_EIAJ, /**< set to Japanese FM Stereo */
|
|
DRX_AUD_STANDARD_FM_STEREO,/**< set to FM-Stereo Radio */
|
|
DRX_AUD_STANDARD_M_MONO, /**< for 4.5 MHz mono detected */
|
|
DRX_AUD_STANDARD_D_K_MONO, /**< for 6.5 MHz mono detected */
|
|
DRX_AUD_STANDARD_BG_FM, /**< set BG_FM standard */
|
|
DRX_AUD_STANDARD_D_K1, /**< set D_K1 standard */
|
|
DRX_AUD_STANDARD_D_K2, /**< set D_K2 standard */
|
|
DRX_AUD_STANDARD_D_K3, /**< set D_K3 standard */
|
|
DRX_AUD_STANDARD_BG_NICAM_FM,
|
|
/**< set BG_NICAM_FM standard */
|
|
DRX_AUD_STANDARD_L_NICAM_AM,
|
|
/**< set L_NICAM_AM standard */
|
|
DRX_AUD_STANDARD_I_NICAM_FM,
|
|
/**< set I_NICAM_FM standard */
|
|
DRX_AUD_STANDARD_D_K_NICAM_FM,
|
|
/**< set D_K_NICAM_FM standard */
|
|
DRX_AUD_STANDARD_NOT_READY,/**< used to detect audio standard */
|
|
DRX_AUD_STANDARD_AUTO = DRX_AUTO,
|
|
/**< Automatic Standard Detection */
|
|
DRX_AUD_STANDARD_UNKNOWN = DRX_UNKNOWN
|
|
/**< used as auto and for readback */
|
|
};
|
|
|
|
/* CTRL_AUD_GET_STATUS - struct drx_aud_status */
|
|
/**
|
|
* \enum enum drx_aud_nicam_status * \brief Status of NICAM carrier.
|
|
*/
|
|
enum drx_aud_nicam_status {
|
|
DRX_AUD_NICAM_DETECTED = 0,
|
|
/**< NICAM carrier detected */
|
|
DRX_AUD_NICAM_NOT_DETECTED,
|
|
/**< NICAM carrier not detected */
|
|
DRX_AUD_NICAM_BAD /**< NICAM carrier bad quality */
|
|
};
|
|
|
|
/**
|
|
* \struct struct drx_aud_status * \brief Audio status characteristics.
|
|
*/
|
|
struct drx_aud_status {
|
|
bool stereo; /**< stereo detection */
|
|
bool carrier_a; /**< carrier A detected */
|
|
bool carrier_b; /**< carrier B detected */
|
|
bool sap; /**< sap / bilingual detection */
|
|
bool rds; /**< RDS data array present */
|
|
enum drx_aud_nicam_status nicam_status;
|
|
/**< status of NICAM carrier */
|
|
s8 fm_ident; /**< FM Identification value */
|
|
};
|
|
|
|
/* CTRL_AUD_READ_RDS - DRXRDSdata_t */
|
|
|
|
/**
|
|
* \struct DRXRDSdata_t
|
|
* \brief Raw RDS data array.
|
|
*/
|
|
struct drx_cfg_aud_rds {
|
|
bool valid; /**< RDS data validation */
|
|
u16 data[18]; /**< data from one RDS data array */
|
|
};
|
|
|
|
/* DRX_CFG_AUD_VOLUME - struct drx_cfg_aud_volume - set/get */
|
|
/**
|
|
* \enum DRXAudAVCDecayTime_t
|
|
* \brief Automatic volume control configuration.
|
|
*/
|
|
enum drx_aud_avc_mode {
|
|
DRX_AUD_AVC_OFF, /**< Automatic volume control off */
|
|
DRX_AUD_AVC_DECAYTIME_8S, /**< level volume in 8 seconds */
|
|
DRX_AUD_AVC_DECAYTIME_4S, /**< level volume in 4 seconds */
|
|
DRX_AUD_AVC_DECAYTIME_2S, /**< level volume in 2 seconds */
|
|
DRX_AUD_AVC_DECAYTIME_20MS/**< level volume in 20 millisec */
|
|
};
|
|
|
|
/**
|
|
* /enum DRXAudMaxAVCGain_t
|
|
* /brief Automatic volume control max gain in audio baseband.
|
|
*/
|
|
enum drx_aud_avc_max_gain {
|
|
DRX_AUD_AVC_MAX_GAIN_0DB, /**< maximum AVC gain 0 dB */
|
|
DRX_AUD_AVC_MAX_GAIN_6DB, /**< maximum AVC gain 6 dB */
|
|
DRX_AUD_AVC_MAX_GAIN_12DB /**< maximum AVC gain 12 dB */
|
|
};
|
|
|
|
/**
|
|
* /enum DRXAudMaxAVCAtten_t
|
|
* /brief Automatic volume control max attenuation in audio baseband.
|
|
*/
|
|
enum drx_aud_avc_max_atten {
|
|
DRX_AUD_AVC_MAX_ATTEN_12DB,
|
|
/**< maximum AVC attenuation 12 dB */
|
|
DRX_AUD_AVC_MAX_ATTEN_18DB,
|
|
/**< maximum AVC attenuation 18 dB */
|
|
DRX_AUD_AVC_MAX_ATTEN_24DB/**< maximum AVC attenuation 24 dB */
|
|
};
|
|
/**
|
|
* \struct struct drx_cfg_aud_volume * \brief Audio volume configuration.
|
|
*/
|
|
struct drx_cfg_aud_volume {
|
|
bool mute; /**< mute overrides volume setting */
|
|
s16 volume; /**< volume, range -114 to 12 dB */
|
|
enum drx_aud_avc_mode avc_mode; /**< AVC auto volume control mode */
|
|
u16 avc_ref_level; /**< AVC reference level */
|
|
enum drx_aud_avc_max_gain avc_max_gain;
|
|
/**< AVC max gain selection */
|
|
enum drx_aud_avc_max_atten avc_max_atten;
|
|
/**< AVC max attenuation selection */
|
|
s16 strength_left; /**< quasi-peak, left speaker */
|
|
s16 strength_right; /**< quasi-peak, right speaker */
|
|
};
|
|
|
|
/* DRX_CFG_I2S_OUTPUT - struct drx_cfg_i2s_output - set/get */
|
|
/**
|
|
* \enum enum drxi2s_mode * \brief I2S output mode.
|
|
*/
|
|
enum drxi2s_mode {
|
|
DRX_I2S_MODE_MASTER, /**< I2S is in master mode */
|
|
DRX_I2S_MODE_SLAVE /**< I2S is in slave mode */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drxi2s_word_length * \brief Width of I2S data.
|
|
*/
|
|
enum drxi2s_word_length {
|
|
DRX_I2S_WORDLENGTH_32 = 0,/**< I2S data is 32 bit wide */
|
|
DRX_I2S_WORDLENGTH_16 = 1 /**< I2S data is 16 bit wide */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drxi2s_format * \brief Data wordstrobe alignment for I2S.
|
|
*/
|
|
enum drxi2s_format {
|
|
DRX_I2S_FORMAT_WS_WITH_DATA,
|
|
/**< I2S data and wordstrobe are aligned */
|
|
DRX_I2S_FORMAT_WS_ADVANCED
|
|
/**< I2S data one cycle after wordstrobe */
|
|
};
|
|
|
|
/**
|
|
* \enum enum drxi2s_polarity * \brief Polarity of I2S data.
|
|
*/
|
|
enum drxi2s_polarity {
|
|
DRX_I2S_POLARITY_RIGHT,/**< wordstrobe - right high, left low */
|
|
DRX_I2S_POLARITY_LEFT /**< wordstrobe - right low, left high */
|
|
};
|
|
|
|
/**
|
|
* \struct struct drx_cfg_i2s_output * \brief I2S output configuration.
|
|
*/
|
|
struct drx_cfg_i2s_output {
|
|
bool output_enable; /**< I2S output enable */
|
|
u32 frequency; /**< range from 8000-48000 Hz */
|
|
enum drxi2s_mode mode; /**< I2S mode, master or slave */
|
|
enum drxi2s_word_length word_length;
|
|
/**< I2S wordlength, 16 or 32 bits */
|
|
enum drxi2s_polarity polarity;/**< I2S wordstrobe polarity */
|
|
enum drxi2s_format format; /**< I2S wordstrobe delay to data */
|
|
};
|
|
|
|
/* ------------------------------expert interface-----------------------------*/
|
|
/**
|
|
* /enum enum drx_aud_fm_deemphasis * setting for FM-Deemphasis in audio demodulator.
|
|
*
|
|
*/
|
|
enum drx_aud_fm_deemphasis {
|
|
DRX_AUD_FM_DEEMPH_50US,
|
|
DRX_AUD_FM_DEEMPH_75US,
|
|
DRX_AUD_FM_DEEMPH_OFF
|
|
};
|
|
|
|
/**
|
|
* /enum DRXAudDeviation_t
|
|
* setting for deviation mode in audio demodulator.
|
|
*
|
|
*/
|
|
enum drx_cfg_aud_deviation {
|
|
DRX_AUD_DEVIATION_NORMAL,
|
|
DRX_AUD_DEVIATION_HIGH
|
|
};
|
|
|
|
/**
|
|
* /enum enum drx_no_carrier_option * setting for carrier, mute/noise.
|
|
*
|
|
*/
|
|
enum drx_no_carrier_option {
|
|
DRX_NO_CARRIER_MUTE,
|
|
DRX_NO_CARRIER_NOISE
|
|
};
|
|
|
|
/**
|
|
* \enum DRXAudAutoSound_t
|
|
* \brief Automatic Sound
|
|
*/
|
|
enum drx_cfg_aud_auto_sound {
|
|
DRX_AUD_AUTO_SOUND_OFF = 0,
|
|
DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON,
|
|
DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_OFF
|
|
};
|
|
|
|
/**
|
|
* \enum DRXAudASSThres_t
|
|
* \brief Automatic Sound Select Thresholds
|
|
*/
|
|
struct drx_cfg_aud_ass_thres {
|
|
u16 a2; /* A2 Threshold for ASS configuration */
|
|
u16 btsc; /* BTSC Threshold for ASS configuration */
|
|
u16 nicam; /* Nicam Threshold for ASS configuration */
|
|
};
|
|
|
|
/**
|
|
* \struct struct drx_aud_carrier * \brief Carrier detection related parameters
|
|
*/
|
|
struct drx_aud_carrier {
|
|
u16 thres; /* carrier detetcion threshold for primary carrier (A) */
|
|
enum drx_no_carrier_option opt; /* Mute or noise at no carrier detection (A) */
|
|
s32 shift; /* DC level of incoming signal (A) */
|
|
s32 dco; /* frequency adjustment (A) */
|
|
};
|
|
|
|
/**
|
|
* \struct struct drx_cfg_aud_carriers * \brief combining carrier A & B to one struct
|
|
*/
|
|
struct drx_cfg_aud_carriers {
|
|
struct drx_aud_carrier a;
|
|
struct drx_aud_carrier b;
|
|
};
|
|
|
|
/**
|
|
* /enum enum drx_aud_i2s_src * Selection of audio source
|
|
*/
|
|
enum drx_aud_i2s_src {
|
|
DRX_AUD_SRC_MONO,
|
|
DRX_AUD_SRC_STEREO_OR_AB,
|
|
DRX_AUD_SRC_STEREO_OR_A,
|
|
DRX_AUD_SRC_STEREO_OR_B};
|
|
|
|
/**
|
|
* \enum enum drx_aud_i2s_matrix * \brief Used for selecting I2S output.
|
|
*/
|
|
enum drx_aud_i2s_matrix {
|
|
DRX_AUD_I2S_MATRIX_A_MONO,
|
|
/**< A sound only, stereo or mono */
|
|
DRX_AUD_I2S_MATRIX_B_MONO,
|
|
/**< B sound only, stereo or mono */
|
|
DRX_AUD_I2S_MATRIX_STEREO,
|
|
/**< A+B sound, transparant */
|
|
DRX_AUD_I2S_MATRIX_MONO /**< A+B mixed to mono sum, (L+R)/2 */};
|
|
|
|
/**
|
|
* /enum enum drx_aud_fm_matrix * setting for FM-Matrix in audio demodulator.
|
|
*
|
|
*/
|
|
enum drx_aud_fm_matrix {
|
|
DRX_AUD_FM_MATRIX_NO_MATRIX,
|
|
DRX_AUD_FM_MATRIX_GERMAN,
|
|
DRX_AUD_FM_MATRIX_KOREAN,
|
|
DRX_AUD_FM_MATRIX_SOUND_A,
|
|
DRX_AUD_FM_MATRIX_SOUND_B};
|
|
|
|
/**
|
|
* \struct DRXAudMatrices_t
|
|
* \brief Mixer settings
|
|
*/
|
|
struct drx_cfg_aud_mixer {
|
|
enum drx_aud_i2s_src source_i2s;
|
|
enum drx_aud_i2s_matrix matrix_i2s;
|
|
enum drx_aud_fm_matrix matrix_fm;
|
|
};
|
|
|
|
/**
|
|
* \enum DRXI2SVidSync_t
|
|
* \brief Audio/video synchronization, interacts with I2S mode.
|
|
* AUTO_1 and AUTO_2 are for automatic video standard detection with preference
|
|
* for NTSC or Monochrome, because the frequencies are too close (59.94 & 60 Hz)
|
|
*/
|
|
enum drx_cfg_aud_av_sync {
|
|
DRX_AUD_AVSYNC_OFF,/**< audio/video synchronization is off */
|
|
DRX_AUD_AVSYNC_NTSC,
|
|
/**< it is an NTSC system */
|
|
DRX_AUD_AVSYNC_MONOCHROME,
|
|
/**< it is a MONOCHROME system */
|
|
DRX_AUD_AVSYNC_PAL_SECAM
|
|
/**< it is a PAL/SECAM system */};
|
|
|
|
/**
|
|
* \struct struct drx_cfg_aud_prescale * \brief Prescalers
|
|
*/
|
|
struct drx_cfg_aud_prescale {
|
|
u16 fm_deviation;
|
|
s16 nicam_gain;
|
|
};
|
|
|
|
/**
|
|
* \struct struct drx_aud_beep * \brief Beep
|
|
*/
|
|
struct drx_aud_beep {
|
|
s16 volume; /* dB */
|
|
u16 frequency; /* Hz */
|
|
bool mute;
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_aud_btsc_detect * \brief BTSC detetcion mode
|
|
*/
|
|
enum drx_aud_btsc_detect {
|
|
DRX_BTSC_STEREO,
|
|
DRX_BTSC_MONO_AND_SAP};
|
|
|
|
/**
|
|
* \struct struct drx_aud_data * \brief Audio data structure
|
|
*/
|
|
struct drx_aud_data {
|
|
/* audio storage */
|
|
bool audio_is_active;
|
|
enum drx_aud_standard audio_standard;
|
|
struct drx_cfg_i2s_output i2sdata;
|
|
struct drx_cfg_aud_volume volume;
|
|
enum drx_cfg_aud_auto_sound auto_sound;
|
|
struct drx_cfg_aud_ass_thres ass_thresholds;
|
|
struct drx_cfg_aud_carriers carriers;
|
|
struct drx_cfg_aud_mixer mixer;
|
|
enum drx_cfg_aud_deviation deviation;
|
|
enum drx_cfg_aud_av_sync av_sync;
|
|
struct drx_cfg_aud_prescale prescale;
|
|
enum drx_aud_fm_deemphasis deemph;
|
|
enum drx_aud_btsc_detect btsc_detect;
|
|
/* rds */
|
|
u16 rds_data_counter;
|
|
bool rds_data_present;
|
|
};
|
|
|
|
/**
|
|
* \enum enum drx_qam_lock_range * \brief QAM lock range mode
|
|
*/
|
|
enum drx_qam_lock_range {
|
|
DRX_QAM_LOCKRANGE_NORMAL,
|
|
DRX_QAM_LOCKRANGE_EXTENDED};
|
|
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
/*== Data access structures ==================================================*/
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
|
|
/* Address on device */
|
|
typedef u32 dr_xaddr_t, *pdr_xaddr_t;
|
|
|
|
/* Protocol specific flags */
|
|
typedef u32 dr_xflags_t, *pdr_xflags_t;
|
|
|
|
/* Write block of data to device */
|
|
typedef int(*drx_write_block_func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u16 datasize, /* size of data in bytes */
|
|
u8 *data, /* data to send */
|
|
u32 flags);
|
|
|
|
/* Read block of data from device */
|
|
typedef int(*drx_read_block_func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u16 datasize, /* size of data in bytes */
|
|
u8 *data, /* receive buffer */
|
|
u32 flags);
|
|
|
|
/* Write 8-bits value to device */
|
|
typedef int(*drx_write_reg8func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u8 data, /* data to send */
|
|
u32 flags);
|
|
|
|
/* Read 8-bits value to device */
|
|
typedef int(*drx_read_reg8func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u8 *data, /* receive buffer */
|
|
u32 flags);
|
|
|
|
/* Read modify write 8-bits value to device */
|
|
typedef int(*drx_read_modify_write_reg8func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 waddr, /* write address of register */
|
|
u32 raddr, /* read address of register */
|
|
u8 wdata, /* data to write */
|
|
u8 *rdata); /* data to read */
|
|
|
|
/* Write 16-bits value to device */
|
|
typedef int(*drx_write_reg16func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u16 data, /* data to send */
|
|
u32 flags);
|
|
|
|
/* Read 16-bits value to device */
|
|
typedef int(*drx_read_reg16func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u16 *data, /* receive buffer */
|
|
u32 flags);
|
|
|
|
/* Read modify write 16-bits value to device */
|
|
typedef int(*drx_read_modify_write_reg16func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 waddr, /* write address of register */
|
|
u32 raddr, /* read address of register */
|
|
u16 wdata, /* data to write */
|
|
u16 *rdata); /* data to read */
|
|
|
|
/* Write 32-bits value to device */
|
|
typedef int(*drx_write_reg32func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u32 data, /* data to send */
|
|
u32 flags);
|
|
|
|
/* Read 32-bits value to device */
|
|
typedef int(*drx_read_reg32func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 addr, /* address of register/memory */
|
|
u32 *data, /* receive buffer */
|
|
u32 flags);
|
|
|
|
/* Read modify write 32-bits value to device */
|
|
typedef int(*drx_read_modify_write_reg32func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */
|
|
u32 waddr, /* write address of register */
|
|
u32 raddr, /* read address of register */
|
|
u32 wdata, /* data to write */
|
|
u32 *rdata); /* data to read */
|
|
|
|
/**
|
|
* \struct struct drx_access_func * \brief Interface to an access protocol.
|
|
*/
|
|
struct drx_access_func {
|
|
drx_write_block_func_t write_block_func;
|
|
drx_read_block_func_t read_block_func;
|
|
drx_write_reg8func_t write_reg8func;
|
|
drx_read_reg8func_t read_reg8func;
|
|
drx_read_modify_write_reg8func_t read_modify_write_reg8func;
|
|
drx_write_reg16func_t write_reg16func;
|
|
drx_read_reg16func_t read_reg16func;
|
|
drx_read_modify_write_reg16func_t read_modify_write_reg16func;
|
|
drx_write_reg32func_t write_reg32func;
|
|
drx_read_reg32func_t read_reg32func;
|
|
drx_read_modify_write_reg32func_t read_modify_write_reg32func;
|
|
};
|
|
|
|
/* Register address and data for register dump function */
|
|
struct drx_reg_dump {
|
|
u32 address;
|
|
u32 data;
|
|
};
|
|
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
/*== Demod instance data structures ==========================================*/
|
|
/*============================================================================*/
|
|
/*============================================================================*/
|
|
|
|
/**
|
|
* \struct struct drx_common_attr * \brief Set of common attributes, shared by all DRX devices.
|
|
*/
|
|
struct drx_common_attr {
|
|
/* Microcode (firmware) attributes */
|
|
char *microcode_file; /**< microcode filename */
|
|
bool verify_microcode;
|
|
/**< Use microcode verify or not. */
|
|
struct drx_mc_version_rec mcversion;
|
|
/**< Version record of microcode from file */
|
|
|
|
/* Clocks and tuner attributes */
|
|
s32 intermediate_freq;
|
|
/**< IF,if tuner instance not used. (kHz)*/
|
|
s32 sys_clock_freq;
|
|
/**< Systemclock frequency. (kHz) */
|
|
s32 osc_clock_freq;
|
|
/**< Oscillator clock frequency. (kHz) */
|
|
s16 osc_clock_deviation;
|
|
/**< Oscillator clock deviation. (ppm) */
|
|
bool mirror_freq_spect;
|
|
/**< Mirror IF frequency spectrum or not.*/
|
|
|
|
/* Initial MPEG output attributes */
|
|
struct drx_cfg_mpeg_output mpeg_cfg;
|
|
/**< MPEG configuration */
|
|
|
|
bool is_opened; /**< if true instance is already opened. */
|
|
|
|
/* Channel scan */
|
|
struct drx_scan_param *scan_param;
|
|
/**< scan parameters */
|
|
u16 scan_freq_plan_index;
|
|
/**< next index in freq plan */
|
|
s32 scan_next_frequency;
|
|
/**< next freq to scan */
|
|
bool scan_ready; /**< scan ready flag */
|
|
u32 scan_max_channels;/**< number of channels in freqplan */
|
|
u32 scan_channels_scanned;
|
|
/**< number of channels scanned */
|
|
/* Channel scan - inner loop: demod related */
|
|
drx_scan_func_t scan_function;
|
|
/**< function to check channel */
|
|
/* Channel scan - inner loop: SYSObj related */
|
|
void *scan_context; /**< Context Pointer of SYSObj */
|
|
/* Channel scan - parameters for default DTV scan function in core driver */
|
|
u16 scan_demod_lock_timeout;
|
|
/**< millisecs to wait for lock */
|
|
enum drx_lock_status scan_desired_lock;
|
|
/**< lock requirement for channel found */
|
|
/* scan_active can be used by SetChannel to decide how to program the tuner,
|
|
fast or slow (but stable). Usually fast during scan. */
|
|
bool scan_active; /**< true when scan routines are active */
|
|
|
|
/* Power management */
|
|
enum drx_power_mode current_power_mode;
|
|
/**< current power management mode */
|
|
|
|
/* Tuner */
|
|
u8 tuner_port_nr; /**< nr of I2C port to wich tuner is */
|
|
s32 tuner_min_freq_rf;
|
|
/**< minimum RF input frequency, in kHz */
|
|
s32 tuner_max_freq_rf;
|
|
/**< maximum RF input frequency, in kHz */
|
|
bool tuner_rf_agc_pol; /**< if true invert RF AGC polarity */
|
|
bool tuner_if_agc_pol; /**< if true invert IF AGC polarity */
|
|
bool tuner_slow_mode; /**< if true invert IF AGC polarity */
|
|
|
|
struct drx_channel current_channel;
|
|
/**< current channel parameters */
|
|
enum drx_standard current_standard;
|
|
/**< current standard selection */
|
|
enum drx_standard prev_standard;
|
|
/**< previous standard selection */
|
|
enum drx_standard di_cache_standard;
|
|
/**< standard in DI cache if available */
|
|
bool use_bootloader; /**< use bootloader in open */
|
|
u32 capabilities; /**< capabilities flags */
|
|
u32 product_id; /**< product ID inc. metal fix number */};
|
|
|
|
/*
|
|
* Generic functions for DRX devices.
|
|
*/
|
|
|
|
struct drx_demod_instance;
|
|
|
|
/**
|
|
* \struct struct drx_demod_instance * \brief Top structure of demodulator instance.
|
|
*/
|
|
struct drx_demod_instance {
|
|
/**< data access protocol functions */
|
|
struct i2c_device_addr *my_i2c_dev_addr;
|
|
/**< i2c address and device identifier */
|
|
struct drx_common_attr *my_common_attr;
|
|
/**< common DRX attributes */
|
|
void *my_ext_attr; /**< device specific attributes */
|
|
/* generic demodulator data */
|
|
|
|
struct i2c_adapter *i2c;
|
|
const struct firmware *firmware;
|
|
};
|
|
|
|
/*-------------------------------------------------------------------------
|
|
MACROS
|
|
Conversion from enum values to human readable form.
|
|
-------------------------------------------------------------------------*/
|
|
|
|
/* standard */
|
|
|
|
#define DRX_STR_STANDARD(x) ( \
|
|
(x == DRX_STANDARD_DVBT) ? "DVB-T" : \
|
|
(x == DRX_STANDARD_8VSB) ? "8VSB" : \
|
|
(x == DRX_STANDARD_NTSC) ? "NTSC" : \
|
|
(x == DRX_STANDARD_PAL_SECAM_BG) ? "PAL/SECAM B/G" : \
|
|
(x == DRX_STANDARD_PAL_SECAM_DK) ? "PAL/SECAM D/K" : \
|
|
(x == DRX_STANDARD_PAL_SECAM_I) ? "PAL/SECAM I" : \
|
|
(x == DRX_STANDARD_PAL_SECAM_L) ? "PAL/SECAM L" : \
|
|
(x == DRX_STANDARD_PAL_SECAM_LP) ? "PAL/SECAM LP" : \
|
|
(x == DRX_STANDARD_ITU_A) ? "ITU-A" : \
|
|
(x == DRX_STANDARD_ITU_B) ? "ITU-B" : \
|
|
(x == DRX_STANDARD_ITU_C) ? "ITU-C" : \
|
|
(x == DRX_STANDARD_ITU_D) ? "ITU-D" : \
|
|
(x == DRX_STANDARD_FM) ? "FM" : \
|
|
(x == DRX_STANDARD_DTMB) ? "DTMB" : \
|
|
(x == DRX_STANDARD_AUTO) ? "Auto" : \
|
|
(x == DRX_STANDARD_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
|
|
/* channel */
|
|
|
|
#define DRX_STR_BANDWIDTH(x) ( \
|
|
(x == DRX_BANDWIDTH_8MHZ) ? "8 MHz" : \
|
|
(x == DRX_BANDWIDTH_7MHZ) ? "7 MHz" : \
|
|
(x == DRX_BANDWIDTH_6MHZ) ? "6 MHz" : \
|
|
(x == DRX_BANDWIDTH_AUTO) ? "Auto" : \
|
|
(x == DRX_BANDWIDTH_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_FFTMODE(x) ( \
|
|
(x == DRX_FFTMODE_2K) ? "2k" : \
|
|
(x == DRX_FFTMODE_4K) ? "4k" : \
|
|
(x == DRX_FFTMODE_8K) ? "8k" : \
|
|
(x == DRX_FFTMODE_AUTO) ? "Auto" : \
|
|
(x == DRX_FFTMODE_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_GUARD(x) ( \
|
|
(x == DRX_GUARD_1DIV32) ? "1/32nd" : \
|
|
(x == DRX_GUARD_1DIV16) ? "1/16th" : \
|
|
(x == DRX_GUARD_1DIV8) ? "1/8th" : \
|
|
(x == DRX_GUARD_1DIV4) ? "1/4th" : \
|
|
(x == DRX_GUARD_AUTO) ? "Auto" : \
|
|
(x == DRX_GUARD_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_CONSTELLATION(x) ( \
|
|
(x == DRX_CONSTELLATION_BPSK) ? "BPSK" : \
|
|
(x == DRX_CONSTELLATION_QPSK) ? "QPSK" : \
|
|
(x == DRX_CONSTELLATION_PSK8) ? "PSK8" : \
|
|
(x == DRX_CONSTELLATION_QAM16) ? "QAM16" : \
|
|
(x == DRX_CONSTELLATION_QAM32) ? "QAM32" : \
|
|
(x == DRX_CONSTELLATION_QAM64) ? "QAM64" : \
|
|
(x == DRX_CONSTELLATION_QAM128) ? "QAM128" : \
|
|
(x == DRX_CONSTELLATION_QAM256) ? "QAM256" : \
|
|
(x == DRX_CONSTELLATION_QAM512) ? "QAM512" : \
|
|
(x == DRX_CONSTELLATION_QAM1024) ? "QAM1024" : \
|
|
(x == DRX_CONSTELLATION_QPSK_NR) ? "QPSK_NR" : \
|
|
(x == DRX_CONSTELLATION_AUTO) ? "Auto" : \
|
|
(x == DRX_CONSTELLATION_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_CODERATE(x) ( \
|
|
(x == DRX_CODERATE_1DIV2) ? "1/2nd" : \
|
|
(x == DRX_CODERATE_2DIV3) ? "2/3rd" : \
|
|
(x == DRX_CODERATE_3DIV4) ? "3/4th" : \
|
|
(x == DRX_CODERATE_5DIV6) ? "5/6th" : \
|
|
(x == DRX_CODERATE_7DIV8) ? "7/8th" : \
|
|
(x == DRX_CODERATE_AUTO) ? "Auto" : \
|
|
(x == DRX_CODERATE_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_HIERARCHY(x) ( \
|
|
(x == DRX_HIERARCHY_NONE) ? "None" : \
|
|
(x == DRX_HIERARCHY_ALPHA1) ? "Alpha=1" : \
|
|
(x == DRX_HIERARCHY_ALPHA2) ? "Alpha=2" : \
|
|
(x == DRX_HIERARCHY_ALPHA4) ? "Alpha=4" : \
|
|
(x == DRX_HIERARCHY_AUTO) ? "Auto" : \
|
|
(x == DRX_HIERARCHY_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_PRIORITY(x) ( \
|
|
(x == DRX_PRIORITY_LOW) ? "Low" : \
|
|
(x == DRX_PRIORITY_HIGH) ? "High" : \
|
|
(x == DRX_PRIORITY_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_MIRROR(x) ( \
|
|
(x == DRX_MIRROR_NO) ? "Normal" : \
|
|
(x == DRX_MIRROR_YES) ? "Mirrored" : \
|
|
(x == DRX_MIRROR_AUTO) ? "Auto" : \
|
|
(x == DRX_MIRROR_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_CLASSIFICATION(x) ( \
|
|
(x == DRX_CLASSIFICATION_GAUSS) ? "Gaussion" : \
|
|
(x == DRX_CLASSIFICATION_HVY_GAUSS) ? "Heavy Gaussion" : \
|
|
(x == DRX_CLASSIFICATION_COCHANNEL) ? "Co-channel" : \
|
|
(x == DRX_CLASSIFICATION_STATIC) ? "Static echo" : \
|
|
(x == DRX_CLASSIFICATION_MOVING) ? "Moving echo" : \
|
|
(x == DRX_CLASSIFICATION_ZERODB) ? "Zero dB echo" : \
|
|
(x == DRX_CLASSIFICATION_UNKNOWN) ? "Unknown" : \
|
|
(x == DRX_CLASSIFICATION_AUTO) ? "Auto" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_INTERLEAVEMODE(x) ( \
|
|
(x == DRX_INTERLEAVEMODE_I128_J1) ? "I128_J1" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J1_V2) ? "I128_J1_V2" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J2) ? "I128_J2" : \
|
|
(x == DRX_INTERLEAVEMODE_I64_J2) ? "I64_J2" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J3) ? "I128_J3" : \
|
|
(x == DRX_INTERLEAVEMODE_I32_J4) ? "I32_J4" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J4) ? "I128_J4" : \
|
|
(x == DRX_INTERLEAVEMODE_I16_J8) ? "I16_J8" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J5) ? "I128_J5" : \
|
|
(x == DRX_INTERLEAVEMODE_I8_J16) ? "I8_J16" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J6) ? "I128_J6" : \
|
|
(x == DRX_INTERLEAVEMODE_RESERVED_11) ? "Reserved 11" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J7) ? "I128_J7" : \
|
|
(x == DRX_INTERLEAVEMODE_RESERVED_13) ? "Reserved 13" : \
|
|
(x == DRX_INTERLEAVEMODE_I128_J8) ? "I128_J8" : \
|
|
(x == DRX_INTERLEAVEMODE_RESERVED_15) ? "Reserved 15" : \
|
|
(x == DRX_INTERLEAVEMODE_I12_J17) ? "I12_J17" : \
|
|
(x == DRX_INTERLEAVEMODE_I5_J4) ? "I5_J4" : \
|
|
(x == DRX_INTERLEAVEMODE_B52_M240) ? "B52_M240" : \
|
|
(x == DRX_INTERLEAVEMODE_B52_M720) ? "B52_M720" : \
|
|
(x == DRX_INTERLEAVEMODE_B52_M48) ? "B52_M48" : \
|
|
(x == DRX_INTERLEAVEMODE_B52_M0) ? "B52_M0" : \
|
|
(x == DRX_INTERLEAVEMODE_UNKNOWN) ? "Unknown" : \
|
|
(x == DRX_INTERLEAVEMODE_AUTO) ? "Auto" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_LDPC(x) ( \
|
|
(x == DRX_LDPC_0_4) ? "0.4" : \
|
|
(x == DRX_LDPC_0_6) ? "0.6" : \
|
|
(x == DRX_LDPC_0_8) ? "0.8" : \
|
|
(x == DRX_LDPC_AUTO) ? "Auto" : \
|
|
(x == DRX_LDPC_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_CARRIER(x) ( \
|
|
(x == DRX_CARRIER_MULTI) ? "Multi" : \
|
|
(x == DRX_CARRIER_SINGLE) ? "Single" : \
|
|
(x == DRX_CARRIER_AUTO) ? "Auto" : \
|
|
(x == DRX_CARRIER_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_FRAMEMODE(x) ( \
|
|
(x == DRX_FRAMEMODE_420) ? "420" : \
|
|
(x == DRX_FRAMEMODE_595) ? "595" : \
|
|
(x == DRX_FRAMEMODE_945) ? "945" : \
|
|
(x == DRX_FRAMEMODE_420_FIXED_PN) ? "420 with fixed PN" : \
|
|
(x == DRX_FRAMEMODE_945_FIXED_PN) ? "945 with fixed PN" : \
|
|
(x == DRX_FRAMEMODE_AUTO) ? "Auto" : \
|
|
(x == DRX_FRAMEMODE_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_PILOT(x) ( \
|
|
(x == DRX_PILOT_ON) ? "On" : \
|
|
(x == DRX_PILOT_OFF) ? "Off" : \
|
|
(x == DRX_PILOT_AUTO) ? "Auto" : \
|
|
(x == DRX_PILOT_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
/* TPS */
|
|
|
|
#define DRX_STR_TPS_FRAME(x) ( \
|
|
(x == DRX_TPS_FRAME1) ? "Frame1" : \
|
|
(x == DRX_TPS_FRAME2) ? "Frame2" : \
|
|
(x == DRX_TPS_FRAME3) ? "Frame3" : \
|
|
(x == DRX_TPS_FRAME4) ? "Frame4" : \
|
|
(x == DRX_TPS_FRAME_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
|
|
/* lock status */
|
|
|
|
#define DRX_STR_LOCKSTATUS(x) ( \
|
|
(x == DRX_NEVER_LOCK) ? "Never" : \
|
|
(x == DRX_NOT_LOCKED) ? "No" : \
|
|
(x == DRX_LOCKED) ? "Locked" : \
|
|
(x == DRX_LOCK_STATE_1) ? "Lock state 1" : \
|
|
(x == DRX_LOCK_STATE_2) ? "Lock state 2" : \
|
|
(x == DRX_LOCK_STATE_3) ? "Lock state 3" : \
|
|
(x == DRX_LOCK_STATE_4) ? "Lock state 4" : \
|
|
(x == DRX_LOCK_STATE_5) ? "Lock state 5" : \
|
|
(x == DRX_LOCK_STATE_6) ? "Lock state 6" : \
|
|
(x == DRX_LOCK_STATE_7) ? "Lock state 7" : \
|
|
(x == DRX_LOCK_STATE_8) ? "Lock state 8" : \
|
|
(x == DRX_LOCK_STATE_9) ? "Lock state 9" : \
|
|
"(Invalid)")
|
|
|
|
/* version information , modules */
|
|
#define DRX_STR_MODULE(x) ( \
|
|
(x == DRX_MODULE_DEVICE) ? "Device" : \
|
|
(x == DRX_MODULE_MICROCODE) ? "Microcode" : \
|
|
(x == DRX_MODULE_DRIVERCORE) ? "CoreDriver" : \
|
|
(x == DRX_MODULE_DEVICEDRIVER) ? "DeviceDriver" : \
|
|
(x == DRX_MODULE_BSP_I2C) ? "BSP I2C" : \
|
|
(x == DRX_MODULE_BSP_TUNER) ? "BSP Tuner" : \
|
|
(x == DRX_MODULE_BSP_HOST) ? "BSP Host" : \
|
|
(x == DRX_MODULE_DAP) ? "Data Access Protocol" : \
|
|
(x == DRX_MODULE_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_POWER_MODE(x) ( \
|
|
(x == DRX_POWER_UP) ? "DRX_POWER_UP " : \
|
|
(x == DRX_POWER_MODE_1) ? "DRX_POWER_MODE_1" : \
|
|
(x == DRX_POWER_MODE_2) ? "DRX_POWER_MODE_2" : \
|
|
(x == DRX_POWER_MODE_3) ? "DRX_POWER_MODE_3" : \
|
|
(x == DRX_POWER_MODE_4) ? "DRX_POWER_MODE_4" : \
|
|
(x == DRX_POWER_MODE_5) ? "DRX_POWER_MODE_5" : \
|
|
(x == DRX_POWER_MODE_6) ? "DRX_POWER_MODE_6" : \
|
|
(x == DRX_POWER_MODE_7) ? "DRX_POWER_MODE_7" : \
|
|
(x == DRX_POWER_MODE_8) ? "DRX_POWER_MODE_8" : \
|
|
(x == DRX_POWER_MODE_9) ? "DRX_POWER_MODE_9" : \
|
|
(x == DRX_POWER_MODE_10) ? "DRX_POWER_MODE_10" : \
|
|
(x == DRX_POWER_MODE_11) ? "DRX_POWER_MODE_11" : \
|
|
(x == DRX_POWER_MODE_12) ? "DRX_POWER_MODE_12" : \
|
|
(x == DRX_POWER_MODE_13) ? "DRX_POWER_MODE_13" : \
|
|
(x == DRX_POWER_MODE_14) ? "DRX_POWER_MODE_14" : \
|
|
(x == DRX_POWER_MODE_15) ? "DRX_POWER_MODE_15" : \
|
|
(x == DRX_POWER_MODE_16) ? "DRX_POWER_MODE_16" : \
|
|
(x == DRX_POWER_DOWN) ? "DRX_POWER_DOWN " : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_OOB_STANDARD(x) ( \
|
|
(x == DRX_OOB_MODE_A) ? "ANSI 55-1 " : \
|
|
(x == DRX_OOB_MODE_B_GRADE_A) ? "ANSI 55-2 A" : \
|
|
(x == DRX_OOB_MODE_B_GRADE_B) ? "ANSI 55-2 B" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_AUD_STANDARD(x) ( \
|
|
(x == DRX_AUD_STANDARD_BTSC) ? "BTSC" : \
|
|
(x == DRX_AUD_STANDARD_A2) ? "A2" : \
|
|
(x == DRX_AUD_STANDARD_EIAJ) ? "EIAJ" : \
|
|
(x == DRX_AUD_STANDARD_FM_STEREO) ? "FM Stereo" : \
|
|
(x == DRX_AUD_STANDARD_AUTO) ? "Auto" : \
|
|
(x == DRX_AUD_STANDARD_M_MONO) ? "M-Standard Mono" : \
|
|
(x == DRX_AUD_STANDARD_D_K_MONO) ? "D/K Mono FM" : \
|
|
(x == DRX_AUD_STANDARD_BG_FM) ? "B/G-Dual Carrier FM (A2)" : \
|
|
(x == DRX_AUD_STANDARD_D_K1) ? "D/K1-Dual Carrier FM" : \
|
|
(x == DRX_AUD_STANDARD_D_K2) ? "D/K2-Dual Carrier FM" : \
|
|
(x == DRX_AUD_STANDARD_D_K3) ? "D/K3-Dual Carrier FM" : \
|
|
(x == DRX_AUD_STANDARD_BG_NICAM_FM) ? "B/G-NICAM-FM" : \
|
|
(x == DRX_AUD_STANDARD_L_NICAM_AM) ? "L-NICAM-AM" : \
|
|
(x == DRX_AUD_STANDARD_I_NICAM_FM) ? "I-NICAM-FM" : \
|
|
(x == DRX_AUD_STANDARD_D_K_NICAM_FM) ? "D/K-NICAM-FM" : \
|
|
(x == DRX_AUD_STANDARD_UNKNOWN) ? "Unknown" : \
|
|
"(Invalid)")
|
|
#define DRX_STR_AUD_STEREO(x) ( \
|
|
(x == true) ? "Stereo" : \
|
|
(x == false) ? "Mono" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_AUD_SAP(x) ( \
|
|
(x == true) ? "Present" : \
|
|
(x == false) ? "Not present" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_AUD_CARRIER(x) ( \
|
|
(x == true) ? "Present" : \
|
|
(x == false) ? "Not present" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_AUD_RDS(x) ( \
|
|
(x == true) ? "Available" : \
|
|
(x == false) ? "Not Available" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_AUD_NICAM_STATUS(x) ( \
|
|
(x == DRX_AUD_NICAM_DETECTED) ? "Detected" : \
|
|
(x == DRX_AUD_NICAM_NOT_DETECTED) ? "Not detected" : \
|
|
(x == DRX_AUD_NICAM_BAD) ? "Bad" : \
|
|
"(Invalid)")
|
|
|
|
#define DRX_STR_RDS_VALID(x) ( \
|
|
(x == true) ? "Valid" : \
|
|
(x == false) ? "Not Valid" : \
|
|
"(Invalid)")
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Access macros
|
|
-------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* \brief Create a compilable reference to the microcode attribute
|
|
* \param d pointer to demod instance
|
|
*
|
|
* Used as main reference to an attribute field.
|
|
* Used by both macro implementation and function implementation.
|
|
* These macros are defined to avoid duplication of code in macro and function
|
|
* definitions that handle access of demod common or extended attributes.
|
|
*
|
|
*/
|
|
|
|
#define DRX_ATTR_MCRECORD(d) ((d)->my_common_attr->mcversion)
|
|
#define DRX_ATTR_MIRRORFREQSPECT(d) ((d)->my_common_attr->mirror_freq_spect)
|
|
#define DRX_ATTR_CURRENTPOWERMODE(d)((d)->my_common_attr->current_power_mode)
|
|
#define DRX_ATTR_ISOPENED(d) ((d)->my_common_attr->is_opened)
|
|
#define DRX_ATTR_USEBOOTLOADER(d) ((d)->my_common_attr->use_bootloader)
|
|
#define DRX_ATTR_CURRENTSTANDARD(d) ((d)->my_common_attr->current_standard)
|
|
#define DRX_ATTR_PREVSTANDARD(d) ((d)->my_common_attr->prev_standard)
|
|
#define DRX_ATTR_CACHESTANDARD(d) ((d)->my_common_attr->di_cache_standard)
|
|
#define DRX_ATTR_CURRENTCHANNEL(d) ((d)->my_common_attr->current_channel)
|
|
#define DRX_ATTR_MICROCODE(d) ((d)->my_common_attr->microcode)
|
|
#define DRX_ATTR_VERIFYMICROCODE(d) ((d)->my_common_attr->verify_microcode)
|
|
#define DRX_ATTR_CAPABILITIES(d) ((d)->my_common_attr->capabilities)
|
|
#define DRX_ATTR_PRODUCTID(d) ((d)->my_common_attr->product_id)
|
|
#define DRX_ATTR_INTERMEDIATEFREQ(d) ((d)->my_common_attr->intermediate_freq)
|
|
#define DRX_ATTR_SYSCLOCKFREQ(d) ((d)->my_common_attr->sys_clock_freq)
|
|
#define DRX_ATTR_TUNERRFAGCPOL(d) ((d)->my_common_attr->tuner_rf_agc_pol)
|
|
#define DRX_ATTR_TUNERIFAGCPOL(d) ((d)->my_common_attr->tuner_if_agc_pol)
|
|
#define DRX_ATTR_TUNERSLOWMODE(d) ((d)->my_common_attr->tuner_slow_mode)
|
|
#define DRX_ATTR_TUNERSPORTNR(d) ((d)->my_common_attr->tuner_port_nr)
|
|
#define DRX_ATTR_I2CADDR(d) ((d)->my_i2c_dev_addr->i2c_addr)
|
|
#define DRX_ATTR_I2CDEVID(d) ((d)->my_i2c_dev_addr->i2c_dev_id)
|
|
#define DRX_ISMCVERTYPE(x) ((x) == AUX_VER_RECORD)
|
|
|
|
/**************************/
|
|
|
|
/* Macros with device-specific handling are converted to CFG functions */
|
|
|
|
#define DRX_ACCESSMACRO_SET(demod, value, cfg_name, data_type) \
|
|
do { \
|
|
struct drx_cfg config; \
|
|
data_type cfg_data; \
|
|
config.cfg_type = cfg_name; \
|
|
config.cfg_data = &cfg_data; \
|
|
cfg_data = value; \
|
|
drx_ctrl(demod, DRX_CTRL_SET_CFG, &config); \
|
|
} while (0)
|
|
|
|
#define DRX_ACCESSMACRO_GET(demod, value, cfg_name, data_type, error_value) \
|
|
do { \
|
|
int cfg_status; \
|
|
struct drx_cfg config; \
|
|
data_type cfg_data; \
|
|
config.cfg_type = cfg_name; \
|
|
config.cfg_data = &cfg_data; \
|
|
cfg_status = drx_ctrl(demod, DRX_CTRL_GET_CFG, &config); \
|
|
if (cfg_status == 0) { \
|
|
value = cfg_data; \
|
|
} else { \
|
|
value = (data_type)error_value; \
|
|
} \
|
|
} while (0)
|
|
|
|
/* Configuration functions for usage by Access (XS) Macros */
|
|
|
|
#ifndef DRX_XS_CFG_BASE
|
|
#define DRX_XS_CFG_BASE (500)
|
|
#endif
|
|
|
|
#define DRX_XS_CFG_PRESET (DRX_XS_CFG_BASE + 0)
|
|
#define DRX_XS_CFG_AUD_BTSC_DETECT (DRX_XS_CFG_BASE + 1)
|
|
#define DRX_XS_CFG_QAM_LOCKRANGE (DRX_XS_CFG_BASE + 2)
|
|
|
|
/* Access Macros with device-specific handling */
|
|
|
|
#define DRX_SET_PRESET(d, x) \
|
|
DRX_ACCESSMACRO_SET((d), (x), DRX_XS_CFG_PRESET, char*)
|
|
#define DRX_GET_PRESET(d, x) \
|
|
DRX_ACCESSMACRO_GET((d), (x), DRX_XS_CFG_PRESET, char*, "ERROR")
|
|
|
|
#define DRX_SET_AUD_BTSC_DETECT(d, x) DRX_ACCESSMACRO_SET((d), (x), \
|
|
DRX_XS_CFG_AUD_BTSC_DETECT, enum drx_aud_btsc_detect)
|
|
#define DRX_GET_AUD_BTSC_DETECT(d, x) DRX_ACCESSMACRO_GET((d), (x), \
|
|
DRX_XS_CFG_AUD_BTSC_DETECT, enum drx_aud_btsc_detect, DRX_UNKNOWN)
|
|
|
|
#define DRX_SET_QAM_LOCKRANGE(d, x) DRX_ACCESSMACRO_SET((d), (x), \
|
|
DRX_XS_CFG_QAM_LOCKRANGE, enum drx_qam_lock_range)
|
|
#define DRX_GET_QAM_LOCKRANGE(d, x) DRX_ACCESSMACRO_GET((d), (x), \
|
|
DRX_XS_CFG_QAM_LOCKRANGE, enum drx_qam_lock_range, DRX_UNKNOWN)
|
|
|
|
/**
|
|
* \brief Macro to check if std is an ATV standard
|
|
* \retval true std is an ATV standard
|
|
* \retval false std is an ATV standard
|
|
*/
|
|
#define DRX_ISATVSTD(std) (((std) == DRX_STANDARD_PAL_SECAM_BG) || \
|
|
((std) == DRX_STANDARD_PAL_SECAM_DK) || \
|
|
((std) == DRX_STANDARD_PAL_SECAM_I) || \
|
|
((std) == DRX_STANDARD_PAL_SECAM_L) || \
|
|
((std) == DRX_STANDARD_PAL_SECAM_LP) || \
|
|
((std) == DRX_STANDARD_NTSC) || \
|
|
((std) == DRX_STANDARD_FM))
|
|
|
|
/**
|
|
* \brief Macro to check if std is an QAM standard
|
|
* \retval true std is an QAM standards
|
|
* \retval false std is an QAM standards
|
|
*/
|
|
#define DRX_ISQAMSTD(std) (((std) == DRX_STANDARD_ITU_A) || \
|
|
((std) == DRX_STANDARD_ITU_B) || \
|
|
((std) == DRX_STANDARD_ITU_C) || \
|
|
((std) == DRX_STANDARD_ITU_D))
|
|
|
|
/**
|
|
* \brief Macro to check if std is VSB standard
|
|
* \retval true std is VSB standard
|
|
* \retval false std is not VSB standard
|
|
*/
|
|
#define DRX_ISVSBSTD(std) ((std) == DRX_STANDARD_8VSB)
|
|
|
|
/**
|
|
* \brief Macro to check if std is DVBT standard
|
|
* \retval true std is DVBT standard
|
|
* \retval false std is not DVBT standard
|
|
*/
|
|
#define DRX_ISDVBTSTD(std) ((std) == DRX_STANDARD_DVBT)
|
|
|
|
/*-------------------------------------------------------------------------
|
|
THE END
|
|
-------------------------------------------------------------------------*/
|
|
#endif /* __DRXDRIVER_H__ */
|