mirror of https://github.com/drowe67/librtlsdr.git
added gpio functions to API and extended rtl_biast
* functions were provided from Marko Cebokli at http://lea.hamradio.si/~s57uuu/mischam/rtlsdr/ports.html * changed functions to return error/status * added rtlsdr_set_gpio_status() - for testing Signed-off-by: hayati ayguen <h_ayguen@web.de>development
parent
3864bf7889
commit
35b8c01015
|
@ -535,8 +535,10 @@ RTLSDR_API int rtlsdr_ir_query(rtlsdr_dev_t *dev, uint8_t *buf, size_t buf_len);
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Enable or disable (the bias tee on) GPIO PIN 0. (Works for rtl-sdr.com v3 dongles)
|
* Enable or disable (the bias tee on) GPIO PIN 0 - if not reconfigured.
|
||||||
* See: http://www.rtl-sdr.com/rtl-sdr-blog-v-3-dongles-user-guide/
|
* See rtlsdr_set_opt_string() option 'T'.
|
||||||
|
* This works for rtl-sdr.com v3 dongles, see
|
||||||
|
* http://www.rtl-sdr.com/rtl-sdr-blog-v-3-dongles-user-guide/
|
||||||
* Note: rtlsdr_close() does not clear GPIO lines,
|
* Note: rtlsdr_close() does not clear GPIO lines,
|
||||||
* so it leaves the (bias tee) line enabled if a client program
|
* so it leaves the (bias tee) line enabled if a client program
|
||||||
* doesn't explictly disable it.
|
* doesn't explictly disable it.
|
||||||
|
@ -554,12 +556,30 @@ RTLSDR_API int rtlsdr_set_bias_tee(rtlsdr_dev_t *dev, int on);
|
||||||
* doesn't explictly disable it.
|
* doesn't explictly disable it.
|
||||||
*
|
*
|
||||||
* \param dev the device handle given by rtlsdr_open()
|
* \param dev the device handle given by rtlsdr_open()
|
||||||
* \param gpio the gpio pin to configure as a Bias T control.
|
* \param gpio the gpio pin -- assuming this line is connected to Bias T.
|
||||||
|
* gpio needs to be in 0 .. 7. BUT pin 4 is connected to Tuner RESET.
|
||||||
|
* and for FC0012 is already connected/reserved pin 6 for switching V/U-HF.
|
||||||
* \param on 1 for Bias T on. 0 for Bias T off.
|
* \param on 1 for Bias T on. 0 for Bias T off.
|
||||||
* \return -1 if device is not initialized. 0 otherwise.
|
* \return -1 if device is not initialized. 0 otherwise.
|
||||||
*/
|
*/
|
||||||
RTLSDR_API int rtlsdr_set_bias_tee_gpio(rtlsdr_dev_t *dev, int gpio, int on);
|
RTLSDR_API int rtlsdr_set_bias_tee_gpio(rtlsdr_dev_t *dev, int gpio, int on);
|
||||||
|
|
||||||
|
|
||||||
|
/* from http://lea.hamradio.si/~s57uuu/mischam/rtlsdr/ports.html
|
||||||
|
* added return of error/status */
|
||||||
|
RTLSDR_API int rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio);
|
||||||
|
RTLSDR_API int rtlsdr_set_gpio_input(rtlsdr_dev_t *dev, uint8_t gpio);
|
||||||
|
|
||||||
|
RTLSDR_API int rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
|
||||||
|
RTLSDR_API int rtlsdr_get_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int *val);
|
||||||
|
|
||||||
|
RTLSDR_API int rtlsdr_set_gpio_byte(rtlsdr_dev_t *dev, int val);
|
||||||
|
RTLSDR_API int rtlsdr_get_gpio_byte(rtlsdr_dev_t *dev, int *val);
|
||||||
|
|
||||||
|
/* added for testing: */
|
||||||
|
RTLSDR_API int rtlsdr_set_gpio_status(rtlsdr_dev_t *dev, int *status );
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Sets multiple options from a string encoded like "bw=300:agc=0:gain=27.3:dagc=0:T=1".
|
* Sets multiple options from a string encoded like "bw=300:agc=0:gain=27.3:dagc=0:T=1".
|
||||||
* this is a helper function, that programs don't need to implement every single option
|
* this is a helper function, that programs don't need to implement every single option
|
||||||
|
|
|
@ -266,7 +266,6 @@ struct rtlsdr_dev {
|
||||||
int dev_num;
|
int dev_num;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val);
|
|
||||||
static int rtlsdr_demod_write_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint16_t val, uint8_t len);
|
static int rtlsdr_demod_write_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint16_t val, uint8_t len);
|
||||||
static int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq);
|
static int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq);
|
||||||
static int rtlsdr_update_ds(rtlsdr_dev_t *dev, uint32_t freq);
|
static int rtlsdr_update_ds(rtlsdr_dev_t *dev, uint32_t freq);
|
||||||
|
@ -929,27 +928,77 @@ int rtlsdr_demod_write_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint1
|
||||||
return (r == len) ? 0 : -1;
|
return (r == len) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val)
|
int rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val)
|
||||||
{
|
{
|
||||||
uint16_t r;
|
uint16_t r, retval;
|
||||||
|
|
||||||
gpio = 1 << gpio;
|
gpio = 1 << gpio;
|
||||||
r = rtlsdr_read_reg(dev, SYSB, GPO, 1);
|
r = rtlsdr_read_reg(dev, SYSB, GPO, 1);
|
||||||
r = val ? (r | gpio) : (r & ~gpio);
|
r = val ? (r | gpio) : (r & ~gpio);
|
||||||
rtlsdr_write_reg(dev, SYSB, GPO, r, 1);
|
retval = rtlsdr_write_reg(dev, SYSB, GPO, r, 1);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio)
|
int rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio)
|
||||||
{
|
{
|
||||||
int r;
|
int r, retval;
|
||||||
gpio = 1 << gpio;
|
gpio = 1 << gpio;
|
||||||
|
|
||||||
r = rtlsdr_read_reg(dev, SYSB, GPD, 1);
|
r = rtlsdr_read_reg(dev, SYSB, GPD, 1);
|
||||||
rtlsdr_write_reg(dev, SYSB, GPD, r & ~gpio, 1);
|
retval = rtlsdr_write_reg(dev, SYSB, GPD, r & ~gpio, 1);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
r = rtlsdr_read_reg(dev, SYSB, GPOE, 1);
|
r = rtlsdr_read_reg(dev, SYSB, GPOE, 1);
|
||||||
rtlsdr_write_reg(dev, SYSB, GPOE, r | gpio, 1);
|
retval = rtlsdr_write_reg(dev, SYSB, GPOE, r | gpio, 1);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rtlsdr_get_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int *val)
|
||||||
|
{
|
||||||
|
uint16_t r;
|
||||||
|
|
||||||
|
gpio = 1 << gpio;
|
||||||
|
r = rtlsdr_read_reg(dev, SYSB, GPI, 1);
|
||||||
|
*val = (r & gpio) ? 1 : 0;
|
||||||
|
return 0; /* no way to determine error with rtlsdr_read_reg() for now! */
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtlsdr_set_gpio_input(rtlsdr_dev_t *dev, uint8_t gpio)
|
||||||
|
{
|
||||||
|
int r, retval;
|
||||||
|
gpio = 1 << gpio;
|
||||||
|
|
||||||
|
r = rtlsdr_read_reg(dev, SYSB, GPD, 1);
|
||||||
|
retval = rtlsdr_write_reg(dev, SYSB, GPD, r | gpio, 1);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
r = rtlsdr_read_reg(dev, SYSB, GPOE, 1);
|
||||||
|
retval = rtlsdr_write_reg(dev, SYSB, GPOE, r & ~gpio, 1);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtlsdr_set_gpio_status(rtlsdr_dev_t *dev, int *status )
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
r = rtlsdr_read_reg(dev, SYSB, GPD, 1);
|
||||||
|
*status = r;
|
||||||
|
return 0; /* no way to determine error with rtlsdr_read_reg() for now! */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int rtlsdr_get_gpio_byte(rtlsdr_dev_t *dev, int *val)
|
||||||
|
{
|
||||||
|
*val = rtlsdr_read_reg(dev, SYSB, GPI, 1);
|
||||||
|
return 0; /* no way to determine error with rtlsdr_read_reg() for now! */
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtlsdr_set_gpio_byte(rtlsdr_dev_t *dev, int val)
|
||||||
|
{
|
||||||
|
int retval = rtlsdr_write_reg(dev, SYSB, GPO, val, 1);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void rtlsdr_set_i2c_repeater(rtlsdr_dev_t *dev, int on)
|
void rtlsdr_set_i2c_repeater(rtlsdr_dev_t *dev, int on)
|
||||||
{
|
{
|
||||||
if (on)
|
if (on)
|
||||||
|
|
|
@ -50,32 +50,51 @@ void usage(void)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Usage:\trtl_biast [-options]\n"
|
"Usage:\trtl_biast [-options]\n"
|
||||||
"\t[-d device_index (default: 0)]\n"
|
"\t[-d device_index (default: 0)]\n"
|
||||||
"\t[-b bias_on (default: 0)]\n"
|
"\t[-g GPIO select (default: 0)]\n"
|
||||||
"\t[-g GPIO select (default: 0)]\n");
|
"\t[-b set write bias_on (default: 0, in output mode)]\n"
|
||||||
|
"\t[-r read pin (in input mode)]\n"
|
||||||
|
"\t[-w write pin (in output mode)]\n"
|
||||||
|
"\t[-s read all GPIO pins status (0 = write, 1 = read ?? )]\n"
|
||||||
|
"\t[-R read all GPIO pins ?? ]\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i, r, opt;
|
int i, r, opt, val;
|
||||||
int dev_index = 0;
|
int dev_index = 0;
|
||||||
int dev_given = 0;
|
int dev_given = 0;
|
||||||
|
int write_pin_given = 0;
|
||||||
|
int read_pin_given = 0;
|
||||||
|
int read_all_given = 0;
|
||||||
|
int req_status = 0;
|
||||||
uint32_t bias_on = 0;
|
uint32_t bias_on = 0;
|
||||||
uint32_t gpio_pin = 0;
|
int gpio_pin = 0;
|
||||||
int device_count;
|
int device_count;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "d:b:g:h?")) != -1) {
|
while ((opt = getopt(argc, argv, "d:b:w:g:srRh?")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'd':
|
case 'd':
|
||||||
dev_index = verbose_device_search(optarg);
|
dev_index = verbose_device_search(optarg);
|
||||||
dev_given = 1;
|
dev_given = 1;
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
|
case 'w':
|
||||||
bias_on = atoi(optarg);
|
bias_on = atoi(optarg);
|
||||||
|
write_pin_given = 1;
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
gpio_pin = atoi(optarg);
|
gpio_pin = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
read_pin_given = 1;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
read_all_given = 1;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
req_status = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
|
@ -91,7 +110,71 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
r = rtlsdr_open(&dev, dev_index);
|
r = rtlsdr_open(&dev, dev_index);
|
||||||
rtlsdr_set_bias_tee_gpio(dev, gpio_pin, bias_on);
|
if (r < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "error opening device with index %d\n", dev_index);
|
||||||
|
return -r;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write_pin_given)
|
||||||
|
{
|
||||||
|
r = rtlsdr_set_bias_tee_gpio(dev, gpio_pin, bias_on);
|
||||||
|
if (r < 0)
|
||||||
|
fprintf(stderr, "error setting value %d on pin %d\n", bias_on, gpio_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (read_pin_given)
|
||||||
|
{
|
||||||
|
r = rtlsdr_set_gpio_input(dev, gpio_pin);
|
||||||
|
if (r < 0)
|
||||||
|
fprintf(stderr, "error configuring pin %d to input\n", gpio_pin);
|
||||||
|
|
||||||
|
r = rtlsdr_get_gpio_bit(dev, gpio_pin, &val);
|
||||||
|
if (r < 0)
|
||||||
|
fprintf(stderr, "error reading value for pin %d\n", gpio_pin);
|
||||||
|
else
|
||||||
|
printf("value %d at pin %d\n", val, gpio_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (read_all_given)
|
||||||
|
{
|
||||||
|
r = rtlsdr_get_gpio_byte(dev, &val);
|
||||||
|
if (r < 0)
|
||||||
|
fprintf(stderr, "error reading value for all pins\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("GPIO 0x%02x = bin ", val);
|
||||||
|
for (gpio_pin = 7; gpio_pin >= 4; --gpio_pin)
|
||||||
|
printf("%d", ((val >> gpio_pin) & 1));
|
||||||
|
printf(" ");
|
||||||
|
for (gpio_pin = 3; gpio_pin >= 0; --gpio_pin)
|
||||||
|
printf("%d", ((val >> gpio_pin) & 1));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (req_status)
|
||||||
|
{
|
||||||
|
r = rtlsdr_set_gpio_status(dev, &val);
|
||||||
|
if (r < 0)
|
||||||
|
fprintf(stderr, "error reading status for all pins\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("STATUS 0x%02x = bin ", val);
|
||||||
|
for (gpio_pin = 7; gpio_pin >= 4; --gpio_pin)
|
||||||
|
printf("%d", ((val >> gpio_pin) & 1));
|
||||||
|
printf(" ");
|
||||||
|
for (gpio_pin = 3; gpio_pin >= 0; --gpio_pin)
|
||||||
|
printf("%d", ((val >> gpio_pin) & 1));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
r = -1;
|
||||||
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue