1
0
mirror of https://github.com/DigitalDevices/dddvb.git synced 2023-10-10 13:37:43 +02:00

Merge branch 'internal'

This commit is contained in:
rjkm 2021-08-09 09:04:33 +02:00
commit fbc39f71f4
10 changed files with 163 additions and 27 deletions

View File

@ -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 cit: cit.c
$(CC) -o cit cit.c -lpthread $(CC) -o cit cit.c -lpthread

100
apps/getiq.c Normal file
View File

@ -0,0 +1,100 @@
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/types.h>
#include <getopt.h>
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);
}

View File

@ -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] = { const enum fe_code_rate dvbs_fec_lut[8] = {
FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, 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] = { const enum fe_rolloff ro_lut[8] = {
ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_10, ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_10,

View File

@ -456,7 +456,7 @@ struct mci_result {
s16 channel_power; /* channel power in dBm x 100 */ s16 channel_power; /* channel power in dBm x 100 */
s16 rsvd2; s16 rsvd2;
s16 signal_to_noise; /* SNR in dB x 100, Note: negativ values are valid in DVB-S2 */ 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 rsvd4;
u32 ber_numerator; /* Bit error rate: PreRS in DVB-S, PreBCH in DVB-S2X */ u32 ber_numerator; /* Bit error rate: PreRS in DVB-S, PreBCH in DVB-S2X */
u32 ber_denominator; u32 ber_denominator;
@ -770,11 +770,18 @@ struct mci_result {
} ISDBS_TMCCInfo; } ISDBS_TMCCInfo;
struct { struct {
uint8_t cut; u8 cut;
uint8_t avs_code; u8 avs_code;
uint8_t temperature; u8 temperature;
uint8_t rsvd[13]; u8 rsvd[13];
} sx8_bist; } 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]; u32 version[3];
u8 version_rsvd; u8 version_rsvd;

View File

@ -34,6 +34,14 @@ static int direct_mode;
module_param(direct_mode, int, 0444); module_param(direct_mode, int, 0444);
MODULE_PARM_DESC(direct_mode, "Ignore LDPC limits and assign high speed demods according to needed symbolrate."); 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); static const u32 MCLK = (1550000000 / 12);
/* Add 2MBit/s overhead allowance (minimum factor is 90/32400 for QPSK w/o Pilots) */ /* Add 2MBit/s overhead allowance (minimum factor is 90/32400 for QPSK w/o Pilots) */
@ -252,6 +260,11 @@ static int stop(struct dvb_frontend *fe)
return 0; 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) static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config)
{ {
struct sx8 *state = fe->demodulator_priv; struct sx8 *state = fe->demodulator_priv;
@ -266,10 +279,6 @@ static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config)
u32 bits_per_symbol = 0; u32 bits_per_symbol = 0;
int i = -1, stat = 0; int i = -1, stat = 0;
struct ddb_link *link = state->mci.base->link; 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) { if (link->ids.device == 0x000b) {
/* Mask out higher modulations and MIS for Basic /* Mask out higher modulations and MIS for Basic
@ -345,7 +354,7 @@ static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config)
state->mci.demod = i; state->mci.demod = i;
if (!sx8_base->tuner_use_count[input]) 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->tuner_use_count[input]++;
sx8_base->iq_mode = (ts_config > 1); sx8_base->iq_mode = (ts_config > 1);
unlock: unlock:
@ -396,7 +405,7 @@ unlock:
static int start_iq(struct dvb_frontend *fe, u32 flags, 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 sx8 *state = fe->demodulator_priv;
struct mci_base *mci_base = state->mci.base; struct mci_base *mci_base = state->mci.base;
@ -423,6 +432,7 @@ static int start_iq(struct dvb_frontend *fe, u32 flags,
state->mci.demod = 0; state->mci.demod = 0;
sx8_base->tuner_use_count[input]++; sx8_base->tuner_use_count[input]++;
sx8_base->iq_mode = 2; sx8_base->iq_mode = 2;
mci_set_tuner(fe, input, 1, flags & 0xff, 0x40);
} else { } else {
if ((state->iq_started & 0x07) != state->mci.nr) { if ((state->iq_started & 0x07) != state->mci.nr) {
stat = -EBUSY; stat = -EBUSY;
@ -433,11 +443,11 @@ unlock:
mutex_unlock(&mci_base->tuner_lock); mutex_unlock(&mci_base->tuner_lock);
if (stat) if (stat)
return stat; return stat;
mci_set_tuner(fe, input, 1, flags & 0xff, 0);
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
cmd.command = SX8_CMD_START_IQ; cmd.command = SX8_CMD_START_IQ;
cmd.sx8_start_iq.flags = (flags >> 16) & 0xff; 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.frequency = p->frequency * 1000;
cmd.sx8_start_iq.symbol_rate = p->symbol_rate; cmd.sx8_start_iq.symbol_rate = p->symbol_rate;
cmd.sx8_start_iq.gain = (flags >> 8) & 0xff; cmd.sx8_start_iq.gain = (flags >> 8) & 0xff;
@ -502,7 +512,7 @@ static int set_parameters(struct dvb_frontend *fe)
} }
stat = start(fe, 3, mask, ts_config); stat = start(fe, 3, mask, ts_config);
} else { } else {
stat = start_iq(fe, isi & 0xffffff, 4, ts_config); stat = start_iq(fe, isi & 0xffffff, ts_config);
} }
mutex_unlock(&state->lock); mutex_unlock(&state->lock);
return stat; return stat;

View File

@ -7,7 +7,21 @@ API:
Currently DTV_STREAM_ID is misused. Currently DTV_STREAM_ID is misused.
0x10000000 - symbols (locked and tracked) at symbol rate 0x10000000 - symbols (locked and tracked) at symbol rate
0x20000000 - samples at ADC rate (1550/24=64.583... MHz) 0x20000000 - samples at symbol rate
0x30000000 - 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

View File

@ -3028,13 +3028,13 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
fe->dvb = dvb; fe->dvb = dvb;
fepriv->inversion = INVERSION_OFF; 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, dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
fe, DVB_DEVICE_FRONTEND, 0); 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 * Initialize the cache to the proper values according with the
* first supported delivery system (ops->delsys[0]) * first supported delivery system (ops->delsys[0])

View File

@ -504,7 +504,8 @@ int main(int argc, char **argv)
cnr = dddvb_get_cnr(fe); cnr = dddvb_get_cnr(fe);
printf("stat=%02x, str=%lld.%03llddB, snr=%lld.%03llddB \n", 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); sleep(1);
} }
} else { } else {
@ -523,7 +524,8 @@ int main(int argc, char **argv)
cnr = dddvb_get_cnr(fe); cnr = dddvb_get_cnr(fe);
fprintf(stderr,"stat=%02x, str=%lld.%03llddB, snr=%lld.%03llddB \n", 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); sleep(1);
} }
fprintf(stderr,"got lock on %s\n", fe->name); fprintf(stderr,"got lock on %s\n", fe->name);

View File

@ -603,7 +603,6 @@ static int open_fe(struct dddvb_fe *fe)
sprintf(fname, "/dev/dvb/adapter%d/frontend%d", fe->anum, fe->fnum); sprintf(fname, "/dev/dvb/adapter%d/frontend%d", fe->anum, fe->fnum);
fe->fd = open(fname, O_RDWR); fe->fd = open(fname, O_RDWR);
printf("open = %d\n", fe->fd);
if (fe->fd < 0) if (fe->fd < 0)
return -1; return -1;
return 0; return 0;

View File

@ -329,7 +329,7 @@ static void calc_lq(struct dddvb_fe *fe)
{ {
struct dtv_fe_stats st; struct dtv_fe_stats st;
int64_t str, snr; 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); get_property(fe->fd, DTV_TRANSMISSION_MODE, &fe->pls_code);
dbgprintf(DEBUG_DVB, "fe%d: pls=0x%02x\n", fe->nr, 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); dbgprintf(DEBUG_DVB, "fe%d: fec=%u mod=%u\n", fe->nr, fec, mod);
switch (fe->n_param.param[PARAM_MSYS]) { switch (fe->n_param.param[PARAM_MSYS]) {
case SYS_DVBS: 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); quality = dvbsq(snr, fec, ber_num, ber_den);
break; break;
case SYS_DVBS2: 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); quality = dvbs2q(snr, fec, mod, ber_num, ber_den);
break; break;
case SYS_DVBC_ANNEX_A: case SYS_DVBC_ANNEX_A: