From c23435e275d6a243a1b33b0caf00b3ca646ca4b9 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 23 Jun 2021 11:18:35 +0200 Subject: [PATCH 1/2] handle revision 1 mods differently --- ddbridge/ddbridge-core.c | 13 +++++++++---- ddbridge/ddbridge-modulator.c | 21 ++++++++++++++++++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 4e6dc7f..7fbf91a 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -2602,7 +2602,7 @@ static int ddb_port_match_link_i2c(struct ddb_port *port) static void ddb_ports_init(struct ddb *dev) { - u32 i, l, p; + u32 i, l, p, ports; struct ddb_port *port; const struct ddb_info *info; const struct ddb_regmap *rm; @@ -2614,7 +2614,12 @@ static void ddb_ports_init(struct ddb *dev) rm = info->regmap; if (!rm) continue; - for (i = 0; i < info->port_num; i++, p++) { + ports = info->port_num; + if ((l == 0) && (dev->link[l].info->type == DDB_MOD) && + (dev->link[0].ids.revision == 1)) { + ports = ddbreadl(dev, 0x260) >> 24; + } + for (i = 0; i < ports; i++, p++) { port = &dev->port[p]; port->dev = dev; port->nr = i; @@ -3266,8 +3271,8 @@ static long ddb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ddbid.device = dev->link[0].ids.device; ddbid.subvendor = dev->link[0].ids.subvendor; ddbid.subdevice = dev->link[0].ids.subdevice; - ddbid.hw = ddbreadl(dev, 0); - ddbid.regmap = ddbreadl(dev, 4); + ddbid.hw = dev->link[0].ids.hwid; + ddbid.regmap = dev->link[0].ids.regmapid; if (copy_to_user(parg, &ddbid, sizeof(ddbid))) return -EFAULT; break; diff --git a/ddbridge/ddbridge-modulator.c b/ddbridge/ddbridge-modulator.c index 986cf2f..e99064d 100644 --- a/ddbridge/ddbridge-modulator.c +++ b/ddbridge/ddbridge-modulator.c @@ -1863,6 +1863,8 @@ static int mod_init_2(struct ddb *dev, u32 Frequency) dev_err(dev->dev, "FSM setup failed!\n"); return -1; } + if (dev->link[0].ids.revision == 1) + return 0; for (i = 0; i < streams; i++) { struct ddb_mod *mod = &dev->mod[i]; @@ -2026,7 +2028,7 @@ static int mod_init_sdr_iq(struct ddb *dev) ret = rfdac_init(dev); if (ret) dev_err(dev->dev, "RFDAC setup failed\n"); - + ddbwritel(dev, 0x01, 0x240); if (dev->link[0].ids.revision == 1) @@ -2049,6 +2051,23 @@ static int mod_init_sdr_iq(struct ddb *dev) int ddbridge_mod_init(struct ddb *dev) { + dev_info(dev->dev, "Revision: %u\n", dev->link[0].ids.revision); + if (dev->link[0].ids.revision == 1) { + switch (dev->link[0].info->version) { + case 0: + case 1: + return mod_init_1(dev, 722000000); + case 2: /* FSM */ + return mod_init_2(dev, 114000000); + case 16: /* PAL */ + return mod_init_3(dev, 503250000); + case 17: /* raw IQ */ + case 18: /* IQ+FFT */ + return mod_init_sdr_iq(dev); + default: + return -1; + } + } switch (dev->link[0].info->version) { case 0: case 1: From 442b1c3bf690b5d9214c2d94e0b0f817e10db89d Mon Sep 17 00:00:00 2001 From: none Date: Wed, 23 Jun 2021 11:19:55 +0200 Subject: [PATCH 2/2] add more S2 info and support cards via GT link --- apps/ddinfo.c | 74 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/apps/ddinfo.c b/apps/ddinfo.c index 14555c7..5cbe77a 100644 --- a/apps/ddinfo.c +++ b/apps/ddinfo.c @@ -35,10 +35,10 @@ void print_temp(struct mci_result *res) printf("Die temperature = %u\n", res->sx8_bist.temperature); } -int temp_info(int dev) +int temp_info(int dev, uint32_t link) { struct ddb_mci_msg msg = { - .link = 0, + .link = link, .cmd.command = SX8_CMD_GETBIST, }; int ret; @@ -233,23 +233,36 @@ void print_info(struct mci_result *res, uint8_t demod) switch (res->mode) { case M4_MODE_DVBSX: if (res->dvbs2_signal_info.standard == 2) { - int short_frame = 0; + int short_frame = 0, pilots = 0; + char *modcod = "unknown"; + uint8_t pls = res->dvbs2_signal_info.pls_code; - if ((res->dvbs2_signal_info.pls_code >= 128) || - ((res->dvbs2_signal_info.roll_off & 0x7f) > 2)) + if ((pls >= 128) || ((res->dvbs2_signal_info.roll_off & 0x7f) > 2)) printf("Demod Locked: DVB-S2X\n"); else printf("Demod Locked: DVB-S2\n"); printf("PLS-Code: %u\n", res->dvbs2_signal_info.pls_code); - printf("Roll-Off: %s\n", Rolloff[res->dvbs2_signal_info.roll_off]); - printf("Inversion: %s\n", (res->dvbs2_signal_info.roll_off & 0x80) ? "on": "off"); - printf("\n"); + if (pls >= 250) { + pilots = 1; + modcod = S2Xrsvd[pls - 250]; + } else if (pls >= 132) { + pilots = pls & 1; + short_frame = pls > 216; + modcod = S2XModCods[(pls - 132)/2]; + } else if (pls < 128) { + pilots = pls & 1; + short_frame = pls & 2; + modcod = S2ModCods[pls / 4]; + } + printf("Roll-Off: %s\n", Rolloff[res->dvbs2_signal_info.roll_off & 7]); + printf("Pilots: %s\n", pilots ? "On" : "Off"); + printf("Frame: %s\n", short_frame ? "Short" : "Long"); } else { printf("Demod Locked: DVB-S\n"); printf("PR: %s\n", PunctureRates[res->dvbs2_signal_info.pls_code & 0x07]); - } + printf("Inversion: %s\n", (res->dvbs2_signal_info.roll_off & 0x80) ? "on": "off"); case M4_MODE_DVBT: printf("Locked DVB-T\n"); break; @@ -274,10 +287,37 @@ void print_info(struct mci_result *res, uint8_t demod) } -int mci_info(int dev, uint8_t demod) +int readreg(int dev, uint32_t reg, uint32_t link, uint32_t *val) +{ + struct ddb_reg ddbreg; + + ddbreg.reg = reg + (link << 28); + if (ioctl(dev, IOCTL_DDB_READ_REG, &ddbreg) < 0) + return -1; + *val = ddbreg.val; + return 0; +} + +void mci_firmware(int dev, uint32_t link) +{ + union { + uint32_t u[4]; + char s[16]; + } version; + + readreg(dev, MIC_INTERFACE_VER , link, &version.u[0]); + readreg(dev, MIC_INTERFACE_VER + 4, link, &version.u[1]); + readreg(dev, MIC_INTERFACE_VER + 8, link, &version.u[2]); + readreg(dev, MIC_INTERFACE_VER + 12, link, &version.u[3]); + + printf("MCI firmware: %s.%d\n", &version.s, version.s[15]); +} + + +int mci_info(int dev, uint32_t link, uint8_t demod) { struct ddb_mci_msg msg = { - .link = 0, + .link = link, .cmd.command = MCI_CMD_GETSIGNALINFO, .cmd.demod = demod }; @@ -380,20 +420,22 @@ static int card_info(int ddbnum, int demod) id.hw, id.regmap, (id.hw & 0xff0000) >> 16, (id.hw & 0xffff)); switch (id.device) { case 0x0009: + mci_firmware(ddb, link); if (demod >= 0) - mci_info(ddb, demod); + mci_info(ddb, link, demod); else { for (i = 0; i < 8; i++) - mci_info(ddb, i); + mci_info(ddb, link, i); } - temp_info(ddb); + temp_info(ddb, link); break; case 0x000a: + mci_firmware(ddb, link); if (demod >= 0) - mci_info(ddb, demod); + mci_info(ddb, link, demod); else { for (i = 0; i < 4; i++) - mci_info(ddb, i); + mci_info(ddb, link, i); } break; default: