External module 5v power issues fixes

This commit is contained in:
MX
2023-03-08 01:09:17 +03:00
parent cad2f2a065
commit ab91dc1882
7 changed files with 54 additions and 54 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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,
1 entry status name type params
1354 Function + furi_hal_subghz_check_radio _Bool
1355 Function + furi_hal_subghz_disable_ext_power void
1356 Function - furi_hal_subghz_dump_state void
1357 Function + furi_hal_subghz_enable_ext_power void _Bool
1358 Function + furi_hal_subghz_flush_rx void
1359 Function + furi_hal_subghz_flush_tx void
1360 Function + furi_hal_subghz_get_lqi uint8_t

View File

@@ -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);

View File

@@ -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
*/