@@ -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
130131void 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
574575void 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)
734742int 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)
923934int 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)
12561269int 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