#include #include #include #include #include #include #include #include #include #include #include #include #define PWIDTH 90 #ifndef I2C_M_NOREPSTART #define I2C_M_NOREPSTART 0 #endif typedef unsigned char u8; static unsigned long getTick () { static unsigned long init = 0; unsigned long t; struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); t = ts.tv_nsec / 1000000; t += ts.tv_sec * 1000; if (init == 0) init = t; return t - init; } struct regdmp { unsigned flags; unsigned shift; unsigned mask; const char *name; }; struct reg { unsigned reg; unsigned flags; struct regdmp *dmp; const char *name; }; static struct regdmp byte[] = { { 0, 0,255, "VAL" }, { 0, 0, 0, NULL } }; static struct regdmp conf[] = { { 0, 7, 1, "OPD" }, { 0, 1,63, "CONFIG" }, { 0, 0, 1, "XOR" }, { 0, 0, 0, NULL } }; static struct regdmp f100[] = { { 0, 4,15,"IDENT" }, { 0, 0,15,"RELEASE" }, { 0, 0, 0, NULL } }; static struct regdmp f129[] = { { 0, 3, 1, "I2C_FASTMODE" }, { 0, 0, 3, "I2CADDR_INC" }, { 0, 0, 0, NULL } }; static struct regdmp f12a[] = { { 0, 7, 1, "I2CT_ON" }, { 0, 4, 7, "ENARPT_LEVEL" }, { 0, 3, 1, "SCLT_DELAY" }, { 0, 2, 1, "STOP_ENABLE" }, { 0, 1, 1, "STOP_SDAT2SDA" }, { 0, 0, 0, NULL } }; static struct regdmp f16a[] = { { 0, 4,15, "SEL2" }, { 0, 0,15, "SEL1" }, { 0, 0, 0, NULL } }; static struct regdmp f16b[] = { { 0, 4,15, "SEL4" }, { 0, 0,15, "SEL3" }, { 0, 0, 0, NULL } }; static struct regdmp f16c[] = { { 0, 4,15, "SEL6" }, { 0, 0,15, "SEL5" }, { 0, 0, 0, NULL } }; static struct regdmp f190[] = { { 0, 7, 1, "TIM_OFF" }, { 0, 6, 1, "DISEQC_RESET" }, { 0, 4, 3, "TIM_CMD" }, { 0, 3, 1, "DIS_PRECHARGE" }, { 0, 0, 7, "DISTX_MODE" }, { 0, 0, 0, NULL } }; static struct regdmp f198[] = { { 0, 7, 1, "TX_FAIL" }, { 0, 6, 1, "FIFO_FULL" }, { 0, 5, 1, "TX_IDLE" }, { 0, 4, 1, "GAP_BURST" }, { 0, 0,15, "TXFIFO_BYTES" }, { 0, 0, 0, NULL } }; static struct regdmp f1b6[] = { { 0, 7, 1, "STANDBY" }, { 0, 6, 1, "BYPASSPLLCORE" }, { 0, 5, 1, "SELX1RATIO" }, { 0, 3, 1, "STOP_PLL" }, { 0, 2, 1, "BYPASSPLLFSK" }, { 0, 1, 1, "SELOSCI" }, { 0, 0, 1, "BYPASSPLLADC" }, { 0, 0, 0, NULL } }; static struct regdmp f1c2[] = { { 0, 7, 1, "STOP_CLKPKDT2" }, { 0, 6, 1, "STOP_CLKPKDT1" }, { 0, 5, 1, "STOP_CLKFEC" }, { 0, 3, 1, "STOP_CLKADCI2" }, { 0, 2, 1, "INV_CLKADCI2" }, { 0, 1, 1, "STOP_CLKADCI1" }, { 0, 0, 1, "INV_CLKADCI1" }, { 0, 0, 0, NULL } }; static struct regdmp f1c3[] = { { 0, 4, 1, "STOP_CLKSAMP2" }, { 0, 3, 1, "STOP_CLKSAMP1" }, { 0, 2, 1, "STOP_CLKVIT2" }, { 0, 1, 1, "STOP_CLKVIT1" }, { 0, 0, 1, "STOP_CLKTS" }, { 0, 0, 0, NULL } }; static struct regdmp f1e1[] = { { 0, 5, 1, "DISEQC1_PON" }, { 0, 0, 0, NULL } }; static struct regdmp f201[] = { { 0, 5, 1, "DUMMYPL_NOSDATA" }, { 0, 3, 3, "NOSPLH_BETA" }, { 0, 0, 7, "NOSDATA_BETA" }, { 0, 0, 0, NULL } }; static struct regdmp f206[] = { { 0, 7, 1, "AGC1_LOCKED" }, { 0, 4, 1, "AGC1_MINPOWER" }, { 0, 3, 1, "AGCOUT_FAST" }, { 0, 0, 7, "AGCIQ_BETA" }, { 0, 0, 0, NULL } }; static struct regdmp f211[] = { { 0, 7, 1, "MANUAL_MODCOD" }, { 0, 2,31, "DEMOD_MODCOD" }, { 0, 0, 3, "DEMOD_TYPE" }, { 0, 0, 0, NULL } }; static struct regdmp f212[] = { { 0, 7, 1, "CAR_LOCK" }, { 0, 5, 3, "TMGLOCK_QUALITY" }, { 0, 3, 1, "LOCK_DEFINITE" }, { 0, 0, 1, "OVADC_DETECT" }, { 0, 0, 0, NULL } }; static struct regdmp f213[] = { { 0, 7, 1, "DEMOD_DELOCK" }, { 0, 3, 3, "AGC1_NOSIGNALACK" }, { 0, 2, 1, "AGC2_OVERFLOW" }, { 0, 1, 1, "CFR_OVERFLOW" }, { 0, 0, 1, "GAMMA_OVERUNDER" }, { 0, 0, 0, NULL } }; static struct regdmp f214[] = { { 0, 7, 1, "DVBS2_ENABLE" }, { 0, 6, 1, "DVBS1_ENABLE" }, { 0, 4, 1, "SCAN_ENABLE" }, { 0, 3, 1, "CFR_AUTOSCAN" }, { 0, 0, 3, "TUN_RNG" }, { 0, 0, 0, NULL } }; static struct regdmp f215[] = { { 0, 6, 1, "S1S2_SEQUENTIAL" }, { 0, 4, 1, "INFINITE_RELOCK" }, { 0, 0, 0, NULL } }; static struct regdmp f216[] = { { 0, 0,31, "DEMOD_MODE" }, { 0, 0, 0, NULL } }; static struct regdmp f21e[] = { { 0, 3, 1, "NOSTOP_FIFOFULL" }, { 0, 0, 0, NULL } }; static struct regdmp f21f[] = { { 0, 3, 1, "TUNER_NRELAUNCH" }, { 0, 0, 0, NULL } }; static struct regdmp f224[] = { { 0, 7, 1, "SPECINV_DEMOD" }, { 0, 2,31, "PLH_MODCOD" }, { 0, 0, 3, "PLH_TYPE" }, { 0, 0, 0, NULL } }; static struct regdmp f238[] = { { 0, 7, 1, "CFRUPLOW_AUTO" }, { 0, 6, 1, "CFRUPLOW_TEST" }, { 0, 2, 1, "ROTAON" }, { 0, 0, 3, "PH_DET_ALGO" }, { 0, 0, 0, NULL } }; static struct regdmp f239[] = { { 0, 4, 3, "CAR_ALPHA_MANT" }, { 0, 0,15, "CAR_ALPHA_EXP" }, { 0, 0, 0, NULL } }; static struct regdmp f23a[] = { { 0, 4, 3, "CAR_BETA_MANT" }, { 0, 0,15, "CAR_BETA_EXP" }, { 0, 0, 0, NULL } }; static struct regdmp f23d[] = { { 0, 4,15, "KC_COARSE_EXP" }, { 0, 0,15, "BETA_FREQ" }, { 0, 0, 0, NULL } }; static struct regdmp f250[] = { { 0, 6, 3, "TMGLOCK_BETA" }, { 0, 4, 1, "DO_TIMING_CORR" }, { 0, 0, 3, "TMG_MINFREQ" }, { 0, 0, 0, NULL } }; static struct regdmp f251[] = { { 0, 4,15, "TMGALPHAS_EXP" }, { 0, 0,15, "TMGBETAS_EXP" }, { 0, 0, 0, NULL } }; static struct regdmp f252[] = { { 0, 4,15, "TMGALPHAS2_EXP" }, { 0, 0,15, "TMGBETAS2_EXP" }, { 0, 0, 0, NULL } }; static struct regdmp f259[] = { { 0, 4,15, "SFR_SCANSTEP" }, { 0, 0,15, "SFR_CENTERSTEP" }, { 0, 0, 0, NULL } }; static struct regdmp f260[] = { { 0, 7, 1, "AUTO_GUP" }, { 0, 0,127,"SYMB_FREQ_UP1" }, { 0, 0, 0, NULL } }; static struct regdmp f262[] = { { 0, 7, 1, "AUTO_GLOW" }, { 0, 0,127,"SYMB_FREQ_LOW1" }, { 0, 0, 0, NULL } }; static struct regdmp f26d[] = { { 0, 6, 3, "ROLLOFF_STATUS" }, { 0, 0, 0, NULL } }; static struct regdmp f290[] = { { 0, 6, 1, "CARRIER3_DISABLE" }, { 0, 2, 1, "ROTA2ON" }, { 0, 0, 3, "PH_DET_ALGO2" }, { 0, 0, 0, NULL } }; static struct regdmp f291[] = { { 0, 6, 3, "CFR2TOCFR1_DVBS1" }, { 0, 5, 1, "EN_S2CAR2CENTER" }, { 0, 4, 1, "DIS_BCHERRCFR2" }, { 0, 0, 7, "CFR2TOCFR1_BETA" }, { 0, 0, 0, NULL } }; static struct regdmp f297[] = { { 0, 7, 1, "ENAB_SPSKSYMB" }, { 0, 4, 3, "CAR2S2_Q_ALPH_M" }, { 0, 0,15, "CAR2S2_Q_ALPH_E" }, { 0, 0, 0, NULL } }; static struct regdmp f298[] = { { 0, 7, 1, "OLDI3Q_MODE" }, { 0, 4, 3, "CAR2S2_8_ALPH_M" }, { 0, 0,15, "CAR2S2_8_ALPH_M" }, { 0, 0, 0, NULL } }; static struct regdmp f29c[] = { { 0, 4, 3, "CAR2S2_Q_BETA_M" }, { 0, 0,15, "CAR2S2_Q_BETA_M" }, { 0, 0, 0, NULL } }; static struct regdmp f29d[] = { { 0, 4, 3, "CAR2S2_8_BETA_M" }, { 0, 0,15, "CAR2S2_8_BETA_M" }, { 0, 0, 0, NULL } }; static struct regdmp f2b7[] = { { 0, 4,15, "DIS_8P_9_10" }, { 0, 0,15, "DIS_8P_8_9" }, { 0, 0, 0, NULL } }; static struct regdmp f2b8[] = { { 0, 4,15, "DIS_8P_5_6" }, { 0, 0,15, "DIS_8P_3_4" }, { 0, 0, 0, NULL } }; static struct regdmp f2b9[] = { { 0, 4,15, "DIS_8P_2_3" }, { 0, 0,15, "DIS_8P_3_5" }, { 0, 0, 0, NULL } }; static struct regdmp f2ba[] = { { 0, 4,15, "DIS_QP_9_10" }, { 0, 0,15, "DIS_QP_8_9" }, { 0, 0, 0, NULL } }; static struct regdmp f2bb[] = { { 0, 4,15, "DIS_QP_5_6" }, { 0, 0,15, "DIS_QP_4_5" }, { 0, 0, 0, NULL } }; static struct regdmp f2bc[] = { { 0, 4,15, "DIS_QP_3_4" }, { 0, 0,15, "DIS_QP_2_3" }, { 0, 0, 0, NULL } }; static struct regdmp f2bd[] = { { 0, 4,15, "DIS_QP_3_5" }, { 0, 0,15, "DIS_QP_1_2" }, { 0, 0, 0, NULL } }; static struct regdmp f2be[] = { { 0, 4,15, "DIS_QP_2_5" }, { 0, 0,15, "DIS_QP_1_3" }, { 0, 0, 0, NULL } }; static struct regdmp f2bf[] = { { 0, 4,15, "DIS_QP_1_4" }, { 0, 0, 0, NULL } }; static struct regdmp f2c0[] = { { 0, 7, 1, "EN_CCIMODE" }, { 0, 0,127,"R0_GAUSSIEN" }, { 0, 0, 0, NULL } }; static struct regdmp f2c1[] = { { 0, 7, 1, "CCIDETECT_PLHONLY" }, { 0, 0,127,"R0_CCI" }, { 0, 0, 0, NULL } }; static struct regdmp f2d8[] = { { 0, 6, 1, "EQUALFFE_ON" }, { 0, 0, 7, "MU_EQUALFFE" }, { 0, 0, 0, NULL } }; static struct regdmp f2e0[] = { { 0, 7, 1, "TUN_ACKFAIL" }, { 0, 4, 7, "TUN_TYPE" }, { 0, 3, 1, "TUN_SECSTOP" }, { 0, 2, 1, "TUN_VCOSRCH" }, { 0, 0, 3, "TUN_MADDRESS" }, { 0, 0, 0, NULL } }; static struct regdmp f300[] = { { 0, 7, 1, "DIS_QSCALE" }, { 0, 0,127,"SMAPCOEF_Q_LLR12" }, { 0, 0, 0, NULL } }; static struct regdmp f301[] = { { 0, 2, 1, "ADJ_8PSKLLR1" }, { 0, 1, 1, "OLD_8PSKLLR1" }, { 0, 0, 1, "DIS_AB8PSK" }, { 0, 0, 0, NULL } }; static struct regdmp f302[] = { { 0, 7, 1, "DIS_8SCALE" }, { 0, 0,127,"SMAPCOEF_8P_LLR23" }, { 0, 0, 0, NULL } }; static struct regdmp f333[] = { { 0, 7, 1, "DSS_DVB" }, { 0, 4, 1, "DSS_SRCH" }, { 0, 1, 1, "SYNCVIT" }, { 0, 0, 1, "IQINV" }, { 0, 0, 0, NULL } }; static struct regdmp f33c[] = { { 0, 6, 1, "DIS_VTHLOCK" }, { 0, 5, 1, "E7_8VIT" }, { 0, 4, 1, "E6_7VIT" }, { 0, 3, 1, "E5_6VIT" }, { 0, 2, 1, "E3_4VIT" }, { 0, 1, 1, "E2_3VIT" }, { 0, 0, 1, "E1_2VIT" }, { 0, 0, 0, NULL } }; static struct regdmp f33d[] = { { 0, 7, 1, "AMVIT" }, { 0, 6, 1, "FROZENVIT" }, { 0, 4, 3, "SNVIT" }, { 0, 2, 3, "TOVVIT" }, { 0, 0, 3, "HYPVIT" }, { 0, 0, 0, NULL } }; static struct regdmp f33e[] = { { 0, 4, 1, "PRFVIT" }, { 0, 3, 1, "LOCKEDVIT" }, { 0, 0, 0, NULL } }; static struct regdmp f369[] = { { 0, 7, 1, "PKTDELIN_DELOCK" }, { 0, 6, 1, "SYNCDUPDFL_BADDFL" }, { 0, 5, 1, "CONTINUOUS_STREAM" }, { 0, 4, 1, "UNACCEPTED_STREAM" }, { 0, 3, 1, "BCH_ERROR_FLAG" }, { 0, 1, 1, "PKTDELIN_LOCK" }, { 0, 0, 1, "FIRST_LOCK" }, { 0, 0, 0, NULL } }; static struct regdmp f36a[] = { { 0, 3,31, "FRAME_MODCOD" }, { 0, 0, 3, "FRAME_TYPE" }, { 0, 0, 0, NULL } }; static struct regdmp f370[] = { { 0, 7, 1, "TSDIL_ON" }, { 0, 6, 1, "TSRS_ON" }, { 0, 4, 1, "TSDESCRAMB_ON" }, { 0, 3, 1, "TSFRAME_MODE" }, { 0, 2, 1, "TS_DISABLE" }, { 0, 0, 1, "TSOUT_NOSYNC" }, { 0, 0, 0, NULL } }; static struct regdmp f372[] = { { 0, 7, 1, "TSFIFO_DVBCI" }, { 0, 6, 7, "TSFIFO_SERIAL" }, { 0, 5, 1, "TSFIFO_TEIUPDATE" }, { 0, 4, 1, "TSFIFO_DUTY50" }, { 0, 3, 1, "TSFIFO_HSGNLOUT" }, { 0, 1, 3, "TSFIFO_ERRMODE" }, { 0, 0, 1, "RST_HWARE" }, { 0, 0, 0, NULL } }; static struct regdmp f381[] = { { 0, 7, 1, "TSFIFO_LINEOK" }, { 0, 6, 1, "TSFIFO_ERROR" }, { 0, 0, 1, "DIL_READY" }, { 0, 0, 0, NULL } }; static struct regdmp f382[] = { { 0, 7, 1, "TSFIFO_DEMODSEL" }, { 0, 6, 1, "TSFIFOSPEED_STORE" }, { 0, 5, 1, "DILXX_RESET" }, { 0, 4, 1, "TSSERIAL_IMPOS" }, { 0, 1, 1, "SCRAMBDETECT" }, { 0, 0, 0, NULL } }; static struct regdmp f398[] = { { 0, 7, 1, "ERR_SOURCE1" }, { 0, 0,127,"NUM_EVENT1" }, { 0, 0, 0, NULL } }; static struct regdmp f39d[] = { { 0, 7, 1, "OLDVALUE" }, { 0, 0,127,"VAL" }, { 0, 0, 0, NULL } }; static struct regdmp f3a0[] = { { 0, 7, 1, "SPY_ENABLE" }, { 0, 6, 1, "NO_SYNCBYTE" }, { 0, 5, 1, "SERIAL_MODE" }, { 0, 4, 1, "UNUSUAL_PACKET" }, { 0, 3, 1, "BERMETER_DATAMODE" }, { 0, 1, 1, "BERMETER_LMODE" }, { 0, 0, 1, "BERMETER_RESET" }, { 0, 0, 0, NULL } }; static struct regdmp f3a4[] = { { 0, 7, 1, "SPY_ENDSIM" }, { 0, 6, 1, "VALID_SIM" }, { 0, 5, 1, "FOUND_SIGNAL" }, { 0, 4, 1, "DSS_SYNCBYTE" }, { 0, 0,15, "RESULT_STATE" }, { 0, 0, 0, NULL } }; static struct regdmp f332[] = { { 0, 7, 1, "NVTH_NOSRANGE" }, { 0, 6, 1, "VERROR_MAXMODE" }, { 0, 3, 1, "NSLOWSN_LOCKED" }, { 0, 1, 1, "DIS_RSFLOCK" }, { 0, 0, 0, NULL } }; static struct regdmp fa86[] = { { 0, 4, 1, "BROADCAST" }, { 0, 1, 1, "PRIORITY" }, { 0, 0, 1, "DDEMOD" }, { 0, 0, 0, NULL } }; static struct regdmp ff11[] = { { 0, 7, 1, "FRESFEC" }, { 0, 0, 0, NULL } }; static struct reg demod_reg_tbl[] = { { 0xf100, 0, f100, "MID" }, { 0xf129, 0, f129, "I2CCFG" }, { 0xf12a, 0, f12a, "P1_I2CRPT" }, { 0xf12b, 0, f12a, "P2_I2CRPT" }, { 0xf142, 0, conf, "GPIO2CFG" }, { 0xf143, 0, conf, "GPIO3CFG" }, { 0xf144, 0, conf, "GPIO4CFG" }, { 0xf145, 0, conf, "GPIO5CFG" }, { 0xf146, 0, conf, "GPIO6CFG" }, { 0xf147, 0, conf, "GPIO7CFG" }, { 0xf148, 0, conf, "GPIO8CFG" }, { 0xf149, 0, conf, "GPIO9CFG" }, { 0xf14a, 0, conf, "GPIO10CFG" }, { 0xf14b, 0, conf, "GPIO11CFG" }, { 0xf14c, 0, conf, "GPIO12CFG" }, { 0xf14d, 0, conf, "GPIO13CFG" }, { 0xf152, 0, conf, "AGCRF1CFG" }, { 0xf156, 0, conf, "AGCRF2CFG" }, { 0xf15b, 0, conf, "ERROR1CFG" }, { 0xf15c, 0, conf, "DPN1CFG" }, { 0xf15d, 0, conf, "STROUT1CFG" }, { 0xf15e, 0, conf, "CLKOUT1CFG" }, { 0xf15f, 0, conf, "DATA71CFG" }, { 0xf160, 0, conf, "ERROR2CFG" }, { 0xf161, 0, conf, "DPN2CFG" }, { 0xf162, 0, conf, "STROUT2CFG" }, { 0xf163, 0, conf, "CLKOUT2CFG" }, { 0xf164, 0, conf, "DATA72CFG" }, { 0xf165, 0, conf, "ERROR3CFG" }, { 0xf166, 0, conf, "DPN3CFG" }, { 0xf167, 0, conf, "STROUT3CFG" }, { 0xf168, 0, conf, "CLKOUT3CFG" }, { 0xf169, 0, conf, "DATA73CFG" }, { 0xf16a, 0, f16a, "STRSTATUS1" }, { 0xf16b, 0, f16b, "STRSTATUS2" }, { 0xf16c, 0, f16c, "STRSTATUS3" }, { 0xf190, 0, f190, "P2_DISTXCTL" }, { 0xf197, 0, byte, "P2_DISTXDATA" }, { 0xf198, 0, f198, "P2_DISTXSTATUS" }, { 0xf199, 0, byte, "P2_F22TX" }, { 0xf19a, 0, byte, "P2_F22RX" }, { 0xf19d, 0, byte, "P2_ACRDIV" }, { 0xf1a0, 0, f190, "P1_DISTXCTL" }, { 0xf1a7, 0, byte, "P1_DISTXDATA" }, { 0xf1a8, 0, f198, "P1_DISTXSTATUS" }, { 0xf1a9, 0, byte, "P1_F22TX" }, { 0xf1aa, 0, byte, "P1_F22RX" }, { 0xf1ad, 0, byte, "P1_ACRDIV" }, { 0xf1b3, 0, byte, "NCOARSE" }, { 0xf1b6, 0, f1b6, "SYNTCTRL" }, { 0xf1c2, 0, f1c2, "STOPCLK1" }, { 0xf1c3, 0, f1c3, "STOPCLK2" }, { 0xf1e1, 0, f1e1, "TSTTNR2" }, { 0xf201, 0, f201, "NOSCFG" }, { 0xf206, 0, f206, "AGC1CN" }, { 0xf20e, 0, byte, "AGCIQIN1" }, { 0xf20f, 0, byte, "AGCIQIN0" }, { 0xf211, 0, f211, "DMDMODCOD" }, { 0xf212, 0, f212, "DSTATUS" }, { 0xf213, 0, f213, "DSTATUS2" }, { 0xf214, 0, f214, "DMDCFGMD" }, { 0xf215, 0, f215, "DMDCFG2" }, { 0xf216, 0, f216, "DMDISTATE" }, { 0xf217, 0, byte, "DMDT0M" }, { 0xf21e, 0, f21e, "DMDCFG3" }, { 0xf21f, 0, f21f, "DMDCFG4" }, { 0xf220, 0, byte, "CORRELMANT" }, { 0xf221, 0, byte, "CORRELABS" }, { 0xf222, 0, byte, "CORRELEXP" }, { 0xf224, 0, f224, "PLHMODCOD" }, { 0xf22d, 0, byte, "AGC2_REF" }, { 0xf238, 0, f238, "CARCFG" }, { 0xf239, 0, f239, "ACLC" }, { 0xf23a, 0, f23a, "BCLC" }, { 0xf23d, 0, f23d, "CARFREQ" }, { 0xf23e, 0, byte, "CARHDR/K_FREQ_HDR" }, { 0xf23f, 0, byte, "LDT/CARLOCK_THRES" }, { 0xf240, 0, byte, "LDT2/CARLOCK_THRES2" }, { 0xf242, 0, byte, "CFRUP1" }, { 0xf243, 0, byte, "CFRUP0" }, { 0xf246, 0, byte, "CFRLOW1" }, { 0xf247, 0, byte, "CFRLOW0" }, { 0xf248, 0, byte, "CFRINIT1" }, { 0xf249, 0, byte, "CFRINIT0" }, { 0xf24c, 0, byte, "CFR2/CAR_FREQ2" }, { 0xf24d, 0, byte, "CFR1/CAR_FREQ1" }, { 0xf24e, 0, byte, "CFR0/CAR_FREQ0" }, { 0xf250, 0, f250, "TMGCFG" }, { 0xf251, 0, f251, "RTC" }, { 0xf252, 0, f252, "RTCS2" }, { 0xf253, 0, byte, "TMGTHRISE" }, { 0xf254, 0, byte, "TMGTHFALL" }, { 0xf255, 0, byte, "SFRUPRATIO" }, { 0xf256, 0, byte, "SFRLOWRATIO" }, { 0xf258, 0, byte, "KREFTMG" }, { 0xf259, 0, f259, "SFRSTEP" }, { 0xf25e, 0, byte, "SFRINIT1" }, { 0xf25f, 0, byte, "SFRINIT0" }, { 0xf260, 0, f260, "SFRUP1" }, { 0xf261, 0, byte, "SFRUP0" }, { 0xf262, 0, f262, "SFRLOW1" }, { 0xf263, 0, byte, "SFRLOW0" }, { 0xf268, 0, byte, "TMGREG2" }, { 0xf269, 0, byte, "TMGREG1" }, { 0xf26a, 0, byte, "TMGREG0" }, { 0xf26b, 0, byte, "TMGLOCK1" }, { 0xf26c, 0, byte, "TMGLOCK0" }, { 0xf26d, 0, f26d, "TMGOBS" }, { 0xf280, 0, byte, "NNOSDATAT1" }, { 0xf281, 0, byte, "NNOSDATAT0" }, { 0xf284, 0, byte, "NNOSPLHT1" }, { 0xf285, 0, byte, "NNOSPLHT0" }, { 0xf290, 0, f290, "CAR2CFG" }, { 0xf291, 0, f291, "CAR2CFG1" }, { 0xf297, 0, f297, "ACLC2S2Q" }, { 0xf298, 0, f298, "ACLC2S28" }, { 0xf29c, 0, f29c, "BCLC2S2Q" }, { 0xf29d, 0, f29d, "BCLC2S28" }, { 0xf2b7, 0, f2b7, "MODCODLST7" }, { 0xf2b8, 0, f2b8, "MODCODLST8" }, { 0xf2b9, 0, f2b9, "MODCODLST9" }, { 0xf2ba, 0, f2ba, "MODCODLSTA" }, { 0xf2bb, 0, f2bb, "MODCODLSTB" }, { 0xf2bc, 0, f2bc, "MODCODLSTC" }, { 0xf2bd, 0, f2bd, "MODCODLSTD" }, { 0xf2be, 0, f2be, "MODCODLSTE" }, { 0xf2bf, 0, f2bf, "MODCODLSTF" }, { 0xf2c0, 0, f2c0, "GAUSSR0" }, { 0xf2c1, 0, f2c1, "CCIR0" }, { 0xf2d8, 0, f2d8, "FFECFG" }, { 0xf2e0, 0, f2e0, "TNRCFG" }, { 0xf300, 0, f300, "SMAPCOEF7" }, { 0xf301, 0, f301, "SMAPCOEF6" }, { 0xf302, 0, f302, "SMAPCOEF5" }, { 0xf333, 0, f333, "FECM" }, { 0xf334, 0, byte, "VTH12" }, { 0xf335, 0, byte, "VTH23" }, { 0xf336, 0, byte, "VTH34" }, { 0xf337, 0, byte, "VTH56" }, { 0xf338, 0, byte, "VTH67" }, { 0xf339, 0, byte, "VTH78" }, { 0xf33c, 0, f33c, "PRVIT" }, { 0xf33d, 0, f33d, "VAVSRVIT" }, { 0xf33e, 0, f33e, "VSTATUSVIT" }, { 0xf370, 0, f370, "TSSTATEM" }, { 0xf372, 0, f372, "TSCFGH" }, { 0xf369, 0, f369, "PDELSTATUS1" }, { 0xf36a, 0, f36a, "PDELSTATUS2" }, { 0xf380, 0, byte, "TSFIFO_OUTSPEED" }, { 0xf381, 0, f381, "TSSTATUS" }, { 0xf382, 0, f382, "TSSTATUS2" }, { 0xf383, 0, byte, "BITRATE1" }, { 0xf384, 0, byte, "BITRATE0" }, { 0xf398, 0, f398, "ERRCTRL1" }, { 0xf399, 0, byte, "ERRCNT12" }, { 0xf39a, 0, byte, "ERRCNT11" }, { 0xf39b, 0, byte, "ERRCNT10" }, { 0xf39d, 0, f39d, "ERRCNT22" }, { 0xf39e, 0, byte, "ERRCNT21" }, { 0xf39f, 0, byte, "ERRCNT20" }, { 0xf3a0, 0, f3a0, "FECSPY" }, { 0xf3a4, 0, f3a4, "FSTATUS" }, { 0xf3ad, 0, byte, "FBERERR2" }, { 0xf3ae, 0, byte, "FBERERR1" }, { 0xf3af, 0, byte, "FBERERR0" }, { 0xf332, 0, f332, "VITSCALE" }, { 0xf600, 0, byte, "RCCFG2" }, { 0xfa43, 0, byte, "GAINLLR_NF4/QP_1_2" }, { 0xfa44, 0, byte, "GAINLLR_NF5/QP_3_5" }, { 0xfa45, 0, byte, "GAINLLR_NF6/QP_2_3" }, { 0xfa46, 0, byte, "GAINLLR_NF7/QP_3_4" }, { 0xfa47, 0, byte, "GAINLLR_NF8/QP_4_5" }, { 0xfa48, 0, byte, "GAINLLR_NF9/QP_5_6" }, { 0xfa49, 0, byte, "GAINLLR_NF10/QP_8_9" }, { 0xfa4a, 0, byte, "GAINLLR_NF11/QP_9_10" }, { 0xfa50, 0, byte, "GAINLLR_NF18/8P_9_10" }, { 0xfa86, 0, fa86, "GENCFG" }, { 0xff11, 0, ff11, "TSTRES0" }, { 0, 0, NULL, NULL } }; static int i2c_demod_valid(int reg) { if (reg >= 0xf100 && reg < 0x10000) return 1; return 0; } static const char * i2c_demod_prefix(int reg) { if (reg >= 0xf200 && reg < 0xf400) return "P2_"; if (reg >= 0xf400 && reg < 0xf600) return "P1_"; return ""; } static struct reg *i2c_demod_find(int reg) { int reg2 = reg >= 0xf400 && reg < 0xf600 ? reg - 0x200 : reg; struct reg *rt; for (rt = demod_reg_tbl; rt->name; rt++) if (rt->reg == reg2) break; return rt->name ? rt : NULL; } static const char *i2c_print_old(const char *s) { if (s[0]) printf("%s\n", s); return ""; } static int i2c_line(int rd, int t1, int start, const char *s) { static struct reg *old_rt[2] = { NULL, NULL }; static int old_cmd[2] = { 0, 0 }; int r, ptr, addr, cnt, d[16], val; struct reg *rt; struct regdmp *rtd; char buf[1024]; r = sscanf(s + start, "%x, %d) %x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x", &addr, &cnt, &d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6], &d[7], &d[8], &d[9], &d[10], &d[11], &d[12], &d[13], &d[14], &d[15]); if (r < 3 || cnt != r - 2) return -1; if (addr < 0xd0 && addr > 0xd3) return -1; if (!rd) goto wr; if (old_rt[t1] == NULL) return -1; if (cnt < 1) { old_rt[t1] = NULL; return -1; } addr = old_cmd[t1]; ptr = 0; do { val = d[ptr]; rt = i2c_demod_find(addr++); if (rt == NULL) { s = i2c_print_old(s); continue; } snprintf(buf, sizeof(buf), "%-40s ; %s%s{%04x}", s, i2c_demod_prefix(addr - 1), rt->name, addr - 1); for (rtd = rt->dmp; rtd && rtd->name; rtd++) { if (strlen(buf) > PWIDTH) { printf("%s\n", buf); sprintf(buf, "%40s ;", ""); } snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s=0x%x", rtd->name, (val >> rtd->shift) & rtd->mask); val &= ~(rtd->mask << rtd->shift); } if (val) { if (strlen(buf) > PWIDTH) { printf("%s\n", buf); sprintf(buf, "%40s ;", ""); } snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " UNKNOWN=0x%x", val); } s = i2c_print_old(buf); } while (++ptr < cnt); old_rt[t1] = NULL; return 0; wr: if (!i2c_demod_valid((d[0] << 8) | d[1])) return -1; if (cnt < 2) return -1; old_cmd[t1] = ((d[0] << 8) | d[1]) - 1; ptr = 2; do { addr = ++old_cmd[t1]; rt = i2c_demod_find(addr); if (rt == NULL) { s = i2c_print_old(s); continue; } old_rt[t1] = rt; snprintf(buf, sizeof(buf), "%-40s ; %s%s{%04x}", s, i2c_demod_prefix(addr), rt->name, addr); if (ptr < cnt) { val = d[ptr]; for (rtd = rt->dmp; rtd && rtd->name; rtd++) { if (strlen(buf) > PWIDTH) { printf("%s\n", buf); sprintf(buf, "%40s ;", ""); } snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s=0x%x", rtd->name, (val >> rtd->shift) & rtd->mask); val &= ~(rtd->mask << rtd->shift); } if (val) { if (strlen(buf) > PWIDTH) { printf("%s\n", buf); sprintf(buf, "%40s ;", ""); } snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " UNKNOWN=0x%x", val); } } s = i2c_print_old(buf); } while (++ptr < cnt); return 0; } static void i2c_decoder(void) { char buf[1024]; int r; while (!feof(stdin)) { if (fgets(buf, sizeof(buf), stdin) == NULL) break; if (buf[0] == '\0') continue; buf[strlen(buf)-1] = '\0'; r = -1; if (!strncmp(buf, "[i2c] wrte(", 11)) r = i2c_line(0, 0, 11, buf); else if (!strncmp(buf, "[i2c] read(", 11)) r = i2c_line(1, 0, 11, buf); else if (!strncmp(buf, "[i2c] t1_w(", 11)) r = i2c_line(0, 1, 11, buf); else if (!strncmp(buf, "[i2c] t1_r(", 11)) r = i2c_line(1, 1, 11, buf); if (r < 0) printf("%s\n", buf); } } static int i2c_fd = -1; static int i2c_open(int num, char *_path) { char path[32]; if (num < 8) sprintf(path, "/dev/i2c-%d", num); else strcpy(path, "/dev/axe/i2c_drv-0"); i2c_fd = open(path, O_RDWR); if (i2c_fd < 0) return -1; if (_path) strcpy(_path, path); return 0; } static int i2c_open_check(void) { if (i2c_fd >= 0) return 0; if (i2c_open(0, NULL)) { printf("Unable to open i2c device\n"); return -1; } return 0; } static u8 i2c_repeater[3] = { 0xf1, 0x2a, 0xbc }; static int i2c_reg_read(int addr, int reg, u8 *buf, int cnt, int trans) { u8 buf1[3]; struct i2c_rdwr_ioctl_data d; struct i2c_msg m[4]; int mi = 0, fmask = trans ? I2C_M_NOREPSTART : 0; if (i2c_open_check()) return -1; memset(&d, 0, sizeof(d)); memset(&m, 0, sizeof(m)); memset(buf1, 0, sizeof(buf1)); memset(buf, 0, cnt); /* STV0610 */ if (addr == 0xc0 || addr == 0xc6) { fmask = I2C_M_NOREPSTART; m[mi].addr = (addr == 0xc0 ? 0xd0 : 0xd2) >> 1; m[mi].len = sizeof(i2c_repeater); m[mi].flags = fmask; m[mi].buf = i2c_repeater; mi++; } if (reg < 256) { buf1[0] = reg; } else { buf1[0] = reg >> 8; buf1[1] = reg; } m[mi].addr = addr >> 1; m[mi].len = reg < 256 ? 1 : 2; m[mi].flags = fmask; m[mi].buf = buf1; mi++; /* STV0610 */ if (addr == 0xc0 || addr == 0xc6) { m[mi].addr = (addr == 0xc0 ? 0xd0 : 0xd2) >> 1; m[mi].len = sizeof(i2c_repeater); m[mi].flags = fmask; m[mi].buf = i2c_repeater; mi++; } m[mi].addr = addr >> 1; m[mi].len = cnt; m[mi].flags = fmask | I2C_M_RD; m[mi].buf = buf; mi++; d.nmsgs = mi; d.msgs = m; if (ioctl(i2c_fd, I2C_RDWR, &d) < 0) { printf("I2C RDWR failed for addr 0x%x\n", addr); return -1; } return cnt; } static int i2c_reg_write(int addr, int reg, u8 *buf, int cnt, int trans) { u8 buf1[32]; struct i2c_rdwr_ioctl_data d; struct i2c_msg m[2]; int mi = 0, fmask = trans ? I2C_M_NOREPSTART : 0; if (i2c_open_check()) return -1; memset(&d, 0, sizeof(d)); memset(&m, 0, sizeof(m)); memset(buf1, 0, sizeof(buf1)); /* STV0610 */ if (addr == 0xc0 || addr == 0xc6) { fmask = I2C_M_NOREPSTART; m[mi].addr = (addr == 0xc0 ? 0xd0 : 0xd2) >> 1; m[mi].len = sizeof(i2c_repeater); m[mi].flags = fmask; m[mi].buf = i2c_repeater; mi++; } if (reg < 256) { buf1[0] = reg; memcpy(buf1 + 1, buf, cnt); } else { buf1[0] = reg >> 8; buf1[1] = reg; memcpy(buf1 + 2, buf, cnt); } m[mi].addr = addr >> 1; m[mi].len = (reg < 256 ? 1 : 2) + cnt; m[mi].flags = fmask; m[mi].buf = buf1; mi++; d.nmsgs = mi; d.msgs = m; if (ioctl(i2c_fd, I2C_RDWR, &d) < 0) { printf("I2C RDWR failed for addr 0x%x\n", addr); return -1; } return cnt; } static void i2c_scan(void) { int i, a, r; u8 v; char path[32]; for (i = 0; i < 9; i++) { if (i2c_open(i, path)) continue; a = 0xd0; r = i2c_reg_read(a, 0xf000, &v, 1, 1); if (r >= 0) printf("I2C read succeed for %s, addr 0x%02x: 0x%02x\n", path, a, v); close(i2c_fd); i2c_fd = -1; } } #define MAXARGV 32 #define MAXOPTS 32 static char *argv[MAXARGV]; static int argc; static char *opts[MAXOPTS]; static int optc; static int find_opt(const char *name) { int i; for (i = 0; i < optc; i++) if (strcmp(opts[i], name) == 0) return 1; return 0; } static void parse_args(int _argc, char *_argv[]) { char *s; int i; argv[0] = _argv[0]; argc = 1; for (i = 1; i < _argc; i++) { s = _argv[i]; if (s[0] == '-') { s++; if (s[0] == '-') s++; if (optc < MAXOPTS) opts[optc++] = s; } else { if (argc < MAXARGV) argv[argc++] = s; } } } int main(int _argc, char *_argv[]) { parse_args(_argc, _argv); if (argc > 1 && !strcmp(argv[1], "wait")) { long int ms = 1000; const char *f = NULL; if (argc > 2) ms = atol(argv[2]); if (argc > 3) nice(atoi(argv[3])); if (argc > 4) f = argv[4][0] ? argv[4] : NULL; ms += getTick(); while (ms > getTick()) if (f && !access(f, R_OK)) break; } if (argc > 1 && !strcmp(argv[1], "i2c_decoder")) { i2c_decoder(); } if (argc > 1 && !strcmp(argv[1], "i2c_scan")) { i2c_scan(); } if (argc > 1 && !strcmp(argv[1], "i2c_reg_read")) { if (argc <= 3) exit(EXIT_FAILURE); int i, j; int a = strtol(argv[2], NULL, 0); int r = strtol(argv[3], NULL, 0); int c = argc > 4 ? strtol(argv[4], NULL, 0) : 1; u8 buf[16]; char buf2[256]; if (a < 0 || r < 0 || c < 0) exit(EXIT_FAILURE); i = i2c_reg_read(a, r, buf, c > sizeof(buf) ? sizeof(buf) : c, find_opt("trans")); if (i < 0) { printf("Unable to read register 0x%x from addr 0x%x\n", r, a); exit(EXIT_FAILURE); } if (find_opt("decode")) { if (r < 256) sprintf(buf2, " > (%x, %d) %02x", a & ~1, 2, r & 0xff); else sprintf(buf2, " > (%x, %d) %02x.%02x", a & ~1, 2, (r >> 8) & 0xff, r & 0xff); if (i2c_line(0, 0, 5, buf2) >= 0) { sprintf(buf2, " < (%x, %d) ", a | 1, i); for (j = 0; j < i; j++) sprintf(buf2 + strlen(buf2), "%s%02x", j > 0 ? "." : "", buf[j]); if (i2c_line(1, 0, 5, buf2) >= 0) exit(EXIT_SUCCESS); } } if (!find_opt("decode") || find_opt("raw")) { for (j = 0; j < i; j++) printf("%s0x%02x", j > 0 ? ":" : "", buf[j]); printf("\n"); } exit(EXIT_SUCCESS); } if (argc > 1 && !strcmp(argv[1], "i2c_reg_write")) { if (argc <= 4) exit(EXIT_FAILURE); int i, j; int a = strtol(argv[2], NULL, 0); int r = strtol(argv[3], NULL, 0); u8 buf[16]; for (j = 4; j < argc && j < sizeof(buf) + 4; j++) buf[j-4] = strtol(argv[j], NULL, 0); if (a <= 0 && r < 0) exit(EXIT_FAILURE); i = i2c_reg_write(a, r, buf, j, find_opt("trans")); if (i < 0) { printf("Unable to write register 0x%x to addr 0x%x\n", r, a); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } return 0; }