forked from sdr/rtl-sdr
1
0
Fork 0

Compare commits

...

11 Commits

Author SHA1 Message Date
Oliver Smith 619ac3186e Release 2.0.2
Change-Id: I7723639673836905af2bf4551816d8503ea74ae1
2024-04-23 11:42:58 +02:00
Steve Markgraf 7ebcb041f2 lib: set SOVERSION back to 0
When the version was incremented to 2.0.0, this resulted
in the SOVERSION being set to 2, indicating an ABI change,
which was actually not the case.

People have been complaining that software linked against
librtlsdr.so.0 is no longer working, so change the SOVERSION
back to 0.
2024-04-07 21:42:51 +02:00
Harald Welte ab2434e30d Add funding link to github mirror
see https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository
2024-03-23 11:28:41 +01:00
Ethan Halsall d81ef9a9d9 fix: round gain input to nearest value 2024-03-10 23:01:56 +01:00
Ethan Halsall e04c42c019 fix: set fc0012 gain to low on init 2024-03-10 23:01:56 +01:00
Steve Markgraf ef23f806ec Merge pull request 'r82xx: improved tuning speed and accuracy' (#6) from sultanqasim/rtl-sdr:upstream_fast_retune into master
Reviewed-on: sdr/rtl-sdr#6
2024-03-08 20:18:37 +00:00
Steve Markgraf dd2511a7c2 Merge pull request 'Improve CLI usage docs: '-d' also accepts serial' (#5) from kerel-fs/rtl-sdr:docs into master
Reviewed-on: sdr/rtl-sdr#5
2024-03-08 20:08:08 +00:00
Sultan Qasim Khan 2acb75cff3 r82xx: batch register writes for tuning
Batch six register writes into a single step to speed up retuning.
2024-03-07 17:46:00 -05:00
Sultan Qasim Khan 0b64f07fd5 r82xx: avoid redundant register writes for speed 2024-02-29 12:53:28 -05:00
Oliver Jowett f5978e8871 r82xx: improve tuner precision
Improve tuner precision by calculating the VCO divisor at full precision, not
at kHz resolution. Also replace the manual divison loop with a simpler
fixed-point calculation.
2024-02-29 12:53:27 -05:00
hayati ayguen 91ef34d922 improve CLI usage docs: '-d' also accepts serial
commit e30dbd52b638629d58ae6e33ebcf5a2d71a768a5 in https://github.com/librtlsdr/librtlsdr

Signed-off-by: hayati ayguen <h_ayguen@web.de>
[F. Schmidt: rebased on latest master]
Signed-off-by: Fabian P. Schmidt <kerel@mailbox.org>
2024-02-16 17:27:28 +01:00
11 changed files with 108 additions and 65 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
open_collective: osmocom

31
debian/changelog vendored
View File

@ -1,3 +1,34 @@
rtl-sdr (2.0.2) unstable; urgency=medium
[ Mikael Falkvidd ]
* Fix small typo in rtl_sdr man page
[ Clayton Smith ]
* Use library paths from pkg-config
* Only use LIBUSB_LINK_LIBRARIES if it exists
[ hayati ayguen ]
* improve CLI usage docs: '-d' also accepts serial
[ Oliver Jowett ]
* r82xx: improve tuner precision
[ Sultan Qasim Khan ]
* r82xx: avoid redundant register writes for speed
* r82xx: batch register writes for tuning
[ Ethan Halsall ]
* fix: set fc0012 gain to low on init
* fix: round gain input to nearest value
[ Harald Welte ]
* Add funding link to github mirror
[ Steve Markgraf ]
* lib: set SOVERSION back to 0
-- Oliver Smith <osmith@sysmocom.de> Tue, 23 Apr 2024 11:40:18 +0200
rtl-sdr (2.0.1) unstable; urgency=medium
* debian/changelog: update for 2.0.0 and 2.0.1

View File

@ -29,7 +29,7 @@ target_include_directories(rtlsdr PUBLIC
)
set_target_properties(rtlsdr PROPERTIES DEFINE_SYMBOL "rtlsdr_EXPORTS")
set_target_properties(rtlsdr PROPERTIES OUTPUT_NAME rtlsdr)
set_target_properties(rtlsdr PROPERTIES SOVERSION ${MAJOR_VERSION})
set_target_properties(rtlsdr PROPERTIES SOVERSION 0)
set_target_properties(rtlsdr PROPERTIES VERSION ${LIBVER})
generate_export_header(rtlsdr)

View File

@ -89,7 +89,7 @@ void usage(void)
fprintf(stderr,
"rtl_adsb, a simple ADS-B decoder\n\n"
"Use:\trtl_adsb [-R] [-g gain] [-p ppm] [output file]\n"
"\t[-d device_index (default: 0)]\n"
"\t[-d device_index or serial (default: 0)]\n"
"\t[-V verbove output (default: off)]\n"
"\t[-S show short frames (default: off)]\n"
"\t[-Q quality (0: no sanity checks, 0.5: half bit, 1: one bit (default), 2: two bits)]\n"

View File

@ -192,7 +192,7 @@ void usage(void)
"\t wbfm == -M fm -s 170k -o 4 -A fast -r 32k -l 0 -E deemp\n"
"\t raw mode outputs 2x16 bit IQ pairs\n"
"\t[-s sample_rate (default: 24k)]\n"
"\t[-d device_index (default: 0)]\n"
"\t[-d device_index or serial (default: 0)]\n"
"\t[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]\n"
"\t[-g tuner_gain (default: automatic)]\n"
"\t[-l squelch_level (default: 0/off)]\n"

View File

@ -130,7 +130,7 @@ void usage(void)
"\t[-e exit_timer (default: off/0)]\n"
//"\t[-s avg/iir smoothing (default: avg)]\n"
//"\t[-t threads (default: 1)]\n"
"\t[-d device_index (default: 0)]\n"
"\t[-d device_index or serial (default: 0)]\n"
"\t[-g tuner_gain (default: automatic)]\n"
"\t[-p ppm_error (default: 0)]\n"
"\t[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]\n"

View File

@ -49,7 +49,7 @@ void usage(void)
"rtl_sdr, an I/Q recorder for RTL2832 based DVB-T receivers\n\n"
"Usage:\t -f frequency_to_tune_to [Hz]\n"
"\t[-s samplerate (default: 2048000 Hz)]\n"
"\t[-d device_index (default: 0)]\n"
"\t[-d device_index or serial (default: 0)]\n"
"\t[-g gain (default: 0 for auto)]\n"
"\t[-p ppm_error (default: 0)]\n"
"\t[-b output_block_size (default: 16 * 16384)]\n"

View File

@ -102,7 +102,7 @@ void usage(void)
printf("\t[-s samplerate in Hz (default: %d Hz)]\n", DEFAULT_SAMPLE_RATE_HZ);
printf("\t[-b number of buffers (default: 15, set by library)]\n");
printf("\t[-n max number of linked list buffers to keep (default: %d)]\n", DEFAULT_MAX_NUM_BUFFERS);
printf("\t[-d device index (default: 0)]\n");
printf("\t[-d device index or serial (default: 0)]\n");
printf("\t[-P ppm_error (default: 0)]\n");
printf("\t[-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)]\n");
printf("\t[-D enable direct sampling (default: off)]\n");

View File

@ -90,7 +90,7 @@ void usage(void)
"rtl_test, a benchmark tool for RTL2832 based DVB-T receivers\n\n"
"Usage:\n"
"\t[-s samplerate (default: 2048000 Hz)]\n"
"\t[-d device_index (default: 0)]\n"
"\t[-d device_index or serial (default: 0)]\n"
"\t[-t enable Elonics E4000 tuner benchmark]\n"
#ifndef _WIN32
"\t[-p[seconds] enable PPM error measurement (default: 10 seconds)]\n"

View File

@ -114,7 +114,7 @@ int fc0012_init(void *dev)
0x00, /* reg. 0x10: may also be 0x0d */
0x00, /* reg. 0x11 */
0x1f, /* reg. 0x12: Set to maximum gain */
0x08, /* reg. 0x13: Set to Middle Gain: 0x08,
0x00, /* reg. 0x13: Set to Low Gain: 0x00,
Low Gain: 0x00, High Gain: 0x10, enable IX2: 0x80 */
0x00, /* reg. 0x14 */
0x04, /* reg. 0x15: Enable LNA COMPS */
@ -321,23 +321,11 @@ int fc0012_set_gain(void *dev, int gain)
/* mask bits off */
tmp &= 0xe0;
switch (gain) {
case -99: /* -9.9 dB */
tmp |= 0x02;
break;
case -40: /* -4 dB */
break;
case 71:
tmp |= 0x08; /* 7.1 dB */
break;
case 179:
tmp |= 0x17; /* 17.9 dB */
break;
case 192:
default:
tmp |= 0x10; /* 19.2 dB */
break;
}
if (gain < -40) tmp |= 0x02; /* -9.9 dB */
else if (gain < 71) tmp |= 0x00; /* -4.0 dB */
else if (gain < 179) tmp |= 0x08; /* 7.1 dB */
else if (gain < 192) tmp |= 0x17; /* 17.9 dB */
else tmp |= 0x10; /* 19.2 dB */
ret = fc0012_writereg(dev, 0x13, tmp);

View File

@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include "rtlsdr_i2c.h"
#include "tuner_r82xx.h"
@ -243,6 +244,7 @@ static void shadow_store(struct r82xx_priv *priv, uint8_t reg, const uint8_t *va
if (r < 0) {
len += r;
val -= r;
r = 0;
}
if (len <= 0)
@ -253,11 +255,29 @@ static void shadow_store(struct r82xx_priv *priv, uint8_t reg, const uint8_t *va
memcpy(&priv->regs[r], val, len);
}
static bool shadow_equal(struct r82xx_priv *priv, uint8_t reg, const uint8_t *val,
int len)
{
int r = reg - REG_SHADOW_START;
if (r < 0 || len < 0 || len > NUM_REGS - r)
return false;
if (memcmp(&priv->regs[r], val, len) == 0)
return true;
return false;
}
static int r82xx_write(struct r82xx_priv *priv, uint8_t reg, const uint8_t *val,
unsigned int len)
{
int rc, size, pos = 0;
/* Avoid setting registers unnecessarily since it's slow */
if (shadow_equal(priv, reg, val, len))
return 0;
/* Store the shadow registers */
shadow_store(priv, reg, val, len);
@ -424,17 +444,21 @@ static int r82xx_set_mux(struct r82xx_priv *priv, uint32_t freq)
return rc;
}
static inline uint8_t mask_reg8(uint8_t reg, uint8_t val, uint8_t mask)
{
return (reg & ~mask) | (val & mask);
}
static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
{
int rc, i;
unsigned sleep_time = 10000;
uint64_t vco_freq;
uint32_t vco_fra; /* VCO contribution by SDM (kHz) */
uint32_t vco_min = 1770000;
uint32_t vco_max = vco_min * 2;
uint32_t freq_khz, pll_ref, pll_ref_khz;
uint16_t n_sdm = 2;
uint16_t sdm = 0;
uint64_t vco_div;
uint32_t vco_min = 1770000; /* kHz */
uint32_t vco_max = vco_min * 2; /* kHz */
uint32_t freq_khz, pll_ref;
uint32_t sdm = 0;
uint8_t mix_div = 2;
uint8_t div_buf = 0;
uint8_t div_num = 0;
@ -442,25 +466,24 @@ static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
uint8_t refdiv2 = 0;
uint8_t ni, si, nint, vco_fine_tune, val;
uint8_t data[5];
uint8_t regs[7];
/* Frequency in kHz */
freq_khz = (freq + 500) / 1000;
pll_ref = priv->cfg->xtal;
pll_ref_khz = (priv->cfg->xtal + 500) / 1000;
rc = r82xx_write_reg_mask(priv, 0x10, refdiv2, 0x10);
if (rc < 0)
return rc;
/* set pll autotune = 128kHz */
rc = r82xx_write_reg_mask(priv, 0x1a, 0x00, 0x0c);
if (rc < 0)
return rc;
/* regs 0x10 to 0x16 */
memcpy(regs, &priv->regs[0x10 - REG_SHADOW_START], 7);
regs[0] = mask_reg8(regs[0], refdiv2, 0x10);
/* set VCO current = 100 */
rc = r82xx_write_reg_mask(priv, 0x12, 0x80, 0xe0);
if (rc < 0)
return rc;
regs[2] = mask_reg8(regs[2], 0x80, 0xe0);
/* Calculate divider */
while (mix_div <= 64) {
@ -490,13 +513,27 @@ static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
else if (vco_fine_tune < vco_power_ref)
div_num = div_num + 1;
rc = r82xx_write_reg_mask(priv, 0x10, div_num << 5, 0xe0);
if (rc < 0)
return rc;
regs[0] = mask_reg8(regs[0], div_num << 5, 0xe0);
vco_freq = (uint64_t)freq * (uint64_t)mix_div;
nint = vco_freq / (2 * pll_ref);
vco_fra = (vco_freq - 2 * pll_ref * nint) / 1000;
/* We want to approximate:
* vco_freq / (2 * pll_ref)
*
* in the form:
* nint + sdm/65536
*
* where nint,sdm are integers and 0 < nint, 0 <= sdm < 65536
*
* Scaling to fixed point and rounding:
*
* vco_div = 65536*(nint + sdm/65536) = int( 0.5 + 65536 * vco_freq / (2 * pll_ref) )
* vco_div = 65536*nint + sdm = int( (pll_ref + 65536 * vco_freq) / (2 * pll_ref) )
*/
vco_div = (pll_ref + 65536 * vco_freq) / (2 * pll_ref);
nint = (uint32_t) (vco_div / 65536);
sdm = (uint32_t) (vco_div % 65536);
if (nint > ((128 / vco_power_ref) - 1)) {
fprintf(stderr, "[R82XX] No valid PLL values for %u Hz!\n", freq);
@ -506,35 +543,20 @@ static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
ni = (nint - 13) / 4;
si = nint - 4 * ni - 13;
rc = r82xx_write_reg(priv, 0x14, ni + (si << 6));
if (rc < 0)
return rc;
regs[4] = ni + (si << 6);
/* pw_sdm */
if (!vco_fra)
if (sdm == 0)
val = 0x08;
else
val = 0x00;
rc = r82xx_write_reg_mask(priv, 0x12, val, 0x08);
if (rc < 0)
return rc;
regs[2] = mask_reg8(regs[2], val, 0x08);
/* sdm calculator */
while (vco_fra > 1) {
if (vco_fra > (2 * pll_ref_khz / n_sdm)) {
sdm = sdm + 32768 / (n_sdm / 2);
vco_fra = vco_fra - 2 * pll_ref_khz / n_sdm;
if (n_sdm >= 0x8000)
break;
}
n_sdm <<= 1;
}
regs[5] = sdm & 0xff;
regs[6] = sdm >> 8;
rc = r82xx_write_reg(priv, 0x16, sdm >> 8);
if (rc < 0)
return rc;
rc = r82xx_write_reg(priv, 0x15, sdm & 0xff);
rc = r82xx_write(priv, 0x10, regs, 7);
if (rc < 0)
return rc;
@ -1317,6 +1339,7 @@ int r82xx_init(struct r82xx_priv *priv)
priv->xtal_cap_sel = XTAL_HIGH_CAP_0P;
/* Initialize registers */
memset(priv->regs, 0, NUM_REGS);
rc = r82xx_write(priv, 0x05,
r82xx_init_array, sizeof(r82xx_init_array));