diff --git a/meson.build b/meson.build
index b1430809..841d6835 100644
--- a/meson.build
+++ b/meson.build
@@ -89,6 +89,7 @@ def = def + {'GIT_VERSION': git_version}
mdx_src = ['platform/drivers/ADC/ADC1_MDx.c',
'platform/drivers/GPS/GPS_MDx.cpp',
'platform/drivers/NVM/W25Qx.c',
+ 'platform/drivers/audio/audio_MDx.c',
'platform/drivers/backlight/backlight_MDx.c',
'platform/drivers/tones/toneGenerator_MDx.cpp']
@@ -107,7 +108,8 @@ gdx_src = ['platform/drivers/NVM/W25Qx.c',
'platform/drivers/baseband/HR_C6000.c',
'platform/drivers/baseband/interfaces_GDx.c',
'platform/drivers/display/UC1701_GDx.c',
- 'platform/drivers/keyboard/keyboard_GDx.c',]
+ 'platform/drivers/keyboard/keyboard_GDx.c',
+ 'platform/drivers/audio/audio_GDx.c']
##
## --------------------- MCU-dependent source files ----------------------------
diff --git a/openrtx/include/interfaces/audio.h b/openrtx/include/interfaces/audio.h
new file mode 100644
index 00000000..868d886f
--- /dev/null
+++ b/openrtx/include/interfaces/audio.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * Copyright (C) 2021 by Federico Amedeo Izzo IU2NUO, *
+ * Niccolò Izzo IU2KIN *
+ * Frederik Saraci IU2NRO *
+ * Silvano Seva IU2KWO *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, see *
+ ***************************************************************************/
+
+#ifndef AUDIO_H
+#define AUDIO_H
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * This file provides a common interface for the platform-dependent low-level
+ * audio driver, in charge of managing microphone and audio amplifier.
+ */
+
+/**
+ * Initialise low-level audio management module.
+ */
+void audio_init();
+
+/**
+ * Shut down low-level audio management module.
+ */
+void audio_terminate();
+
+/**
+ * Enable microphone.
+ */
+void audio_enableMic();
+
+/**
+ * Disable microphone.
+ */
+void audio_disableMic();
+
+/**
+ * Enable audio PA.
+ */
+void audio_enableAmp();
+
+/**
+ * Disable audio PA.
+ */
+void audio_disableAmp();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDIO_H */
diff --git a/openrtx/src/rtx.c b/openrtx/src/rtx.c
index 2102309b..c36329ca 100644
--- a/openrtx/src/rtx.c
+++ b/openrtx/src/rtx.c
@@ -21,15 +21,13 @@
#include
#include
#include
+#include
#include
#include
#ifdef PLATFORM_MDUV3x0
#include "../../platform/drivers/baseband/HR_C6000.h"
#endif
-#include
-#include
-
pthread_mutex_t *cfgMutex; /* Mutex for incoming config messages */
const rtxStatus_t *newCnf; /* Pointer for incoming config messages */
@@ -40,76 +38,6 @@ bool enterRx; /* Flag for RX mode activation */
float rssi; /* Current RSSI in dBm */
-/*
- * These functions below provide a basic API for audio path management. They
- * will be removed once the audio driver is set up.
- */
-
-void _afCtrlInit()
-{
- #if defined(PLATFORM_MD3x0) || defined(PLATFORM_MDUV3x0)
- gpio_setMode(SPK_MUTE, OUTPUT);
- gpio_setMode(AUDIO_AMP_EN, OUTPUT);
- gpio_setMode(MIC_PWR, OUTPUT);
- #ifdef PLATFORM_MD3x0
- gpio_setMode(FM_MUTE, OUTPUT);
- #endif
- #elif defined(PLATFORM_GD77) || defined(PLATFORM_DM1801)
- gpio_setMode(AUDIO_AMP_EN, OUTPUT);
- #endif
-}
-
-void _afCtrlSpeaker(bool enable)
-{
- if(enable)
- {
- #if defined(PLATFORM_MD3x0) || defined(PLATFORM_MDUV3x0)
- gpio_setPin(AUDIO_AMP_EN);
- delayMs(10);
- gpio_clearPin(SPK_MUTE);
- #ifdef PLATFORM_MD3x0
- gpio_setPin(FM_MUTE);
- #endif
- #elif defined(PLATFORM_GD77) || defined(PLATFORM_DM1801)
- gpio_setPin(AUDIO_AMP_EN);
- #endif
- }
- else
- {
- #if defined(PLATFORM_MD3x0) || defined(PLATFORM_MDUV3x0)
- gpio_setPin(SPK_MUTE);
- gpio_clearPin(AUDIO_AMP_EN);
- #ifdef PLATFORM_MD3x0
- gpio_clearPin(FM_MUTE);
- #endif
- #elif defined(PLATFORM_GD77) || defined(PLATFORM_DM1801)
- gpio_clearPin(AUDIO_AMP_EN);
- #endif
- }
-}
-
-void _afCtrlMic(bool enable)
-{
- if(enable)
- {
- #if defined(PLATFORM_MD3x0) || defined(PLATFORM_MDUV3x0)
- gpio_setPin(MIC_PWR);
- #endif
- }
- else
- {
- #if defined(PLATFORM_MD3x0) || defined(PLATFORM_MDUV3x0)
- gpio_clearPin(MIC_PWR);
- #endif
- }
-}
-
-void _afCtrlTerminate()
-{
- _afCtrlMic(false);
- _afCtrlSpeaker(false);
-}
-
/*
* Unfortunately on MD-UV3x0 radios the volume knob does not regulate
* the amplitude of the analog signal towards the audio amplifier but it
@@ -120,17 +48,17 @@ void _afCtrlTerminate()
* which has to be mapped in a range between 1 and 31.
*/
#ifdef PLATFORM_MDUV3x0
-void _afSetVolume()
+void _setVolume()
{
float level = (platform_getVolumeLevel() / 1560.0f) * 30.0f;
uint8_t volume = ((uint8_t) (level + 0.5f));
// Mute volume when knob is set below 10%
if(volume < 1)
- _afCtrlSpeaker(false);
+ audio_disableAmp();
else
{
- _afCtrlSpeaker(true);
+ audio_enableAmp();
/* Update HR_C6000 gain only if volume changed */
static uint8_t old_volume = 0;
if(volume != old_volume)
@@ -177,13 +105,10 @@ void rtx_init(pthread_mutex_t *m)
* Initial value for RSSI filter
*/
rssi = radio_getRssi(rtxStatus.rxFrequency);
-
- _afCtrlInit();
}
void rtx_terminate()
{
- _afCtrlTerminate();
radio_terminate();
}
@@ -280,20 +205,21 @@ void rtx_taskFunc()
if((sqlOpen == false) && (rssi > (squelch + 0.1f)))
{
- _afCtrlSpeaker(true);
+ audio_enableAmp();
sqlOpen = true;
}
if((sqlOpen == true) && (rssi < (squelch - 0.1f)))
{
- _afCtrlSpeaker(false);
+ audio_disableAmp();
sqlOpen = false;
}
+
#ifdef PLATFORM_MDUV3x0
if(sqlOpen == true)
{
// Set output volume by changing the HR_C6000 DAC gain
- _afSetVolume();
+ _setVolume();
}
#endif
}
@@ -313,10 +239,10 @@ void rtx_taskFunc()
/* TX logic */
if(platform_getPttStatus() && (rtxStatus.opStatus != TX))
{
- _afCtrlSpeaker(false);
+ audio_disableAmp();
radio_disableRtx();
- _afCtrlMic(true);
+ audio_enableMic();
radio_setVcoFrequency(rtxStatus.txFrequency, true);
radio_enableTx(rtxStatus.txPower, rtxStatus.txToneEn);
@@ -325,7 +251,7 @@ void rtx_taskFunc()
if(!platform_getPttStatus() && (rtxStatus.opStatus == TX))
{
- _afCtrlMic(false);
+ audio_disableMic();
radio_disableRtx();
rtxStatus.opStatus = OFF;
diff --git a/platform/drivers/audio/audio_GDx.c b/platform/drivers/audio/audio_GDx.c
new file mode 100644
index 00000000..47c20686
--- /dev/null
+++ b/platform/drivers/audio/audio_GDx.c
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2021 by Federico Amedeo Izzo IU2NUO, *
+ * Niccolò Izzo IU2KIN *
+ * Frederik Saraci IU2NRO *
+ * Silvano Seva IU2KWO *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, see *
+ ***************************************************************************/
+
+#include
+#include
+#include
+
+void audio_init()
+{
+ gpio_setMode(AUDIO_AMP_EN, OUTPUT);
+ gpio_clearPin(AUDIO_AMP_EN); /* Audio PA off */
+}
+
+void audio_terminate()
+{
+ gpio_clearPin(AUDIO_AMP_EN); /* Audio PA off */
+}
+
+void audio_enableMic()
+{
+ /* No mic control on this family */
+}
+
+void audio_disableMic()
+{
+ /* No mic control on this family */
+}
+
+void audio_enableAmp()
+{
+ gpio_setPin(AUDIO_AMP_EN);
+}
+
+void audio_disableAmp()
+{
+ gpio_clearPin(AUDIO_AMP_EN);
+}
diff --git a/platform/drivers/audio/audio_MDx.c b/platform/drivers/audio/audio_MDx.c
new file mode 100644
index 00000000..e43760c3
--- /dev/null
+++ b/platform/drivers/audio/audio_MDx.c
@@ -0,0 +1,65 @@
+/***************************************************************************
+ * Copyright (C) 2021 by Federico Amedeo Izzo IU2NUO, *
+ * Niccolò Izzo IU2KIN *
+ * Frederik Saraci IU2NRO *
+ * Silvano Seva IU2KWO *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, see *
+ ***************************************************************************/
+
+#include
+#include
+#include
+#include
+
+void audio_init()
+{
+ gpio_setMode(SPK_MUTE, OUTPUT);
+ gpio_setMode(AUDIO_AMP_EN, OUTPUT);
+ gpio_setMode(MIC_PWR, OUTPUT);
+
+ gpio_setPin(SPK_MUTE); /* Speaker muted */
+ gpio_clearPin(AUDIO_AMP_EN); /* Audio PA off */
+ gpio_clearPin(MIC_PWR); /* Mic preamp. off */
+}
+
+void audio_terminate()
+{
+ gpio_setPin(SPK_MUTE); /* Speaker muted */
+ gpio_clearPin(AUDIO_AMP_EN); /* Audio PA off */
+ gpio_clearPin(MIC_PWR); /* Mic preamp. off */
+}
+
+void audio_enableMic()
+{
+ gpio_setPin(MIC_PWR);
+}
+
+void audio_disableMic()
+{
+ gpio_clearPin(MIC_PWR);
+}
+
+void audio_enableAmp()
+{
+ gpio_setPin(AUDIO_AMP_EN);
+ sleepFor(0, 10); /* 10ms anti-pop delay */
+ gpio_clearPin(SPK_MUTE);
+}
+
+void audio_disableAmp()
+{
+ gpio_setPin(SPK_MUTE);
+ gpio_clearPin(AUDIO_AMP_EN);
+}
diff --git a/platform/drivers/baseband/radio_MD3x0.c b/platform/drivers/baseband/radio_MD3x0.c
index 37d6fee4..0127fb37 100644
--- a/platform/drivers/baseband/radio_MD3x0.c
+++ b/platform/drivers/baseband/radio_MD3x0.c
@@ -71,6 +71,9 @@ void radio_init()
gpio_setMode(TX_STG_EN, OUTPUT);
gpio_setMode(RX_STG_EN, OUTPUT);
+ gpio_setMode(FM_MUTE, OUTPUT);
+ gpio_clearPin(FM_MUTE);
+
gpio_clearPin(PLL_PWR); /* PLL off */
gpio_setPin(VCOVCC_SW); /* VCOVCC high enables RX VCO, TX VCO if low */
gpio_setPin(WN_SW); /* 25kHz bandwidth */
@@ -205,6 +208,11 @@ void radio_enableRx()
DAC->DHR12L1 = vtune_rx * 0xFF;
gpio_setPin(RX_STG_EN);
+
+ if(currOpMode == FM)
+ {
+ gpio_setPin(FM_MUTE);
+ }
}
void radio_enableTx(const float txPower, const bool enableCss)
@@ -244,6 +252,7 @@ void radio_disableRtx()
gpio_clearPin(TX_STG_EN);
gpio_clearPin(RX_STG_EN);
+ gpio_clearPin(FM_MUTE);
}
void radio_updateCalibrationParams(const rtxStatus_t* rtxCfg)
diff --git a/platform/targets/DM-1801/platform.c b/platform/targets/DM-1801/platform.c
index ff5cae30..665f2a11 100644
--- a/platform/targets/DM-1801/platform.c
+++ b/platform/targets/DM-1801/platform.c
@@ -20,6 +20,7 @@
#include
#include
+#include
#include
#include
#include
@@ -45,15 +46,9 @@ void platform_init()
gpio_setMode(PWR_SW, OUTPUT);
- /*
- * Initialise backlight driver
- */
- backlight_init();
-
- /*
- * Initialise ADC
- */
- adc0_init();
+ backlight_init(); /* Initialise backlight driver */
+ audio_init(); /* Initialise audio management module */
+ adc0_init(); /* Initialise ADC */
pthread_mutex_init(&adc_mutex, NULL);
/*
@@ -97,6 +92,7 @@ void platform_terminate()
pthread_mutex_destroy(&adc_mutex);
i2c0_terminate();
+ audio_terminate();
/* Finally, remove power supply */
gpio_clearPin(PWR_SW);
diff --git a/platform/targets/GD-77/platform.c b/platform/targets/GD-77/platform.c
index a1feeadc..8ffe9567 100644
--- a/platform/targets/GD-77/platform.c
+++ b/platform/targets/GD-77/platform.c
@@ -20,6 +20,7 @@
#include
#include
+#include
#include
#include
#include
@@ -44,15 +45,9 @@ void platform_init()
gpio_setMode(PWR_SW, OUTPUT);
- /*
- * Initialise backlight driver
- */
- backlight_init();
-
- /*
- * Initialise ADC
- */
- adc0_init();
+ backlight_init(); /* Initialise backlight driver */
+ audio_init(); /* Initialise audio management module */
+ adc0_init(); /* Initialise ADC */
pthread_mutex_init(&adc_mutex, NULL);
/*
@@ -96,6 +91,7 @@ void platform_terminate()
pthread_mutex_destroy(&adc_mutex);
i2c0_terminate();
+ audio_terminate();
/* Finally, remove power supply */
gpio_clearPin(PWR_SW);
diff --git a/platform/targets/MD-3x0/platform.c b/platform/targets/MD-3x0/platform.c
index 72519314..bf198d5f 100644
--- a/platform/targets/MD-3x0/platform.c
+++ b/platform/targets/MD-3x0/platform.c
@@ -27,6 +27,7 @@
#include
#include
#include
+#include
md3x0Calib_t calibration;
hwInfo_t hwInfo;
@@ -64,6 +65,7 @@ void platform_init()
toneGen_init(); /* Initialise tone generator */
rtc_init(); /* Initialise RTC */
backlight_init(); /* Initialise backlight driver */
+ audio_init(); /* Initialise audio management module */
}
void platform_terminate()
@@ -80,6 +82,7 @@ void platform_terminate()
nvm_terminate();
toneGen_terminate();
rtc_terminate();
+ audio_terminate();
/* Finally, remove power supply */
gpio_clearPin(PWR_SW);
diff --git a/platform/targets/MD-9600/platform.c b/platform/targets/MD-9600/platform.c
index 2a9624ec..322b02f6 100644
--- a/platform/targets/MD-9600/platform.c
+++ b/platform/targets/MD-9600/platform.c
@@ -28,6 +28,7 @@
#include
#include
#include
+#include
#include
#include
@@ -77,6 +78,7 @@ void platform_init()
rtc_init(); /* Initialise RTC */
backlight_init(); /* Initialise backlight driver */
chSelector_init(); /* Initialise channel selector handler */
+ audio_init(); /* Initialise audio management module */
}
void platform_terminate()
@@ -89,6 +91,7 @@ void platform_terminate()
toneGen_terminate();
rtc_terminate();
chSelector_terminate();
+ audio_terminate();
/* Finally, remove power supply */
gpio_clearPin(PWR_SW);
diff --git a/platform/targets/MD-UV3x0/platform.c b/platform/targets/MD-UV3x0/platform.c
index 42d43995..67c6ca7d 100644
--- a/platform/targets/MD-UV3x0/platform.c
+++ b/platform/targets/MD-UV3x0/platform.c
@@ -25,6 +25,7 @@
#include
#include
#include
+#include
#include
#ifdef ENABLE_BKLIGHT_DIMMING
@@ -58,6 +59,7 @@ void platform_init()
nvm_loadHwInfo(&hwInfo); /* Load hardware information data */
rtc_init(); /* Initialise RTC */
chSelector_init(); /* Initialise channel selector handler */
+ audio_init(); /* Initialise audio management module */
#ifdef ENABLE_BKLIGHT_DIMMING
backlight_init(); /* Initialise backlight driver */
@@ -85,6 +87,7 @@ void platform_terminate()
nvm_terminate();
rtc_terminate();
chSelector_terminate();
+ audio_terminate();
/* Finally, remove power supply */
gpio_clearPin(PWR_SW);