diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index df81eae29..0bfdce0c9 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -146,6 +146,8 @@ bool subghz_scene_ext_module_settings_on_event(void* context, SceneManagerEvent // Set selected radio module furi_hal_subghz_set_radio_type(value_index_exm); + furi_hal_subghz_enable_ext_power(); + // Check if module is present, if no -> show error if(!furi_hal_subghz_check_radio()) { value_index_exm = 0; diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index 69e6cbea7..fd31353e0 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -75,43 +75,46 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneStart, SubmenuIndexExtSettings); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneExtModuleSettings); return true; - - } else if(!furi_hal_subghz_check_radio()) { - furi_string_set(subghz->error_str, "Please connect\nexternal radio"); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); - return true; - } else if(event.event == SubmenuIndexReadRAW) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexReadRAW); - subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReadRAW); - return true; - } else if(event.event == SubmenuIndexRead) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexRead); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiver); - return true; - } else if(event.event == SubmenuIndexSaved) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexSaved); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); - return true; } else if(event.event == SubmenuIndexAddManually) { scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneStart, SubmenuIndexAddManually); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetType); return true; - } else if(event.event == SubmenuIndexFrequencyAnalyzer) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexFrequencyAnalyzer); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneFrequencyAnalyzer); - DOLPHIN_DEED(DolphinDeedSubGhzFrequencyAnalyzer); - return true; - } else if(event.event == SubmenuIndexTest) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneStart, SubmenuIndexTest); - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTest); - return true; + } else { + furi_hal_subghz_enable_ext_power(); + + if(!furi_hal_subghz_check_radio()) { + furi_string_set(subghz->error_str, "Please connect\nexternal radio"); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); + return true; + } else if(event.event == SubmenuIndexReadRAW) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexReadRAW); + subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReadRAW); + return true; + } else if(event.event == SubmenuIndexRead) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexRead); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiver); + return true; + } else if(event.event == SubmenuIndexSaved) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexSaved); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); + return true; + } else if(event.event == SubmenuIndexFrequencyAnalyzer) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexFrequencyAnalyzer); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneFrequencyAnalyzer); + DOLPHIN_DEED(DolphinDeedSubGhzFrequencyAnalyzer); + return true; + } else if(event.event == SubmenuIndexTest) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneStart, SubmenuIndexTest); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTest); + return true; + } } } return false; diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index ac9270114..e2b484120 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -421,6 +421,9 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { // The rest free(subghz); + + // Disable power for External CC1101 if it was enabled and module is connected + furi_hal_subghz_disable_ext_power(); } int32_t subghz_app(void* p) { diff --git a/applications/plugins/subbrute b/applications/plugins/subbrute index ed94bc878..19153c723 160000 --- a/applications/plugins/subbrute +++ b/applications/plugins/subbrute @@ -1 +1 @@ -Subproject commit ed94bc87868b80bf41dad754f3747a9f40551995 +Subproject commit 19153c72395c7d62efac425325b4c4c646e1fd3f diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index e7b7582a9..8ff7b0caa 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1354,7 +1354,7 @@ Function,+,furi_hal_spi_release,void,FuriHalSpiBusHandle* Function,+,furi_hal_subghz_check_radio,_Bool, Function,+,furi_hal_subghz_disable_ext_power,void, Function,-,furi_hal_subghz_dump_state,void, -Function,+,furi_hal_subghz_enable_ext_power,void, +Function,+,furi_hal_subghz_enable_ext_power,_Bool, Function,+,furi_hal_subghz_flush_rx,void, Function,+,furi_hal_subghz_flush_tx,void, Function,+,furi_hal_subghz_get_lqi,uint8_t, diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index b8834bef3..50503530d 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -21,8 +21,6 @@ #define INIT_TIMEOUT 10 static uint32_t furi_hal_subghz_debug_gpio_buff[2]; -static bool last_OTG_state = false; -static bool ext_power_is_enabled_already = false; /* DMA Channels definition */ #define SUBGHZ_DMA DMA2 @@ -80,18 +78,20 @@ void furi_hal_subghz_init(void) { furi_hal_subghz_init_check(); } -void furi_hal_subghz_enable_ext_power(void) { - if(ext_power_is_enabled_already && furi_hal_power_is_otg_enabled()) return; - ext_power_is_enabled_already = true; - last_OTG_state = furi_hal_power_is_otg_enabled(); - if(furi_hal_subghz.radio_type != SubGhzRadioInternal && !furi_hal_power_is_otg_enabled()) { - furi_hal_power_enable_otg(); +bool furi_hal_subghz_enable_ext_power(void) { + if(furi_hal_subghz.radio_type != SubGhzRadioInternal) { + uint8_t attempts = 0; + while(!furi_hal_power_is_otg_enabled() && attempts++ < 2) { + furi_hal_power_enable_otg(); + //CC1101 power-up time + furi_delay_ms(5); + } } + return furi_hal_power_is_otg_enabled(); } void furi_hal_subghz_disable_ext_power(void) { - ext_power_is_enabled_already = false; - if(furi_hal_subghz.radio_type != SubGhzRadioInternal && !last_OTG_state) { + if(furi_hal_subghz.radio_type != SubGhzRadioInternal) { furi_hal_power_disable_otg(); } } @@ -99,8 +99,6 @@ void furi_hal_subghz_disable_ext_power(void) { bool furi_hal_subghz_check_radio(void) { bool result = true; - furi_hal_subghz_enable_ext_power(); - furi_hal_spi_acquire(furi_hal_subghz.spi_bus_handle); uint8_t ver = cc1101_get_version(furi_hal_subghz.spi_bus_handle); @@ -113,7 +111,6 @@ bool furi_hal_subghz_check_radio(void) { result = false; } - furi_hal_subghz_disable_ext_power(); return result; } @@ -124,7 +121,6 @@ bool furi_hal_subghz_init_check(void) { furi_hal_subghz.state = SubGhzStateIdle; furi_hal_subghz.preset = FuriHalSubGhzPresetIDLE; - furi_hal_subghz_enable_ext_power(); furi_hal_spi_acquire(furi_hal_subghz.spi_bus_handle); #ifdef FURI_HAL_SUBGHZ_TX_GPIO @@ -176,7 +172,6 @@ bool furi_hal_subghz_init_check(void) { } else { FURI_LOG_E(TAG, "Failed to initialization"); } - furi_hal_subghz_disable_ext_power(); return result; } @@ -193,8 +188,6 @@ void furi_hal_subghz_sleep() { furi_hal_spi_release(furi_hal_subghz.spi_bus_handle); - furi_hal_subghz_disable_ext_power(); - furi_hal_subghz.preset = FuriHalSubGhzPresetIDLE; } @@ -339,7 +332,6 @@ void furi_hal_subghz_shutdown() { // Reset and shutdown cc1101_shutdown(furi_hal_subghz.spi_bus_handle); furi_hal_spi_release(furi_hal_subghz.spi_bus_handle); - furi_hal_subghz_disable_ext_power(); } void furi_hal_subghz_reset() { @@ -352,7 +344,6 @@ void furi_hal_subghz_reset() { } void furi_hal_subghz_idle() { - furi_hal_subghz_enable_ext_power(); furi_hal_spi_acquire(furi_hal_subghz.spi_bus_handle); cc1101_switch_to_idle(furi_hal_subghz.spi_bus_handle); furi_hal_spi_release(furi_hal_subghz.spi_bus_handle); diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.h b/firmware/targets/f7/furi_hal/furi_hal_subghz.h index 8ede17d32..f66cb3960 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.h +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.h @@ -303,8 +303,9 @@ SubGhzRadioType furi_hal_subghz_get_radio_type(void); bool furi_hal_subghz_check_radio(void); /** Turn on the power of the external radio module + * @return true if power-up is successful */ -void furi_hal_subghz_enable_ext_power(void); +bool furi_hal_subghz_enable_ext_power(void); /** Turn off the power of the external radio module */