From 91f7c2f8e0152833a1d586a857c3fad2cdc35f88 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 8 Dec 2021 22:22:11 -0500 Subject: [PATCH] fix file formatting; support modifying ADF7021 gain from the host; --- ADF7021.cpp | 26 ++++++++++++++++---------- ADF7021.h | 2 ++ Defines.h | 24 +++++------------------- IO.cpp | 18 ++++++++---------- IO.h | 22 +++++++++++++++++----- SerialPort.cpp | 7 +++++-- dmr/DMRDMORX.cpp | 14 +++++++------- p25/P25TX.cpp | 26 +++++++++++++------------- 8 files changed, 73 insertions(+), 66 deletions(-) diff --git a/ADF7021.cpp b/ADF7021.cpp index 231ed17..6c40125 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -428,15 +428,21 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset) /* ** AGC (Register 9) */ -#if defined(AD7021_GAIN_AUTO) - AD7021_CONTROL = 0x000231E9; // AGC ON, normal operation -#elif defined(AD7021_GAIN_AUTO_LIN) - AD7021_CONTROL = 0x100231E9; // AGC ON, LNA high linearity -#elif defined(AD7021_GAIN_LOW) - AD7021_CONTROL = 0x120631E9; // AGC OFF, low gain, LNA high linearity -#elif defined(AD7021_GAIN_HIGH) - AD7021_CONTROL = 0x00A631E9; // AGC OFF, high gain -#endif + switch (m_gainMode) { + case ADF_GAIN_AUTO_LIN: + AD7021_CONTROL = 0x100231E9; // AGC ON, LNA high linearity + break; + case ADF_GAIN_LOW: + AD7021_CONTROL = 0x120631E9; // AGC OFF, low gain, LNA high linearity + break; + case ADF_GAIN_HIGH: + AD7021_CONTROL = 0x00A631E9; // AGC OFF, high gain + break; + case ADF_GAIN_AUTO: + default: + AD7021_CONTROL = 0x000231E9; // AGC ON, normal operation + break; + } AD7021_1_IOCTL(); /* @@ -1015,7 +1021,7 @@ void IO::configureTxRx(DVM_STATE modemState) ADF7021_REG2 |= (uint32_t)0b110001 << 7; // PA ADF7021_REG2 |= (uint32_t)0b10 << 28; // invert data (and RC alpha = 0.5) ADF7021_REG2 |= (uint32_t)(p25Dev / div2) << 19; // deviation -#if defined(ENABLE_P25_WIDE) || defined(ADF7021_DISABLE_RC_4FSK) +#if defined(ADF7021_DISABLE_RC_4FSK) ADF7021_REG2 |= (uint32_t)0b011 << 4; // modulation (4FSK) #else ADF7021_REG2 |= (uint32_t)0b111 << 4; // modulation (RC 4FSK) diff --git a/ADF7021.h b/ADF7021.h index 7be1057..ecac181 100644 --- a/ADF7021.h +++ b/ADF7021.h @@ -46,6 +46,8 @@ #define LOW 0 #define HIGH 1 +#define DEFAULT_FREQUENCY 433075000 + /** Band Tables */ /** 136 - 174 mhz */ #define VHF_MIN 136000000 diff --git a/Defines.h b/Defines.h index bb7fcb5..1122a52 100644 --- a/Defines.h +++ b/Defines.h @@ -98,33 +98,20 @@ typedef unsigned long long ulong64_t; // Allow the P25 protocol #define ENABLE_P25 -// Enable P25 Wide modulation -// #define ENABLE_P25_WIDE - // Enable ADF7021 support #define ENABLE_ADF7021 // Bidirectional Data pin (Enable Standard TX/RX Data Interface of ADF7021) #define BIDIR_DATA_PIN -// Enable full duplex support with dual ADF7021 (valid for homebrew hotspots only) -// #define DUPLEX - // TCXO of the ADF7021 // For 14.7456 MHz: #define ADF7021_14_7456 // For 12.2880 MHz: // #define ADF7021_12_2880 -// Configure receiver gain for ADF7021 -// AGC automatic, default settings -#define AD7021_GAIN_AUTO -// AGC automatic with high LNA linearity -// #define AD7021_GAIN_AUTO_LIN -// AGC OFF, lowest gain -// #define AD7021_GAIN_LOW -// AGC OFF, highest gain -// #define AD7021_GAIN_HIGH +// Enable full duplex support with dual ADF7021 (valid for homebrew hotspots only) +// #define DUPLEX // Disable TX Raised Cosine filter for 4FSK modulation in ADF7021 // #define ADF7021_DISABLE_RC_4FSK @@ -142,14 +129,13 @@ typedef unsigned long long ulong64_t; // Force the internal L (internal VCO inductor) for UHF 380 and T-band #define FORCE_UHF_INTERAL_L -// Enable mode detection -#define ENABLE_SCAN_MODE - // Pass RSSI information to the host // #define SEND_RSSI_DATA // Enable for RPi 3B+, USB mode -// #define LONG_USB_RESET +#if defined(STM32_USB_HOST) +#define LONG_USB_RESET +#endif const uint8_t BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; diff --git a/IO.cpp b/IO.cpp index fd6a338..dff86e3 100644 --- a/IO.cpp +++ b/IO.cpp @@ -34,14 +34,6 @@ #include "ADF7021.h" #include "IO.h" -// --------------------------------------------------------------------------- -// Globals -// --------------------------------------------------------------------------- - -uint32_t m_rxFrequency; -uint32_t m_txFrequency; -uint8_t m_rfPower; - // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- @@ -56,7 +48,11 @@ IO::IO(): m_ledValue(true), m_watchdog(0U), m_int1Counter(0U), - m_int2Counter(0U) + m_int2Counter(0U), + m_rxFrequency(DEFAULT_FREQUENCY), + m_txFrequency(DEFAULT_FREQUENCY), + m_rfPower(0U), + m_gainMode(ADF_GAIN_AUTO) { initInt(); @@ -240,9 +236,11 @@ void IO::setMode(DVM_STATE modemState) /// /// /// -uint8_t IO::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower) +/// +uint8_t IO::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, ADF_GAIN_MODE gainMode) { m_rfPower = rfPower >> 2; + m_gainMode = gainMode; // check frequency ranges if (!( diff --git a/IO.h b/IO.h index c1fd010..1840d7f 100644 --- a/IO.h +++ b/IO.h @@ -56,12 +56,19 @@ #endif // --------------------------------------------------------------------------- -// Global Externs +// Constants // --------------------------------------------------------------------------- -extern uint32_t m_rxFrequency; -extern uint32_t m_txFrequency; -extern uint8_t m_rfPower; +enum ADF_GAIN_MODE { + // AGC automatic, default settings + ADF_GAIN_AUTO = 0U, + // AGC automatic with high LNA linearity + ADF_GAIN_AUTO_LIN = 1U, + // AGC OFF, lowest gain + ADF_GAIN_LOW = 2U, + // AGC OFF, highest gain + ADF_GAIN_HIGH = 3U +}; // --------------------------------------------------------------------------- // Class Declaration @@ -108,7 +115,7 @@ public: /// void setDeviations(uint8_t dmrTXLevel, uint8_t p25TXLevel); /// Sets the RF parameters. - uint8_t setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower); + uint8_t setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, ADF_GAIN_MODE gainMode); /// Sets the RF adjustment parameters. void setRFAdjust(int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj); @@ -183,6 +190,11 @@ private: volatile uint16_t m_int1Counter; volatile uint16_t m_int2Counter; + uint32_t m_rxFrequency; + uint32_t m_txFrequency; + uint8_t m_rfPower; + ADF_GAIN_MODE m_gainMode; + /// Helper to check the frequencies are within band ranges of the ADF7021. void checkBand(uint32_t rxFreq, uint32_t txFreq); #if defined(ZUMSPOT_ADF7021) || defined(LONESTAR_USB) || defined(SKYBRIDGE_HS) diff --git a/SerialPort.cpp b/SerialPort.cpp index 6217a6a..9efc533 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -1134,11 +1134,12 @@ void SerialPort::setMode(DVM_STATE modemState) /// uint8_t SerialPort::setRFParams(const uint8_t* data, uint8_t length) { - if (length < 14U) + if (length < 15U) return RSN_ILLEGAL_LENGTH; uint32_t rxFreq, txFreq; uint8_t rfPower; + ADF_GAIN_MODE gainMode; rxFreq = data[1U] << 0; rxFreq |= data[2U] << 8; @@ -1176,7 +1177,9 @@ uint8_t SerialPort::setRFParams(const uint8_t* data, uint8_t length) if (p25PostBWAdj < -128) return RSN_INVALID_REQUEST; + gainMode = (ADF_GAIN_MODE)data[14U]; + io.setRFAdjust(dmrDiscBWAdj, p25DiscBWAdj, dmrPostBWAdj, p25PostBWAdj); - return io.setRFParams(rxFreq, txFreq, rfPower); + return io.setRFParams(rxFreq, txFreq, rfPower, gainMode); } diff --git a/dmr/DMRDMORX.cpp b/dmr/DMRDMORX.cpp index 0254efb..d9cdc75 100644 --- a/dmr/DMRDMORX.cpp +++ b/dmr/DMRDMORX.cpp @@ -77,12 +77,12 @@ DMRDMORX::DMRDMORX() : /// void DMRDMORX::reset() { - m_syncPtr = 0U; - m_control = CONTROL_NONE; - m_syncCount = 0U; - m_state = DMORXS_NONE; - m_startPtr = 0U; - m_endPtr = NOENDPTR; + m_syncPtr = 0U; + m_control = CONTROL_NONE; + m_syncCount = 0U; + m_state = DMORXS_NONE; + m_startPtr = 0U; + m_endPtr = NOENDPTR; } /// @@ -360,7 +360,7 @@ void DMRDMORX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer) start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - + buffer[i] |= _READ_BIT(m_buffer, start) << 0; start++; if (start >= DMO_BUFFER_LENGTH_BITS) diff --git a/p25/P25TX.cpp b/p25/P25TX.cpp index bf15da1..813a70e 100644 --- a/p25/P25TX.cpp +++ b/p25/P25TX.cpp @@ -124,21 +124,21 @@ void P25TX::process() /// uint8_t P25TX::writeData(const uint8_t* data, uint8_t length) { - if (length < (P25_TDU_FRAME_LENGTH_BYTES + 1U)) - return RSN_ILLEGAL_LENGTH; - - uint16_t space = m_fifo.getSpace(); - DEBUG3("P25TX: writeData(): dataLength/fifoLength", length, space); - if (space < length) { - m_fifo.reset(); - return RSN_RINGBUFF_FULL; - } + if (length < (P25_TDU_FRAME_LENGTH_BYTES + 1U)) + return RSN_ILLEGAL_LENGTH; + + uint16_t space = m_fifo.getSpace(); + DEBUG3("P25TX: writeData(): dataLength/fifoLength", length, space); + if (space < length) { + m_fifo.reset(); + return RSN_RINGBUFF_FULL; + } - m_fifo.put(length - 1U); - for (uint8_t i = 0U; i < (length - 1U); i++) - m_fifo.put(data[i + 1U]); + m_fifo.put(length - 1U); + for (uint8_t i = 0U; i < (length - 1U); i++) + m_fifo.put(data[i + 1U]); - return RSN_OK; + return RSN_OK; } ///