From 66fb8b1ed4f9d29e3221edadb855f29c5f80b357 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sat, 22 Aug 2026 13:52:04 +0200 Subject: [PATCH] Remove ENABLE_AM_FIX --- App/am_fix.c | 397 ------------------------------------------ App/am_fix.h | 35 ---- App/app/action.c | 6 +- App/app/app.c | 7 - App/app/chFrScanner.c | 4 - App/app/menu.c | 23 --- App/app/spectrum.c | 11 -- App/debugging.h | 1 - App/main.c | 8 - App/misc.c | 4 - App/misc.h | 4 - App/radio.c | 23 +-- App/settings.c | 16 +- App/ui/main.c | 26 --- App/ui/main.h | 1 - App/ui/menu.c | 10 -- App/ui/menu.h | 3 - README.md | 3 +- tools/misc/main.cpp | 328 ---------------------------------- 19 files changed, 7 insertions(+), 903 deletions(-) delete mode 100644 App/am_fix.c delete mode 100644 App/am_fix.h diff --git a/App/am_fix.c b/App/am_fix.c deleted file mode 100644 index 3c4c9e45..00000000 --- a/App/am_fix.c +++ /dev/null @@ -1,397 +0,0 @@ - -/* Copyright 2023 OneOfEleven - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// code to 'try' and reduce the AM demodulator saturation problem -// -// that is until someone works out how to properly configure the BK chip ! - -#include - -#include "am_fix.h" -#include "app/main.h" -#include "board.h" -#include "driver/bk4819.h" -#include "external/printf/printf.h" -#include "frequencies.h" -#include "functions.h" -#include "misc.h" -#include "settings.h" -#ifdef ENABLE_AGC_SHOW_DATA -#include "ui/main.h" -#endif - -#ifdef ENABLE_AM_FIX - -typedef struct -{ - uint16_t reg_val; - int8_t gain_dB; -} __attribute__((packed)) t_gain_table; - -// REG_10 AGC gain table -// -// <15:10> ??? -// -// <9:8> = LNA Gain Short -// 3 = 0dB < original value -// 2 = -19dB // was -11 -// 1 = -24dB // was -16 -// 0 = -28dB // was -19 -// -// <7:5> = LNA Gain -// 7 = 0dB -// 6 = -2dB -// 5 = -4dB < original value -// 4 = -6dB -// 3 = -9dB -// 2 = -14dB -// 1 = -19dB -// 0 = -24dB -// -// <4:3> = MIXER Gain -// 3 = 0dB < original value -// 2 = -3dB -// 1 = -6dB -// 0 = -8dB -// -// <2:0> = PGA Gain -// 7 = 0dB -// 6 = -3dB < original value -// 5 = -6dB -// 4 = -9dB -// 3 = -15dB -// 2 = -21dB -// 1 = -27dB -// 0 = -33dB - -// front end register dB values -// -// these values need to be accurate for the code to properly/reliably switch -// between table entries when adjusting the front end registers. -// -// these 4 tables need a measuring/calibration update -// -//// static const int16_t lna_short_dB[] = { -19, -16, -11, 0}; // was (but wrong) -// static const int16_t lna_short_dB[] = { (-28), (-24), (-19), 0}; // corrected'ish -// static const int16_t lna_dB[] = { (-24), (-19), (-14), ( -9), (-6), (-4), (-2), 0}; -// static const int16_t mixer_dB[] = { ( -8), ( -6), ( -3), 0}; -// static const int16_t pga_dB[] = { (-33), (-27), (-21), (-15), (-9), (-6), (-3), 0}; - -// lookup table is hugely easier than writing code to do the same -// - -#define LOOKUP_TABLE 1 - -#if LOOKUP_TABLE -static const t_gain_table gain_table[] = -{ - {0x03BE, -7}, // 0 .. 3 5 3 6 .. 0dB -4dB 0dB -3dB .. -7dB original - - {0x0000,-93}, // 1 .. 0 0 0 0 .. -28dB -24dB -8dB -33dB .. -93dB - {0x0008,-91}, // 2 .. 0 0 1 0 .. -28dB -24dB -6dB -33dB .. -91dB - {0x0010,-88}, // 3 .. 0 0 2 0 .. -28dB -24dB -3dB -33dB .. -88dB - {0x0001,-87}, // 4 .. 0 0 0 1 .. -28dB -24dB -8dB -27dB .. -87dB - {0x0009,-85}, // 5 .. 0 0 1 1 .. -28dB -24dB -6dB -27dB .. -85dB - {0x0011,-82}, // 6 .. 0 0 2 1 .. -28dB -24dB -3dB -27dB .. -82dB - {0x0002,-81}, // 7 .. 0 0 0 2 .. -28dB -24dB -8dB -21dB .. -81dB - {0x000A,-79}, // 8 .. 0 0 1 2 .. -28dB -24dB -6dB -21dB .. -79dB - {0x0012,-76}, // 9 .. 0 0 2 2 .. -28dB -24dB -3dB -21dB .. -76dB - {0x0003,-75}, // 10 .. 0 0 0 3 .. -28dB -24dB -8dB -15dB .. -75dB - {0x000B,-73}, // 11 .. 0 0 1 3 .. -28dB -24dB -6dB -15dB .. -73dB - {0x0013,-70}, // 12 .. 0 0 2 3 .. -28dB -24dB -3dB -15dB .. -70dB - {0x0004,-69}, // 13 .. 0 0 0 4 .. -28dB -24dB -8dB -9dB .. -69dB - {0x000C,-67}, // 14 .. 0 0 1 4 .. -28dB -24dB -6dB -9dB .. -67dB - {0x000D,-64}, // 15 .. 0 0 1 5 .. -28dB -24dB -6dB -6dB .. -64dB - {0x001C,-61}, // 16 .. 0 0 3 4 .. -28dB -24dB 0dB - 9dB .. -61dB - {0x001D,-58}, // 17 .. 0 0 3 5 .. -28dB -24dB 0dB -6dB .. -58dB - {0x001E,-55}, // 18 .. 0 0 3 6 .. -28dB -24dB 0dB -3dB .. -55dB - {0x001F,-52}, // 19 .. 0 0 3 7 .. -28dB -24dB 0dB 0dB .. -52dB - {0x003E,-50}, // 20 .. 0 1 3 6 .. -28dB -19dB 0dB -3dB .. -50dB - {0x003F,-47}, // 21 .. 0 1 3 7 .. -28dB -19dB 0dB 0dB .. -47dB - {0x005E,-45}, // 22 .. 0 2 3 6 .. -28dB -14dB 0dB -3dB .. -45dB - {0x005F,-42}, // 23 .. 0 2 3 7 .. -28dB -14dB 0dB 0dB .. -42dB - {0x007E,-40}, // 24 .. 0 3 3 6 .. -28dB -9dB 0dB -3dB .. -40dB - {0x007F,-37}, // 25 .. 0 3 3 7 .. -28dB -9dB 0dB 0dB .. -37dB - {0x009F,-34}, // 26 .. 0 4 3 7 .. -28dB -6dB 0dB 0dB .. -34dB - {0x00BF,-32}, // 27 .. 0 5 3 7 .. -28dB -4dB 0dB 0dB .. -32dB - {0x00DF,-30}, // 28 .. 0 6 3 7 .. -28dB -2dB 0dB 0dB .. -30dB - {0x00FF,-28}, // 29 .. 0 7 3 7 .. -28dB 0dB 0dB 0dB .. -28dB - {0x01DF,-26}, // 30 .. 1 6 3 7 .. -24dB -2dB 0dB 0dB .. -26dB - {0x01FF,-24}, // 31 .. 1 7 3 7 .. -24dB 0dB 0dB 0dB .. -24dB - {0x02BF,-23}, // 32 .. 2 5 3 7 .. -19dB -4dB 0dB 0dB .. -23dB - {0x02DF,-21}, // 33 .. 2 6 3 7 .. -19dB -2dB 0dB -0dB .. -21dB - {0x02FF,-19}, // 34 .. 2 7 3 7 .. -19dB 0dB 0dB 0dB .. -19dB - {0x035E,-17}, // 35 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB - {0x035F,-14}, // 36 .. 3 2 3 7 .. 0dB -14dB 0dB 0dB .. -14dB - {0x037E,-12}, // 37 .. 3 3 3 6 .. 0dB -9dB 0dB -3dB .. -12dB - {0x037F,-9}, // 38 .. 3 3 3 7 .. 0dB -9dB 0dB 0dB .. -9dB - {0x038F,-6}, // 39 .. 3 4 3 7 .. 0dB - 6dB 0dB 0dB .. -6dB - {0x03BF,-4}, // 40 .. 3 5 3 7 .. 0dB -4dB 0dB 0dB .. -4dB - {0x03DF,-2}, // 41 .. 3 6 3 7 .. 0dB - 2dB 0dB 0dB .. -2dB - {0x03FF,0} // 42 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB -}; - -const uint8_t gain_table_size = ARRAY_SIZE(gain_table); -#else - -t_gain_table gain_table[100] = {{0x03BE, -7}}; //original -uint8_t gain_table_size = 0; - -void CreateTable() -{ -typedef union { - struct { - uint8_t pgaIdx:3; - uint8_t mixerIdx:2; - uint8_t lnaIdx:3; - uint8_t lnaSIdx:2; - }; - uint16_t __raw; -} GainData; - - static const int8_t lna_short_dB[] = {-28, -24, -19, 0}; // corrected'ish - static const int8_t lna_dB[] = {-24, -19, -14, -9, -6, -4, -2, 0}; - static const int8_t mixer_dB[] = { -8, -6, -3, 0}; - static const int8_t pga_dB[] = {-33, -27, -21, -15, -9, -6, -3, 0}; - - unsigned i; - for (uint8_t lnaSIdx = 0; lnaSIdx < ARRAY_SIZE(lna_short_dB); lnaSIdx++) { - for (uint8_t lnaIdx = 0; lnaIdx < ARRAY_SIZE(lna_dB); lnaIdx++) { - for (uint8_t mixerIdx = 0; mixerIdx < ARRAY_SIZE(mixer_dB); mixerIdx++) { - for (uint8_t pgaIdx = 0; pgaIdx < ARRAY_SIZE(pga_dB); pgaIdx++) { - int16_t db = lna_short_dB[lnaSIdx] + lna_dB[lnaIdx] + mixer_dB[mixerIdx] + pga_dB[pgaIdx]; - GainData gainData = {{ - pgaIdx, - mixerIdx, - lnaIdx, - lnaSIdx, - }}; - - for (i = 1; i < ARRAY_SIZE(gain_table); i++) { - t_gain_table * gain = &gain_table[i]; - if (db == gain->gain_dB) - break; - if (db > gain->gain_dB) - continue; - if (db < gain->gain_dB) { - if(gain->gain_dB) - memmove(gain + 1, gain, 100 - i); - gain->gain_dB = db; - gain->reg_val = gainData.__raw; - break; - } - gain->gain_dB = db; - gain->reg_val = gainData.__raw; - break; - } - } - } - } - } - - gain_table_size = i+1; -} -#endif - - -#ifdef ENABLE_AM_FIX_SHOW_DATA - // display update rate - static const unsigned int display_update_rate = 250 / 10; // max 250ms display update rate - unsigned int counter = 0; -#endif - -unsigned int gain_table_index[2] = {0, 0}; -// used simply to detect a changed gain setting -unsigned int gain_table_index_prev[2] = {0, 0}; -// holds the previous RSSI level .. we do an average of old + new RSSI reading -int16_t prev_rssi[2] = {0, 0}; -// to help reduce gain hunting, peak hold count down tick -unsigned int hold_counter[2] = {0, 0}; -// -89dBm, any higher and the AM demodulator starts to saturate/clip/distort -const int16_t desired_rssi = (-89 + 160) * 2; - -int8_t currentGainDiff; -bool enabled = true; - -void AM_fix_init(void) -{ // called at boot-up - for (int i = 0; i < 2; i++) { - gain_table_index[i] = 0; // re-start with original QS setting - } -#if !LOOKUP_TABLE - CreateTable(); -#endif -} - -void AM_fix_reset(const unsigned vfo) -{ // reset the AM fixer upper - if (vfo > 1) - return; - - #ifdef ENABLE_AM_FIX_SHOW_DATA - counter = 0; - #endif - - prev_rssi[vfo] = 0; - hold_counter[vfo] = 0; - gain_table_index_prev[vfo] = 0; -} - -// adjust the RX gain to try and prevent the AM demodulator from -// saturating/overloading/clipping (distorted AM audio) -// -// we're actually doing the BK4819's job for it here, but as the chip -// won't/don't do it for itself, we're left to bodging it ourself by -// playing with the RF front end gain setting -// -void AM_fix_10ms(const unsigned vfo) -{ - if(!gSetting_AM_fix || !enabled || vfo > 1 ) - return; - - if (gCurrentFunction != FUNCTION_FOREGROUND && !FUNCTION_IsRx()) { -#ifdef ENABLE_AM_FIX_SHOW_DATA - counter = display_update_rate; // queue up a display update as soon as we switch to RX mode -#endif - return; - } - -#ifdef ENABLE_AM_FIX_SHOW_DATA - if (counter > 0) { - if (++counter >= display_update_rate) { // trigger a display update - counter = 0; - gUpdateDisplay = true; - } - } -#endif - - static uint32_t lastFreq[2]; - if(gEeprom.VfoInfo[vfo].pRX->Frequency != lastFreq[vfo]) { - lastFreq[vfo] = gEeprom.VfoInfo[vfo].pRX->Frequency; - AM_fix_reset(vfo); - } - - int16_t rssi; - { // sample the current RSSI level - // average it with the previous rssi (a bit of noise/spike immunity) - const int16_t new_rssi = BK4819_GetRSSI(); - rssi = (prev_rssi[vfo] > 0) ? (prev_rssi[vfo] + new_rssi) / 2 : new_rssi; - prev_rssi[vfo] = new_rssi; - } - -#ifdef ENABLE_AM_FIX_SHOW_DATA - { - static int16_t lastRssi; - - if (lastRssi != rssi) { // rssi changed - lastRssi = rssi; - - if (counter == 0) { - counter = 1; - gUpdateDisplay = true; // trigger a display update - } - } - } -#endif - - // automatically adjust the RF RX gain - - // update the gain hold counter - if (hold_counter[vfo] > 0) - hold_counter[vfo]--; - - // dB difference between actual and desired RSSI level - int16_t diff_dB = (rssi - desired_rssi) / 2; - - if (diff_dB > 0) { // decrease gain - unsigned int index = gain_table_index[vfo]; // current position we're at - - if (diff_dB >= 10) { // jump immediately to a new gain setting - // this greatly speeds up initial gain reduction (but reduces noise/spike immunity) - - const int16_t desired_gain_dB = (int16_t)gain_table[index].gain_dB - diff_dB + 8; // get no closer than 8dB (bit of noise/spike immunity) - - // scan the table to see what index to jump straight too - while (index > 1) - if (gain_table[--index].gain_dB <= desired_gain_dB) - break; - } - else - { // incrementally reduce the gain .. taking it slow improves noise/spike immunity - if (index > 1) - index--; // slow step-by-step gain reduction - } - - index = MAX(1u, index); - - if (gain_table_index[vfo] != index) - { - gain_table_index[vfo] = index; - hold_counter[vfo] = 30; // 300ms hold - } - } - - if (diff_dB >= -6) // 6dB hysterisis (help reduce gain hunting) - hold_counter[vfo] = 30; // 300ms hold - - if (hold_counter[vfo] == 0) - { // hold has been released, we're free to increase gain - const unsigned int index = gain_table_index[vfo] + 1; // move up to next gain index - gain_table_index[vfo] = MIN(index, gain_table_size - 1u); - } - - - { // apply the new settings to the front end registers - const unsigned int index = gain_table_index[vfo]; - - // remember the new table index - gain_table_index_prev[vfo] = index; - currentGainDiff = gain_table[0].gain_dB - gain_table[index].gain_dB; - BK4819_WriteRegister(BK4819_REG_13, gain_table[index].reg_val); -#ifdef ENABLE_AGC_SHOW_DATA - UI_MAIN_PrintAGC(true); -#endif - } - -#ifdef ENABLE_AM_FIX_SHOW_DATA - if (counter == 0) { - counter = 1; - gUpdateDisplay = true; - } -#endif -} - -#ifdef ENABLE_AM_FIX_SHOW_DATA -void AM_fix_print_data(const unsigned vfo, char *s) { - if (s != NULL && vfo < ARRAY_SIZE(gain_table_index)) { - const unsigned int index = gain_table_index[vfo]; - sprintf(s, "%2u %4ddB %3u", index, gain_table[index].gain_dB, prev_rssi[vfo]); - counter = 0; - } -} -#endif - -int8_t AM_fix_get_gain_diff() -{ - return currentGainDiff; -} - -void AM_fix_enable(bool on) -{ - enabled = on; -} -#endif diff --git a/App/am_fix.h b/App/am_fix.h deleted file mode 100644 index 3667301f..00000000 --- a/App/am_fix.h +++ /dev/null @@ -1,35 +0,0 @@ - -/* Copyright 2023 OneOfEleven - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef AM_FIXH - -#include -#include - -#ifdef ENABLE_AM_FIX - void AM_fix_init(void); - void AM_fix_reset(const unsigned vfo); - void AM_fix_10ms(const unsigned vfo); - #ifdef ENABLE_AM_FIX_SHOW_DATA - void AM_fix_print_data(const unsigned vfo, char *s); - #endif - int8_t AM_fix_get_gain_diff(); - void AM_fix_enable(bool on); - -#endif - -#endif diff --git a/App/app/action.c b/App/app/action.c index 837c0876..564452d9 100644 --- a/App/app/action.c +++ b/App/app/action.c @@ -675,11 +675,7 @@ void ACTION_Wn(void) } #endif - #ifdef ENABLE_AM_FIX - BK4819_SetFilterBandwidth(bw, true); - #else - BK4819_SetFilterBandwidth(bw, false); - #endif + BK4819_SetFilterBandwidth(bw, false); } void ACTION_BackLight(void) diff --git a/App/app/app.c b/App/app/app.c index 9e70b915..618680e9 100644 --- a/App/app/app.c +++ b/App/app/app.c @@ -18,7 +18,6 @@ #include #include -#include "am_fix.h" #include "app/action.h" #ifdef ENABLE_AIRCOPY @@ -1605,12 +1604,6 @@ void APP_TimeSlice10ms(void) gFlashLightBlinkCounter++; -#ifdef ENABLE_AM_FIX - if (gRxVfo->Modulation == MODULATION_AM) { - AM_fix_10ms(gEeprom.RX_VFO); - } -#endif - #ifdef ENABLE_UART if (UART_IsCommandAvailable(UART_PORT_UART)) { // SCHEDULER_Disable(); diff --git a/App/app/chFrScanner.c b/App/app/chFrScanner.c index c1a25996..d663049d 100644 --- a/App/app/chFrScanner.c +++ b/App/app/chFrScanner.c @@ -553,11 +553,7 @@ static void ScanFastApplyChannelShape(ModulationMode_t modulation) } else { -#ifdef ENABLE_AM_FIX - BK4819_SetFilterBandwidth(BK4819_FILTER_BW_WIDE, true); -#else BK4819_SetFilterBandwidth(BK4819_FILTER_BW_WIDE, false); -#endif } if (modulationChanged) diff --git a/App/app/menu.c b/App/app/menu.c index 80fa0d7f..d5f905c8 100644 --- a/App/app/menu.c +++ b/App/app/menu.c @@ -233,11 +233,6 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) break; #endif - #ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - #endif - #endif #ifdef ENABLE_AUDIO_BAR case MENU_MIC_BAR: #endif @@ -844,16 +839,6 @@ void MENU_AcceptSetting(void) gRequestSaveChannel = 1; return; - #ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - gSetting_AM_fix = gSubMenuSelection; - gVfoConfigureMode = VFO_CONFIGURE_RELOAD; - gFlagResetVfos = true; - break; - #endif - #endif - #ifdef ENABLE_NOAA case MENU_NOAA_S: gEeprom.NOAA_AUTO_SCAN = gSubMenuSelection; @@ -1344,14 +1329,6 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gTxVfo->Modulation; break; -#ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - gSubMenuSelection = gSetting_AM_fix; - break; - #endif -#endif - #ifdef ENABLE_NOAA case MENU_NOAA_S: gSubMenuSelection = gEeprom.NOAA_AUTO_SCAN; diff --git a/App/app/spectrum.c b/App/app/spectrum.c index f86cb8a1..0661dc13 100644 --- a/App/app/spectrum.c +++ b/App/app/spectrum.c @@ -14,7 +14,6 @@ * limitations under the License. */ #include "app/spectrum.h" -#include "am_fix.h" #include "audio.h" #include "misc.h" @@ -608,10 +607,6 @@ uint16_t GetRssi() // Discard first read (AGC may still be transitioning), keep second BK4819_GetRSSI(); uint16_t rssi = BK4819_GetRSSI(); -#ifdef ENABLE_AM_FIX - if (settings.modulationType == MODULATION_AM && gSetting_AM_fix) - rssi += AM_fix_get_gain_diff() * 2; -#endif return rssi; } @@ -2474,12 +2469,6 @@ static void Tick() if (gNextTimeslice) { gNextTimeslice = false; -#ifdef ENABLE_AM_FIX - if (settings.modulationType == MODULATION_AM && !lockAGC) - { - AM_fix_10ms(vfo); // allow AM_Fix to apply its AGC action - } -#endif BACKLIGHT_Update(); } diff --git a/App/debugging.h b/App/debugging.h index aa0bb692..6679bbc2 100644 --- a/App/debugging.h +++ b/App/debugging.h @@ -7,7 +7,6 @@ #include "driver/bk4819.h" #include "string.h" #include "external/printf/printf.h" -#include "am_fix.h" static inline void LogUart(const char *const str) { diff --git a/App/main.c b/App/main.c index d7d1544f..c5d95d0e 100644 --- a/App/main.c +++ b/App/main.c @@ -18,10 +18,6 @@ #include #include // NULL -#ifdef ENABLE_AM_FIX - #include "am_fix.h" -#endif - #include "audio.h" #include "board.h" #ifdef ENABLE_FEAT_F4HWN_RXTX_LOG @@ -138,10 +134,6 @@ void Main(void) BATTERY_GetReadings(false); -#ifdef ENABLE_AM_FIX - AM_fix_init(); -#endif - BOOT_Mode_t BootMode = BOOT_GetMode(); #ifdef ENABLE_FEAT_F4HWN_MULTIBOOT diff --git a/App/misc.c b/App/misc.c index 5d7b118e..f49ba7d9 100644 --- a/App/misc.c +++ b/App/misc.c @@ -107,10 +107,6 @@ bool gSetting_ScrambleEnable; enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx; -#ifdef ENABLE_AM_FIX - bool gSetting_AM_fix = true; -#endif - #ifdef ENABLE_FEAT_F4HWN_SLEEP uint8_t gSetting_set_off = 1; bool gWakeUp = false; diff --git a/App/misc.h b/App/misc.h index e00dd71b..461f636d 100644 --- a/App/misc.h +++ b/App/misc.h @@ -159,10 +159,6 @@ extern bool gSetting_ScrambleEnable; extern enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx; -#ifdef ENABLE_AM_FIX - extern bool gSetting_AM_fix; -#endif - #ifdef ENABLE_FEAT_F4HWN_SLEEP extern uint8_t gSetting_set_off; extern bool gWakeUp; diff --git a/App/radio.c b/App/radio.c index b32e600b..6fe4974b 100644 --- a/App/radio.c +++ b/App/radio.c @@ -17,7 +17,6 @@ #include "driver/bk4819-regs.h" #include -#include "am_fix.h" #include "app/dtmf.h" #ifdef ENABLE_FEAT_F4HWN_RXTX_LOG #include "app/rxtx_log.h" @@ -767,12 +766,7 @@ void RADIO_SetupRegisters(bool switchToForeground) case BK4819_FILTER_BW_WIDE: case BK4819_FILTER_BW_NARROW: case BK4819_FILTER_BW_NARROWER: - #ifdef ENABLE_AM_FIX - // BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->Modulation == MODULATION_AM && gSetting_AM_fix); - BK4819_SetFilterBandwidth(Bandwidth, true); - #else - BK4819_SetFilterBandwidth(Bandwidth, false); - #endif + BK4819_SetFilterBandwidth(Bandwidth, false); break; } } @@ -994,12 +988,7 @@ void RADIO_SetTxParameters(void) case BK4819_FILTER_BW_WIDE: case BK4819_FILTER_BW_NARROW: case BK4819_FILTER_BW_NARROWER: - #ifdef ENABLE_AM_FIX -// BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->Modulation == MODULATION_AM && gSetting_AM_fix); - BK4819_SetFilterBandwidth(Bandwidth, true); - #else - BK4819_SetFilterBandwidth(Bandwidth, false); - #endif + BK4819_SetFilterBandwidth(Bandwidth, false); break; } @@ -1150,14 +1139,6 @@ void RADIO_SetupAGC(bool listeningAM, bool disable) return; lastSettings = newSettings; -#ifdef ENABLE_AM_FIX - if (listeningAM && gSetting_AM_fix) { - BK4819_SetAGC(0); - AM_fix_enable(!disable); - return; - } -#endif - BK4819_SetAGC(!disable); BK4819_InitAGC(listeningAM); } diff --git a/App/settings.c b/App/settings.c index 3cf3f801..41f2e548 100644 --- a/App/settings.c +++ b/App/settings.c @@ -375,11 +375,7 @@ gEeprom.FreqChannel[1] = IS_FREQ_CHANNEL(Data16[5]) ? Data16[5] : (FREQ_CHANNE #ifdef ENABLE_AUDIO_BAR gSetting_mic_bar = !!(Data[7] & (1u << 4)); #endif - #ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - gSetting_AM_fix = !!(Data[7] & (1u << 5)); - #endif - #endif + // Data[7] bit 5 is reserved (legacy ENABLE_AM_FIX). gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u; if (!gEeprom.VFO_OPEN) @@ -1076,11 +1072,7 @@ void SETTINGS_SaveSettings(void) #ifdef ENABLE_AUDIO_BAR if (!gSetting_mic_bar) State[7] &= ~(1u << 4); #endif - #ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - if (!gSetting_AM_fix) State[7] &= ~(1u << 5); - #endif - #endif + // State[7] bit 5 is preserved (legacy ENABLE_AM_FIX). State[7] = (State[7] & ~(3u << 6)) | ((gSetting_backlight_on_tx_rx & 3u) << 6); PY25Q16_WriteBuffer(0x00A150, SecBuf, 8, false); @@ -1305,9 +1297,7 @@ State[1] = 0 #ifdef ENABLE_FEAT_F4HWN_GAME | (1 << 3) #endif -#ifdef ENABLE_AM_FIX - | (1 << 4) -#endif +// Bit 4 is reserved (legacy ENABLE_AM_FIX). #ifdef ENABLE_SPECTRUM | (1 << 5) #endif diff --git a/App/ui/main.c b/App/ui/main.c index ff677f48..faf004cd 100644 --- a/App/ui/main.c +++ b/App/ui/main.c @@ -28,9 +28,6 @@ #include "app/beam.h" #endif -#ifdef ENABLE_AM_FIX - #include "am_fix.h" -#endif #include "bitmaps.h" #include "board.h" #include "driver/bk4819.h" @@ -1074,9 +1071,6 @@ void DisplayRSSIBar(const bool now) #ifdef ENABLE_FEAT_F4HWN int16_t rssi_dBm = BK4819_GetRSSI_dBm() -#ifdef ENABLE_AM_FIX - + ((gSetting_AM_fix && gRxVfo->Modulation == MODULATION_AM) ? AM_fix_get_gain_diff() : 0) -#endif + dBmCorrTable[gRxVfo->Band]; // IARU VHF/UHF S-meter: S9 = -93 dBm, 1 S-unit = 6 dB @@ -1113,9 +1107,6 @@ void DisplayRSSIBar(const bool now) const int16_t s0_dBm = -gEeprom.S0_LEVEL; // S0 .. base level const int16_t rssi_dBm = BK4819_GetRSSI_dBm() -#ifdef ENABLE_AM_FIX - + ((gSetting_AM_fix && gRxVfo->Modulation == MODULATION_AM) ? AM_fix_get_gain_diff() : 0) -#endif + dBmCorrTable[gRxVfo->Band]; int s0_9 = gEeprom.S0_LEVEL - gEeprom.S9_LEVEL; @@ -2346,23 +2337,6 @@ void UI_DisplayMain(void) else #endif -#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) - if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].Modulation == MODULATION_AM && gSetting_AM_fix) - { - if (gScreenToDisplay != DISPLAY_MAIN -#ifdef ENABLE_DTMF_CALLING - || gDTMF_CallState != DTMF_CALL_STATE_NONE -#endif - ) - return; - - center_line = CENTER_LINE_AM_FIX_DATA; - AM_fix_print_data(gEeprom.RX_VFO, String); - UI_PrintStringSmallNormal(String, 2, 0, 3); - } - else -#endif - #ifdef ENABLE_RSSI_BAR if (rx) { center_line = CENTER_LINE_RSSI; diff --git a/App/ui/main.h b/App/ui/main.h index db839d06..84033f05 100644 --- a/App/ui/main.h +++ b/App/ui/main.h @@ -27,7 +27,6 @@ enum center_line_t { CENTER_LINE_AUDIO_BAR, CENTER_LINE_AUDIO_SCOPE, CENTER_LINE_RSSI, - CENTER_LINE_AM_FIX_DATA, CENTER_LINE_DTMF_DEC, CENTER_LINE_CHARGE_DATA, #ifdef ENABLE_FEAT_F4HWN_BEAM diff --git a/App/ui/menu.c b/App/ui/menu.c index 71c9b6cd..7eab8922 100644 --- a/App/ui/menu.c +++ b/App/ui/menu.c @@ -127,11 +127,6 @@ const t_menu_item MenuList[] = {"D List", MENU_D_LIST }, #endif {"D Live", MENU_D_LIVE_DEC }, // live DTMF decoder -#ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - {"AM Fix", MENU_AM_FIX }, - #endif -#endif {"VOX", MENU_VOX }, #ifdef ENABLE_FEAT_F4HWN {"SysInf", MENU_VOL }, // was "VOL" @@ -1147,11 +1142,6 @@ void UI_DisplayMenu(void) strcpy(String, gSubMenu_RX_TX[gSubMenuSelection]); break; - #ifndef ENABLE_FEAT_F4HWN - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - #endif - #endif case MENU_BCL: case MENU_BEEP: case MENU_STE: diff --git a/App/ui/menu.h b/App/ui/menu.h index fc21a58f..2f75f736 100644 --- a/App/ui/menu.h +++ b/App/ui/menu.h @@ -98,9 +98,6 @@ enum MENU_VOL, MENU_BAT_TXT, MENU_AM, -#ifdef ENABLE_AM_FIX - MENU_AM_FIX, -#endif #ifndef ENABLE_FEAT_F4HWN #ifdef ENABLE_NOAA MENU_NOAA_S, diff --git a/README.md b/README.md index 9ec495af..5847bb1f 100644 --- a/README.md +++ b/README.md @@ -274,11 +274,10 @@ Specialized presets extend Fusion for specific uses: - Improved VFO persistence and restoration. - Extensive code refactoring and memory optimization. - DTMF calling and the scrambler remain disabled in Fusion. -- Legacy AM Fix code is not used by this firmware. +- Legacy AM Fix support has been removed. ## Main features from Egzumer: * many of OneOfEleven mods: - * AM fix, huge improvement in reception quality * long press buttons functions replicating F+ action * fast scanning * channel name editing in the menu diff --git a/tools/misc/main.cpp b/tools/misc/main.cpp index ec5d917a..03097329 100644 --- a/tools/misc/main.cpp +++ b/tools/misc/main.cpp @@ -20,332 +20,6 @@ #include #include -// ************************************************************************ -// create a front end gain table for the firmware - - // <9:8> = LNA Gain Short - // 3 = 0dB < original value - // 2 = -24dB // was -11 - // 1 = -30dB // was -16 - // 0 = -33dB // was -19 - // - // <7:5> = LNA Gain - // 7 = 0dB - // 6 = -2dB - // 5 = -4dB - // 4 = -6dB - // 3 = -9dB - // 2 = -14dB < original value - // 1 = -19dB - // 0 = -24dB - // - // <4:3> = MIXER Gain - // 3 = 0dB < original value - // 2 = -3dB - // 1 = -6dB - // 0 = -8dB - // - // <2:0> = PGA Gain - // 7 = 0dB - // 6 = -3dB < original value - // 5 = -6dB - // 4 = -9dB - // 3 = -15dB - // 2 = -21dB - // 1 = -27dB - // 0 = -33dB - -typedef struct -{ - uint8_t lna_short; - uint8_t lna; - uint8_t mixer; - uint8_t pga; - int16_t lna_short_dB; - int16_t lna_dB; - int16_t mixer_dB; - int16_t pga_dB; - int16_t sum_dB; -} t_gain_table; - -void create_gain_table(const char *filename) -{ - std::vector gain_table; - - if (filename == NULL) - return; - - // front end register dB values -// const int16_t lna_short_dB[4] = { (-19), (-16), (-11), (0)}; // was - const int16_t lna_short_dB[4] = { (-33), (-30), (-24), (0)}; // corrected - const int16_t lna_dB[8] = { (-24), (-19), (-14), (-9), (-6), (-4), (-2), (0)}; - const int16_t mixer_dB[4] = { (-8), (-6), (-3), (0)}; - const int16_t pga_dB[8] = { (-33), (-27), (-21), (-15), (-9), (-6), (-3), (0)}; - - const uint8_t orig_lna_short = 3; - const uint8_t orig_lna = 2; - const uint8_t orig_mixer = 3; - const uint8_t orig_pga = 6; - - const int16_t orig_gain_dB = - lna_short_dB[orig_lna_short] + - lna_dB[orig_lna] + - mixer_dB[orig_mixer] + - pga_dB[orig_pga]; - - #if 1 - // full table - const uint8_t lna_short_min = 0; // 0 - const uint8_t lna_min = 0; // 0 - const uint8_t mixer_min = 0; // 0 - const uint8_t pga_min = 0; // 0 - - const uint8_t lna_short_max = 3; // 3 - const uint8_t lna_max = 7; // 5 - const uint8_t mixer_max = 3; // 3 - const uint8_t pga_max = 7; // 7 - #else - // just one register changes - const uint8_t lna_short_min = 0; - const uint8_t lna_min = 2; - const uint8_t mixer_min = 3; - const uint8_t pga_min = 6; - - const uint8_t lna_short_max = 3; - const uint8_t lna_max = 2; - const uint8_t mixer_max = 3; - const uint8_t pga_max = 6; - #endif - - uint8_t lna_short = lna_short_min; - uint8_t lna = lna_min; - uint8_t mixer = mixer_min; - uint8_t pga = pga_min; - - unsigned int original_index = 0; - - while (true) - { - t_gain_table entry; - - entry.lna_short = lna_short; - entry.lna = lna; - entry.mixer = mixer; - entry.pga = pga; - - entry.lna_short_dB = lna_short_dB[lna_short]; - entry.lna_dB = lna_dB[lna]; - entry.mixer_dB = mixer_dB[mixer]; - entry.pga_dB = pga_dB[pga]; - - entry.sum_dB = lna_short_dB[lna_short] + lna_dB[lna] + mixer_dB[mixer] + pga_dB[pga]; - - if (entry.sum_dB != orig_gain_dB) - gain_table.push_back(entry); - else - if (lna_short == orig_lna_short && lna == orig_lna && mixer == orig_mixer && pga == orig_pga) - gain_table.push_back(entry); - - if (++pga <= pga_max) - continue; - pga = pga_min; - - if (++mixer <= mixer_max) - continue; - mixer = mixer_min; - - if (++lna <= lna_max) - continue; - lna = lna_min; - - if (++lna_short <= lna_short_max) - continue; -// lna_short = lna_short_min; - - break; - } - - // sort the table according top the sum dB - for (unsigned int i = 0; i < (gain_table.size() - 1); i++) - { - t_gain_table entry1 = gain_table[i]; - for (unsigned int k = i + 1; k < gain_table.size(); k++) - { - t_gain_table entry2 = gain_table[k]; - if (entry2.sum_dB < entry1.sum_dB) - { // swap - const t_gain_table entry = entry1; - entry1 = entry2; - entry2 = entry; - gain_table[i] = entry1; - gain_table[k] = entry2; - } - } - } - - { // remove sum_dB duplicates - unsigned int i = 0; - while (i < gain_table.size()) - { - const t_gain_table entry1 = gain_table[i++]; - - if (entry1.lna_short == orig_lna_short && - entry1.lna == orig_lna && - entry1.mixer == orig_mixer && - entry1.pga == orig_pga) - continue; // leave the original inplace - - while (i < gain_table.size()) - { - const t_gain_table entry2 = gain_table[i]; - - if (entry2.lna_short == orig_lna_short && - entry2.lna == orig_lna && - entry2.mixer == orig_mixer && - entry2.pga == orig_pga) - break; // leave the original inplace - - if (entry2.sum_dB != entry1.sum_dB) - break; - - gain_table.erase(gain_table.begin() + i, gain_table.begin() + i + 1); - } - } - } - - // find the index for the original Quansheng register settings - for (int i = (int)gain_table.size() - 1; i >= 0; i--) - { - const t_gain_table entry = gain_table[i]; - - if (entry.sum_dB != orig_gain_dB) - continue; - - if (entry.lna_short != orig_lna_short || - entry.lna != orig_lna || - entry.mixer != orig_mixer || - entry.pga != orig_pga) - continue; - - original_index = i; - break; - } - - // *************************** - // save the table to a file - -/* - typedef struct - { - #if 1 - // bitfields take up less flash bytes - uint8_t lna_short:2; // 0 ~ 3 - uint8_t lna:3; // 0 ~ 7 - uint8_t mixer:2; // 0 ~ 3 - uint8_t pga:3; // 0 ~ 7 - #else - uint8_t lna_short; // 0 ~ 3 - uint8_t lna; // 0 ~ 7 - uint8_t mixer; // 0 ~ 3 - uint8_t pga; // 0 ~ 7 - #endif - } t_am_fix_gain_table; - //} __attribute__((packed)) t_am_fix_gain_table; -*/ - - FILE *file = fopen(filename, "w"); - if (file == NULL) - return; - - fprintf(file, "\n"); - fprintf(file, "\tstatic const t_am_fix_gain_table am_fix_gain_table[] =\n"); - fprintf(file, "\t{\n"); - - #if 0 - fprintf(file, "\t\t{.lna_short = 3, .lna = 2, .mixer = 3, .pga = 6}, // 0 0dB -14dB 0dB -3dB .. -17dB original\n\n"); - - for (unsigned int i = 0; i < gain_table.size(); i++) - { - char s[1024]; - - const t_gain_table entry = gain_table[i]; - - sprintf(s, "\t\t{%u, %u, %u, %u}, // %3u .. %3ddB %3ddB %2ddB %3ddB .. %3ddB", - entry.lna_short, - entry.lna, - entry.mixer, - entry.pga, - 1 + i, - entry.lna_short_dB, - entry.lna_dB, - entry.mixer_dB, - entry.pga_dB, - entry.sum_dB); - - if (i == original_index) - strcat(s, " original"); - - fprintf(file, "%s\n", s); - } - #else - { - //BK4819_WriteRegister(BK4819_REG_13, ((uint16_t)gains.lna_short << 8) | ((uint16_t)gains.lna << 5) | ((uint16_t)gains.mixer << 3) | ((uint16_t)gains.pga << 0)); - - uint16_t reg_val; - int16_t sum_dB; - - reg_val = ((uint16_t)orig_lna_short << 8) | ((uint16_t)orig_lna << 5) | ((uint16_t)orig_mixer << 3) | ((uint16_t)orig_pga << 0); - sum_dB = lna_short_dB[orig_lna_short] + lna_dB[orig_lna] + mixer_dB[orig_mixer] + pga_dB[orig_pga]; - fprintf(file, "\t\t{0x%04X, %-3d}, // 0 .. %u %u %u %u .. 0dB -14dB 0dB -3dB .. -17dB original\n\n", - reg_val, - sum_dB, - orig_lna_short, - orig_lna, - orig_mixer, - orig_pga); - - for (unsigned int i = 0; i < gain_table.size(); i++) - { - char s[1024]; - - const t_gain_table entry = gain_table[i]; - - reg_val = ((uint16_t)entry.lna_short << 8) | ((uint16_t)entry.lna << 5) | ((uint16_t)entry.mixer << 3) | ((uint16_t)entry.pga << 0); - sum_dB = lna_short_dB[entry.lna_short] + lna_dB[entry.lna] + mixer_dB[entry.mixer] + pga_dB[entry.pga]; - - sprintf(s, "\t\t{0x%04X, %-3d}, // %3u .. %u %u %u %u .. %3ddB %3ddB %2ddB %3ddB .. %3ddB", - reg_val, - sum_dB, - - 1 + i, - - entry.lna_short, - entry.lna, - entry.mixer, - entry.pga, - - entry.lna_short_dB, - entry.lna_dB, - entry.mixer_dB, - entry.pga_dB, - - entry.sum_dB); - - if (i == original_index) - strcat(s, " original"); - - fprintf(file, "%s\n", s); - } - } - #endif - - fprintf(file, "\t};\n\n"); - - fprintf(file, "\tstatic const unsigned int original_index = %u;\n", 1 + original_index); - - fclose(file); -} - // ************************************************************************ // "rotate_font()" has nothing to do with this program at all, I just needed // to write a bit of code to rotate some fonts I've drawn @@ -464,8 +138,6 @@ void rotate_font(const char *filename1, const char *filename2) #pragma argsused int main(int argc, char* argv[]) { - create_gain_table("gain_table.c"); - rotate_font("uv-k5_small.bin", "uv-k5_small.c"); rotate_font("uv-k5_small_bold.bin", "uv-k5_small_bold.c");