From 8063bd82079e5e0a11173deb2a50873f70901461 Mon Sep 17 00:00:00 2001 From: Hoernchen Date: Sat, 15 Jun 2013 12:00:25 +0200 Subject: [PATCH] firmware: if precision --- firmware/common/rffc5071.c | 15 ++++++++------- firmware/common/rffc5071.h | 2 +- firmware/hackrf_usb/hackrf_usb.c | 18 +++++++++--------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/firmware/common/rffc5071.c b/firmware/common/rffc5071.c index 52fde498..483d5180 100644 --- a/firmware/common/rffc5071.c +++ b/firmware/common/rffc5071.c @@ -448,12 +448,12 @@ void rffc5071_enable(void) { #define REF_FREQ 50 /* configure frequency synthesizer in integer mode (lo in MHz) */ -uint16_t rffc5071_config_synth_int(uint16_t lo) { +uint32_t rffc5071_config_synth_int(uint16_t lo) { uint8_t lodiv; uint16_t fvco; uint8_t fbkdiv; uint16_t n; - uint16_t tune_freq; + uint32_t tune_freq_hz; uint16_t p1nmsb; uint8_t p1nlsb; @@ -488,8 +488,9 @@ uint16_t rffc5071_config_synth_int(uint16_t lo) { p1nmsb = (tmp_n >> 13ULL) & 0xffff; p1nlsb = (tmp_n >> 5ULL) & 0xff; - tune_freq = REF_FREQ*tmp_n*fbkdiv/lodiv / (1 << 29); - LOG("# lo=%d n_lo=%d lodiv=%d fvco=%d fbkdiv=%d n=%d tune_freq=%d\n", + //~ tune_freq = REF_FREQ*tmp_n*fbkdiv/lodiv / (1 << 29); + tune_freq_hz = (uint32_t)(REF_FREQ*tmp_n*fbkdiv/lodiv * 1000*1000 / (1 << 29ULL)); + LOG("# lo=%d n_lo=%d lodiv=%d fvco=%d fbkdiv=%d n=%d tune_freq_hz=%d\n", lo, n_lo, lodiv, fvco, fbkdiv, n, tune_freq); /* Path 1 */ @@ -508,15 +509,15 @@ uint16_t rffc5071_config_synth_int(uint16_t lo) { rffc5071_regs_commit(); - return tune_freq; + return tune_freq_hz; } /* !!!!!!!!!!! hz is currently ignored !!!!!!!!!!! * * Tuning is rounded down to the nearest 25MHz or 50MHz depending on * frequency requsted. Actual tuned value in MHz is returned. */ -uint16_t rffc5071_set_frequency(uint16_t mhz, uint32_t hz) { - uint16_t tune_freq; +uint32_t rffc5071_set_frequency(uint16_t mhz, uint32_t hz) { + uint32_t tune_freq; // Fractional tuning unimplemented, 'hz' ignored hz=hz; diff --git a/firmware/common/rffc5071.h b/firmware/common/rffc5071.h index f55bf9a7..8b5c5675 100644 --- a/firmware/common/rffc5071.h +++ b/firmware/common/rffc5071.h @@ -71,7 +71,7 @@ extern void rffc5071_regs_commit(void); * tune frequency (MHz) is returned. Expect requested freq to be * rounded down to the nearest multiple of 25MHz or 50MHz, depending * internal calculations. */ -extern uint16_t rffc5071_set_frequency(uint16_t mhz, uint32_t hz); +extern uint32_t rffc5071_set_frequency(uint16_t mhz, uint32_t hz); /* Set up rx only, tx only, or full duplex. Chip should be disabled * before _tx, _rx, or _rxtx are called. */ diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 35173a7e..d59b9599 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -109,7 +109,7 @@ bool set_freq(uint32_t freq_mhz, uint32_t freq_hz) bool success; uint32_t RFFC5071_freq_mhz; uint32_t MAX2837_freq_hz; - uint32_t real_RFFC5071_freq_mhz; + uint32_t real_RFFC5071_freq_hz; uint32_t tmp_hz; success = true; @@ -122,13 +122,13 @@ bool set_freq(uint32_t freq_mhz, uint32_t freq_hz) RFFC5071_freq_mhz = MAX2837_FREQ_NOMINAL_MHZ - freq_mhz; /* Set Freq and read real freq */ - real_RFFC5071_freq_mhz = rffc5071_set_frequency(RFFC5071_freq_mhz, 0); - if(real_RFFC5071_freq_mhz < RFFC5071_freq_mhz) + real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz, 0); + if(real_RFFC5071_freq_hz < RFFC5071_freq_mhz * FREQ_ONE_MHZ) { - tmp_hz = -((RFFC5071_freq_mhz - real_RFFC5071_freq_mhz) * FREQ_ONE_MHZ); + tmp_hz = -(RFFC5071_freq_mhz * FREQ_ONE_MHZ - real_RFFC5071_freq_hz); }else { - tmp_hz = ((real_RFFC5071_freq_mhz - RFFC5071_freq_mhz) * FREQ_ONE_MHZ); + tmp_hz = (real_RFFC5071_freq_hz - RFFC5071_freq_mhz * FREQ_ONE_MHZ); } MAX2837_freq_hz = MAX2837_FREQ_NOMINAL_HZ + tmp_hz + freq_hz; max2837_set_frequency(MAX2837_freq_hz); @@ -148,13 +148,13 @@ bool set_freq(uint32_t freq_mhz, uint32_t freq_hz) RFFC5071_freq_mhz = freq_mhz - MAX2837_FREQ_NOMINAL_MHZ; /* Set Freq and read real freq */ - real_RFFC5071_freq_mhz = rffc5071_set_frequency(RFFC5071_freq_mhz, 0); - if(real_RFFC5071_freq_mhz < RFFC5071_freq_mhz) + real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz, 0); + if(real_RFFC5071_freq_hz < RFFC5071_freq_mhz * FREQ_ONE_MHZ) { - tmp_hz = ((RFFC5071_freq_mhz - real_RFFC5071_freq_mhz) * FREQ_ONE_MHZ); + tmp_hz = (RFFC5071_freq_mhz * FREQ_ONE_MHZ - real_RFFC5071_freq_hz); }else { - tmp_hz = -((real_RFFC5071_freq_mhz - RFFC5071_freq_mhz) * FREQ_ONE_MHZ); + tmp_hz = -(real_RFFC5071_freq_hz - RFFC5071_freq_mhz * FREQ_ONE_MHZ); } MAX2837_freq_hz = MAX2837_FREQ_NOMINAL_HZ + tmp_hz + freq_hz; max2837_set_frequency(MAX2837_freq_hz);