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;
}
///