diff --git a/include/rtl-sdr.h b/include/rtl-sdr.h index d64701ea..80462fc8 100644 --- a/include/rtl-sdr.h +++ b/include/rtl-sdr.h @@ -399,6 +399,14 @@ RTLSDR_API int rtlsdr_set_bias_tee(rtlsdr_dev_t *dev, int on); */ RTLSDR_API int rtlsdr_set_bias_tee_gpio(rtlsdr_dev_t *dev, int gpio, int on); +/*! + * Control whether the bias tee is left on after rtlsdr_close() is called. + * + * \param dev the device handle given by rtlsdr_open() + * \param leave_on 1 to leave Bias T on upon library close; 0 otherwise + * \return -1 if device is not initialized. 0 otherwise. + */ +RTLSDR_API int rtlsdr_set_bias_tee_leave_on(rtlsdr_dev_t *dev, int leave_on); #ifdef __cplusplus } diff --git a/src/convenience/convenience.c b/src/convenience/convenience.c index 00cc2cc3..23aa7b9c 100644 --- a/src/convenience/convenience.c +++ b/src/convenience/convenience.c @@ -261,13 +261,6 @@ int verbose_device_search(char *s) fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); } fprintf(stderr, "\n"); - /* does string look like raw id number */ - device = (int)strtol(s, &s2, 0); - if (s2[0] == '\0' && device >= 0 && device < device_count) { - fprintf(stderr, "Using device %d: %s\n", - device, rtlsdr_get_device_name((uint32_t)device)); - return device; - } /* does string exact match a serial */ for (i = 0; i < device_count; i++) { rtlsdr_get_device_usb_strings(i, vendor, product, serial); @@ -301,6 +294,13 @@ int verbose_device_search(char *s) device, rtlsdr_get_device_name((uint32_t)device)); return device; } + /* does string look like raw id number */ + device = (int)strtol(s, &s2, 0); + if (s2[0] == '\0' && device >= 0 && device < device_count) { + fprintf(stderr, "Using device %d: %s\n", + device, rtlsdr_get_device_name((uint32_t)device)); + return device; + } fprintf(stderr, "No matching devices found.\n"); return -1; } diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 01462980..04bd5a8f 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -104,6 +104,8 @@ struct rtlsdr_dev { enum rtlsdr_async_status async_status; int async_cancel; int use_zerocopy; + int keep_biast_on; + int biast_gpio; /* rtl demod context */ uint32_t rate; /* Hz */ uint32_t rtl_xtal; /* Hz */ @@ -1658,6 +1660,14 @@ int rtlsdr_close(rtlsdr_dev_t *dev) rtlsdr_deinit_baseband(dev); } + /* + * Disable bias-tee unless we're explicitly asked + * to keep it on. + */ + if (dev->keep_biast_on == 0) { + rtlsdr_set_bias_tee(dev, 0); + } + libusb_release_interface(dev->devh, 0); #ifdef DETACH_KERNEL_DRIVER @@ -2014,6 +2024,7 @@ int rtlsdr_set_bias_tee_gpio(rtlsdr_dev_t *dev, int gpio, int on) if (!dev) return -1; + dev->biast_gpio = gpio; rtlsdr_set_gpio_output(dev, gpio); rtlsdr_set_gpio_bit(dev, gpio, on); @@ -2022,5 +2033,17 @@ int rtlsdr_set_bias_tee_gpio(rtlsdr_dev_t *dev, int gpio, int on) int rtlsdr_set_bias_tee(rtlsdr_dev_t *dev, int on) { + if (!dev) + return -1; + return rtlsdr_set_bias_tee_gpio(dev, 0, on); } + +int rtlsdr_set_bias_tee_leave_on(rtlsdr_dev_t *dev, int leave_on) +{ + if (!dev) + return -1; + + dev->keep_biast_on = leave_on; + return 0; +} diff --git a/src/rtl_biast.c b/src/rtl_biast.c index 185e838f..776d14b0 100644 --- a/src/rtl_biast.c +++ b/src/rtl_biast.c @@ -83,18 +83,13 @@ int main(int argc, char **argv) } r = rtlsdr_open(&dev, dev_index); + + /* Flip on the bias tee on the given GPIO pin */ rtlsdr_set_bias_tee_gpio(dev, gpio_pin, bias_on); -exit: - /* - * Note - rtlsdr_close() in this tree does not clear the bias tee - * GPIO line, so it leaves the bias tee enabled if a client program - * doesn't explictly disable it. - * - * If that behaviour changes then another rtlsdr_close() will be - * needed that takes some extension flags, and one of them should - * be to either explicitly close the biast or leave it alone. - */ + /* Ensure it stays on during rtlsdr_close() */ + rtlsdr_set_bias_tee_leave_on(dev, 1); + rtlsdr_close(dev); return r >= 0 ? r : -r; diff --git a/src/rtl_tcp.c b/src/rtl_tcp.c index 562198f0..a04566af 100644 --- a/src/rtl_tcp.c +++ b/src/rtl_tcp.c @@ -375,7 +375,7 @@ int main(int argc, char **argv) char *addr = "127.0.0.1"; char *port = "1234"; uint32_t frequency = 100000000, samp_rate = 2048000; - struct sockaddr_storage local, remote; + struct sockaddr_storage remote; struct addrinfo *ai; struct addrinfo *aiHead; struct addrinfo hints; @@ -524,6 +524,7 @@ int main(int argc, char **argv) pthread_cond_init(&cond, NULL); pthread_cond_init(&exit_cond, NULL); + memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; /* Server mode. */ hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6. */ hints.ai_socktype = SOCK_STREAM; @@ -538,7 +539,6 @@ int main(int argc, char **argv) addr, gai_strerror(aiErr)); return(-1); } - memcpy(&local, aiHead->ai_addr, aiHead->ai_addrlen); for (ai = aiHead; ai != NULL; ai = ai->ai_next) { aiErr = getnameinfo((struct sockaddr *)ai->ai_addr, ai->ai_addrlen, @@ -555,8 +555,8 @@ int main(int argc, char **argv) setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, (char *)&r, sizeof(int)); setsockopt(listensocket, SOL_SOCKET, SO_LINGER, (char *)&ling, sizeof(ling)); - if (bind(listensocket, (struct sockaddr *)&local, sizeof(local))) - fprintf(stderr, "rtl_tcp bind error: %s", strerror(errno)); + if (bind(listensocket, (struct sockaddr *) ai->ai_addr, ai->ai_addrlen)) + fprintf(stderr, "rtl_tcp bind error: %s\n", strerror(errno)); else break; }