The R820T/2 RTL-SDR’s are known to have a problem that surfaces when trying to listen at L-band frequencies above about 1.5 GHz. As the dongle heats up the internal PLL appears to loose lock, causing reception to be lost above a certain frequency which is usually above around 1.5 GHz. There appears to be manufacturing variation between R820T/2 chips, so some dongles may exhibit this problem, whilst others do not, and some may fail at lower or higher frequencies than others.
This problem can be almost completely solved by cooling the RTL-SDR, and this is the reason we have added a thermal pad to the RTL-SDR dongles sold by us to aid with passive cooling via the metal case. In our tests this solves the problem for almost all dongles, but a few still do sometimes still exhibit this problem after running for a few hours.
Recently we were informed by a reader of RTL-SDR.com about a conversation on IRC where some users suggested modifying the RTL-SDR drivers to solve this problem. The suggestion was to modify the VCO current settings so that they were implemented in the same way as in the Airspy (which also uses the R820T2 but does not have this problem). Basically, in the Airspy the current is set at maximum on initialization, whereas in the RTL-SDR drivers it is set lower, and then bumped up if the PLL fails to lock. Setting it to maximum in the first place seems to help stop signal loss at L-band frequencies.
So far we’ve tested this change with a dongle that was known to be very bad at L-band. This dongle used to fail at 1.65 GHz after 20 seconds. With the driver change it fails after 2 minutes which is an improvement. With passive cooling via thermal pad and our metal case it used to fail after 15 minutes or so, but with passive cooling and the driver change it runs indefinitely.
If you’re having problems at L-band and would like to test this change then we’ve uploaded a modified Windows version of the driver on GitHub here https://github.com/rtlsdrblog/rtl-sdr/releases. It is based on Keenerds version of the RTL-SDR drivers. Simply download the .dll file and replace the current version in your SDR# folder, or other folder. Let us know if it helps you.
The main change made is r82xx_write_reg_mask(priv, 0x12, 0x00, 0xe0); is added to the init code, and r82xx_write_reg_mask(priv, 0x12, 0x80, 0xe0); r82xx_write_reg_mask(priv, 0x12, 0x60, 0xe0); are removed from the set_pll and pll check code.
Thanks to patchvonbraun, Youssef of Airspy and others on IRC for discussing this problem.