Skip to content

Commit 3f2632d

Browse files
committed
r82xx: set_dithering()
1 parent 3dfa4ad commit 3f2632d

5 files changed

Lines changed: 46 additions & 3 deletions

File tree

include/rtl-sdr.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,17 @@ RTLSDR_API int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on);
322322
*/
323323
RTLSDR_API int rtlsdr_get_offset_tuning(rtlsdr_dev_t *dev);
324324

325+
/*!
326+
* Enable or disable frequency dithering for r820t tuners.
327+
* Must be performed before freq_set().
328+
* Fails for other tuners.
329+
*
330+
* \param dev the device handle given by rtlsdr_open()
331+
* \param on 0 means disabled, 1 enabled
332+
* \return 0 on success
333+
*/
334+
RTLSDR_API int rtlsdr_set_dithering(rtlsdr_dev_t *dev, int dither);
335+
325336
/* streaming functions */
326337

327338
RTLSDR_API int rtlsdr_reset_buffer(rtlsdr_dev_t *dev);

include/tuner_r82xx.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ struct r82xx_priv {
8484
uint8_t input;
8585
int has_lock;
8686
int init_done;
87+
int disable_dither;
8788

8889
/* Store current mode */
8990
uint32_t delsys;
@@ -116,5 +117,6 @@ int r82xx_init(struct r82xx_priv *priv);
116117
int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq);
117118
int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain);
118119
int r82xx_set_nomod(struct r82xx_priv *priv);
120+
int r82xx_set_dither(struct r82xx_priv *priv, int dither);
119121

120122
#endif

src/librtlsdr.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,14 @@ int rtlsdr_get_offset_tuning(rtlsdr_dev_t *dev)
12661266
return (dev->offs_freq) ? 1 : 0;
12671267
}
12681268

1269+
int rtlsdr_set_dithering(rtlsdr_dev_t *dev, int dither)
1270+
{
1271+
if (dev->tuner_type == RTLSDR_TUNER_R820T) {
1272+
return r82xx_set_dither(&dev->r82xx_p, dither);
1273+
}
1274+
return 1;
1275+
}
1276+
12691277
static rtlsdr_dongle_t *find_known_device(uint16_t vid, uint16_t pid)
12701278
{
12711279
unsigned int i;

src/rtl_sdr.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ void usage(void)
5656
"\t[-n number of samples to read (default: 0, infinite)]\n"
5757
"\t[-S force sync output (default: async)]\n"
5858
"\t[-D direct_sampling_mode, 0 (default/off), 1 (I), 2 (Q), 3 (no-mod)]\n"
59+
"\t[-N no dithering (default: use dithering)]\n"
5960
"\tfilename (a '-' dumps samples to stdout)\n\n");
6061
exit(1);
6162
}
@@ -115,6 +116,7 @@ int main(int argc, char **argv)
115116
int ppm_error = 0;
116117
int sync_mode = 0;
117118
int direct_sampling = 0;
119+
int dithering = 1;
118120
FILE *file;
119121
uint8_t *buffer;
120122
int dev_index = 0;
@@ -123,7 +125,7 @@ int main(int argc, char **argv)
123125
uint32_t samp_rate = DEFAULT_SAMPLE_RATE;
124126
uint32_t out_block_size = DEFAULT_BUF_LENGTH;
125127

126-
while ((opt = getopt(argc, argv, "d:f:g:s:b:n:p:D:S")) != -1) {
128+
while ((opt = getopt(argc, argv, "d:f:g:s:b:n:p:D:SN")) != -1) {
127129
switch (opt) {
128130
case 'd':
129131
dev_index = verbose_device_search(optarg);
@@ -153,6 +155,9 @@ int main(int argc, char **argv)
153155
case 'D':
154156
direct_sampling = atoi(optarg);
155157
break;
158+
case 'N':
159+
dithering = 0;
160+
break;
156161
default:
157162
usage();
158163
break;
@@ -203,6 +208,16 @@ int main(int argc, char **argv)
203208
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE );
204209
#endif
205210

211+
if (!dithering) {
212+
fprintf(stderr, "Disabling dithering... ");
213+
r = rtlsdr_set_dithering(dev, dithering);
214+
if (r) {
215+
fprintf(stderr, "failure\n");
216+
} else {
217+
fprintf(stderr, "success\n");
218+
}
219+
}
220+
206221
if (direct_sampling) {
207222
verbose_direct_sampling(dev, direct_sampling);
208223
}

src/tuner_r82xx.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,10 @@ static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
506506
else
507507
val = 0x00;
508508

509-
rc = r82xx_write_reg_mask(priv, 0x12, val, 0x08);
509+
if (priv->disable_dither)
510+
val |= 0x10;
511+
512+
rc = r82xx_write_reg_mask(priv, 0x12, val, 0x18);
510513
if (rc < 0)
511514
return rc;
512515

@@ -1142,7 +1145,11 @@ int r82xx_set_nomod(struct r82xx_priv *priv)
11421145
return rc;
11431146
}
11441147

1145-
1148+
int r82xx_set_dither(struct r82xx_priv *priv, int dither)
1149+
{
1150+
priv->disable_dither = !dither;
1151+
return 0;
1152+
}
11461153

11471154
/*
11481155
* r82xx standby logic

0 commit comments

Comments
 (0)