|
@@ -39,11 +39,15 @@
|
|
#define LIBUSB_CALL
|
|
#define LIBUSB_CALL
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+/* two raised to the power of n */
|
|
|
|
+#define TWO_POW(n) ((double)(1ULL<<(n)))
|
|
|
|
+
|
|
#include "rtl-sdr.h"
|
|
#include "rtl-sdr.h"
|
|
#include "tuner_e4k.h"
|
|
#include "tuner_e4k.h"
|
|
#include "tuner_fc0012.h"
|
|
#include "tuner_fc0012.h"
|
|
#include "tuner_fc0013.h"
|
|
#include "tuner_fc0013.h"
|
|
#include "tuner_fc2580.h"
|
|
#include "tuner_fc2580.h"
|
|
|
|
+#include "tuner_r820t.h"
|
|
|
|
|
|
typedef struct rtlsdr_tuner_iface {
|
|
typedef struct rtlsdr_tuner_iface {
|
|
/* tuner interface */
|
|
/* tuner interface */
|
|
@@ -160,6 +164,17 @@ int fc2580_set_bw(void *dev, int bw) { return fc2580_SetBandwidthMode(dev, 1); }
|
|
int fc2580_set_gain(void *dev, int gain) { return 0; }
|
|
int fc2580_set_gain(void *dev, int gain) { return 0; }
|
|
int fc2580_set_gain_mode(void *dev, int manual) { return 0; }
|
|
int fc2580_set_gain_mode(void *dev, int manual) { return 0; }
|
|
|
|
|
|
|
|
+int r820t_init(void *dev) {
|
|
|
|
+ int r = R828_Init(dev);
|
|
|
|
+ r820t_SetStandardMode(dev, DVB_T_6M);
|
|
|
|
+ return r;
|
|
|
|
+}
|
|
|
|
+int r820t_exit(void *dev) { return 0; }
|
|
|
|
+int r820t_set_freq(void *dev, uint32_t freq) { return r820t_SetRfFreqHz(dev, freq); }
|
|
|
|
+int r820t_set_bw(void *dev, int bw) { return 0; }
|
|
|
|
+int r820t_set_gain(void *dev, int gain) { return 0; }
|
|
|
|
+int r820t_set_gain_mode(void *dev, int manual) { return 0; }
|
|
|
|
+
|
|
/* definition order must match enum rtlsdr_tuner */
|
|
/* definition order must match enum rtlsdr_tuner */
|
|
static rtlsdr_tuner_iface_t tuners[] = {
|
|
static rtlsdr_tuner_iface_t tuners[] = {
|
|
{
|
|
{
|
|
@@ -185,6 +200,11 @@ static rtlsdr_tuner_iface_t tuners[] = {
|
|
_fc2580_set_freq, fc2580_set_bw, fc2580_set_gain, NULL,
|
|
_fc2580_set_freq, fc2580_set_bw, fc2580_set_gain, NULL,
|
|
fc2580_set_gain_mode
|
|
fc2580_set_gain_mode
|
|
},
|
|
},
|
|
|
|
+ {
|
|
|
|
+ r820t_init, r820t_exit,
|
|
|
|
+ r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL,
|
|
|
|
+ r820t_set_gain_mode
|
|
|
|
+ },
|
|
};
|
|
};
|
|
|
|
|
|
typedef struct rtlsdr_dongle {
|
|
typedef struct rtlsdr_dongle {
|
|
@@ -540,6 +560,24 @@ int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev)
|
|
return r;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq)
|
|
|
|
+{
|
|
|
|
+ int32_t if_freq;
|
|
|
|
+ uint8_t tmp;
|
|
|
|
+ int r;
|
|
|
|
+
|
|
|
|
+ if_freq = ((freq * TWO_POW(22)) / dev->rtl_xtal) * (-1);
|
|
|
|
+
|
|
|
|
+ tmp = (if_freq >> 16) & 0x3f;
|
|
|
|
+ r = rtlsdr_demod_write_reg(dev, 1, 0x19, tmp, 1);
|
|
|
|
+ tmp = (if_freq >> 8) & 0xff;
|
|
|
|
+ r |= rtlsdr_demod_write_reg(dev, 1, 0x1a, tmp, 1);
|
|
|
|
+ tmp = if_freq & 0xff;
|
|
|
|
+ r |= rtlsdr_demod_write_reg(dev, 1, 0x1b, tmp, 1);
|
|
|
|
+
|
|
|
|
+ return r;
|
|
|
|
+}
|
|
|
|
+
|
|
int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, uint32_t tuner_freq)
|
|
int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, uint32_t tuner_freq)
|
|
{
|
|
{
|
|
int r = 0;
|
|
int r = 0;
|
|
@@ -712,6 +750,7 @@ int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains)
|
|
const int fc0012_gains[] = { -99, -40, 71, 179, 192 };
|
|
const int fc0012_gains[] = { -99, -40, 71, 179, 192 };
|
|
const int fc0013_gains[] = { -63, 71, 191, 197 };
|
|
const int fc0013_gains[] = { -63, 71, 191, 197 };
|
|
const int fc2580_gains[] = { 0 /* no gain values */ };
|
|
const int fc2580_gains[] = { 0 /* no gain values */ };
|
|
|
|
+ const int r820t_gains[] = { 0 /* no gain values */ };
|
|
|
|
|
|
int *ptr = NULL;
|
|
int *ptr = NULL;
|
|
int len = 0;
|
|
int len = 0;
|
|
@@ -732,6 +771,9 @@ int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains)
|
|
case RTLSDR_TUNER_FC2580:
|
|
case RTLSDR_TUNER_FC2580:
|
|
ptr = (int *)fc2580_gains; len = sizeof(fc2580_gains);
|
|
ptr = (int *)fc2580_gains; len = sizeof(fc2580_gains);
|
|
break;
|
|
break;
|
|
|
|
+ case RTLSDR_TUNER_R820T:
|
|
|
|
+ ptr = (int *)r820t_gains; len = sizeof(r820t_gains);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
fprintf(stderr, "Invalid tuner type %d\n", dev->tuner_type);
|
|
fprintf(stderr, "Invalid tuner type %d\n", dev->tuner_type);
|
|
break;
|
|
break;
|
|
@@ -808,9 +850,6 @@ int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int mode)
|
|
return r;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
|
|
-/* two raised to the power of n */
|
|
|
|
-#define TWO_POW(n) ((double)(1ULL<<(n)))
|
|
|
|
-
|
|
|
|
int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate)
|
|
int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate)
|
|
{
|
|
{
|
|
uint16_t tmp;
|
|
uint16_t tmp;
|
|
@@ -1088,6 +1127,24 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
|
|
goto found;
|
|
goto found;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ reg = rtlsdr_i2c_read_reg(dev, R820T_I2C_ADDR, R820T_CHECK_ADDR);
|
|
|
|
+ if (reg == R820T_CHECK_VAL) {
|
|
|
|
+ fprintf(stderr, "Found Rafael Micro R820T tuner\n");
|
|
|
|
+ dev->tuner_type = RTLSDR_TUNER_R820T;
|
|
|
|
+
|
|
|
|
+ /* disable Zero-IF mode */
|
|
|
|
+ rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1);
|
|
|
|
+
|
|
|
|
+ /* the R820T uses 3.57 MHz IF for the DVB-T 6 MHz mode, and
|
|
|
|
+ * 4.57 MHz for the 8 MHz mode */
|
|
|
|
+ rtlsdr_set_if_freq(dev, 3570000);
|
|
|
|
+
|
|
|
|
+ /* enable spectrum inversion */
|
|
|
|
+ rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1);
|
|
|
|
+
|
|
|
|
+ goto found;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* initialise GPIOs */
|
|
/* initialise GPIOs */
|
|
rtlsdr_set_gpio_output(dev, 5);
|
|
rtlsdr_set_gpio_output(dev, 5);
|
|
|
|
|