1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * dib3000mb_priv.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2004 Patrick Boettcher (patrick.boettcher@posteo.de) 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * for more information see dib3000mb.c . 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __DIB3000MB_PRIV_H_INCLUDED__ 11*4882a593Smuzhiyun #define __DIB3000MB_PRIV_H_INCLUDED__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* handy shortcuts */ 14*4882a593Smuzhiyun #define rd(reg) dib3000_read_reg(state,reg) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define wr(reg,val) if (dib3000_write_reg(state,reg,val)) \ 17*4882a593Smuzhiyun { pr_err("while sending 0x%04x to 0x%04x.", val, reg); return -EREMOTEIO; } 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define wr_foreach(a,v) { int i; \ 20*4882a593Smuzhiyun if (sizeof(a) != sizeof(v)) \ 21*4882a593Smuzhiyun pr_err("sizeof: %zu %zu is different", sizeof(a), sizeof(v));\ 22*4882a593Smuzhiyun for (i=0; i < sizeof(a)/sizeof(u16); i++) \ 23*4882a593Smuzhiyun wr(a[i],v[i]); \ 24*4882a593Smuzhiyun } 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define set_or(reg,val) wr(reg,rd(reg) | val) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define set_and(reg,val) wr(reg,rd(reg) & val) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* debug */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define dprintk(level, fmt, arg...) do { \ 33*4882a593Smuzhiyun if (debug & level) \ 34*4882a593Smuzhiyun printk(KERN_DEBUG pr_fmt("%s: " fmt), \ 35*4882a593Smuzhiyun __func__, ##arg); \ 36*4882a593Smuzhiyun } while (0) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* mask for enabling a specific pid for the pid_filter */ 39*4882a593Smuzhiyun #define DIB3000_ACTIVATE_PID_FILTERING (0x2000) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* common values for tuning */ 42*4882a593Smuzhiyun #define DIB3000_ALPHA_0 ( 0) 43*4882a593Smuzhiyun #define DIB3000_ALPHA_1 ( 1) 44*4882a593Smuzhiyun #define DIB3000_ALPHA_2 ( 2) 45*4882a593Smuzhiyun #define DIB3000_ALPHA_4 ( 4) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define DIB3000_CONSTELLATION_QPSK ( 0) 48*4882a593Smuzhiyun #define DIB3000_CONSTELLATION_16QAM ( 1) 49*4882a593Smuzhiyun #define DIB3000_CONSTELLATION_64QAM ( 2) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define DIB3000_GUARD_TIME_1_32 ( 0) 52*4882a593Smuzhiyun #define DIB3000_GUARD_TIME_1_16 ( 1) 53*4882a593Smuzhiyun #define DIB3000_GUARD_TIME_1_8 ( 2) 54*4882a593Smuzhiyun #define DIB3000_GUARD_TIME_1_4 ( 3) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define DIB3000_TRANSMISSION_MODE_2K ( 0) 57*4882a593Smuzhiyun #define DIB3000_TRANSMISSION_MODE_8K ( 1) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define DIB3000_SELECT_LP ( 0) 60*4882a593Smuzhiyun #define DIB3000_SELECT_HP ( 1) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define DIB3000_FEC_1_2 ( 1) 63*4882a593Smuzhiyun #define DIB3000_FEC_2_3 ( 2) 64*4882a593Smuzhiyun #define DIB3000_FEC_3_4 ( 3) 65*4882a593Smuzhiyun #define DIB3000_FEC_5_6 ( 5) 66*4882a593Smuzhiyun #define DIB3000_FEC_7_8 ( 7) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define DIB3000_HRCH_OFF ( 0) 69*4882a593Smuzhiyun #define DIB3000_HRCH_ON ( 1) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define DIB3000_DDS_INVERSION_OFF ( 0) 72*4882a593Smuzhiyun #define DIB3000_DDS_INVERSION_ON ( 1) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define DIB3000_TUNER_WRITE_ENABLE(a) (0xffff & (a << 8)) 75*4882a593Smuzhiyun #define DIB3000_TUNER_WRITE_DISABLE(a) (0xffff & ((a << 8) | (1 << 7))) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define DIB3000_REG_MANUFACTOR_ID ( 1025) 78*4882a593Smuzhiyun #define DIB3000_I2C_ID_DIBCOM (0x01b3) 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun #define DIB3000_REG_DEVICE_ID ( 1026) 81*4882a593Smuzhiyun #define DIB3000MB_DEVICE_ID (0x3000) 82*4882a593Smuzhiyun #define DIB3000MC_DEVICE_ID (0x3001) 83*4882a593Smuzhiyun #define DIB3000P_DEVICE_ID (0x3002) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* frontend state */ 86*4882a593Smuzhiyun struct dib3000_state { 87*4882a593Smuzhiyun struct i2c_adapter* i2c; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* configuration settings */ 90*4882a593Smuzhiyun struct dib3000_config config; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct dvb_frontend frontend; 93*4882a593Smuzhiyun int timing_offset; 94*4882a593Smuzhiyun int timing_offset_comp_done; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun u32 last_tuned_bw; 97*4882a593Smuzhiyun u32 last_tuned_freq; 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* register addresses and some of their default values */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* restart subsystems */ 103*4882a593Smuzhiyun #define DIB3000MB_REG_RESTART ( 0) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define DIB3000MB_RESTART_OFF ( 0) 106*4882a593Smuzhiyun #define DIB3000MB_RESTART_AUTO_SEARCH (1 << 1) 107*4882a593Smuzhiyun #define DIB3000MB_RESTART_CTRL (1 << 2) 108*4882a593Smuzhiyun #define DIB3000MB_RESTART_AGC (1 << 3) 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* FFT size */ 111*4882a593Smuzhiyun #define DIB3000MB_REG_FFT ( 1) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* Guard time */ 114*4882a593Smuzhiyun #define DIB3000MB_REG_GUARD_TIME ( 2) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* QAM */ 117*4882a593Smuzhiyun #define DIB3000MB_REG_QAM ( 3) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* Alpha coefficient high priority Viterbi algorithm */ 120*4882a593Smuzhiyun #define DIB3000MB_REG_VIT_ALPHA ( 4) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* spectrum inversion */ 123*4882a593Smuzhiyun #define DIB3000MB_REG_DDS_INV ( 5) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* DDS frequency value (IF position) ad ? values don't match reg_3000mb.txt */ 126*4882a593Smuzhiyun #define DIB3000MB_REG_DDS_FREQ_MSB ( 6) 127*4882a593Smuzhiyun #define DIB3000MB_REG_DDS_FREQ_LSB ( 7) 128*4882a593Smuzhiyun #define DIB3000MB_DDS_FREQ_MSB ( 178) 129*4882a593Smuzhiyun #define DIB3000MB_DDS_FREQ_LSB ( 8990) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* timing frequency (carrier spacing) */ 132*4882a593Smuzhiyun static u16 dib3000mb_reg_timing_freq[] = { 8,9 }; 133*4882a593Smuzhiyun static u16 dib3000mb_timing_freq[][2] = { 134*4882a593Smuzhiyun { 126 , 48873 }, /* 6 MHz */ 135*4882a593Smuzhiyun { 147 , 57019 }, /* 7 MHz */ 136*4882a593Smuzhiyun { 168 , 65164 }, /* 8 MHz */ 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* impulse noise parameter */ 140*4882a593Smuzhiyun /* 36 ??? */ 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun static u16 dib3000mb_reg_impulse_noise[] = { 10,11,12,15,36 }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun enum dib3000mb_impulse_noise_type { 145*4882a593Smuzhiyun DIB3000MB_IMPNOISE_OFF, 146*4882a593Smuzhiyun DIB3000MB_IMPNOISE_MOBILE, 147*4882a593Smuzhiyun DIB3000MB_IMPNOISE_FIXED, 148*4882a593Smuzhiyun DIB3000MB_IMPNOISE_DEFAULT 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun static u16 dib3000mb_impulse_noise_values[][5] = { 152*4882a593Smuzhiyun { 0x0000, 0x0004, 0x0014, 0x01ff, 0x0399 }, /* off */ 153*4882a593Smuzhiyun { 0x0001, 0x0004, 0x0014, 0x01ff, 0x037b }, /* mobile */ 154*4882a593Smuzhiyun { 0x0001, 0x0004, 0x0020, 0x01bd, 0x0399 }, /* fixed */ 155*4882a593Smuzhiyun { 0x0000, 0x0002, 0x000a, 0x01ff, 0x0399 }, /* default */ 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* 159*4882a593Smuzhiyun * Dual Automatic-Gain-Control 160*4882a593Smuzhiyun * - gains RF in tuner (AGC1) 161*4882a593Smuzhiyun * - gains IF after filtering (AGC2) 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* also from 16 to 18 */ 165*4882a593Smuzhiyun static u16 dib3000mb_reg_agc_gain[] = { 166*4882a593Smuzhiyun 19,20,21,22,23,24,25,26,27,28,29,30,31,32 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun static u16 dib3000mb_default_agc_gain[] = 170*4882a593Smuzhiyun { 0x0001, 52429, 623, 128, 166, 195, 61, /* RF ??? */ 171*4882a593Smuzhiyun 0x0001, 53766, 38011, 0, 90, 33, 23 }; /* IF ??? */ 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* phase noise */ 174*4882a593Smuzhiyun /* 36 is set when setting the impulse noise */ 175*4882a593Smuzhiyun static u16 dib3000mb_reg_phase_noise[] = { 33,34,35,37,38 }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun static u16 dib3000mb_default_noise_phase[] = { 2, 544, 0, 5, 4 }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* lock duration */ 180*4882a593Smuzhiyun static u16 dib3000mb_reg_lock_duration[] = { 39,40 }; 181*4882a593Smuzhiyun static u16 dib3000mb_default_lock_duration[] = { 135, 135 }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* AGC loop bandwidth */ 184*4882a593Smuzhiyun static u16 dib3000mb_reg_agc_bandwidth[] = { 43,44,45,46,47,48,49,50 }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun static u16 dib3000mb_agc_bandwidth_low[] = 187*4882a593Smuzhiyun { 2088, 10, 2088, 10, 3448, 5, 3448, 5 }; 188*4882a593Smuzhiyun static u16 dib3000mb_agc_bandwidth_high[] = 189*4882a593Smuzhiyun { 2349, 5, 2349, 5, 2586, 2, 2586, 2 }; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* 192*4882a593Smuzhiyun * lock0 definition (coff_lock) 193*4882a593Smuzhiyun */ 194*4882a593Smuzhiyun #define DIB3000MB_REG_LOCK0_MASK ( 51) 195*4882a593Smuzhiyun #define DIB3000MB_LOCK0_DEFAULT ( 4) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* 198*4882a593Smuzhiyun * lock1 definition (cpil_lock) 199*4882a593Smuzhiyun * for auto search 200*4882a593Smuzhiyun * which values hide behind the lock masks 201*4882a593Smuzhiyun */ 202*4882a593Smuzhiyun #define DIB3000MB_REG_LOCK1_MASK ( 52) 203*4882a593Smuzhiyun #define DIB3000MB_LOCK1_SEARCH_4 (0x0004) 204*4882a593Smuzhiyun #define DIB3000MB_LOCK1_SEARCH_2048 (0x0800) 205*4882a593Smuzhiyun #define DIB3000MB_LOCK1_DEFAULT (0x0001) 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* 208*4882a593Smuzhiyun * lock2 definition (fec_lock) */ 209*4882a593Smuzhiyun #define DIB3000MB_REG_LOCK2_MASK ( 53) 210*4882a593Smuzhiyun #define DIB3000MB_LOCK2_DEFAULT (0x0080) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* 213*4882a593Smuzhiyun * SEQ ? what was that again ... :) 214*4882a593Smuzhiyun * changes when, inversion, guard time and fft is 215*4882a593Smuzhiyun * either automatically detected or not 216*4882a593Smuzhiyun */ 217*4882a593Smuzhiyun #define DIB3000MB_REG_SEQ ( 54) 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* bandwidth */ 220*4882a593Smuzhiyun static u16 dib3000mb_reg_bandwidth[] = { 55,56,57,58,59,60,61,62,63,64,65,66,67 }; 221*4882a593Smuzhiyun static u16 dib3000mb_bandwidth_6mhz[] = 222*4882a593Smuzhiyun { 0, 33, 53312, 112, 46635, 563, 36565, 0, 1000, 0, 1010, 1, 45264 }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun static u16 dib3000mb_bandwidth_7mhz[] = 225*4882a593Smuzhiyun { 0, 28, 64421, 96, 39973, 483, 3255, 0, 1000, 0, 1010, 1, 45264 }; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun static u16 dib3000mb_bandwidth_8mhz[] = 228*4882a593Smuzhiyun { 0, 25, 23600, 84, 34976, 422, 43808, 0, 1000, 0, 1010, 1, 45264 }; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_68 ( 68) 231*4882a593Smuzhiyun #define DIB3000MB_UNK_68 ( 0) 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_69 ( 69) 234*4882a593Smuzhiyun #define DIB3000MB_UNK_69 ( 0) 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_71 ( 71) 237*4882a593Smuzhiyun #define DIB3000MB_UNK_71 ( 0) 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_77 ( 77) 240*4882a593Smuzhiyun #define DIB3000MB_UNK_77 ( 6) 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_78 ( 78) 243*4882a593Smuzhiyun #define DIB3000MB_UNK_78 (0x0080) 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* isi */ 246*4882a593Smuzhiyun #define DIB3000MB_REG_ISI ( 79) 247*4882a593Smuzhiyun #define DIB3000MB_ISI_ACTIVATE ( 0) 248*4882a593Smuzhiyun #define DIB3000MB_ISI_INHIBIT ( 1) 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* sync impovement */ 251*4882a593Smuzhiyun #define DIB3000MB_REG_SYNC_IMPROVEMENT ( 84) 252*4882a593Smuzhiyun #define DIB3000MB_SYNC_IMPROVE_2K_1_8 ( 3) 253*4882a593Smuzhiyun #define DIB3000MB_SYNC_IMPROVE_DEFAULT ( 0) 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* phase noise compensation inhibition */ 256*4882a593Smuzhiyun #define DIB3000MB_REG_PHASE_NOISE ( 87) 257*4882a593Smuzhiyun #define DIB3000MB_PHASE_NOISE_DEFAULT ( 0) 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_92 ( 92) 260*4882a593Smuzhiyun #define DIB3000MB_UNK_92 (0x0080) 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_96 ( 96) 263*4882a593Smuzhiyun #define DIB3000MB_UNK_96 (0x0010) 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_97 ( 97) 266*4882a593Smuzhiyun #define DIB3000MB_UNK_97 (0x0009) 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /* mobile mode ??? */ 269*4882a593Smuzhiyun #define DIB3000MB_REG_MOBILE_MODE ( 101) 270*4882a593Smuzhiyun #define DIB3000MB_MOBILE_MODE_ON ( 1) 271*4882a593Smuzhiyun #define DIB3000MB_MOBILE_MODE_OFF ( 0) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_106 ( 106) 274*4882a593Smuzhiyun #define DIB3000MB_UNK_106 (0x0080) 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_107 ( 107) 277*4882a593Smuzhiyun #define DIB3000MB_UNK_107 (0x0080) 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_108 ( 108) 280*4882a593Smuzhiyun #define DIB3000MB_UNK_108 (0x0080) 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /* fft */ 283*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_121 ( 121) 284*4882a593Smuzhiyun #define DIB3000MB_UNK_121_2K ( 7) 285*4882a593Smuzhiyun #define DIB3000MB_UNK_121_DEFAULT ( 5) 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun #define DIB3000MB_REG_UNK_122 ( 122) 288*4882a593Smuzhiyun #define DIB3000MB_UNK_122 ( 2867) 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /* QAM for mobile mode */ 291*4882a593Smuzhiyun #define DIB3000MB_REG_MOBILE_MODE_QAM ( 126) 292*4882a593Smuzhiyun #define DIB3000MB_MOBILE_MODE_QAM_64 ( 3) 293*4882a593Smuzhiyun #define DIB3000MB_MOBILE_MODE_QAM_QPSK_16 ( 1) 294*4882a593Smuzhiyun #define DIB3000MB_MOBILE_MODE_QAM_OFF ( 0) 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun /* 297*4882a593Smuzhiyun * data diversity when having more than one chip on-board 298*4882a593Smuzhiyun * see also DIB3000MB_OUTPUT_MODE_DATA_DIVERSITY 299*4882a593Smuzhiyun */ 300*4882a593Smuzhiyun #define DIB3000MB_REG_DATA_IN_DIVERSITY ( 127) 301*4882a593Smuzhiyun #define DIB3000MB_DATA_DIVERSITY_IN_OFF ( 0) 302*4882a593Smuzhiyun #define DIB3000MB_DATA_DIVERSITY_IN_ON ( 2) 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* vit hrch */ 305*4882a593Smuzhiyun #define DIB3000MB_REG_VIT_HRCH ( 128) 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* vit code rate */ 308*4882a593Smuzhiyun #define DIB3000MB_REG_VIT_CODE_RATE ( 129) 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun /* vit select hp */ 311*4882a593Smuzhiyun #define DIB3000MB_REG_VIT_HP ( 130) 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun /* time frame for Bit-Error-Rate calculation */ 314*4882a593Smuzhiyun #define DIB3000MB_REG_BERLEN ( 135) 315*4882a593Smuzhiyun #define DIB3000MB_BERLEN_LONG ( 0) 316*4882a593Smuzhiyun #define DIB3000MB_BERLEN_DEFAULT ( 1) 317*4882a593Smuzhiyun #define DIB3000MB_BERLEN_MEDIUM ( 2) 318*4882a593Smuzhiyun #define DIB3000MB_BERLEN_SHORT ( 3) 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun /* 142 - 152 FIFO parameters 321*4882a593Smuzhiyun * which is what ? 322*4882a593Smuzhiyun */ 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #define DIB3000MB_REG_FIFO_142 ( 142) 325*4882a593Smuzhiyun #define DIB3000MB_FIFO_142 ( 0) 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun /* MPEG2 TS output mode */ 328*4882a593Smuzhiyun #define DIB3000MB_REG_MPEG2_OUT_MODE ( 143) 329*4882a593Smuzhiyun #define DIB3000MB_MPEG2_OUT_MODE_204 ( 0) 330*4882a593Smuzhiyun #define DIB3000MB_MPEG2_OUT_MODE_188 ( 1) 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun #define DIB3000MB_REG_PID_PARSE ( 144) 333*4882a593Smuzhiyun #define DIB3000MB_PID_PARSE_INHIBIT ( 0) 334*4882a593Smuzhiyun #define DIB3000MB_PID_PARSE_ACTIVATE ( 1) 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun #define DIB3000MB_REG_FIFO ( 145) 337*4882a593Smuzhiyun #define DIB3000MB_FIFO_INHIBIT ( 1) 338*4882a593Smuzhiyun #define DIB3000MB_FIFO_ACTIVATE ( 0) 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun #define DIB3000MB_REG_FIFO_146 ( 146) 341*4882a593Smuzhiyun #define DIB3000MB_FIFO_146 ( 3) 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun #define DIB3000MB_REG_FIFO_147 ( 147) 344*4882a593Smuzhiyun #define DIB3000MB_FIFO_147 (0x0100) 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun /* 347*4882a593Smuzhiyun * pidfilter 348*4882a593Smuzhiyun * it is not a hardware pidfilter but a filter which drops all pids 349*4882a593Smuzhiyun * except the ones set. Necessary because of the limited USB1.1 bandwidth. 350*4882a593Smuzhiyun * regs 153-168 351*4882a593Smuzhiyun */ 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun #define DIB3000MB_REG_FIRST_PID ( 153) 354*4882a593Smuzhiyun #define DIB3000MB_NUM_PIDS ( 16) 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun /* 357*4882a593Smuzhiyun * output mode 358*4882a593Smuzhiyun * USB devices have to use 'slave'-mode 359*4882a593Smuzhiyun * see also DIB3000MB_REG_ELECT_OUT_MODE 360*4882a593Smuzhiyun */ 361*4882a593Smuzhiyun #define DIB3000MB_REG_OUTPUT_MODE ( 169) 362*4882a593Smuzhiyun #define DIB3000MB_OUTPUT_MODE_GATED_CLK ( 0) 363*4882a593Smuzhiyun #define DIB3000MB_OUTPUT_MODE_CONT_CLK ( 1) 364*4882a593Smuzhiyun #define DIB3000MB_OUTPUT_MODE_SERIAL ( 2) 365*4882a593Smuzhiyun #define DIB3000MB_OUTPUT_MODE_DATA_DIVERSITY ( 5) 366*4882a593Smuzhiyun #define DIB3000MB_OUTPUT_MODE_SLAVE ( 6) 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun /* irq event mask */ 369*4882a593Smuzhiyun #define DIB3000MB_REG_IRQ_EVENT_MASK ( 170) 370*4882a593Smuzhiyun #define DIB3000MB_IRQ_EVENT_MASK ( 0) 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* filter coefficients */ 373*4882a593Smuzhiyun static u16 dib3000mb_reg_filter_coeffs[] = { 374*4882a593Smuzhiyun 171, 172, 173, 174, 175, 176, 177, 178, 375*4882a593Smuzhiyun 179, 180, 181, 182, 183, 184, 185, 186, 376*4882a593Smuzhiyun 188, 189, 190, 191, 192, 194 377*4882a593Smuzhiyun }; 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun static u16 dib3000mb_filter_coeffs[] = { 380*4882a593Smuzhiyun 226, 160, 29, 381*4882a593Smuzhiyun 979, 998, 19, 382*4882a593Smuzhiyun 22, 1019, 1006, 383*4882a593Smuzhiyun 1022, 12, 6, 384*4882a593Smuzhiyun 1017, 1017, 3, 385*4882a593Smuzhiyun 6, 1019, 386*4882a593Smuzhiyun 1021, 2, 3, 387*4882a593Smuzhiyun 1, 0, 388*4882a593Smuzhiyun }; 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun /* 391*4882a593Smuzhiyun * mobile algorithm (when you are moving with your device) 392*4882a593Smuzhiyun * but not faster than 90 km/h 393*4882a593Smuzhiyun */ 394*4882a593Smuzhiyun #define DIB3000MB_REG_MOBILE_ALGO ( 195) 395*4882a593Smuzhiyun #define DIB3000MB_MOBILE_ALGO_ON ( 0) 396*4882a593Smuzhiyun #define DIB3000MB_MOBILE_ALGO_OFF ( 1) 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun /* multiple demodulators algorithm */ 399*4882a593Smuzhiyun #define DIB3000MB_REG_MULTI_DEMOD_MSB ( 206) 400*4882a593Smuzhiyun #define DIB3000MB_REG_MULTI_DEMOD_LSB ( 207) 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun /* terminator, no more demods */ 403*4882a593Smuzhiyun #define DIB3000MB_MULTI_DEMOD_MSB ( 32767) 404*4882a593Smuzhiyun #define DIB3000MB_MULTI_DEMOD_LSB ( 4095) 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* bring the device into a known */ 407*4882a593Smuzhiyun #define DIB3000MB_REG_RESET_DEVICE ( 1024) 408*4882a593Smuzhiyun #define DIB3000MB_RESET_DEVICE (0x812c) 409*4882a593Smuzhiyun #define DIB3000MB_RESET_DEVICE_RST ( 0) 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun /* hardware clock configuration */ 412*4882a593Smuzhiyun #define DIB3000MB_REG_CLOCK ( 1027) 413*4882a593Smuzhiyun #define DIB3000MB_CLOCK_DEFAULT (0x9000) 414*4882a593Smuzhiyun #define DIB3000MB_CLOCK_DIVERSITY (0x92b0) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun /* power down config */ 417*4882a593Smuzhiyun #define DIB3000MB_REG_POWER_CONTROL ( 1028) 418*4882a593Smuzhiyun #define DIB3000MB_POWER_DOWN ( 1) 419*4882a593Smuzhiyun #define DIB3000MB_POWER_UP ( 0) 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun /* electrical output mode */ 422*4882a593Smuzhiyun #define DIB3000MB_REG_ELECT_OUT_MODE ( 1029) 423*4882a593Smuzhiyun #define DIB3000MB_ELECT_OUT_MODE_OFF ( 0) 424*4882a593Smuzhiyun #define DIB3000MB_ELECT_OUT_MODE_ON ( 1) 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun /* set the tuner i2c address */ 427*4882a593Smuzhiyun #define DIB3000MB_REG_TUNER ( 1089) 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun /* monitoring registers (read only) */ 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun /* agc loop locked (size: 1) */ 432*4882a593Smuzhiyun #define DIB3000MB_REG_AGC_LOCK ( 324) 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun /* agc power (size: 16) */ 435*4882a593Smuzhiyun #define DIB3000MB_REG_AGC_POWER ( 325) 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun /* agc1 value (16) */ 438*4882a593Smuzhiyun #define DIB3000MB_REG_AGC1_VALUE ( 326) 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun /* agc2 value (16) */ 441*4882a593Smuzhiyun #define DIB3000MB_REG_AGC2_VALUE ( 327) 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun /* total RF power (16), can be used for signal strength */ 444*4882a593Smuzhiyun #define DIB3000MB_REG_RF_POWER ( 328) 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun /* dds_frequency with offset (24) */ 447*4882a593Smuzhiyun #define DIB3000MB_REG_DDS_VALUE_MSB ( 339) 448*4882a593Smuzhiyun #define DIB3000MB_REG_DDS_VALUE_LSB ( 340) 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun /* timing offset signed (24) */ 451*4882a593Smuzhiyun #define DIB3000MB_REG_TIMING_OFFSET_MSB ( 341) 452*4882a593Smuzhiyun #define DIB3000MB_REG_TIMING_OFFSET_LSB ( 342) 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* fft start position (13) */ 455*4882a593Smuzhiyun #define DIB3000MB_REG_FFT_WINDOW_POS ( 353) 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun /* carriers locked (1) */ 458*4882a593Smuzhiyun #define DIB3000MB_REG_CARRIER_LOCK ( 355) 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun /* noise power (24) */ 461*4882a593Smuzhiyun #define DIB3000MB_REG_NOISE_POWER_MSB ( 372) 462*4882a593Smuzhiyun #define DIB3000MB_REG_NOISE_POWER_LSB ( 373) 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun #define DIB3000MB_REG_MOBILE_NOISE_MSB ( 374) 465*4882a593Smuzhiyun #define DIB3000MB_REG_MOBILE_NOISE_LSB ( 375) 466*4882a593Smuzhiyun 467*4882a593Smuzhiyun /* 468*4882a593Smuzhiyun * signal power (16), this and the above can be 469*4882a593Smuzhiyun * used to calculate the signal/noise - ratio 470*4882a593Smuzhiyun */ 471*4882a593Smuzhiyun #define DIB3000MB_REG_SIGNAL_POWER ( 380) 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun /* mer (24) */ 474*4882a593Smuzhiyun #define DIB3000MB_REG_MER_MSB ( 381) 475*4882a593Smuzhiyun #define DIB3000MB_REG_MER_LSB ( 382) 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun /* 478*4882a593Smuzhiyun * Transmission Parameter Signalling (TPS) 479*4882a593Smuzhiyun * the following registers can be used to get TPS-information. 480*4882a593Smuzhiyun * The values are according to the DVB-T standard. 481*4882a593Smuzhiyun */ 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun /* TPS locked (1) */ 484*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_LOCK ( 394) 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun /* QAM from TPS (2) (values according to DIB3000MB_REG_QAM) */ 487*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_QAM ( 398) 488*4882a593Smuzhiyun 489*4882a593Smuzhiyun /* hierarchy from TPS (1) */ 490*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_HRCH ( 399) 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun /* alpha from TPS (3) (values according to DIB3000MB_REG_VIT_ALPHA) */ 493*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_VIT_ALPHA ( 400) 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun /* code rate high priority from TPS (3) (values according to DIB3000MB_FEC_*) */ 496*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_CODE_RATE_HP ( 401) 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun /* code rate low priority from TPS (3) if DIB3000MB_REG_TPS_VIT_ALPHA */ 499*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_CODE_RATE_LP ( 402) 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun /* guard time from TPS (2) (values according to DIB3000MB_REG_GUARD_TIME */ 502*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_GUARD_TIME ( 403) 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun /* fft size from TPS (2) (values according to DIB3000MB_REG_FFT) */ 505*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_FFT ( 404) 506*4882a593Smuzhiyun 507*4882a593Smuzhiyun /* cell id from TPS (16) */ 508*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_CELL_ID ( 406) 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun /* TPS (68) */ 511*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_1 ( 408) 512*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_2 ( 409) 513*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_3 ( 410) 514*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_4 ( 411) 515*4882a593Smuzhiyun #define DIB3000MB_REG_TPS_5 ( 412) 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun /* bit error rate (before RS correction) (21) */ 518*4882a593Smuzhiyun #define DIB3000MB_REG_BER_MSB ( 414) 519*4882a593Smuzhiyun #define DIB3000MB_REG_BER_LSB ( 415) 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun /* packet error rate (uncorrected TS packets) (16) */ 522*4882a593Smuzhiyun #define DIB3000MB_REG_PACKET_ERROR_RATE ( 417) 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun /* uncorrected packet count (16) */ 525*4882a593Smuzhiyun #define DIB3000MB_REG_UNC ( 420) 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun /* viterbi locked (1) */ 528*4882a593Smuzhiyun #define DIB3000MB_REG_VIT_LCK ( 421) 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun /* viterbi inidcator (16) */ 531*4882a593Smuzhiyun #define DIB3000MB_REG_VIT_INDICATOR ( 422) 532*4882a593Smuzhiyun 533*4882a593Smuzhiyun /* transport stream sync lock (1) */ 534*4882a593Smuzhiyun #define DIB3000MB_REG_TS_SYNC_LOCK ( 423) 535*4882a593Smuzhiyun 536*4882a593Smuzhiyun /* transport stream RS lock (1) */ 537*4882a593Smuzhiyun #define DIB3000MB_REG_TS_RS_LOCK ( 424) 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun /* lock mask 0 value (1) */ 540*4882a593Smuzhiyun #define DIB3000MB_REG_LOCK0_VALUE ( 425) 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun /* lock mask 1 value (1) */ 543*4882a593Smuzhiyun #define DIB3000MB_REG_LOCK1_VALUE ( 426) 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun /* lock mask 2 value (1) */ 546*4882a593Smuzhiyun #define DIB3000MB_REG_LOCK2_VALUE ( 427) 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun /* interrupt pending for auto search */ 549*4882a593Smuzhiyun #define DIB3000MB_REG_AS_IRQ_PENDING ( 434) 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun #endif 552