1
0
Fork 0

Add a dummy read to fix intermittent I2C errors

After keeping the I2C repeater always on and removing logic to keep
re-enabling it before every tuner I2C operation, I was occasionally
getting failures for I2C operations when retuning. I don't know why
those intermittent errors were happening, but this seems to fix the
issue. I don't know why this dummy read fixes it, or what reading
from page 0x0A even represents because the datasheet doesn't say
anything about it.
This commit is contained in:
Sultan Qasim Khan 2024-02-19 16:51:17 -05:00
parent f19f7627be
commit 30996265e2
1 changed files with 10 additions and 0 deletions

View File

@ -667,6 +667,7 @@ int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev)
return -1;
if (dev->tuner && dev->tuner->exit) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->exit(dev); /* deinitialize tuner */
}
@ -884,6 +885,7 @@ int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq)
if (dev->direct_sampling) {
r = rtlsdr_set_if_freq(dev, freq);
} else if (dev->tuner && dev->tuner->set_freq) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->set_freq(dev, freq - dev->offs_freq);
}
@ -1006,6 +1008,7 @@ int rtlsdr_set_tuner_bandwidth(rtlsdr_dev_t *dev, uint32_t bw)
return -1;
if (dev->tuner->set_bw) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->set_bw(dev, bw > 0 ? bw : dev->rate);
if (r)
return r;
@ -1022,6 +1025,7 @@ int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain)
return -1;
if (dev->tuner->set_gain) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->set_gain((void *)dev, gain);
}
@ -1049,6 +1053,7 @@ int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain)
return -1;
if (dev->tuner->set_if_gain) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->set_if_gain(dev, stage, gain);
}
@ -1063,6 +1068,7 @@ int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int mode)
return -1;
if (dev->tuner->set_gain_mode) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->set_gain_mode((void *)dev, mode);
}
@ -1098,6 +1104,7 @@ int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate)
dev->rate = (uint32_t)real_rate;
if (dev->tuner && dev->tuner->set_bw) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
dev->tuner->set_bw(dev, dev->bw > 0 ? dev->bw : dev->rate);
}
@ -1152,6 +1159,7 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
if (on) {
if (dev->tuner && dev->tuner->exit) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r = dev->tuner->exit(dev);
}
@ -1171,6 +1179,7 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
dev->direct_sampling = on;
} else {
if (dev->tuner && dev->tuner->init) {
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
r |= dev->tuner->init(dev);
}
@ -1237,6 +1246,7 @@ int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on)
} else {
bw = dev->rate;
}
rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); /* dummy read */
dev->tuner->set_bw(dev, bw);
}