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

fix gain on SDR modulator

This commit is contained in:
Ralph Metzler 2019-11-04 19:14:20 +01:00
parent d2337b6620
commit 2186362136
2 changed files with 58 additions and 15 deletions

View File

@ -511,11 +511,11 @@ static int mod_fsm_setup(struct ddb *dev, u32 MaxUsedChannels)
return status; return status;
} }
static int mod_set_vga(struct ddb *dev, u32 Gain) static int mod_set_vga(struct ddb *dev, u32 gain)
{ {
if (Gain > 255) if (gain > 255)
return -EINVAL; return -EINVAL;
ddbwritel(dev, Gain, RF_VGA); ddbwritel(dev, gain, RF_VGA);
return 0; return 0;
} }
@ -626,6 +626,41 @@ static int mod_set_attenuator(struct ddb *dev, u32 Value)
return 0; return 0;
} }
static int mod_set_sdr_attenuator(struct ddb *dev, u32 value)
{
u32 control;
if (value > 31)
return -EINVAL;
control = ddbreadl(dev, SDR_CONTROL);
if (control & 0x01000000) {
ddbwritel(dev, 0x03, SDR_CONTROL);
} else {
ddbwritel(dev, value, RF_ATTENUATOR);
}
return 0;
}
static int mod_set_sdr_gain(struct ddb *dev, u32 gain)
{
u32 control = ddbreadl(dev, SDR_CONTROL);
if (control & 0x01000000) {
if (gain > 511)
return -EINVAL;
ddbwritel(dev, 0x03, SDR_CONTROL);
ddbwritel(dev, gain, SDR_GAIN_F);
if (gain > 255)
gain = 255;
ddbwritel(dev, gain, SDR_GAIN_SMA);
} else {
if (gain > 255)
return -EINVAL;
ddbwritel(dev, gain, SDR_GAIN_F);
}
return 0;
}
static void mod_si598_readreg(struct ddb *dev, u8 index, u8 *val) static void mod_si598_readreg(struct ddb *dev, u8 index, u8 *val)
{ {
ddbwritel(dev, index, CLOCKGEN_INDEX); ddbwritel(dev, index, CLOCKGEN_INDEX);
@ -1423,7 +1458,9 @@ static int mod3_set_base_frequency(struct ddb *dev, u32 frequency)
if (frequency % 1000) if (frequency % 1000)
return -EINVAL; return -EINVAL;
if ((frequency < 114000000) || (frequency > 874000000)) if (frequency < 114000000)
return -EINVAL;
if (frequency > 1874000000)
return -EINVAL; return -EINVAL;
dev->mod_base.frequency = frequency; dev->mod_base.frequency = frequency;
tmp = frequency; tmp = frequency;
@ -1524,10 +1561,10 @@ static int mod3_prop_proc(struct ddb_mod *mod, struct dtv_property *tvp)
return mod3_set_base_frequency(mod->port->dev, tvp->u.data); return mod3_set_base_frequency(mod->port->dev, tvp->u.data);
case MODULATOR_ATTENUATOR: case MODULATOR_ATTENUATOR:
return mod_set_attenuator(mod->port->dev, tvp->u.data); return mod_set_sdr_attenuator(mod->port->dev, tvp->u.data);
case MODULATOR_GAIN: case MODULATOR_GAIN:
return mod_set_vga(mod->port->dev, tvp->u.data); return mod_set_sdr_gain(mod->port->dev, tvp->u.data);
} }
return -EINVAL; return -EINVAL;
} }
@ -1904,8 +1941,8 @@ static int mod_init_3(struct ddb *dev, u32 Frequency)
ddbwritel(dev, 0x00002000, SDR_CHANNEL_FM1GAIN(i)); ddbwritel(dev, 0x00002000, SDR_CHANNEL_FM1GAIN(i));
ddbwritel(dev, 0x00001000, SDR_CHANNEL_FM2GAIN(i)); ddbwritel(dev, 0x00001000, SDR_CHANNEL_FM2GAIN(i));
} }
mod_set_attenuator(dev, 0); mod_set_sdr_attenuator(dev, 0);
mod_set_vga(dev, 64); mod_set_sdr_gain(dev, 64);
return ret; return ret;
} }
@ -1935,9 +1972,9 @@ static int mod_init_sdr_iq(struct ddb *dev)
ddbwritel(dev, 0x00, SDR_CHANNEL_CONTROL(i)); ddbwritel(dev, 0x00, SDR_CHANNEL_CONTROL(i));
} }
mod_set_attenuator(dev, 0); mod_set_sdr_attenuator(dev, 0);
udelay(10); udelay(10);
mod_set_vga(dev, 120); mod_set_sdr_gain(dev, 120);
return ret; return ret;
} }
@ -1947,13 +1984,13 @@ int ddbridge_mod_init(struct ddb *dev)
case 0: case 0:
case 1: case 1:
return mod_init_1(dev, 722000000); return mod_init_1(dev, 722000000);
case 2: case 2: /* FSM */
return mod_init_2(dev, 114000000); return mod_init_2(dev, 114000000);
case 16: case 16: /* PAL */
return mod_init_3(dev, 503250000); return mod_init_3(dev, 503250000);
case 17: case 17: /* raw IQ */
return mod_init_sdr_iq(dev); return mod_init_sdr_iq(dev);
case 18: case 18: /* IQ+FFT */
return mod_init_sdr_iq(dev); return mod_init_sdr_iq(dev);
default: default:
return -1; return -1;

View File

@ -407,7 +407,6 @@
/* Attenuator/VGA */ /* Attenuator/VGA */
#define RF_ATTENUATOR (0xD8)
#define RF_ATTENUATOR (0xD8) #define RF_ATTENUATOR (0xD8)
/* 0x00 = 0 dB /* 0x00 = 0 dB
* 0x01 = 1 dB * 0x01 = 1 dB
@ -643,3 +642,10 @@
0 \ 0 \
) )
/* SDR_CONTROL */
#define SDR_CONTROL (0xd0)
#define SDR_GAIN_SMA (0xd4)
#define SDR_ATTENUATER (0xd8)
#define SDR_GAIN_F (0xdc)