Skip to content

Commit d59b178

Browse files
committed
lib: cache i2c repeater
1 parent a0b6131 commit d59b178

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

src/librtlsdr.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ struct rtlsdr_dev {
125125
int driver_active;
126126
unsigned int xfer_errors;
127127
int tuner_initialized;
128+
int i2c_repeater_on;
128129
};
129130

130131
void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
@@ -573,6 +574,10 @@ void rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio)
573574

574575
void rtlsdr_set_i2c_repeater(rtlsdr_dev_t *dev, int on)
575576
{
577+
if (on == dev->i2c_repeater_on)
578+
return;
579+
on = !!on; /* values +2 to force on */
580+
dev->i2c_repeater_on = on;
576581
rtlsdr_demod_write_reg(dev, 1, 0x01, on ? 0x18 : 0x10, 1);
577582
}
578583

@@ -670,6 +675,8 @@ int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev)
670675
if (!dev)
671676
return -1;
672677

678+
rtlsdr_set_i2c_repeater(dev, 0);
679+
673680
if (dev->tuner && dev->tuner->exit) {
674681
rtlsdr_set_i2c_repeater(dev, 1);
675682
r = dev->tuner->exit(dev); /* deinitialize tuner */
@@ -692,6 +699,7 @@ int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq)
692699

693700
if (!dev)
694701
return -1;
702+
rtlsdr_set_i2c_repeater(dev, 0);
695703

696704
/* read corrected clock value */
697705
if (rtlsdr_get_xtal_freq(dev, &rtl_xtal, NULL))
@@ -712,7 +720,6 @@ int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq)
712720
if(dev->tuner_initialized && dev->tuner && dev->tuner->set_if_freq) {
713721
rtlsdr_set_i2c_repeater(dev, 1);
714722
dev->tuner->set_if_freq(dev, freq);
715-
rtlsdr_set_i2c_repeater(dev, 0);
716723
}
717724
return r;
718725
}
@@ -722,6 +729,7 @@ int rtlsdr_set_sample_freq_correction(rtlsdr_dev_t *dev, int ppm)
722729
int r = 0;
723730
uint8_t tmp;
724731
int16_t offs = ppm * (-1) * TWO_POW(24) / 1000000;
732+
rtlsdr_set_i2c_repeater(dev, 0);
725733

726734
tmp = offs & 0xff;
727735
r |= rtlsdr_demod_write_reg(dev, 1, 0x3f, tmp, 1);
@@ -734,6 +742,7 @@ int rtlsdr_set_sample_freq_correction(rtlsdr_dev_t *dev, int ppm)
734742
int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, uint32_t tuner_freq)
735743
{
736744
int r = 0;
745+
rtlsdr_set_i2c_repeater(dev, 0);
737746

738747
if (!dev)
739748
return -1;
@@ -831,6 +840,7 @@ int rtlsdr_write_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16
831840
int r = 0;
832841
int i;
833842
uint8_t cmd[2];
843+
rtlsdr_set_i2c_repeater(dev, 0);
834844

835845
if (!dev)
836846
return -1;
@@ -868,6 +878,7 @@ int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_
868878
{
869879
int r = 0;
870880
int i;
881+
rtlsdr_set_i2c_repeater(dev, 0);
871882

872883
if (!dev)
873884
return -1;
@@ -897,11 +908,11 @@ int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq)
897908
return -1;
898909

899910
if (dev->direct_sampling) {
911+
rtlsdr_set_i2c_repeater(dev, 0);
900912
r = rtlsdr_set_if_freq(dev, freq);
901913
} else if (dev->tuner && dev->tuner->set_freq) {
902914
rtlsdr_set_i2c_repeater(dev, 1);
903915
r = dev->tuner->set_freq(dev, freq - dev->offs_freq);
904-
rtlsdr_set_i2c_repeater(dev, 0);
905916
}
906917

907918
if (!r)
@@ -923,6 +934,7 @@ uint32_t rtlsdr_get_center_freq(rtlsdr_dev_t *dev)
923934
int rtlsdr_set_freq_correction(rtlsdr_dev_t *dev, int ppm)
924935
{
925936
int r = 0;
937+
rtlsdr_set_i2c_repeater(dev, 0);
926938

927939
if (!dev)
928940
return -1;
@@ -1025,7 +1037,6 @@ int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain)
10251037
if (dev->tuner->set_gain) {
10261038
rtlsdr_set_i2c_repeater(dev, 1);
10271039
r = dev->tuner->set_gain((void *)dev, gain);
1028-
rtlsdr_set_i2c_repeater(dev, 0);
10291040
}
10301041

10311042
if (!r)
@@ -1054,7 +1065,6 @@ int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain)
10541065
if (dev->tuner->set_if_gain) {
10551066
rtlsdr_set_i2c_repeater(dev, 1);
10561067
r = dev->tuner->set_if_gain(dev, stage, gain);
1057-
rtlsdr_set_i2c_repeater(dev, 0);
10581068
}
10591069

