mirror of https://github.com/drowe67/librtlsdr.git
Ported SDR# R820T Manual Gain Settings Plugin
* Ported Manual Gain Settings for R820T from http://sourceforge.net/projects/sdrr820tmanualgainsettings/master
parent
e3c03f738f
commit
25d0e8e673
|
@ -39,3 +39,4 @@ CMakeCache.txt
|
|||
*/CMakeFiles
|
||||
CMakeFiles
|
||||
*.cmake
|
||||
build
|
||||
|
|
|
@ -232,6 +232,17 @@ RTLSDR_API int rtlsdr_set_tuner_bandwidth(rtlsdr_dev_t *dev, uint32_t bw);
|
|||
*/
|
||||
RTLSDR_API int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev);
|
||||
|
||||
/*!
|
||||
* Set LNA / Mixer / VGA Device Gain for R820T device is configured to.
|
||||
*
|
||||
* \param dev the device handle given by rtlsdr_open()
|
||||
* \param lna_gain in tenths of a dB, -30 means -3.0 dB.
|
||||
* \param mixer_gain in tenths of a dB, -30 means -3.0 dB.
|
||||
* \param vga_gain in tenths of a dB, -30 means -3.0 dB.
|
||||
* \return 0 on success
|
||||
*/
|
||||
RTLSDR_API int rtlsdr_set_tuner_gain_ext(rtlsdr_dev_t *dev, int lna_gain, int mixer_gain, int vga_gain);
|
||||
|
||||
/*!
|
||||
* Set the intermediate frequency gain for the device.
|
||||
*
|
||||
|
|
|
@ -114,7 +114,9 @@ enum r82xx_delivery_system {
|
|||
int r82xx_standby(struct r82xx_priv *priv);
|
||||
int r82xx_init(struct r82xx_priv *priv);
|
||||
int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq);
|
||||
int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain);
|
||||
//int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain);
|
||||
int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain, int extended_mode, int lna_gain, int mixer_gain, int vga_gain);
|
||||
|
||||
int r82xx_set_bandwidth(struct r82xx_priv *priv, int bandwidth, uint32_t rate);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -255,12 +255,18 @@ int r820t_set_bw(void *dev, int bw) {
|
|||
}
|
||||
|
||||
int r820t_set_gain(void *dev, int gain) {
|
||||
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
|
||||
return r82xx_set_gain(&devt->r82xx_p, 1, gain);
|
||||
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
|
||||
return r82xx_set_gain(&devt->r82xx_p, 1, gain, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
int r820t_set_gain_ext(void *dev, int lna_gain, int mixer_gain, int vga_gain) {
|
||||
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
|
||||
return r82xx_set_gain(&devt->r82xx_p, 0, 0, 1, lna_gain, mixer_gain, vga_gain);
|
||||
}
|
||||
|
||||
int r820t_set_gain_mode(void *dev, int manual) {
|
||||
rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev;
|
||||
return r82xx_set_gain(&devt->r82xx_p, manual, 0);
|
||||
return r82xx_set_gain(&devt->r82xx_p, manual, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/* definition order must match enum rtlsdr_tuner */
|
||||
|
@ -1048,6 +1054,27 @@ int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain)
|
|||
return r;
|
||||
}
|
||||
|
||||
int rtlsdr_set_tuner_gain_ext(rtlsdr_dev_t *dev, int lna_gain, int mixer_gain, int vga_gain)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
if (!dev || !dev->tuner)
|
||||
return -1;
|
||||
|
||||
if (dev->tuner->set_gain) {
|
||||
rtlsdr_set_i2c_repeater(dev, 1);
|
||||
r = r820t_set_gain_ext((void *)dev, lna_gain, mixer_gain, vga_gain);
|
||||
rtlsdr_set_i2c_repeater(dev, 0);
|
||||
}
|
||||
|
||||
if (!r)
|
||||
dev->gain = lna_gain + mixer_gain + vga_gain;
|
||||
else
|
||||
dev->gain = 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev)
|
||||
{
|
||||
if (!dev)
|
||||
|
|
|
@ -1004,7 +1004,7 @@ static const int r82xx_mixer_gain_steps[] = {
|
|||
0, 5, 10, 10, 19, 9, 10, 25, 17, 10, 8, 16, 13, 6, 3, -8
|
||||
};
|
||||
|
||||
int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain)
|
||||
int r82xx_set_gain_old(struct r82xx_priv *priv, int set_manual_gain, int gain)
|
||||
{
|
||||
int rc;
|
||||
|
||||
|
@ -1073,6 +1073,113 @@ int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain,
|
||||
int extended_mode, int lna_gain, int mixer_gain, int vga_gain)
|
||||
{
|
||||
int rc;
|
||||
|
||||
int i, total_gain = 0;
|
||||
uint8_t mix_index = 0, lna_index = 0;
|
||||
uint8_t data[4];
|
||||
|
||||
if (extended_mode) {
|
||||
/*
|
||||
// LNA auto off
|
||||
rc = r82xx_write_reg_mask(priv, 0x05, 0x10, 0x10);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
// Mixer auto off
|
||||
rc = r82xx_write_reg_mask(priv, 0x07, 0, 0x10);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
rc = r82xx_read(priv, 0x00, data, sizeof(data));
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
*/
|
||||
|
||||
/* Set LNA */
|
||||
rc = r82xx_write_reg_mask(priv, 0x05, lna_gain, 0x0f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* Set Mixer */
|
||||
rc = r82xx_write_reg_mask(priv, 0x07, mixer_gain, 0x0f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* Set VGA */
|
||||
rc = r82xx_write_reg_mask(priv, 0x0c, vga_gain, 0x9f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (set_manual_gain) {
|
||||
|
||||
/* LNA auto off */
|
||||
rc = r82xx_write_reg_mask(priv, 0x05, 0x10, 0x10);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* Mixer auto off */
|
||||
rc = r82xx_write_reg_mask(priv, 0x07, 0, 0x10);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
rc = r82xx_read(priv, 0x00, data, sizeof(data));
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* set fixed VGA gain for now (16.3 dB) */
|
||||
rc = r82xx_write_reg_mask(priv, 0x0c, 0x08, 0x9f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
for (i = 0; i < 15; i++) {
|
||||
if (total_gain >= gain)
|
||||
break;
|
||||
|
||||
total_gain += r82xx_lna_gain_steps[++lna_index];
|
||||
|
||||
if (total_gain >= gain)
|
||||
break;
|
||||
|
||||
total_gain += r82xx_mixer_gain_steps[++mix_index];
|
||||
}
|
||||
|
||||
/* set LNA gain */
|
||||
rc = r82xx_write_reg_mask(priv, 0x05, lna_index, 0x0f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* set Mixer gain */
|
||||
rc = r82xx_write_reg_mask(priv, 0x07, mix_index, 0x0f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
} else {
|
||||
/* LNA */
|
||||
rc = r82xx_write_reg_mask(priv, 0x05, 0, 0x10);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* Mixer */
|
||||
rc = r82xx_write_reg_mask(priv, 0x07, 0x10, 0x10);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* set fixed VGA gain for now (26.5 dB) */
|
||||
rc = r82xx_write_reg_mask(priv, 0x0c, 0x0b, 0x9f);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Bandwidth contribution by low-pass filter. */
|
||||
static const int r82xx_if_low_pass_bw_table[] = {
|
||||
1700000, 1600000, 1550000, 1450000, 1200000, 900000, 700000, 550000, 450000, 350000
|
||||
|
|
Loading…
Reference in New Issue