Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions include/rtl-sdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
14 changes: 7 additions & 7 deletions src/convenience/convenience.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
23 changes: 23 additions & 0 deletions src/librtlsdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand All @@ -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;
}
15 changes: 5 additions & 10 deletions src/rtl_biast.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 4 additions & 4 deletions src/rtl_tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand All @@ -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;
}
Expand Down