diff options
-rw-r--r-- | software/libosmosdr/include/osmosdr.h | 26 | ||||
-rw-r--r-- | software/libosmosdr/src/libosmosdr.c | 145 |
2 files changed, 170 insertions, 1 deletions
diff --git a/software/libosmosdr/include/osmosdr.h b/software/libosmosdr/include/osmosdr.h index 9b4fa43..396fe36 100644 --- a/software/libosmosdr/include/osmosdr.h +++ b/software/libosmosdr/include/osmosdr.h @@ -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); diff --git a/software/libosmosdr/src/libosmosdr.c b/software/libosmosdr/src/libosmosdr.c index 10e15d7..de0b56c 100644 --- a/software/libosmosdr/src/libosmosdr.c +++ b/software/libosmosdr/src/libosmosdr.c @@ -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; |