From 81c55b53777e14a9ba268daec695f03260a421dd Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Sun, 10 Nov 2024 11:57:53 +0100 Subject: [PATCH] MD-3x0: using STM32 ADC driver --- meson.build | 3 +-- platform/drivers/baseband/radio_MD3x0.cpp | 4 ++-- platform/targets/MD-3x0/hwconfig.c | 4 ++++ platform/targets/MD-3x0/hwconfig.h | 9 ++++++++ platform/targets/MD-3x0/platform.c | 27 ++++++++++++----------- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index b8256936..66b3bdd0 100644 --- a/meson.build +++ b/meson.build @@ -156,8 +156,7 @@ openrtx_def += {'GIT_VERSION': git_version} ## TYT MDx family ## -mdx_src = ['platform/drivers/ADC/ADC1_MDx.c', - 'platform/drivers/GPS/GPS_MDx.cpp', +mdx_src = ['platform/drivers/GPS/GPS_MDx.cpp', 'platform/drivers/NVM/W25Qx.c', 'platform/drivers/NVM/nvmem_settings_MDx.c', 'platform/drivers/NVM/nvmem_MDx.c', diff --git a/platform/drivers/baseband/radio_MD3x0.cpp b/platform/drivers/baseband/radio_MD3x0.cpp index c9b956a8..a55b55cc 100644 --- a/platform/drivers/baseband/radio_MD3x0.cpp +++ b/platform/drivers/baseband/radio_MD3x0.cpp @@ -24,8 +24,8 @@ #include #include #include +#include #include -#include #include #include #include "HR_C5000.h" @@ -383,7 +383,7 @@ rssi_t radio_getRssi() if(rxFreq < 401035000) offset_index = 0; if(rxFreq > 479995000) offset_index = 8; - float rssi_mv = ((float) adc1_getMeasurement(ADC_RSSI_CH)); + float rssi_mv = ((float) adc_getVoltage(&adc1, ADC_RSSI_CH)) / 1000.0f; float rssi_dbm = (rssi_mv - rssi_offset[offset_index]) / rssi_gain; return static_cast< rssi_t >(rssi_dbm); } diff --git a/platform/targets/MD-3x0/hwconfig.c b/platform/targets/MD-3x0/hwconfig.c index 6e8c8189..67866f66 100644 --- a/platform/targets/MD-3x0/hwconfig.c +++ b/platform/targets/MD-3x0/hwconfig.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -43,9 +44,12 @@ const struct spiConfig spiC5000Cfg = .flags = SPI_FLAG_CPHA }; +static pthread_mutex_t adc1Mutex; + SPI_STM32_DEVICE_DEFINE(nvm_spi, SPI1, NULL) SPI_BITBANG_DEVICE_DEFINE(pll_spi, spiPllCfg, NULL) SPI_BITBANG_DEVICE_DEFINE(c5000_spi, spiC5000Cfg, NULL) +ADC_STM32_DEVICE_DEFINE(adc1, ADC1, &adc1Mutex, 3300000) const struct sky73210 pll = { diff --git a/platform/targets/MD-3x0/hwconfig.h b/platform/targets/MD-3x0/hwconfig.h index 13f5f809..e62f3a85 100644 --- a/platform/targets/MD-3x0/hwconfig.h +++ b/platform/targets/MD-3x0/hwconfig.h @@ -27,10 +27,19 @@ extern "C" { #endif +enum adcChannel +{ + ADC_VOL_CH = 0, + ADC_VBAT_CH = 1, + ADC_VOX_CH = 3, + ADC_RSSI_CH = 8 +}; + extern const struct spiDevice nvm_spi; extern const struct spiCustomDevice pll_spi; extern const struct spiCustomDevice c5000_spi; extern const struct sky73210 pll; +extern const struct Adc adc1; /* Device has a working real time clock */ #define CONFIG_RTC diff --git a/platform/targets/MD-3x0/platform.c b/platform/targets/MD-3x0/platform.c index f5396225..409a5e31 100644 --- a/platform/targets/MD-3x0/platform.c +++ b/platform/targets/MD-3x0/platform.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -44,17 +44,18 @@ void platform_init() gpio_setMode(PTT_SW, INPUT_PULL_UP); gpio_setMode(PTT_EXT, INPUT_PULL_UP); + gpio_setMode(AIN_VBAT, ANALOG); + gpio_setMode(AIN_VOLUME, ANALOG); + gpio_setMode(AIN_MIC, ANALOG); + gpio_setMode(AIN_RSSI, ANALOG); + #ifndef RUNNING_TESTSUITE gpio_setMode(PWR_SW, OUTPUT); gpio_setPin(PWR_SW); #endif - /* - * Initialise ADC1, for vbat, RSSI, ... - * Configuration of corresponding GPIOs in analog input mode is done inside - * the driver. - */ - adc1_init(); + /* Initialise ADC1, for vbat, RSSI, ... */ + adcStm32_init(&adc1); memset(&hwInfo, 0x00, sizeof(hwInfo)); @@ -72,7 +73,7 @@ void platform_terminate() gpio_clearPin(RED_LED); /* Shut down all the modules */ - adc1_terminate(); + adcStm32_terminate(&adc1); nvm_terminate(); toneGen_terminate(); audio_terminate(); @@ -85,16 +86,16 @@ uint16_t platform_getVbat() { /* * Battery voltage is measured through an 1:3 voltage divider and - * adc1_getMeasurement returns a value in mV. Thus, to have effective - * battery voltage, multiply by three. + * adc1_getMeasurement returns a value in uV. */ - return adc1_getMeasurement(ADC_VBAT_CH) * 3; + uint32_t vbat = adc_getVoltage(&adc1, ADC_VBAT_CH) * 3; + return vbat / 1000; } uint8_t platform_getMicLevel() { /* Value from ADC is 12 bit wide: shift right by four to get 0 - 255 */ - return (adc1_getRawSample(ADC_VOX_CH) >> 4); + return adc_getRawSample(&adc1, ADC_VOX_CH) >> 4; } uint8_t platform_getVolumeLevel() @@ -105,7 +106,7 @@ uint8_t platform_getVolumeLevel() * lines with a breakpoint around 270mV. * Output value has range 0 - 255 with breakpoint at 150. */ - uint16_t value = adc1_getMeasurement(ADC_VOL_CH); + uint32_t value = adc_getVoltage(&adc1, ADC_VOL_CH) / 1000; uint32_t output; if(value <= 270)