From c6b6aec05747db40565ad2e35ff0899e33f2a5b9 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Sun, 30 Jul 2023 12:12:59 +0300 Subject: [PATCH] replace power amp in driver --- .../drivers/subghz/cc1101_ext/cc1101_ext.c | 49 ++++++- .../drivers/subghz/cc1101_ext/cc1101_ext.h | 3 +- .../scenes/subghz_scene_radio_settings.c | 127 ++++-------------- lib/subghz/devices/devices.c | 39 +----- lib/subghz/devices/types.h | 11 +- 5 files changed, 87 insertions(+), 142 deletions(-) diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c index bd15f9cc6..4e8b395d5 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c @@ -18,7 +18,10 @@ #define TAG "SubGhz_Device_CC1101_Ext" #define SUBGHZ_DEVICE_CC1101_EXT_TX_GPIO &gpio_ext_pb2 -#define SUBGHZ_DEVICE_CC1101_EXT_DANGEROUS_RANGE false +#define SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO &gpio_ext_pc3 +#define SUBGHZ_DEVICE_CC1101_EXT_FORCE_DANGEROUS_RANGE false + +#define SUBGHZ_DEVICE_CC1101_CONFIG_VER 1 /* DMA Channels definition */ #define SUBGHZ_DEVICE_CC1101_EXT_DMA DMA2 @@ -78,6 +81,8 @@ typedef struct { const GpioPin* g0_pin; SubGhzDeviceCC1101ExtAsyncTx async_tx; SubGhzDeviceCC1101ExtAsyncRx async_rx; + bool power_amp; + bool extended_range; } SubGhzDeviceCC1101Ext; static SubGhzDeviceCC1101Ext* subghz_device_cc1101_ext = NULL; @@ -187,7 +192,7 @@ static bool subghz_device_cc1101_ext_check_init() { return ret; } -bool subghz_device_cc1101_ext_alloc() { +bool subghz_device_cc1101_ext_alloc(SubGhzDeviceConf* conf) { furi_assert(subghz_device_cc1101_ext == NULL); subghz_device_cc1101_ext = malloc(sizeof(SubGhzDeviceCC1101Ext)); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateInit; @@ -195,16 +200,35 @@ bool subghz_device_cc1101_ext_alloc() { subghz_device_cc1101_ext->async_mirror_pin = NULL; subghz_device_cc1101_ext->spi_bus_handle = &furi_hal_spi_bus_handle_external; subghz_device_cc1101_ext->g0_pin = SUBGHZ_DEVICE_CC1101_EXT_TX_GPIO; + subghz_device_cc1101_ext->power_amp = false; + subghz_device_cc1101_ext->extended_range = false; + if(conf) { + if(conf->ver == SUBGHZ_DEVICE_CC1101_CONFIG_VER) { + subghz_device_cc1101_ext->power_amp = conf->power_amp; + subghz_device_cc1101_ext->extended_range = conf->extented_range; + } else { + FURI_LOG_E(TAG, "Config version mismatch"); + } + } subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0; furi_hal_spi_bus_handle_init(subghz_device_cc1101_ext->spi_bus_handle); + if(subghz_device_cc1101_ext->power_amp) { + furi_hal_gpio_init_simple(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, GpioModeOutputPushPull); + } + return subghz_device_cc1101_ext_check_init(); } void subghz_device_cc1101_ext_free() { furi_assert(subghz_device_cc1101_ext != NULL); + furi_hal_spi_bus_handle_deinit(subghz_device_cc1101_ext->spi_bus_handle); + if(subghz_device_cc1101_ext->power_amp) { + furi_hal_gpio_init_simple(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, GpioModeAnalog); + } + free(subghz_device_cc1101_ext); subghz_device_cc1101_ext = NULL; } @@ -221,7 +245,7 @@ bool subghz_device_cc1101_ext_is_connect() { bool ret = false; if(subghz_device_cc1101_ext == NULL) { // not initialized - ret = subghz_device_cc1101_ext_alloc(); + ret = subghz_device_cc1101_ext_alloc(NULL); subghz_device_cc1101_ext_free(); } else { // initialized furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); @@ -381,12 +405,18 @@ void subghz_device_cc1101_ext_idle() { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); + if(subghz_device_cc1101_ext->power_amp) { + furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 0); + } } void subghz_device_cc1101_ext_rx() { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_rx(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); + if(subghz_device_cc1101_ext->power_amp) { + furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 0); + } } bool subghz_device_cc1101_ext_tx() { @@ -394,6 +424,9 @@ bool subghz_device_cc1101_ext_tx() { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_tx(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); + if(subghz_device_cc1101_ext->power_amp) { + furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 1); + } return true; } @@ -432,14 +465,16 @@ bool subghz_device_cc1101_ext_is_frequency_valid(uint32_t value) { } bool subghz_device_cc1101_ext_is_tx_allowed(uint32_t value) { - if(!(SUBGHZ_DEVICE_CC1101_EXT_DANGEROUS_RANGE) && + if(!(SUBGHZ_DEVICE_CC1101_EXT_FORCE_DANGEROUS_RANGE || + subghz_device_cc1101_ext->extended_range) && !(value >= 299999755 && value <= 350000335) && // was increased from 348 to 350 !(value >= 386999938 && value <= 467750000) && // was increased from 464 to 467.75 !(value >= 778999847 && value <= 928000000)) { FURI_LOG_I(TAG, "Frequency blocked - outside default range"); return false; } else if( - (SUBGHZ_DEVICE_CC1101_EXT_DANGEROUS_RANGE) && + (SUBGHZ_DEVICE_CC1101_EXT_FORCE_DANGEROUS_RANGE || + subghz_device_cc1101_ext->extended_range) && !subghz_device_cc1101_ext_is_frequency_valid(value)) { FURI_LOG_I(TAG, "Frequency blocked - outside dangerous range"); return false; @@ -529,7 +564,7 @@ void subghz_device_cc1101_ext_start_async_rx( furi_hal_bus_enable(FuriHalBusTIM17); // Configure TIM - //Set the timer resolution to 2 µs + //Set the timer resolution to 2 �s LL_TIM_SetPrescaler(TIM17, (64 << 1) - 1); LL_TIM_SetCounterMode(TIM17, LL_TIM_COUNTERMODE_UP); LL_TIM_SetAutoReload(TIM17, 0xFFFF); @@ -710,7 +745,7 @@ bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callb furi_hal_bus_enable(FuriHalBusTIM17); // Configure TIM - // Set the timer resolution to 2 µs + // Set the timer resolution to 2 �s LL_TIM_SetPrescaler(TIM17, (64 << 1) - 1); LL_TIM_SetCounterMode(TIM17, LL_TIM_COUNTERMODE_UP); LL_TIM_SetAutoReload(TIM17, 0xFFFF); diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.h b/applications/drivers/subghz/cc1101_ext/cc1101_ext.h index d972fcb66..130402f8e 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.h +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include #include #include @@ -34,7 +35,7 @@ const GpioPin* subghz_device_cc1101_ext_get_data_gpio(); * * @return true if success */ -bool subghz_device_cc1101_ext_alloc(); +bool subghz_device_cc1101_ext_alloc(SubGhzDeviceConf* conf); /** Deinitialize device */ diff --git a/applications/main/subghz/scenes/subghz_scene_radio_settings.c b/applications/main/subghz/scenes/subghz_scene_radio_settings.c index 2ff2f565f..0bd2b1f3e 100644 --- a/applications/main/subghz/scenes/subghz_scene_radio_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_radio_settings.c @@ -41,6 +41,14 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "+5", "+10", }; +const uint32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { + 1, + 2, + 3, + 4, + 5, + 10, +}; static void subghz_scene_radio_settings_set_device(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); @@ -69,66 +77,28 @@ static void subghz_scene_receiver_config_set_debug_counter(VariableItem* item) { uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, debug_counter_text[index]); - - switch(index) { - case 0: - furi_hal_subghz_set_rolling_counter_mult(1); - break; - case 1: - furi_hal_subghz_set_rolling_counter_mult(2); - break; - case 2: - furi_hal_subghz_set_rolling_counter_mult(3); - break; - case 3: - furi_hal_subghz_set_rolling_counter_mult(4); - break; - case 4: - furi_hal_subghz_set_rolling_counter_mult(5); - break; - case 5: - furi_hal_subghz_set_rolling_counter_mult(10); - break; - default: - break; - } + furi_hal_subghz_set_rolling_counter_mult(debug_counter_val[index]); } -// static void subghz_scene_receiver_config_set_ext_mod_power(VariableItem* item) { -// SubGhz* subghz = variable_item_get_context(item); -// uint8_t index = variable_item_get_current_value_index(item); - -// variable_item_set_current_value_text(item, ext_mod_power_text[index]); - -// furi_hal_subghz_set_external_power_disable(index == 1); -// if(index == 1) { -// furi_hal_subghz_disable_ext_power(); -// } else { -// furi_hal_subghz_enable_ext_power(); -// } - -// subghz->last_settings->external_module_power_5v_disable = index == 1; -// subghz_last_settings_save(subghz->last_settings); -// } - static void subghz_scene_reciever_config_set_ext_mod_power_amp_text(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, ext_mod_power_amp_text[index]); - if(index == 1) { - furi_hal_gpio_init_simple(&gpio_ext_pc3, GpioModeOutputPushPull); - } else { - furi_hal_gpio_init_simple(&gpio_ext_pc3, GpioModeAnalog); - } - subghz->last_settings->external_module_power_amp = index == 1; // Set globally in furi hal furi_hal_subghz_set_ext_power_amp(subghz->last_settings->external_module_power_amp); subghz_last_settings_save(subghz->last_settings); + + // reinit external device + const SubGhzRadioDeviceType current = subghz_txrx_radio_device_get(subghz->txrx); + if(current != SubGhzRadioDeviceTypeInternal) { + subghz_txrx_radio_device_set(subghz->txrx, SubGhzRadioDeviceTypeInternal); + subghz_txrx_radio_device_set(subghz->txrx, current); + } } static void subghz_scene_receiver_config_set_timestamp_file_names(VariableItem* item) { @@ -183,59 +153,18 @@ void subghz_scene_radio_settings_on_enter(void* context) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, timestamp_names_text[value_index]); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - item = variable_item_list_add( - variable_item_list, - "Counter Incr.", - DEBUG_COUNTER_COUNT, - subghz_scene_receiver_config_set_debug_counter, - subghz); - switch(furi_hal_subghz_get_rolling_counter_mult()) { - case 1: - value_index = 0; - break; - case 2: - value_index = 1; - break; - case 3: - value_index = 2; - break; - case 4: - value_index = 3; - break; - case 5: - value_index = 4; - break; - case 10: - value_index = 5; - break; - default: - break; - } - } else { - item = variable_item_list_add( - variable_item_list, - "Counter Incr.", - 3, - subghz_scene_receiver_config_set_debug_counter, - subghz); - switch(furi_hal_subghz_get_rolling_counter_mult()) { - case 1: - value_index = 0; - break; - case 2: - value_index = 1; - break; - case 3: - value_index = 2; - break; - default: - // Reset to default value - value_index = 0; - furi_hal_subghz_set_rolling_counter_mult(1); - break; - } - } + item = variable_item_list_add( + variable_item_list, + "Counter Incr.", + furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) ? DEBUG_COUNTER_COUNT : 3, + subghz_scene_receiver_config_set_debug_counter, + subghz); + value_index = value_index_uint32( + furi_hal_subghz_get_rolling_counter_mult(), + debug_counter_val, + furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) ? DEBUG_COUNTER_COUNT : 3); + furi_hal_subghz_set_rolling_counter_mult(debug_counter_val[value_index]); + variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, debug_counter_text[value_index]); diff --git a/lib/subghz/devices/devices.c b/lib/subghz/devices/devices.c index 98cb0f609..e034c474d 100644 --- a/lib/subghz/devices/devices.c +++ b/lib/subghz/devices/devices.c @@ -30,14 +30,13 @@ bool subghz_devices_begin(const SubGhzDevice* device) { bool ret = false; furi_assert(device); if(device->interconnect->begin) { - // TODO: Remake this check and move this code - if(strcmp("cc1101_ext", device->name) == 0) { - if(furi_hal_subghz_get_ext_power_amp()) { - furi_hal_gpio_init_simple(&gpio_ext_pc3, GpioModeOutputPushPull); - } - } + SubGhzDeviceConf conf = { + .ver = 1, + .extended_range = false, // TODO + .power_amp = furi_hal_subghz_get_ext_power_amp(), + }; - ret = device->interconnect->begin(); + ret = device->interconnect->begin(&conf); } return ret; } @@ -45,12 +44,6 @@ bool subghz_devices_begin(const SubGhzDevice* device) { void subghz_devices_end(const SubGhzDevice* device) { furi_assert(device); if(device->interconnect->end) { - // TODO: Remake this check and move this code - if(strcmp("cc1101_ext", device->name) == 0) { - if(furi_hal_subghz_get_ext_power_amp()) { - furi_hal_gpio_init_simple(&gpio_ext_pc3, GpioModeAnalog); - } - } device->interconnect->end(); } } @@ -82,12 +75,6 @@ void subghz_devices_idle(const SubGhzDevice* device) { furi_assert(device); if(device->interconnect->idle) { device->interconnect->idle(); - // TODO: Remake this check and move this code - if(strcmp("cc1101_ext", device->name) == 0) { - if(furi_hal_subghz_get_ext_power_amp()) { - furi_hal_gpio_write(&gpio_ext_pc3, 0); - } - } } } @@ -140,13 +127,6 @@ bool subghz_devices_set_tx(const SubGhzDevice* device) { furi_assert(device); if(device->interconnect->set_tx) { ret = device->interconnect->set_tx(); - - // TODO: Remake this check and move this code - if(strcmp("cc1101_ext", device->name) == 0) { - if(furi_hal_subghz_get_ext_power_amp()) { - furi_hal_gpio_write(&gpio_ext_pc3, 1); - } - } } return ret; } @@ -187,13 +167,6 @@ void subghz_devices_set_rx(const SubGhzDevice* device) { furi_assert(device); if(device->interconnect->set_rx) { device->interconnect->set_rx(); - - // TODO: Remake this check and move this code - if(strcmp("cc1101_ext", device->name) == 0) { - if(furi_hal_subghz_get_ext_power_amp()) { - furi_hal_gpio_write(&gpio_ext_pc3, 0); - } - } } } diff --git a/lib/subghz/devices/types.h b/lib/subghz/devices/types.h index 8a4198426..f5f140c6a 100644 --- a/lib/subghz/devices/types.h +++ b/lib/subghz/devices/types.h @@ -12,12 +12,13 @@ #include #define SUBGHZ_RADIO_DEVICE_PLUGIN_APP_ID "subghz_radio_device" -#define SUBGHZ_RADIO_DEVICE_PLUGIN_API_VERSION 1 +#define SUBGHZ_RADIO_DEVICE_PLUGIN_API_VERSION 2 typedef struct SubGhzDeviceRegistry SubGhzDeviceRegistry; typedef struct SubGhzDevice SubGhzDevice; +typedef struct SubGhzDeviceConf SubGhzDeviceConf; -typedef bool (*SubGhzBegin)(void); +typedef bool (*SubGhzBegin)(SubGhzDeviceConf* conf); typedef void (*SubGhzEnd)(void); typedef bool (*SubGhzIsConnect)(void); typedef void (*SubGhzReset)(void); @@ -89,3 +90,9 @@ struct SubGhzDevice { const char* name; const SubGhzDeviceInterconnect* interconnect; }; + +struct SubGhzDeviceConf { + uint8_t ver; + bool extended_range; + bool power_amp; +}; \ No newline at end of file