provide accessors for expanded USB API

This commit is contained in:
Christian Daniel 2012-06-01 00:17:33 +02:00
parent 35355c704c
commit 4eed4e7870
2 changed files with 170 additions and 1 deletions

View File

@ -141,6 +141,15 @@ OSMOSDR_API int osmosdr_get_tuner_gain(osmosdr_dev_t *dev);
*/
OSMOSDR_API int osmosdr_set_tuner_gain_mode(osmosdr_dev_t *dev, int manual);
/* set LNA gain in hdB */
OSMOSDR_API int osmosdr_set_tuner_lna_gain(osmosdr_dev_t *dev, int gain);
/* set mixer gain in hdB */
OSMOSDR_API int osmosdr_set_tuner_mixer_gain(osmosdr_dev_t *dev, int gain);
/* set mixer enhancement */
OSMOSDR_API int osmosdr_set_tuner_mixer_enh(osmosdr_dev_t *dev, int enh);
/* set IF stages gain */
OSMOSDR_API int osmosdr_set_tuner_if_gain(osmosdr_dev_t *dev, int stage, int gain);
/* this will select the baseband filters according to the requested sample rate */
OSMOSDR_API int osmosdr_set_sample_rate(osmosdr_dev_t *dev, uint32_t rate);
@ -152,6 +161,23 @@ OSMOSDR_API int osmosdr_set_sample_rate(osmosdr_dev_t *dev, uint32_t rate);
*/
OSMOSDR_API uint32_t osmosdr_get_sample_rate(osmosdr_dev_t *dev);
/* this allows direct access to the FPGA register bank */
OSMOSDR_API int osmosdr_set_fpga_reg(osmosdr_dev_t *dev, uint8_t reg, uint32_t value);
/* more access to OsmoSDR functions */
/* set decimation (0 = off, 1 = 1:2, 2 = 1:4, 3 = 1:8, ... 6 = 1:64) */
OSMOSDR_API int osmosdr_set_fpga_decimation(osmosdr_dev_t *dev, int dec);
/* set i/q swap / spectrum inversion (0 = off, 1 = on) */
OSMOSDR_API int osmosdr_set_fpga_iq_swap(osmosdr_dev_t *dev, int sw);
/* configure scaling of i and q channel (scaled_i = (orig_i * igain) / 32768) */
OSMOSDR_API int osmosdr_set_fpga_iq_gain(osmosdr_dev_t *dev, uint16_t igain, uint16_t qgain);
/* configure i and q offset correction (corrected_i = orig_i + iofs */
OSMOSDR_API int osmosdr_set_fpga_iq_ofs(osmosdr_dev_t *dev, int16_t iofs, int16_t qofs);
/* streaming functions */
OSMOSDR_API int osmosdr_reset_buffer(osmosdr_dev_t *dev);

View File

@ -122,15 +122,23 @@ int e4k_exit(void *dev) { return 0; }
int e4k_set_freq(void *dev, uint32_t freq) {
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[4];
int res;
buffer[0] = (uint8_t)(freq >> 24);
buffer[1] = (uint8_t)(freq >> 16);
buffer[2] = (uint8_t)(freq >> 8);
buffer[3] = (uint8_t)(freq >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
res = libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(3, 5), 0,
buffer, 4, CTRL_TIMEOUT);
if (res == 4) {
res = libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(3, 9), 0,
NULL, 0, CTRL_TIMEOUT);
}
return res;
}
int e4k_set_bw(void *dev, int bw) { return 0; }
@ -365,6 +373,65 @@ int osmosdr_set_tuner_gain_mode(osmosdr_dev_t *dev, int mode)
return r;
}
int osmosdr_set_tuner_lna_gain(osmosdr_dev_t *dev, int gain)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[4];
buffer[0] = (gain >> 24);
buffer[1] = (gain >> 16);
buffer[2] = (gain >> 8);
buffer[3] = (gain >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(3, 0x0b), 0,
buffer, 4, CTRL_TIMEOUT);
}
int osmosdr_set_tuner_mixer_gain(osmosdr_dev_t *dev, int gain)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[1];
buffer[0] = gain / 10;
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(3, 0x03), 0,
buffer, 1, CTRL_TIMEOUT);
}
int osmosdr_set_tuner_mixer_enh(osmosdr_dev_t *dev, int enh)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[4];
buffer[0] = (enh >> 24);
buffer[1] = (enh >> 16);
buffer[2] = (enh >> 8);
buffer[3] = (enh >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(3, 0x0d), 0,
buffer, 4, CTRL_TIMEOUT);
}
int osmosdr_set_tuner_if_gain(osmosdr_dev_t *dev, int stage, int gain)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[5];
buffer[0] = stage;
gain /= 10;
buffer[1] = (gain >> 24);
buffer[2] = (gain >> 16);
buffer[3] = (gain >> 8);
buffer[4] = (gain >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(3, 0x02), 0,
buffer, 5, CTRL_TIMEOUT);
}
int osmosdr_set_sample_rate(osmosdr_dev_t *dev, uint32_t samp_rate)
{
uint16_t r = 0;
@ -396,6 +463,82 @@ uint32_t osmosdr_get_sample_rate(osmosdr_dev_t *dev)
return dev->rate;
}
int osmosdr_set_fpga_reg(osmosdr_dev_t *dev, uint8_t reg, uint32_t value)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[5];
buffer[0] = reg;
buffer[1] = (uint8_t)(value >> 24);
buffer[2] = (uint8_t)(value >> 16);
buffer[3] = (uint8_t)(value >> 8);
buffer[4] = (uint8_t)(value >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(1, 0x01), 0,
buffer, 5, CTRL_TIMEOUT);
}
int osmosdr_set_fpga_decimation(osmosdr_dev_t *dev, int dec)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[1];
if((dec < 0) || (dec > 6))
return -1;
buffer[0] = dec;
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(1, 0x02), 0,
buffer, 1, CTRL_TIMEOUT);
}
int osmosdr_set_fpga_iq_swap(osmosdr_dev_t *dev, int sw)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[1];
if((sw < 0) || (sw > 1))
return -1;
buffer[0] = sw;
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(1, 0x03), 0,
buffer, 1, CTRL_TIMEOUT);
}
int osmosdr_set_fpga_iq_gain(osmosdr_dev_t *dev, uint16_t igain, uint16_t qgain)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[4];
buffer[0] = (uint8_t)(igain >> 8);
buffer[1] = (uint8_t)(igain >> 0);
buffer[2] = (uint8_t)(qgain >> 8);
buffer[3] = (uint8_t)(qgain >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(1, 0x04), 0,
buffer, 4, CTRL_TIMEOUT);
}
int osmosdr_set_fpga_iq_ofs(osmosdr_dev_t *dev, int16_t iofs, int16_t qofs)
{
osmosdr_dev_t* devt = (osmosdr_dev_t*)dev;
uint8_t buffer[4];
buffer[0] = (uint8_t)(iofs >> 8);
buffer[1] = (uint8_t)(iofs >> 0);
buffer[2] = (uint8_t)(qofs >> 8);
buffer[3] = (uint8_t)(qofs >> 0);
return libusb_control_transfer(devt->devh, CTRL_OUT, 0x07,
FUNC(1, 0x05), 0,
buffer, 4, CTRL_TIMEOUT);
}
osmosdr_dongle_t *find_known_device(uint16_t vid, uint16_t pid)
{
unsigned int i;