10601070
return r;
@@ -1070,7 +1080,6 @@ int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int mode)
10701080
if (dev->tuner->set_gain_mode) {
10711081
rtlsdr_set_i2c_repeater(dev, 1);
10721082
r = dev->tuner->set_gain_mode((void *)dev, mode);
1073-
rtlsdr_set_i2c_repeater(dev, 0);
10741083
}
10751084

10761085
return r;
@@ -1085,6 +1094,7 @@ int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate)
10851094

10861095
if (!dev)
10871096
return -1;
1097+
rtlsdr_set_i2c_repeater(dev, 0);
10881098

10891099
/* check if the rate is supported by the resampler */
10901100
if ((samp_rate <= 225000) || (samp_rate > 3200000) ||
@@ -1140,6 +1150,7 @@ int rtlsdr_set_testmode(rtlsdr_dev_t *dev, int on)
11401150
{
11411151
if (!dev)
11421152
return -1;
1153+
rtlsdr_set_i2c_repeater(dev, 0);
11431154

11441155
return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x03 : 0x05, 1);
11451156
}
@@ -1148,6 +1159,7 @@ int rtlsdr_set_agc_mode(rtlsdr_dev_t *dev, int on)
11481159
{
11491160
if (!dev)
11501161
return -1;
1162+
rtlsdr_set_i2c_repeater(dev, 0);
11511163

11521164
return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x25 : 0x05, 1);
11531165
}
@@ -1189,6 +1201,7 @@ int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on)
11891201
rtlsdr_set_i2c_repeater(dev, 0);
11901202
}
11911203
}
1204+
rtlsdr_set_i2c_repeater(dev, 0);
11921205

11931206
/* common to all direct modes */
11941207
if (on) {
@@ -1256,6 +1269,7 @@ int rtlsdr_get_direct_sampling(rtlsdr_dev_t *dev)
12561269
int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on)
12571270
{
12581271
int r = 0;
1272+
rtlsdr_set_i2c_repeater(dev, 0);
12591273

12601274
if (!dev)
12611275
return -1;
@@ -1624,6 +1638,7 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
16241638
}
16251639

16261640
if (dev->tuner->init) {
1641+
rtlsdr_set_i2c_repeater(dev, 1);
16271642
r = dev->tuner->init(dev);
16281643
dev->tuner_initialized = 1;
16291644
}
@@ -1648,6 +1663,7 @@ int rtlsdr_close(rtlsdr_dev_t *dev)
16481663
{
16491664
if (!dev)
16501665
return -1;
1666+
rtlsdr_set_i2c_repeater(dev, 0);
16511667

16521668
if(!dev->dev_lost) {
16531669
/* block until all async operations have been completed (if any) */
@@ -1686,6 +1702,7 @@ int rtlsdr_reset_buffer(rtlsdr_dev_t *dev)
16861702
{
16871703
if (!dev)
16881704
return -1;
1705+
rtlsdr_set_i2c_repeater(dev, 0);
16891706

16901707
rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2);
16911708
rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x0000, 2);

0 commit comments

Comments
 (0)