1*4882a593Smuzhiyun 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc. 4*4882a593Smuzhiyun All rights reserved. 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun Redistribution and use in source and binary forms, with or without 7*4882a593Smuzhiyun modification, are permitted provided that the following conditions are met: 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun * Redistributions of source code must retain the above copyright notice, 10*4882a593Smuzhiyun this list of conditions and the following disclaimer. 11*4882a593Smuzhiyun * Redistributions in binary form must reproduce the above copyright notice, 12*4882a593Smuzhiyun this list of conditions and the following disclaimer in the documentation 13*4882a593Smuzhiyun and/or other materials provided with the distribution. 14*4882a593Smuzhiyun * Neither the name of Trident Microsystems nor Hauppauge Computer Works 15*4882a593Smuzhiyun nor the names of its contributors may be used to endorse or promote 16*4882a593Smuzhiyun products derived from this software without specific prior written 17*4882a593Smuzhiyun permission. 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*4882a593Smuzhiyun AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*4882a593Smuzhiyun IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*4882a593Smuzhiyun ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23*4882a593Smuzhiyun LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*4882a593Smuzhiyun CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*4882a593Smuzhiyun SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*4882a593Smuzhiyun INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*4882a593Smuzhiyun CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*4882a593Smuzhiyun ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*4882a593Smuzhiyun POSSIBILITY OF SUCH DAMAGE. 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun DRXJ specific header file 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun Authors: Dragan Savic, Milos Nikolic, Mihajlo Katona, Tao Ding, Paul Janssen 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifndef __DRXJ_H__ 37*4882a593Smuzhiyun #define __DRXJ_H__ 38*4882a593Smuzhiyun /*------------------------------------------------------------------------- 39*4882a593Smuzhiyun INCLUDES 40*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #include "drx_driver.h" 43*4882a593Smuzhiyun #include "drx_dap_fasi.h" 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Check DRX-J specific dap condition */ 46*4882a593Smuzhiyun /* Multi master mode and short addr format only will not work. 47*4882a593Smuzhiyun RMW, CRC reset, broadcast and switching back to single master mode 48*4882a593Smuzhiyun cannot be done with short addr only in multi master mode. */ 49*4882a593Smuzhiyun #if ((DRXDAP_SINGLE_MASTER == 0) && (DRXDAPFASI_LONG_ADDR_ALLOWED == 0)) 50*4882a593Smuzhiyun #error "Multi master mode and short addressing only is an illegal combination" 51*4882a593Smuzhiyun *; /* Generate a fatal compiler error to make sure it stops here, 52*4882a593Smuzhiyun this is necessary because not all compilers stop after a #error. */ 53*4882a593Smuzhiyun #endif 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /*------------------------------------------------------------------------- 56*4882a593Smuzhiyun TYPEDEFS 57*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 58*4882a593Smuzhiyun /*============================================================================*/ 59*4882a593Smuzhiyun /*============================================================================*/ 60*4882a593Smuzhiyun /*== code support ============================================================*/ 61*4882a593Smuzhiyun /*============================================================================*/ 62*4882a593Smuzhiyun /*============================================================================*/ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /*============================================================================*/ 65*4882a593Smuzhiyun /*============================================================================*/ 66*4882a593Smuzhiyun /*== SCU cmd if =============================================================*/ 67*4882a593Smuzhiyun /*============================================================================*/ 68*4882a593Smuzhiyun /*============================================================================*/ 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct drxjscu_cmd { 71*4882a593Smuzhiyun u16 command; 72*4882a593Smuzhiyun /*< Command number */ 73*4882a593Smuzhiyun u16 parameter_len; 74*4882a593Smuzhiyun /*< Data length in byte */ 75*4882a593Smuzhiyun u16 result_len; 76*4882a593Smuzhiyun /*< result length in byte */ 77*4882a593Smuzhiyun u16 *parameter; 78*4882a593Smuzhiyun /*< General purpous param */ 79*4882a593Smuzhiyun u16 *result; 80*4882a593Smuzhiyun /*< General purpous param */}; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /*============================================================================*/ 83*4882a593Smuzhiyun /*============================================================================*/ 84*4882a593Smuzhiyun /*== CTRL CFG related data structures ========================================*/ 85*4882a593Smuzhiyun /*============================================================================*/ 86*4882a593Smuzhiyun /*============================================================================*/ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* extra intermediate lock state for VSB,QAM,NTSC */ 89*4882a593Smuzhiyun #define DRXJ_DEMOD_LOCK (DRX_LOCK_STATE_1) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* OOB lock states */ 92*4882a593Smuzhiyun #define DRXJ_OOB_AGC_LOCK (DRX_LOCK_STATE_1) /* analog gain control lock */ 93*4882a593Smuzhiyun #define DRXJ_OOB_SYNC_LOCK (DRX_LOCK_STATE_2) /* digital gain control lock */ 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* Intermediate powermodes for DRXJ */ 96*4882a593Smuzhiyun #define DRXJ_POWER_DOWN_MAIN_PATH DRX_POWER_MODE_8 97*4882a593Smuzhiyun #define DRXJ_POWER_DOWN_CORE DRX_POWER_MODE_9 98*4882a593Smuzhiyun #define DRXJ_POWER_DOWN_PLL DRX_POWER_MODE_10 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* supstition for GPIO FNC mux */ 101*4882a593Smuzhiyun #define APP_O (0x0000) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /*#define DRX_CTRL_BASE (0x0000)*/ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define DRXJ_CTRL_CFG_BASE (0x1000) 106*4882a593Smuzhiyun enum drxj_cfg_type { 107*4882a593Smuzhiyun DRXJ_CFG_AGC_RF = DRXJ_CTRL_CFG_BASE, 108*4882a593Smuzhiyun DRXJ_CFG_AGC_IF, 109*4882a593Smuzhiyun DRXJ_CFG_AGC_INTERNAL, 110*4882a593Smuzhiyun DRXJ_CFG_PRE_SAW, 111*4882a593Smuzhiyun DRXJ_CFG_AFE_GAIN, 112*4882a593Smuzhiyun DRXJ_CFG_SYMBOL_CLK_OFFSET, 113*4882a593Smuzhiyun DRXJ_CFG_ACCUM_CR_RS_CW_ERR, 114*4882a593Smuzhiyun DRXJ_CFG_FEC_MERS_SEQ_COUNT, 115*4882a593Smuzhiyun DRXJ_CFG_OOB_MISC, 116*4882a593Smuzhiyun DRXJ_CFG_SMART_ANT, 117*4882a593Smuzhiyun DRXJ_CFG_OOB_PRE_SAW, 118*4882a593Smuzhiyun DRXJ_CFG_VSB_MISC, 119*4882a593Smuzhiyun DRXJ_CFG_RESET_PACKET_ERR, 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* ATV (FM) */ 122*4882a593Smuzhiyun DRXJ_CFG_ATV_OUTPUT, /* also for FM (SIF control) but not likely */ 123*4882a593Smuzhiyun DRXJ_CFG_ATV_MISC, 124*4882a593Smuzhiyun DRXJ_CFG_ATV_EQU_COEF, 125*4882a593Smuzhiyun DRXJ_CFG_ATV_AGC_STATUS, /* also for FM ( IF,RF, audioAGC ) */ 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun DRXJ_CFG_MPEG_OUTPUT_MISC, 128*4882a593Smuzhiyun DRXJ_CFG_HW_CFG, 129*4882a593Smuzhiyun DRXJ_CFG_OOB_LO_POW, 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun DRXJ_CFG_MAX /* dummy, never to be used */}; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* 134*4882a593Smuzhiyun * /struct enum drxj_cfg_smart_ant_io * smart antenna i/o. 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun enum drxj_cfg_smart_ant_io { 137*4882a593Smuzhiyun DRXJ_SMT_ANT_OUTPUT = 0, 138*4882a593Smuzhiyun DRXJ_SMT_ANT_INPUT 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* 142*4882a593Smuzhiyun * /struct struct drxj_cfg_smart_ant * Set smart antenna. 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun struct drxj_cfg_smart_ant { 145*4882a593Smuzhiyun enum drxj_cfg_smart_ant_io io; 146*4882a593Smuzhiyun u16 ctrl_data; 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* 150*4882a593Smuzhiyun * /struct DRXJAGCSTATUS_t 151*4882a593Smuzhiyun * AGC status information from the DRXJ-IQM-AF. 152*4882a593Smuzhiyun */ 153*4882a593Smuzhiyun struct drxj_agc_status { 154*4882a593Smuzhiyun u16 IFAGC; 155*4882a593Smuzhiyun u16 RFAGC; 156*4882a593Smuzhiyun u16 digital_agc; 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* DRXJ_CFG_AGC_RF, DRXJ_CFG_AGC_IF */ 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* 162*4882a593Smuzhiyun * /struct enum drxj_agc_ctrl_mode * Available AGCs modes in the DRXJ. 163*4882a593Smuzhiyun */ 164*4882a593Smuzhiyun enum drxj_agc_ctrl_mode { 165*4882a593Smuzhiyun DRX_AGC_CTRL_AUTO = 0, 166*4882a593Smuzhiyun DRX_AGC_CTRL_USER, 167*4882a593Smuzhiyun DRX_AGC_CTRL_OFF}; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* 170*4882a593Smuzhiyun * /struct struct drxj_cfg_agc * Generic interface for all AGCs present on the DRXJ. 171*4882a593Smuzhiyun */ 172*4882a593Smuzhiyun struct drxj_cfg_agc { 173*4882a593Smuzhiyun enum drx_standard standard; /* standard for which these settings apply */ 174*4882a593Smuzhiyun enum drxj_agc_ctrl_mode ctrl_mode; /* off, user, auto */ 175*4882a593Smuzhiyun u16 output_level; /* range dependent on AGC */ 176*4882a593Smuzhiyun u16 min_output_level; /* range dependent on AGC */ 177*4882a593Smuzhiyun u16 max_output_level; /* range dependent on AGC */ 178*4882a593Smuzhiyun u16 speed; /* range dependent on AGC */ 179*4882a593Smuzhiyun u16 top; /* rf-agc take over point */ 180*4882a593Smuzhiyun u16 cut_off_current; /* rf-agc is accelerated if output current 181*4882a593Smuzhiyun is below cut-off current */}; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* DRXJ_CFG_PRE_SAW */ 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* 186*4882a593Smuzhiyun * /struct struct drxj_cfg_pre_saw * Interface to configure pre SAW sense. 187*4882a593Smuzhiyun */ 188*4882a593Smuzhiyun struct drxj_cfg_pre_saw { 189*4882a593Smuzhiyun enum drx_standard standard; /* standard to which these settings apply */ 190*4882a593Smuzhiyun u16 reference; /* pre SAW reference value, range 0 .. 31 */ 191*4882a593Smuzhiyun bool use_pre_saw; /* true algorithms must use pre SAW sense */}; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* DRXJ_CFG_AFE_GAIN */ 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /* 196*4882a593Smuzhiyun * /struct struct drxj_cfg_afe_gain * Interface to configure gain of AFE (LNA + PGA). 197*4882a593Smuzhiyun */ 198*4882a593Smuzhiyun struct drxj_cfg_afe_gain { 199*4882a593Smuzhiyun enum drx_standard standard; /* standard to which these settings apply */ 200*4882a593Smuzhiyun u16 gain; /* gain in 0.1 dB steps, DRXJ range 140 .. 335 */}; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* 203*4882a593Smuzhiyun * /struct drxjrs_errors 204*4882a593Smuzhiyun * Available failure information in DRXJ_FEC_RS. 205*4882a593Smuzhiyun * 206*4882a593Smuzhiyun * Container for errors that are received in the most recently finished measurement period 207*4882a593Smuzhiyun * 208*4882a593Smuzhiyun */ 209*4882a593Smuzhiyun struct drxjrs_errors { 210*4882a593Smuzhiyun u16 nr_bit_errors; 211*4882a593Smuzhiyun /*< no of pre RS bit errors */ 212*4882a593Smuzhiyun u16 nr_symbol_errors; 213*4882a593Smuzhiyun /*< no of pre RS symbol errors */ 214*4882a593Smuzhiyun u16 nr_packet_errors; 215*4882a593Smuzhiyun /*< no of pre RS packet errors */ 216*4882a593Smuzhiyun u16 nr_failures; 217*4882a593Smuzhiyun /*< no of post RS failures to decode */ 218*4882a593Smuzhiyun u16 nr_snc_par_fail_count; 219*4882a593Smuzhiyun /*< no of post RS bit erros */ 220*4882a593Smuzhiyun }; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* 223*4882a593Smuzhiyun * /struct struct drxj_cfg_vsb_misc * symbol error rate 224*4882a593Smuzhiyun */ 225*4882a593Smuzhiyun struct drxj_cfg_vsb_misc { 226*4882a593Smuzhiyun u32 symb_error; 227*4882a593Smuzhiyun /*< symbol error rate sps */}; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* 230*4882a593Smuzhiyun * /enum enum drxj_mpeg_output_clock_rate * Mpeg output clock rate. 231*4882a593Smuzhiyun * 232*4882a593Smuzhiyun */ 233*4882a593Smuzhiyun enum drxj_mpeg_start_width { 234*4882a593Smuzhiyun DRXJ_MPEG_START_WIDTH_1CLKCYC, 235*4882a593Smuzhiyun DRXJ_MPEG_START_WIDTH_8CLKCYC}; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun /* 238*4882a593Smuzhiyun * /enum enum drxj_mpeg_output_clock_rate * Mpeg output clock rate. 239*4882a593Smuzhiyun * 240*4882a593Smuzhiyun */ 241*4882a593Smuzhiyun enum drxj_mpeg_output_clock_rate { 242*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO, 243*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_75973K, 244*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_50625K, 245*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_37968K, 246*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_30375K, 247*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_25313K, 248*4882a593Smuzhiyun DRXJ_MPEGOUTPUT_CLOCK_RATE_21696K}; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* 251*4882a593Smuzhiyun * /struct DRXJCfgMisc_t 252*4882a593Smuzhiyun * Change TEI bit of MPEG output 253*4882a593Smuzhiyun * reverse MPEG output bit order 254*4882a593Smuzhiyun * set MPEG output clock rate 255*4882a593Smuzhiyun */ 256*4882a593Smuzhiyun struct drxj_cfg_mpeg_output_misc { 257*4882a593Smuzhiyun bool disable_tei_handling; /*< if true pass (not change) TEI bit */ 258*4882a593Smuzhiyun bool bit_reverse_mpeg_outout; /*< if true, parallel: msb on MD0; serial: lsb out first */ 259*4882a593Smuzhiyun enum drxj_mpeg_output_clock_rate mpeg_output_clock_rate; 260*4882a593Smuzhiyun /*< set MPEG output clock rate that overwirtes the derived one from symbol rate */ 261*4882a593Smuzhiyun enum drxj_mpeg_start_width mpeg_start_width; /*< set MPEG output start width */}; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* 264*4882a593Smuzhiyun * /enum enum drxj_xtal_freq * Supported external crystal reference frequency. 265*4882a593Smuzhiyun */ 266*4882a593Smuzhiyun enum drxj_xtal_freq { 267*4882a593Smuzhiyun DRXJ_XTAL_FREQ_RSVD, 268*4882a593Smuzhiyun DRXJ_XTAL_FREQ_27MHZ, 269*4882a593Smuzhiyun DRXJ_XTAL_FREQ_20P25MHZ, 270*4882a593Smuzhiyun DRXJ_XTAL_FREQ_4MHZ}; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /* 273*4882a593Smuzhiyun * /enum enum drxj_xtal_freq * Supported external crystal reference frequency. 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun enum drxji2c_speed { 276*4882a593Smuzhiyun DRXJ_I2C_SPEED_400KBPS, 277*4882a593Smuzhiyun DRXJ_I2C_SPEED_100KBPS}; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* 280*4882a593Smuzhiyun * /struct struct drxj_cfg_hw_cfg * Get hw configuration, such as crystal reference frequency, I2C speed, etc... 281*4882a593Smuzhiyun */ 282*4882a593Smuzhiyun struct drxj_cfg_hw_cfg { 283*4882a593Smuzhiyun enum drxj_xtal_freq xtal_freq; 284*4882a593Smuzhiyun /*< crystal reference frequency */ 285*4882a593Smuzhiyun enum drxji2c_speed i2c_speed; 286*4882a593Smuzhiyun /*< 100 or 400 kbps */}; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /* 289*4882a593Smuzhiyun * DRXJ_CFG_ATV_MISC 290*4882a593Smuzhiyun */ 291*4882a593Smuzhiyun struct drxj_cfg_atv_misc { 292*4882a593Smuzhiyun s16 peak_filter; /* -8 .. 15 */ 293*4882a593Smuzhiyun u16 noise_filter; /* 0 .. 15 */}; 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun /* 296*4882a593Smuzhiyun * struct drxj_cfg_oob_misc */ 297*4882a593Smuzhiyun #define DRXJ_OOB_STATE_RESET 0x0 298*4882a593Smuzhiyun #define DRXJ_OOB_STATE_AGN_HUNT 0x1 299*4882a593Smuzhiyun #define DRXJ_OOB_STATE_DGN_HUNT 0x2 300*4882a593Smuzhiyun #define DRXJ_OOB_STATE_AGC_HUNT 0x3 301*4882a593Smuzhiyun #define DRXJ_OOB_STATE_FRQ_HUNT 0x4 302*4882a593Smuzhiyun #define DRXJ_OOB_STATE_PHA_HUNT 0x8 303*4882a593Smuzhiyun #define DRXJ_OOB_STATE_TIM_HUNT 0x10 304*4882a593Smuzhiyun #define DRXJ_OOB_STATE_EQU_HUNT 0x20 305*4882a593Smuzhiyun #define DRXJ_OOB_STATE_EQT_HUNT 0x30 306*4882a593Smuzhiyun #define DRXJ_OOB_STATE_SYNC 0x40 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun struct drxj_cfg_oob_misc { 309*4882a593Smuzhiyun struct drxj_agc_status agc; 310*4882a593Smuzhiyun bool eq_lock; 311*4882a593Smuzhiyun bool sym_timing_lock; 312*4882a593Smuzhiyun bool phase_lock; 313*4882a593Smuzhiyun bool freq_lock; 314*4882a593Smuzhiyun bool dig_gain_lock; 315*4882a593Smuzhiyun bool ana_gain_lock; 316*4882a593Smuzhiyun u8 state; 317*4882a593Smuzhiyun }; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* 320*4882a593Smuzhiyun * Index of in array of coef 321*4882a593Smuzhiyun */ 322*4882a593Smuzhiyun enum drxj_cfg_oob_lo_power { 323*4882a593Smuzhiyun DRXJ_OOB_LO_POW_MINUS0DB = 0, 324*4882a593Smuzhiyun DRXJ_OOB_LO_POW_MINUS5DB, 325*4882a593Smuzhiyun DRXJ_OOB_LO_POW_MINUS10DB, 326*4882a593Smuzhiyun DRXJ_OOB_LO_POW_MINUS15DB, 327*4882a593Smuzhiyun DRXJ_OOB_LO_POW_MAX}; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* 330*4882a593Smuzhiyun * DRXJ_CFG_ATV_EQU_COEF 331*4882a593Smuzhiyun */ 332*4882a593Smuzhiyun struct drxj_cfg_atv_equ_coef { 333*4882a593Smuzhiyun s16 coef0; /* -256 .. 255 */ 334*4882a593Smuzhiyun s16 coef1; /* -256 .. 255 */ 335*4882a593Smuzhiyun s16 coef2; /* -256 .. 255 */ 336*4882a593Smuzhiyun s16 coef3; /* -256 .. 255 */}; 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun /* 339*4882a593Smuzhiyun * Index of in array of coef 340*4882a593Smuzhiyun */ 341*4882a593Smuzhiyun enum drxj_coef_array_index { 342*4882a593Smuzhiyun DRXJ_COEF_IDX_MN = 0, 343*4882a593Smuzhiyun DRXJ_COEF_IDX_FM, 344*4882a593Smuzhiyun DRXJ_COEF_IDX_L, 345*4882a593Smuzhiyun DRXJ_COEF_IDX_LP, 346*4882a593Smuzhiyun DRXJ_COEF_IDX_BG, 347*4882a593Smuzhiyun DRXJ_COEF_IDX_DK, 348*4882a593Smuzhiyun DRXJ_COEF_IDX_I, 349*4882a593Smuzhiyun DRXJ_COEF_IDX_MAX}; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /* 352*4882a593Smuzhiyun * DRXJ_CFG_ATV_OUTPUT 353*4882a593Smuzhiyun */ 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* 356*4882a593Smuzhiyun * /enum DRXJAttenuation_t 357*4882a593Smuzhiyun * Attenuation setting for SIF AGC. 358*4882a593Smuzhiyun * 359*4882a593Smuzhiyun */ 360*4882a593Smuzhiyun enum drxjsif_attenuation { 361*4882a593Smuzhiyun DRXJ_SIF_ATTENUATION_0DB, 362*4882a593Smuzhiyun DRXJ_SIF_ATTENUATION_3DB, 363*4882a593Smuzhiyun DRXJ_SIF_ATTENUATION_6DB, 364*4882a593Smuzhiyun DRXJ_SIF_ATTENUATION_9DB}; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /* 367*4882a593Smuzhiyun * /struct struct drxj_cfg_atv_output * SIF attenuation setting. 368*4882a593Smuzhiyun * 369*4882a593Smuzhiyun */ 370*4882a593Smuzhiyun struct drxj_cfg_atv_output { 371*4882a593Smuzhiyun bool enable_cvbs_output; /* true= enabled */ 372*4882a593Smuzhiyun bool enable_sif_output; /* true= enabled */ 373*4882a593Smuzhiyun enum drxjsif_attenuation sif_attenuation; 374*4882a593Smuzhiyun }; 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun /* 377*4882a593Smuzhiyun DRXJ_CFG_ATV_AGC_STATUS (get only) 378*4882a593Smuzhiyun */ 379*4882a593Smuzhiyun /* TODO : AFE interface not yet finished, subject to change */ 380*4882a593Smuzhiyun struct drxj_cfg_atv_agc_status { 381*4882a593Smuzhiyun u16 rf_agc_gain; /* 0 .. 877 uA */ 382*4882a593Smuzhiyun u16 if_agc_gain; /* 0 .. 877 uA */ 383*4882a593Smuzhiyun s16 video_agc_gain; /* -75 .. 1972 in 0.1 dB steps */ 384*4882a593Smuzhiyun s16 audio_agc_gain; /* -4 .. 1020 in 0.1 dB steps */ 385*4882a593Smuzhiyun u16 rf_agc_loop_gain; /* 0 .. 7 */ 386*4882a593Smuzhiyun u16 if_agc_loop_gain; /* 0 .. 7 */ 387*4882a593Smuzhiyun u16 video_agc_loop_gain; /* 0 .. 7 */}; 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /*============================================================================*/ 390*4882a593Smuzhiyun /*============================================================================*/ 391*4882a593Smuzhiyun /*== CTRL related data structures ============================================*/ 392*4882a593Smuzhiyun /*============================================================================*/ 393*4882a593Smuzhiyun /*============================================================================*/ 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* NONE */ 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /*============================================================================*/ 398*4882a593Smuzhiyun /*============================================================================*/ 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun /*========================================*/ 401*4882a593Smuzhiyun /* 402*4882a593Smuzhiyun * /struct struct drxj_data * DRXJ specific attributes. 403*4882a593Smuzhiyun * 404*4882a593Smuzhiyun * Global data container for DRXJ specific data. 405*4882a593Smuzhiyun * 406*4882a593Smuzhiyun */ 407*4882a593Smuzhiyun struct drxj_data { 408*4882a593Smuzhiyun /* device capabilities (determined during drx_open()) */ 409*4882a593Smuzhiyun bool has_lna; /*< true if LNA (aka PGA) present */ 410*4882a593Smuzhiyun bool has_oob; /*< true if OOB supported */ 411*4882a593Smuzhiyun bool has_ntsc; /*< true if NTSC supported */ 412*4882a593Smuzhiyun bool has_btsc; /*< true if BTSC supported */ 413*4882a593Smuzhiyun bool has_smatx; /*< true if mat_tx is available */ 414*4882a593Smuzhiyun bool has_smarx; /*< true if mat_rx is available */ 415*4882a593Smuzhiyun bool has_gpio; /*< true if GPIO is available */ 416*4882a593Smuzhiyun bool has_irqn; /*< true if IRQN is available */ 417*4882a593Smuzhiyun /* A1/A2/A... */ 418*4882a593Smuzhiyun u8 mfx; /*< metal fix */ 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun /* tuner settings */ 421*4882a593Smuzhiyun bool mirror_freq_spect_oob;/*< tuner inversion (true = tuner mirrors the signal */ 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun /* standard/channel settings */ 424*4882a593Smuzhiyun enum drx_standard standard; /*< current standard information */ 425*4882a593Smuzhiyun enum drx_modulation constellation; 426*4882a593Smuzhiyun /*< current constellation */ 427*4882a593Smuzhiyun s32 frequency; /*< center signal frequency in KHz */ 428*4882a593Smuzhiyun enum drx_bandwidth curr_bandwidth; 429*4882a593Smuzhiyun /*< current channel bandwidth */ 430*4882a593Smuzhiyun enum drx_mirror mirror; /*< current channel mirror */ 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /* signal quality information */ 433*4882a593Smuzhiyun u32 fec_bits_desired; /*< BER accounting period */ 434*4882a593Smuzhiyun u16 fec_vd_plen; /*< no of trellis symbols: VD SER measurement period */ 435*4882a593Smuzhiyun u16 qam_vd_prescale; /*< Viterbi Measurement Prescale */ 436*4882a593Smuzhiyun u16 qam_vd_period; /*< Viterbi Measurement period */ 437*4882a593Smuzhiyun u16 fec_rs_plen; /*< defines RS BER measurement period */ 438*4882a593Smuzhiyun u16 fec_rs_prescale; /*< ReedSolomon Measurement Prescale */ 439*4882a593Smuzhiyun u16 fec_rs_period; /*< ReedSolomon Measurement period */ 440*4882a593Smuzhiyun bool reset_pkt_err_acc; /*< Set a flag to reset accumulated packet error */ 441*4882a593Smuzhiyun u16 pkt_err_acc_start; /*< Set a flag to reset accumulated packet error */ 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun /* HI configuration */ 444*4882a593Smuzhiyun u16 hi_cfg_timing_div; /*< HI Configure() parameter 2 */ 445*4882a593Smuzhiyun u16 hi_cfg_bridge_delay; /*< HI Configure() parameter 3 */ 446*4882a593Smuzhiyun u16 hi_cfg_wake_up_key; /*< HI Configure() parameter 4 */ 447*4882a593Smuzhiyun u16 hi_cfg_ctrl; /*< HI Configure() parameter 5 */ 448*4882a593Smuzhiyun u16 hi_cfg_transmit; /*< HI Configure() parameter 6 */ 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun /* UIO configuration */ 451*4882a593Smuzhiyun enum drxuio_mode uio_sma_rx_mode;/*< current mode of SmaRx pin */ 452*4882a593Smuzhiyun enum drxuio_mode uio_sma_tx_mode;/*< current mode of SmaTx pin */ 453*4882a593Smuzhiyun enum drxuio_mode uio_gpio_mode; /*< current mode of ASEL pin */ 454*4882a593Smuzhiyun enum drxuio_mode uio_irqn_mode; /*< current mode of IRQN pin */ 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun /* IQM fs frequecy shift and inversion */ 457*4882a593Smuzhiyun u32 iqm_fs_rate_ofs; /*< frequency shifter setting after setchannel */ 458*4882a593Smuzhiyun bool pos_image; /*< True: positive image */ 459*4882a593Smuzhiyun /* IQM RC frequecy shift */ 460*4882a593Smuzhiyun u32 iqm_rc_rate_ofs; /*< frequency shifter setting after setchannel */ 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun /* ATV configuration */ 463*4882a593Smuzhiyun u32 atv_cfg_changed_flags; /*< flag: flags cfg changes */ 464*4882a593Smuzhiyun s16 atv_top_equ0[DRXJ_COEF_IDX_MAX]; /*< shadow of ATV_TOP_EQU0__A */ 465*4882a593Smuzhiyun s16 atv_top_equ1[DRXJ_COEF_IDX_MAX]; /*< shadow of ATV_TOP_EQU1__A */ 466*4882a593Smuzhiyun s16 atv_top_equ2[DRXJ_COEF_IDX_MAX]; /*< shadow of ATV_TOP_EQU2__A */ 467*4882a593Smuzhiyun s16 atv_top_equ3[DRXJ_COEF_IDX_MAX]; /*< shadow of ATV_TOP_EQU3__A */ 468*4882a593Smuzhiyun bool phase_correction_bypass;/*< flag: true=bypass */ 469*4882a593Smuzhiyun s16 atv_top_vid_peak; /*< shadow of ATV_TOP_VID_PEAK__A */ 470*4882a593Smuzhiyun u16 atv_top_noise_th; /*< shadow of ATV_TOP_NOISE_TH__A */ 471*4882a593Smuzhiyun bool enable_cvbs_output; /*< flag CVBS output enable */ 472*4882a593Smuzhiyun bool enable_sif_output; /*< flag SIF output enable */ 473*4882a593Smuzhiyun enum drxjsif_attenuation sif_attenuation; 474*4882a593Smuzhiyun /*< current SIF att setting */ 475*4882a593Smuzhiyun /* Agc configuration for QAM and VSB */ 476*4882a593Smuzhiyun struct drxj_cfg_agc qam_rf_agc_cfg; /*< qam RF AGC config */ 477*4882a593Smuzhiyun struct drxj_cfg_agc qam_if_agc_cfg; /*< qam IF AGC config */ 478*4882a593Smuzhiyun struct drxj_cfg_agc vsb_rf_agc_cfg; /*< vsb RF AGC config */ 479*4882a593Smuzhiyun struct drxj_cfg_agc vsb_if_agc_cfg; /*< vsb IF AGC config */ 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun /* PGA gain configuration for QAM and VSB */ 482*4882a593Smuzhiyun u16 qam_pga_cfg; /*< qam PGA config */ 483*4882a593Smuzhiyun u16 vsb_pga_cfg; /*< vsb PGA config */ 484*4882a593Smuzhiyun 485*4882a593Smuzhiyun /* Pre SAW configuration for QAM and VSB */ 486*4882a593Smuzhiyun struct drxj_cfg_pre_saw qam_pre_saw_cfg; 487*4882a593Smuzhiyun /*< qam pre SAW config */ 488*4882a593Smuzhiyun struct drxj_cfg_pre_saw vsb_pre_saw_cfg; 489*4882a593Smuzhiyun /*< qam pre SAW config */ 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun /* Version information */ 492*4882a593Smuzhiyun char v_text[2][12]; /*< allocated text versions */ 493*4882a593Smuzhiyun struct drx_version v_version[2]; /*< allocated versions structs */ 494*4882a593Smuzhiyun struct drx_version_list v_list_elements[2]; 495*4882a593Smuzhiyun /*< allocated version list */ 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun /* smart antenna configuration */ 498*4882a593Smuzhiyun bool smart_ant_inverted; 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun /* Tracking filter setting for OOB */ 501*4882a593Smuzhiyun u16 oob_trk_filter_cfg[8]; 502*4882a593Smuzhiyun bool oob_power_on; 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun /* MPEG static bitrate setting */ 505*4882a593Smuzhiyun u32 mpeg_ts_static_bitrate; /*< bitrate static MPEG output */ 506*4882a593Smuzhiyun bool disable_te_ihandling; /*< MPEG TS TEI handling */ 507*4882a593Smuzhiyun bool bit_reverse_mpeg_outout;/*< MPEG output bit order */ 508*4882a593Smuzhiyun enum drxj_mpeg_output_clock_rate mpeg_output_clock_rate; 509*4882a593Smuzhiyun /*< MPEG output clock rate */ 510*4882a593Smuzhiyun enum drxj_mpeg_start_width mpeg_start_width; 511*4882a593Smuzhiyun /*< MPEG Start width */ 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun /* Pre SAW & Agc configuration for ATV */ 514*4882a593Smuzhiyun struct drxj_cfg_pre_saw atv_pre_saw_cfg; 515*4882a593Smuzhiyun /*< atv pre SAW config */ 516*4882a593Smuzhiyun struct drxj_cfg_agc atv_rf_agc_cfg; /*< atv RF AGC config */ 517*4882a593Smuzhiyun struct drxj_cfg_agc atv_if_agc_cfg; /*< atv IF AGC config */ 518*4882a593Smuzhiyun u16 atv_pga_cfg; /*< atv pga config */ 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun u32 curr_symbol_rate; 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun /* pin-safe mode */ 523*4882a593Smuzhiyun bool pdr_safe_mode; /*< PDR safe mode activated */ 524*4882a593Smuzhiyun u16 pdr_safe_restore_val_gpio; 525*4882a593Smuzhiyun u16 pdr_safe_restore_val_v_sync; 526*4882a593Smuzhiyun u16 pdr_safe_restore_val_sma_rx; 527*4882a593Smuzhiyun u16 pdr_safe_restore_val_sma_tx; 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun /* OOB pre-saw value */ 530*4882a593Smuzhiyun u16 oob_pre_saw; 531*4882a593Smuzhiyun enum drxj_cfg_oob_lo_power oob_lo_pow; 532*4882a593Smuzhiyun 533*4882a593Smuzhiyun struct drx_aud_data aud_data; 534*4882a593Smuzhiyun /*< audio storage */}; 535*4882a593Smuzhiyun 536*4882a593Smuzhiyun /*------------------------------------------------------------------------- 537*4882a593Smuzhiyun Access MACROS 538*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 539*4882a593Smuzhiyun /* 540*4882a593Smuzhiyun * \brief Compilable references to attributes 541*4882a593Smuzhiyun * \param d pointer to demod instance 542*4882a593Smuzhiyun * 543*4882a593Smuzhiyun * Used as main reference to an attribute field. 544*4882a593Smuzhiyun * Can be used by both macro implementation and function implementation. 545*4882a593Smuzhiyun * These macros are defined to avoid duplication of code in macro and function 546*4882a593Smuzhiyun * definitions that handle access of demod common or extended attributes. 547*4882a593Smuzhiyun * 548*4882a593Smuzhiyun */ 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun #define DRXJ_ATTR_BTSC_DETECT(d) \ 551*4882a593Smuzhiyun (((struct drxj_data *)(d)->my_ext_attr)->aud_data.btsc_detect) 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun /*------------------------------------------------------------------------- 554*4882a593Smuzhiyun DEFINES 555*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun /* 558*4882a593Smuzhiyun * \def DRXJ_NTSC_CARRIER_FREQ_OFFSET 559*4882a593Smuzhiyun * \brief Offset from picture carrier to centre frequency in kHz, in RF domain 560*4882a593Smuzhiyun * 561*4882a593Smuzhiyun * For NTSC standard. 562*4882a593Smuzhiyun * NTSC channels are listed by their picture carrier frequency (Fpc). 563*4882a593Smuzhiyun * The function DRX_CTRL_SET_CHANNEL requires the centre frequency as input. 564*4882a593Smuzhiyun * In case the tuner module is not used the DRX-J requires that the tuner is 565*4882a593Smuzhiyun * tuned to the centre frequency of the channel: 566*4882a593Smuzhiyun * 567*4882a593Smuzhiyun * Fcentre = Fpc + DRXJ_NTSC_CARRIER_FREQ_OFFSET 568*4882a593Smuzhiyun * 569*4882a593Smuzhiyun */ 570*4882a593Smuzhiyun #define DRXJ_NTSC_CARRIER_FREQ_OFFSET ((s32)(1750)) 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun /* 573*4882a593Smuzhiyun * \def DRXJ_PAL_SECAM_BG_CARRIER_FREQ_OFFSET 574*4882a593Smuzhiyun * \brief Offset from picture carrier to centre frequency in kHz, in RF domain 575*4882a593Smuzhiyun * 576*4882a593Smuzhiyun * For PAL/SECAM - BG standard. This define is needed in case the tuner module 577*4882a593Smuzhiyun * is NOT used. PAL/SECAM channels are listed by their picture carrier frequency (Fpc). 578*4882a593Smuzhiyun * The DRX-J requires that the tuner is tuned to: 579*4882a593Smuzhiyun * Fpc + DRXJ_PAL_SECAM_BG_CARRIER_FREQ_OFFSET 580*4882a593Smuzhiyun * 581*4882a593Smuzhiyun * In case the tuner module is used the drxdriver takes care of this. 582*4882a593Smuzhiyun * In case the tuner module is NOT used the application programmer must take 583*4882a593Smuzhiyun * care of this. 584*4882a593Smuzhiyun * 585*4882a593Smuzhiyun */ 586*4882a593Smuzhiyun #define DRXJ_PAL_SECAM_BG_CARRIER_FREQ_OFFSET ((s32)(2375)) 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun /* 589*4882a593Smuzhiyun * \def DRXJ_PAL_SECAM_DKIL_CARRIER_FREQ_OFFSET 590*4882a593Smuzhiyun * \brief Offset from picture carrier to centre frequency in kHz, in RF domain 591*4882a593Smuzhiyun * 592*4882a593Smuzhiyun * For PAL/SECAM - DK, I, L standards. This define is needed in case the tuner module 593*4882a593Smuzhiyun * is NOT used. PAL/SECAM channels are listed by their picture carrier frequency (Fpc). 594*4882a593Smuzhiyun * The DRX-J requires that the tuner is tuned to: 595*4882a593Smuzhiyun * Fpc + DRXJ_PAL_SECAM_DKIL_CARRIER_FREQ_OFFSET 596*4882a593Smuzhiyun * 597*4882a593Smuzhiyun * In case the tuner module is used the drxdriver takes care of this. 598*4882a593Smuzhiyun * In case the tuner module is NOT used the application programmer must take 599*4882a593Smuzhiyun * care of this. 600*4882a593Smuzhiyun * 601*4882a593Smuzhiyun */ 602*4882a593Smuzhiyun #define DRXJ_PAL_SECAM_DKIL_CARRIER_FREQ_OFFSET ((s32)(2775)) 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun /* 605*4882a593Smuzhiyun * \def DRXJ_PAL_SECAM_LP_CARRIER_FREQ_OFFSET 606*4882a593Smuzhiyun * \brief Offset from picture carrier to centre frequency in kHz, in RF domain 607*4882a593Smuzhiyun * 608*4882a593Smuzhiyun * For PAL/SECAM - LP standard. This define is needed in case the tuner module 609*4882a593Smuzhiyun * is NOT used. PAL/SECAM channels are listed by their picture carrier frequency (Fpc). 610*4882a593Smuzhiyun * The DRX-J requires that the tuner is tuned to: 611*4882a593Smuzhiyun * Fpc + DRXJ_PAL_SECAM_LP_CARRIER_FREQ_OFFSET 612*4882a593Smuzhiyun * 613*4882a593Smuzhiyun * In case the tuner module is used the drxdriver takes care of this. 614*4882a593Smuzhiyun * In case the tuner module is NOT used the application programmer must take 615*4882a593Smuzhiyun * care of this. 616*4882a593Smuzhiyun */ 617*4882a593Smuzhiyun #define DRXJ_PAL_SECAM_LP_CARRIER_FREQ_OFFSET ((s32)(-3255)) 618*4882a593Smuzhiyun 619*4882a593Smuzhiyun /* 620*4882a593Smuzhiyun * \def DRXJ_FM_CARRIER_FREQ_OFFSET 621*4882a593Smuzhiyun * \brief Offset from sound carrier to centre frequency in kHz, in RF domain 622*4882a593Smuzhiyun * 623*4882a593Smuzhiyun * For FM standard. 624*4882a593Smuzhiyun * FM channels are listed by their sound carrier frequency (Fsc). 625*4882a593Smuzhiyun * The function DRX_CTRL_SET_CHANNEL requires the Ffm frequency (see below) as 626*4882a593Smuzhiyun * input. 627*4882a593Smuzhiyun * In case the tuner module is not used the DRX-J requires that the tuner is 628*4882a593Smuzhiyun * tuned to the Ffm frequency of the channel. 629*4882a593Smuzhiyun * 630*4882a593Smuzhiyun * Ffm = Fsc + DRXJ_FM_CARRIER_FREQ_OFFSET 631*4882a593Smuzhiyun * 632*4882a593Smuzhiyun */ 633*4882a593Smuzhiyun #define DRXJ_FM_CARRIER_FREQ_OFFSET ((s32)(-3000)) 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun /* Revision types -------------------------------------------------------*/ 636*4882a593Smuzhiyun 637*4882a593Smuzhiyun #define DRXJ_TYPE_ID (0x3946000DUL) 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun /* Macros ---------------------------------------------------------------*/ 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun /* Convert OOB lock status to string */ 642*4882a593Smuzhiyun #define DRXJ_STR_OOB_LOCKSTATUS(x) ( \ 643*4882a593Smuzhiyun (x == DRX_NEVER_LOCK) ? "Never" : \ 644*4882a593Smuzhiyun (x == DRX_NOT_LOCKED) ? "No" : \ 645*4882a593Smuzhiyun (x == DRX_LOCKED) ? "Locked" : \ 646*4882a593Smuzhiyun (x == DRX_LOCK_STATE_1) ? "AGC lock" : \ 647*4882a593Smuzhiyun (x == DRX_LOCK_STATE_2) ? "sync lock" : \ 648*4882a593Smuzhiyun "(Invalid)") 649*4882a593Smuzhiyun 650*4882a593Smuzhiyun #endif /* __DRXJ_H__ */ 651