libhackrf: Update the library with new fractional sample rate API
And send the new USB command Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
@ -764,17 +764,20 @@ int ADDCALL hackrf_set_freq(hackrf_device* device, const uint64_t freq_hz)
|
|||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float freq_mhz;
|
uint32_t freq_hz;
|
||||||
|
uint32_t divider;
|
||||||
} set_fracrate_params_t;
|
} set_fracrate_params_t;
|
||||||
|
|
||||||
|
|
||||||
int ADDCALL hackrf_set_fracrate(hackrf_device* device, const float freq_mhz)
|
int ADDCALL hackrf_set_fracrate_manual(hackrf_device* device,
|
||||||
|
const uint32_t freq_hz, uint32_t divider)
|
||||||
{
|
{
|
||||||
set_fracrate_params_t set_fracrate_params;
|
set_fracrate_params_t set_fracrate_params;
|
||||||
uint8_t length;
|
uint8_t length;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
set_fracrate_params.freq_mhz = TO_LE(freq_mhz);
|
set_fracrate_params.freq_hz = TO_LE(freq_hz);
|
||||||
|
set_fracrate_params.divider = TO_LE(divider);
|
||||||
length = sizeof(set_fracrate_params_t);
|
length = sizeof(set_fracrate_params_t);
|
||||||
|
|
||||||
result = libusb_control_transfer(
|
result = libusb_control_transfer(
|
||||||
@ -796,6 +799,41 @@ int ADDCALL hackrf_set_fracrate(hackrf_device* device, const float freq_mhz)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ADDCALL hackrf_set_fracrate(hackrf_device* device, const double freq)
|
||||||
|
{
|
||||||
|
const int MAX_N = 32;
|
||||||
|
uint32_t freq_hz, divider;
|
||||||
|
double freq_frac = 1.0 + freq - (int)freq;
|
||||||
|
uint64_t v, a, m;
|
||||||
|
int i, e;
|
||||||
|
|
||||||
|
v = *((uint64_t*)&freq);
|
||||||
|
e = (v >> 52) - 1023;
|
||||||
|
|
||||||
|
m = ((1ULL << 52) - 1);
|
||||||
|
|
||||||
|
v = *((uint64_t*)&freq_frac);
|
||||||
|
v &= m;
|
||||||
|
|
||||||
|
m &= ~((1 << (e+4)) - 1);
|
||||||
|
|
||||||
|
a = 0;
|
||||||
|
|
||||||
|
for (i=1; i<MAX_N; i++) {
|
||||||
|
a += v;
|
||||||
|
if (!(a & m) || !(~a & m))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == MAX_N)
|
||||||
|
i = 1;
|
||||||
|
|
||||||
|
freq_hz = (uint32_t)(freq * i + 0.5);
|
||||||
|
divider = i;
|
||||||
|
|
||||||
|
return hackrf_set_fracrate_manual(device, freq_hz, divider);
|
||||||
|
}
|
||||||
|
|
||||||
int ADDCALL hackrf_set_amp_enable(hackrf_device* device, const uint8_t value)
|
int ADDCALL hackrf_set_amp_enable(hackrf_device* device, const uint8_t value)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
@ -129,7 +129,8 @@ extern ADDAPI int ADDCALL hackrf_board_id_read(hackrf_device* device, uint8_t* v
|
|||||||
extern ADDAPI int ADDCALL hackrf_version_string_read(hackrf_device* device, char* version, uint8_t length);
|
extern ADDAPI int ADDCALL hackrf_version_string_read(hackrf_device* device, char* version, uint8_t length);
|
||||||
|
|
||||||
extern ADDAPI int ADDCALL hackrf_set_freq(hackrf_device* device, const uint64_t freq_hz);
|
extern ADDAPI int ADDCALL hackrf_set_freq(hackrf_device* device, const uint64_t freq_hz);
|
||||||
extern ADDAPI int ADDCALL hackrf_set_fracrate(hackrf_device* device, const float freq_mhz);
|
extern ADDAPI int ADDCALL hackrf_set_fracrate_manual(hackrf_device* device, const uint32_t freq_hz, const uint32_t divider);
|
||||||
|
extern ADDAPI int ADDCALL hackrf_set_fracrate(hackrf_device* device, const double freq_hz);
|
||||||
|
|
||||||
/* external amp, bool on/off */
|
/* external amp, bool on/off */
|
||||||
extern ADDAPI int ADDCALL hackrf_set_amp_enable(hackrf_device* device, const uint8_t value);
|
extern ADDAPI int ADDCALL hackrf_set_amp_enable(hackrf_device* device, const uint8_t value);
|
||||||
|
Reference in New Issue
Block a user