aboutsummaryrefslogtreecommitdiffstats
path: root/src/librtlsdr.c
diff options
context:
space:
mode:
authorrtlsdrblog <rtlsdrblog@gmail.com>2023-08-22 04:16:00 +1200
committerSteve Markgraf <steve@steve-m.de>2023-08-23 00:34:08 +0200
commit1261fbb285297da08f4620b18871b6d6d9ec2a7b (patch)
tree118b455f72e74661c4263d6950587b03d56f5f03 /src/librtlsdr.c
parent142325a93c6ad70f851f43434acfdf75e12dfe03 (diff)
add rtl-sdr blog v4 support
Diffstat (limited to 'src/librtlsdr.c')
-rw-r--r--src/librtlsdr.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/librtlsdr.c b/src/librtlsdr.c
index 096abae..ee13556 100644
--- a/src/librtlsdr.c
+++ b/src/librtlsdr.c
@@ -119,6 +119,8 @@ struct rtlsdr_dev {
int dev_lost;
int driver_active;
unsigned int xfer_errors;
+ char manufact[256];
+ char product[256];
};
void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
@@ -1430,6 +1432,16 @@ int rtlsdr_get_index_by_serial(const char *serial)
return -3;
}
+/* Returns true if the manufact_check and product_check strings match what is in the dongles EEPROM */
+int rtlsdr_check_dongle_model(void *dev, char *manufact_check, char *product_check)
+{
+ if ((strcmp(((rtlsdr_dev_t *)dev)->manufact, manufact_check) == 0&& strcmp(((rtlsdr_dev_t *)dev)->product, product_check) == 0))
+ return 1;
+
+ return 0;
+}
+
+
int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
{
int r;
@@ -1528,6 +1540,9 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
rtlsdr_init_baseband(dev);
dev->dev_lost = 0;
+ /* Get device manufacturer and product id */
+ r = rtlsdr_get_usb_strings(dev, dev->manufact, dev->product, NULL);
+
/* Probe tuners */
rtlsdr_set_i2c_repeater(dev, 1);
@@ -1555,6 +1570,10 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
reg = rtlsdr_i2c_read_reg(dev, R828D_I2C_ADDR, R82XX_CHECK_ADDR);
if (reg == R82XX_CHECK_VAL) {
fprintf(stderr, "Found Rafael Micro R828D tuner\n");
+
+ if (rtlsdr_check_dongle_model(dev, "RTLSDRBlog", "Blog V4"))
+ fprintf(stderr, "RTL-SDR Blog V4 Detected\n");
+
dev->tuner_type = RTLSDR_TUNER_R828D;
goto found;
}
@@ -1588,7 +1607,10 @@ found:
switch (dev->tuner_type) {
case RTLSDR_TUNER_R828D:
- dev->tun_xtal = R828D_XTAL_FREQ;
+ /* If NOT an RTL-SDR Blog V4, set typical R828D 16 MHz freq. Otherwise, keep at 28.8 MHz. */
+ if (!(rtlsdr_check_dongle_model(dev, "RTLSDRBlog", "Blog V4"))) {
+ dev->tun_xtal = R828D_XTAL_FREQ;
+ }
/* fall-through */
case RTLSDR_TUNER_R820T:
/* disable Zero-IF mode */