From 418bd83b40a4f7a8bb931044b2f4cfedfd95fe38 Mon Sep 17 00:00:00 2001 From: rjkm Date: Mon, 5 Jul 2021 18:42:05 +0200 Subject: [PATCH 01/14] only set tuner flags once --- ddbridge/ddbridge-sx8.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index d419573..25e2835 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -423,6 +423,7 @@ static int start_iq(struct dvb_frontend *fe, u32 flags, state->mci.demod = 0; sx8_base->tuner_use_count[input]++; sx8_base->iq_mode = 2; + mci_set_tuner(fe, input, 1, flags & 0xff, 0); } else { if ((state->iq_started & 0x07) != state->mci.nr) { stat = -EBUSY; @@ -433,7 +434,6 @@ unlock: mutex_unlock(&mci_base->tuner_lock); if (stat) return stat; - mci_set_tuner(fe, input, 1, flags & 0xff, 0); memset(&cmd, 0, sizeof(cmd)); cmd.command = SX8_CMD_START_IQ; cmd.sx8_start_iq.flags = (flags >> 16) & 0xff; From 7f002f1356fcf56300c9b5c30791bdd2958bfcee Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:28:42 +0200 Subject: [PATCH 02/14] add 7/8 to offset 4 --- ddbridge/ddbridge-mci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index 5cf9da4..fa9db88 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -300,7 +300,7 @@ void ddb_mci_proc_info(struct mci *mci, struct dtv_frontend_properties *p) }; const enum fe_code_rate dvbs_fec_lut[8] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, - FEC_NONE, FEC_7_8, FEC_NONE, FEC_NONE, + FEC_7_8, FEC_7_8, FEC_NONE, FEC_NONE, }; const enum fe_rolloff ro_lut[8] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_10, From 66b1cf36234030a8e182018225f444f2415f7959 Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:29:17 +0200 Subject: [PATCH 03/14] new signal loss counter field --- ddbridge/ddbridge-mci.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-mci.h b/ddbridge/ddbridge-mci.h index c68e199..e62da9f 100644 --- a/ddbridge/ddbridge-mci.h +++ b/ddbridge/ddbridge-mci.h @@ -456,7 +456,7 @@ struct mci_result { s16 channel_power; /* channel power in dBm x 100 */ s16 rsvd2; s16 signal_to_noise; /* SNR in dB x 100, Note: negativ values are valid in DVB-S2 */ - s16 rsvd3; + u16 signal_loss_counter;/* Counts signal losses and automatic retunes */ u32 rsvd4; u32 ber_numerator; /* Bit error rate: PreRS in DVB-S, PreBCH in DVB-S2X */ u32 ber_denominator; From 37ae102d579d570e115c7ab3e5f05809fc95db2f Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:30:01 +0200 Subject: [PATCH 04/14] use correct u8 type --- ddbridge/ddbridge-mci.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ddbridge/ddbridge-mci.h b/ddbridge/ddbridge-mci.h index e62da9f..2cee34b 100644 --- a/ddbridge/ddbridge-mci.h +++ b/ddbridge/ddbridge-mci.h @@ -770,10 +770,10 @@ struct mci_result { } ISDBS_TMCCInfo; struct { - uint8_t cut; - uint8_t avs_code; - uint8_t temperature; - uint8_t rsvd[13]; + u8 cut; + u8 avs_code; + u8 temperature; + u8 rsvd[13]; } sx8_bist; }; u32 version[3]; From f7fcc1511d6d8c14be38b8286cf9a8fadba98a91 Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:30:10 +0200 Subject: [PATCH 05/14] add extended stats --- ddbridge/ddbridge-mci.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ddbridge/ddbridge-mci.h b/ddbridge/ddbridge-mci.h index 2cee34b..984307f 100644 --- a/ddbridge/ddbridge-mci.h +++ b/ddbridge/ddbridge-mci.h @@ -775,6 +775,13 @@ struct mci_result { u8 temperature; u8 rsvd[13]; } sx8_bist; + + struct { + u8 version; /* 0 = none, 1 = SX8 */ + u8 flags; /* Bit 0: 1 = Tuner Valid, Bit 1: 1 = Output Valid */ + u8 tuner; + u8 output; + } extended_status; }; u32 version[3]; u8 version_rsvd; From fd21dbbd5e8db63307fcacbb37506178a71f3fa5 Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:32:41 +0200 Subject: [PATCH 06/14] add more documentation for use of stream number in SDR modes --- docs/iq_samples | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/iq_samples b/docs/iq_samples index f793481..86a4fa4 100644 --- a/docs/iq_samples +++ b/docs/iq_samples @@ -7,7 +7,21 @@ API: Currently DTV_STREAM_ID is misused. 0x10000000 - symbols (locked and tracked) at symbol rate -0x20000000 - samples at ADC rate (1550/24=64.583... MHz) -0x30000000 - samples at symbol rate +0x20000000 - samples at symbol rate + (fixed at ADC rate (1550/24=64.583... MHz) if 0x00010000 is set) + Max. sample rate is 64.583333 MHz. -Max. sample rate is 64.583333 MHz. +0x00xx0000 - flags + Bit 0 : 0 = VTM/SDR, 1 = SCAN, + Bit 1: 1 = Disable channel AGC, + Bit 2: 1 = Set Gain. + +0x0000xx00 - xx=gain + +0x000000xx - xx=flags + Bit 0:1 Preamp Mode; 0 = Preamp AGC, 1 == Minimum (~ -17dB) , + 2 = Medium, 3 = Maximum gain {~ 15dB} + Bit 2: Bypass Input LNA (6 dB less gain) (Note this is after Preamp) + Bit 4: Set RF Gain + Bit 5: Freeze RF Gain (Turn AGC off at current gain, only when already enabled) + Bit 7: Optimize RF Gain and freeze for FFT From 0a5fb7d6b9b2c91c09b248ca5345622ce7922fdb Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:35:22 +0200 Subject: [PATCH 07/14] add debugging output for actually tuned frequency --- lib/src/dvb_quality.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/src/dvb_quality.c b/lib/src/dvb_quality.c index ecef831..5922ca3 100644 --- a/lib/src/dvb_quality.c +++ b/lib/src/dvb_quality.c @@ -329,7 +329,7 @@ static void calc_lq(struct dddvb_fe *fe) { struct dtv_fe_stats st; int64_t str, snr; - uint32_t mod, fec, ber_num, ber_den, trans, pilot = 0, quality = 0; + uint32_t mod, fec, ber_num, ber_den, trans, pilot = 0, quality = 0, freq; get_property(fe->fd, DTV_TRANSMISSION_MODE, &fe->pls_code); dbgprintf(DEBUG_DVB, "fe%d: pls=0x%02x\n", fe->nr, fe->pls_code); @@ -364,9 +364,13 @@ static void calc_lq(struct dddvb_fe *fe) dbgprintf(DEBUG_DVB, "fe%d: fec=%u mod=%u\n", fe->nr, fec, mod); switch (fe->n_param.param[PARAM_MSYS]) { case SYS_DVBS: + get_property(fe->fd, DTV_FREQUENCY, &freq); + dbgprintf(DEBUG_DVB, "fe%d: actual frequency=%u\n", fe->nr, freq); quality = dvbsq(snr, fec, ber_num, ber_den); break; case SYS_DVBS2: + get_property(fe->fd, DTV_FREQUENCY, &freq); + dbgprintf(DEBUG_DVB, "fe%d: actual frequency=%u\n", fe->nr, freq); quality = dvbs2q(snr, fec, mod, ber_num, ber_den); break; case SYS_DVBC_ANNEX_A: From 5bb0a95b02dde3da6069c5f27d9e83595d8eba85 Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:36:10 +0200 Subject: [PATCH 08/14] remove obsolete debugging line --- lib/src/dvb.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/dvb.c b/lib/src/dvb.c index 369e0c8..adcf52f 100644 --- a/lib/src/dvb.c +++ b/lib/src/dvb.c @@ -603,7 +603,6 @@ static int open_fe(struct dddvb_fe *fe) sprintf(fname, "/dev/dvb/adapter%d/frontend%d", fe->anum, fe->fnum); fe->fd = open(fname, O_RDWR); - printf("open = %d\n", fe->fd); if (fe->fd < 0) return -1; return 0; From d4aa1c634e1310f1b82e4b2383432dc712e7a4c9 Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:49:03 +0200 Subject: [PATCH 09/14] style fix --- lib/ddzap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/ddzap.c b/lib/ddzap.c index 9e90acd..06b6391 100644 --- a/lib/ddzap.c +++ b/lib/ddzap.c @@ -504,7 +504,8 @@ int main(int argc, char **argv) cnr = dddvb_get_cnr(fe); printf("stat=%02x, str=%lld.%03llddB, snr=%lld.%03llddB \n", - stat, (long long int)str/1000,(long long int) abs(str%1000),(long long int) cnr/1000, (long long int)abs(cnr%1000)); + stat, (long long int)str/1000, (long long int) abs(str%1000), + (long long int) cnr/1000, (long long int)abs(cnr%1000)); sleep(1); } } else { @@ -523,7 +524,8 @@ int main(int argc, char **argv) cnr = dddvb_get_cnr(fe); fprintf(stderr,"stat=%02x, str=%lld.%03llddB, snr=%lld.%03llddB \n", - stat,(long long int) str/1000,(long long int) abs(str%1000),(long long int) cnr/1000, (long long int)abs(cnr%1000)); + stat, (long long int) str/1000, (long long int) abs(str%1000), + (long long int) cnr/1000, (long long int)abs(cnr%1000)); sleep(1); } fprintf(stderr,"got lock on %s\n", fe->name); From 61fd25836fdbeb0d77539292104f88265bc2fdfa Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:49:43 +0200 Subject: [PATCH 10/14] report proper frontend number --- dvb-core/dvb_frontend.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dvb-core/dvb_frontend.c b/dvb-core/dvb_frontend.c index 9f6ce4b..a82573d 100644 --- a/dvb-core/dvb_frontend.c +++ b/dvb-core/dvb_frontend.c @@ -3028,13 +3028,13 @@ int dvb_register_frontend(struct dvb_adapter *dvb, fe->dvb = dvb; fepriv->inversion = INVERSION_OFF; - dev_info(fe->dvb->device, - "DVB: registering adapter %i frontend %i (%s)...\n", - fe->dvb->num, fe->id, fe->ops.info.name); - dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template, fe, DVB_DEVICE_FRONTEND, 0); + dev_info(fe->dvb->device, + "DVB: registering adapter %i frontend %i (%s)...\n", + fe->dvb->num, fepriv->dvbdev->id, fe->ops.info.name); + /* * Initialize the cache to the proper values according with the * first supported delivery system (ops->delsys[0]) From 0b9d3ffa6b24e69ad8f65c48e32264c9c79d492d Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 22:57:40 +0200 Subject: [PATCH 11/14] move lut for use in other functions --- ddbridge/ddbridge-sx8.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index 25e2835..d0bc3ba 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -252,6 +252,11 @@ static int stop(struct dvb_frontend *fe) return 0; } +static const u8 ro_lut[8] = { + 8 | SX8_ROLLOFF_35, 8 | SX8_ROLLOFF_20, 8 | SX8_ROLLOFF_25, 0, + 8 | SX8_ROLLOFF_15, 8 | SX8_ROLLOFF_10, 8 | SX8_ROLLOFF_05, 0, +}; + static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config) { struct sx8 *state = fe->demodulator_priv; @@ -266,10 +271,6 @@ static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config) u32 bits_per_symbol = 0; int i = -1, stat = 0; struct ddb_link *link = state->mci.base->link; - const u8 ro_lut[8] = { - 8 | SX8_ROLLOFF_35, 8 | SX8_ROLLOFF_20, 8 | SX8_ROLLOFF_25, 0, - 8 | SX8_ROLLOFF_15, 8 | SX8_ROLLOFF_10, 8 | SX8_ROLLOFF_05, 0, - }; if (link->ids.device == 0x000b) { /* Mask out higher modulations and MIS for Basic From 0165538f130b6efa8030b41bac1097924623b7fe Mon Sep 17 00:00:00 2001 From: rjkm Date: Sat, 7 Aug 2021 23:00:29 +0200 Subject: [PATCH 12/14] prepare to get roll off for SDR mode from parameters but use fixed one for now --- ddbridge/ddbridge-sx8.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index d0bc3ba..2b627fd 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -397,7 +397,7 @@ unlock: static int start_iq(struct dvb_frontend *fe, u32 flags, - u32 roll_off, u32 ts_config) + u32 ts_config) { struct sx8 *state = fe->demodulator_priv; struct mci_base *mci_base = state->mci.base; @@ -424,7 +424,7 @@ static int start_iq(struct dvb_frontend *fe, u32 flags, state->mci.demod = 0; sx8_base->tuner_use_count[input]++; sx8_base->iq_mode = 2; - mci_set_tuner(fe, input, 1, flags & 0xff, 0); + mci_set_tuner(fe, input, 1, flags & 0xff, 0x40); } else { if ((state->iq_started & 0x07) != state->mci.nr) { stat = -EBUSY; @@ -438,7 +438,8 @@ unlock: memset(&cmd, 0, sizeof(cmd)); cmd.command = SX8_CMD_START_IQ; cmd.sx8_start_iq.flags = (flags >> 16) & 0xff; - cmd.sx8_start_iq.roll_off = roll_off; + cmd.sx8_start_iq.roll_off = 5; + //cmd.sx8_start_iq.roll_off = ro_lut[p->rolloff & 7]; cmd.sx8_start_iq.frequency = p->frequency * 1000; cmd.sx8_start_iq.symbol_rate = p->symbol_rate; cmd.sx8_start_iq.gain = (flags >> 8) & 0xff; @@ -503,7 +504,7 @@ static int set_parameters(struct dvb_frontend *fe) } stat = start(fe, 3, mask, ts_config); } else { - stat = start_iq(fe, isi & 0xffffff, 4, ts_config); + stat = start_iq(fe, isi & 0xffffff, ts_config); } mutex_unlock(&state->lock); return stat; From b23187a0492babe58ae175ad1abe7b2deffd23ce Mon Sep 17 00:00:00 2001 From: rjkm Date: Sun, 8 Aug 2021 22:14:42 +0200 Subject: [PATCH 13/14] Add module paramaters for SX8 tuner flags and gain. --- ddbridge/ddbridge-sx8.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index 2b627fd..406c31e 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -34,6 +34,14 @@ static int direct_mode; module_param(direct_mode, int, 0444); MODULE_PARM_DESC(direct_mode, "Ignore LDPC limits and assign high speed demods according to needed symbolrate."); +static u32 sx8_tuner_flags; +module_param(sx8_tuner_flags, int, 0664); +MODULE_PARM_DESC(sx8_tuner_flags, "Change SX8 tuner flags."); + +static u32 sx8_tuner_gain; +module_param(sx8_tuner_gain, int, 0664); +MODULE_PARM_DESC(sx8_tuner_gain, "Change SX8 tuner gain."); + static const u32 MCLK = (1550000000 / 12); /* Add 2MBit/s overhead allowance (minimum factor is 90/32400 for QPSK w/o Pilots) */ @@ -346,7 +354,7 @@ static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config) state->mci.demod = i; if (!sx8_base->tuner_use_count[input]) - mci_set_tuner(fe, input, 1, 0, 0); + mci_set_tuner(fe, input, 1, sx8_tuner_flags, sx8_tuner_gain); sx8_base->tuner_use_count[input]++; sx8_base->iq_mode = (ts_config > 1); unlock: From 19eea5d42d8d143c509b82e40ea75e2778efbc94 Mon Sep 17 00:00:00 2001 From: rjkm Date: Mon, 9 Aug 2021 09:03:02 +0200 Subject: [PATCH 14/14] add getiq to get IQ values from MCI cards --- apps/Makefile | 2 +- apps/getiq.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 apps/getiq.c diff --git a/apps/Makefile b/apps/Makefile index 16860c0..7962616 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,4 +1,4 @@ -all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo +all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo getiq cit: cit.c $(CC) -o cit cit.c -lpthread diff --git a/apps/getiq.c b/apps/getiq.c new file mode 100644 index 0000000..59c8734 --- /dev/null +++ b/apps/getiq.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef int16_t s16; +typedef uint32_t u32; +typedef uint64_t u64; + +#include "../ddbridge/ddbridge-mci.h" +#include "../ddbridge/ddbridge-ioctl.h" + +void print_iq(struct mci_result *res, int fd) +{ + dprintf(fd, "%d,%d\n", res->iq_symbol.i, res->iq_symbol.q); +} + +int get_iq(int dev, uint32_t link, uint8_t demod, int fd) +{ + struct ddb_mci_msg msg = { + .link = link, + .cmd.command = MCI_CMD_GET_IQSYMBOL, + .cmd.demod = demod, + .cmd.get_iq_symbol.tap = 0, + .cmd.get_iq_symbol.point = 0, + }; + int ret; + int i; + + ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); + if (ret < 0) { + printf("Error: %d %d\n", ret, errno); + return ret; + } + if (msg.res.status & 0x80) { + printf("MCI errror %02x\n", msg.res.status); + return ret; + } + + print_iq(&msg.res, fd); + return ret; +} + + +#define SIZE_OF_ARRAY(a) (sizeof(a)/sizeof(a[0])) + +int main(int argc, char*argv[]) +{ + char ddbname[80]; + int fd = -1, all = 1, i, ret = 0, ddb; + char fn[128]; + int32_t device = -1, demod = -1; + + while (1) { + int cur_optind = optind ? optind : 1; + int option_index = 0; + int c; + static struct option long_options[] = { + {"device", required_argument, 0, 'd'}, + {"demod", required_argument, 0, 'n'}, + {0, 0, 0, 0} + }; + c = getopt_long(argc, argv, "ad:n:", + long_options, &option_index); + if (c == -1) + break; + switch (c) { + case 'd': + device = strtoul(optarg, NULL, 0); + break; + case 'n': + demod = strtoul(optarg, NULL, 0); + break; + case 'a': + all = 1; + break; + default: + break; + } + } + if (optind < argc) { + printf("too many arguments\n"); + exit(1); + } + sprintf(ddbname, "/dev/ddbridge/card%d", device); + ddb = open(ddbname, O_RDWR); + if (ddb < 0) + return -3; + for (i = 0; i < 20000; i++) + get_iq(ddb, 0, demod, 1); +}