satip-axe/tools/axehelper.c
2015-04-15 18:05:21 +02:00

293 lines
6.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
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 *wdmp;
struct regdmp *rdmp;
const char *name;
};
static struct regdmp f129w[] = {
{ 0, 3, 1, "I2C_FASTMODE" },
{ 0, 0, 3, "I2CADDR_INC" },
{ 0, 0, 0, NULL }
};
static struct regdmp f12aw[] = {
{ 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 f1a0w[] = {
{ 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 f216w[] = {
{ 0, 0,31, "DEMOD_MODE" },
{ 0, 0, 0, NULL }
};
static struct regdmp f23dw[] = {
{ 0, 8,255,"K_FREQ_HDR" },
{ 0, 4,15, "KC_COARSE_EXP" },
{ 0, 0,15, "BETA_FREQ" },
{ 0, 0, 0, NULL }
};
static struct regdmp f1a8r[] = {
{ 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 f206r[] = {
{ 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 f211r[] = {
{ 0, 7, 1, "MANUAL_MODCOD" },
{ 0, 2,31, "DEMOD_MODCOD" },
{ 0, 0, 3, "DEMOD_TYPE" },
{ 0, 0, 0, NULL }
};
static struct regdmp f212r[] = {
{ 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 f33er[] = {
{ 0, 4, 1, "PRFVIT" },
{ 0, 3, 1, "LOCKEDVIT" },
{ 0, 0, 0, NULL }
};
static struct regdmp f369r[] = {
{ 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 f381r[] = {
{ 0, 7, 1, "TSFIFO_LINEOK" },
{ 0, 6, 1, "TSFIFO_ERROR" },
{ 0, 0, 1, "DIL_READY" },
{ 0, 0, 0, NULL }
};
static struct reg reg_tbl[] = {
{ 0xf129, 0, f129w, NULL, "I2CCFG" },
{ 0xf12a, 0, f12aw, NULL, "P1_I2CRPT" },
{ 0xf1a0, 0, f1a0w, NULL, "P1_DISTXCTL" },
{ 0xf1a7, 0, NULL, NULL, "P1_DISTXDATA" },
{ 0xf1a8, 0, NULL, f1a8r, "P1_DISTXSTATUS" },
{ 0xf206, 0, NULL, f206r, "P2_AGC1CN" },
{ 0xf20e, 0, NULL, NULL, "P2_AGCIQIN1" },
{ 0xf211, 0, NULL, f211r, "P2_DMDMODCOD" },
{ 0xf212, 0, NULL, f212r, "P2_DSTATUS" },
{ 0xf216, 0, f216w, NULL, "P2_DMDISTATE" },
{ 0xf22d, 0, NULL, NULL, "P2_AGC2_REF" },
{ 0xf23d, 0, f23dw, NULL, "P2_CARFREQ" },
{ 0xf248, 0, NULL, NULL, "P2_CFRINIT1" },
{ 0xf25e, 0, NULL, NULL, "P2_SFRINIT1" },
{ 0xf280, 0, NULL, NULL, "P2_NNOSDATAT1" },
{ 0xf284, 0, NULL, NULL, "P2_NNOSPLHT1" },
{ 0xf33e, 0, NULL, f33er, "P2_VSTATUSVIT" },
{ 0xf369, 0, NULL, f369r, "P2_PDELSTATUS1" },
{ 0xf381, 0, NULL, f381r, "P2_TSSTATUS" },
{ 0xf399, 0, NULL, NULL, "P2_ERRCNT12" },
{ 0xf406, 0, NULL, f206r, "P1_AGC1CN" },
{ 0xf40e, 0, NULL, NULL, "P1_AGCIQIN1" },
{ 0xf411, 0, NULL, f211r, "P1_DMDMODCOD" },
{ 0xf412, 0, NULL, f212r, "P1_DSTATUS" },
{ 0xf416, 0, f216w, NULL, "P1_DMDISTATE" },
{ 0xf42d, 0, NULL, NULL, "P1_AGC2_REF" },
{ 0xf43d, 0, f23dw, NULL, "P1_CARFREQ" },
{ 0xf448, 0, NULL, NULL, "P1_CFRINIT1" },
{ 0xf45e, 0, NULL, NULL, "P1_SFRINIT1" },
{ 0xf480, 0, NULL, NULL, "P1_NNOSDATAT1" },
{ 0xf484, 0, NULL, NULL, "P1_NNOSPLHT1" },
{ 0xf53e, 0, NULL, f33er, "P1_VSTATUSVIT" },
{ 0xf569, 0, NULL, f369r, "P1_PDELSTATUS1" },
{ 0xf581, 0, NULL, f381r, "P1_TSSTATUS" },
{ 0xf599, 0, NULL, NULL, "P1_ERRCNT12" },
{ 0, 0, NULL, NULL }
};
static int
i2c_line(int rd, int t1, const char *s)
{
static struct reg *old_rt[2] = { NULL, NULL };
static int old_cmd[2] = { 0, 0 };
int r, addr, cnt, d[16], val;
struct reg *rt;
struct regdmp *rtd;
char buf[1024];
r = sscanf(s + 11, "%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) {
if (old_rt[t1] == NULL)
return -1;
if (cnt < 1) {
old_rt[t1] = NULL;
return -1;
}
val = d[0];
if (cnt > 1)
val |= d[1] << 8;
if (cnt > 2)
val |= d[2] << 16;
if (cnt > 3)
val |= d[3] << 24;
snprintf(buf, sizeof(buf), "%-40s ;", s);
for (rtd = old_rt[t1]->rdmp; rtd && rtd->name; rtd++) {
if (strlen(buf) > 70) {
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);
}
printf("%s\n", buf);
old_rt[t1] = NULL;
return 0;
}
if (d[0] < 0xf1 || d[0] > 0xf5)
return -1;
if (cnt < 2)
return -1;
old_cmd[t1] = (d[0] << 8) | d[1];
for (rt = reg_tbl; rt->name; rt++)
if (rt->reg == old_cmd[t1])
break;
if (rt->name == NULL)
return -1;
old_rt[t1] = rt;
val = 0;
if (cnt > 2)
val = d[2];
if (cnt > 3)
val |= d[3] << 8;
if (cnt > 4)
val |= d[4] << 16;
if (cnt > 5)
val |= d[5] << 24;
snprintf(buf, sizeof(buf), "%-40s ; %s", s, rt->name);
for (rtd = old_rt[t1]->wdmp; rtd && rtd->name; rtd++) {
if (strlen(buf) > 70) {
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);
}
printf("%s\n", buf);
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, buf);
else if (!strncmp(buf, "[i2c] read(", 11))
r = i2c_line(1, 0, buf);
else if (!strncmp(buf, "[i2c] t1_w(", 11))
r = i2c_line(0, 1, buf);
else if (!strncmp(buf, "[i2c] t1_r(", 11))
r = i2c_line(1, 1, buf);
if (r < 0)
printf("%s\n", buf);
}
}
int main(int argc, char *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();
}
return 0;
}