diff --git a/radio/src/boards/generic_stm32/bl_keys.cpp b/radio/src/boards/generic_stm32/bl_keys.cpp index 413494a71..2e1a89066 100644 --- a/radio/src/boards/generic_stm32/bl_keys.cpp +++ b/radio/src/boards/generic_stm32/bl_keys.cpp @@ -6,6 +6,7 @@ bool boardBLStartCondition() { // Trims combo activated + pollKeys(); bool result = (readTrims() == BOOTLOADER_KEYS); #if defined(SECONDARY_BOOTLOADER_KEYS) result |= (readTrims() == SECONDARY_BOOTLOADER_KEYS); diff --git a/radio/src/boards/generic_stm32/inputs.cpp b/radio/src/boards/generic_stm32/inputs.cpp index 80856a0b0..993c756c7 100644 --- a/radio/src/boards/generic_stm32/inputs.cpp +++ b/radio/src/boards/generic_stm32/inputs.cpp @@ -34,6 +34,10 @@ __weak void keysInit() _init_trims(); } +__weak void pollKeys() +{ +} + __weak uint32_t readKeys() { return _read_keys(); diff --git a/radio/src/boards/rm-h750/bsp_io.cpp b/radio/src/boards/rm-h750/bsp_io.cpp index a6b21c5b9..c1e59fdc0 100644 --- a/radio/src/boards/rm-h750/bsp_io.cpp +++ b/radio/src/boards/rm-h750/bsp_io.cpp @@ -38,6 +38,7 @@ #include "debug.h" extern const stm32_switch_t* boardGetSwitchDef(uint8_t idx); +extern bool suspendI2CTasks; struct bsp_io_expander { pca95xx_t exp; @@ -108,6 +109,9 @@ static void _poll_switches(void *param1, uint32_t trigger_source) timer_reset(&_poll_timer); } + // Suspend hardware reads when required + if (suspendI2CTasks) return; + _read_io_expander(&_io_switches); _read_io_expander(&_io_fs_switches); } diff --git a/radio/src/bootloader/boot_menu.cpp b/radio/src/bootloader/boot_menu.cpp index 1d067df23..74896b5a4 100644 --- a/radio/src/bootloader/boot_menu.cpp +++ b/radio/src/bootloader/boot_menu.cpp @@ -41,6 +41,8 @@ #define SEL_CLEAR_FLASH_STORAGE_MENU_LEN 2 #endif +bool suspendI2CTasks = false; + void pollInputs() { keysPollingCycle(); @@ -109,6 +111,7 @@ void bootloaderMenu() if (usbPlugged()) { state = ST_USB; #if !defined(SIMU) + suspendI2CTasks = true; usbStart(); #endif } @@ -119,6 +122,7 @@ void bootloaderMenu() vpos = 0; #if !defined(SIMU) usbStop(); + suspendI2CTasks = false; #endif state = ST_START; } diff --git a/radio/src/bootloader/boot_uf2.cpp b/radio/src/bootloader/boot_uf2.cpp index 9b4eab203..e8283d9c0 100644 --- a/radio/src/bootloader/boot_uf2.cpp +++ b/radio/src/bootloader/boot_uf2.cpp @@ -34,6 +34,8 @@ #define FRAME_INTERVAL_MS 20 +bool suspendI2CTasks = false; + void bootloaderUF2() { BootloaderState state = ST_START; @@ -71,6 +73,7 @@ void bootloaderUF2() if (usbPlugged()) { state = ST_USB; #if !defined(SIMU) + suspendI2CTasks = true; usbStart(); #endif } else if (pwrOffPressed()) { @@ -83,6 +86,8 @@ void bootloaderUF2() if (usbPlugged() == 0) { #if !defined(SIMU) usbStop(); + suspendI2CTasks = false; + #endif state = (state == ST_FLASH_DONE) ? ST_REBOOT : ST_START; } else { diff --git a/radio/src/edgetx.cpp b/radio/src/edgetx.cpp index 9c1e6c766..f7e451f6d 100644 --- a/radio/src/edgetx.cpp +++ b/radio/src/edgetx.cpp @@ -104,6 +104,7 @@ uint8_t latencyToggleSwitch = 0; #endif volatile uint8_t rtc_count = 0; +bool suspendI2CTasks = false; #if defined(DEBUG_LATENCY) void toggleLatencySwitch() @@ -1089,6 +1090,7 @@ void edgeTxClose(uint8_t shutdown) TRACE("edgeTxClose"); watchdogSuspend(2000/*20s*/); + suspendI2CTasks = true; if (shutdown) { pulsesStop(); @@ -1140,6 +1142,7 @@ void edgeTxResume() { TRACE("edgeTxResume"); + suspendI2CTasks = false; if (!sdMounted()) sdInit(); luaInitMainState(); diff --git a/radio/src/hal/key_driver.h b/radio/src/hal/key_driver.h index 933fbd081..0919f2570 100644 --- a/radio/src/hal/key_driver.h +++ b/radio/src/hal/key_driver.h @@ -51,6 +51,11 @@ enum EnumKeys { MAX_KEYS }; +// When port entender is used, readKeys should only return the cached key values +// read key from port extender will only come from pollKeys +// Which is called by the timer task +void pollKeys(); + // returns a bit field with each key set as (1 << KEY_xxx) uint32_t readKeys(); diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 1230aec05..af4a93f90 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -476,6 +476,7 @@ uint16_t keyMapping(uint16_t event) bool keysPollingCycle() { uint32_t trims_input; + pollKeys(); uint32_t keys_input = readKeys(); #if defined(USE_HATS_AS_KEYS) diff --git a/radio/src/targets/common/arm/stm32/csd203_sensor.cpp b/radio/src/targets/common/arm/stm32/csd203_sensor.cpp index 66fbb2ffa..bb4b0f7da 100644 --- a/radio/src/targets/common/arm/stm32/csd203_sensor.cpp +++ b/radio/src/targets/common/arm/stm32/csd203_sensor.cpp @@ -171,6 +171,8 @@ typedef struct { } CSD_ALERT; /*CSD ALERT Configuration struct*/ +extern bool suspendI2CTasks; + void CSD203_Init(CSD_CONFIG *CSD203_CFG); // Initialise CSD203 config uint16_t CSD203_ReadVbus(CSD_CONFIG *CSD203_CFG); // Read Vbus Voltage uint16_t CSD203_ReadRshunt(CSD_CONFIG *CSD203_CFG); // Read Rshunt @@ -410,6 +412,8 @@ void readCSD203(void) { // 5ms static uint16_t GetSenSorStep = 0; + if (suspendI2CTasks) return; + if (IICReadStatusFlag == true) return; IICReadStatusFlag = true; diff --git a/radio/src/targets/pa01/bsp_io.cpp b/radio/src/targets/pa01/bsp_io.cpp index fac0ed112..6e58c3230 100644 --- a/radio/src/targets/pa01/bsp_io.cpp +++ b/radio/src/targets/pa01/bsp_io.cpp @@ -56,10 +56,14 @@ bool bsp_get_shouldReadKeys() return tmp; } +static volatile bool errorOccurs = false; static void bsp_input_read() { uint16_t value; - if (aw9523b_read(&i2c_exp, BSP_IN_MASK, &value) < 0) return; + if (aw9523b_read(&i2c_exp, BSP_IN_MASK, &value) < 0) { + errorOccurs = true; + return; + } inputState = value; } diff --git a/radio/src/targets/pa01/key_driver.cpp b/radio/src/targets/pa01/key_driver.cpp index 6e082fcca..c39b560a6 100644 --- a/radio/src/targets/pa01/key_driver.cpp +++ b/radio/src/targets/pa01/key_driver.cpp @@ -68,13 +68,15 @@ enum PhysicalKeys ENT = 16 }; +extern bool suspendI2CTasks; + static bool fct_state[4] = {false, false, false, false}; static uint32_t keyState = 0; #if !defined(BOOT) static uint32_t nonReadCount = 0; #endif -static uint32_t _readKeyMatrix() +void pollKeys() { #if !defined(BOOT) if(!bsp_get_shouldReadKeys() && nonReadCount < 10) @@ -83,10 +85,12 @@ static uint32_t _readKeyMatrix() keyState |= 1< 1) return syncelem.oldResult; + if (syncelem.ui8ReadInProgress > 1) { + keyState = syncelem.oldResult; + } // If we land here, we have exclusive access to Matrix bsp_output_set(BSP_KEY_OUT_MASK, ~BSP_KEY_OUT1); @@ -170,8 +178,6 @@ static uint32_t _readKeyMatrix() fct_state[3] = (result & 1<