From 37cd0404e54cf26f6b3fe0d3cd193f7a54778118 Mon Sep 17 00:00:00 2001 From: jflyper Date: Tue, 24 Apr 2018 07:42:46 +0900 Subject: [PATCH 1/3] Prevent channel.ccr to be deferenced if timer failed to initialize --- src/main/drivers/pwm_output.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index 9d6f57bc00..ff01904712 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -487,9 +487,11 @@ void pwmToggleBeeper(void) void beeperPwmInit(const ioTag_t tag, uint16_t frequency) { - beeperPwm.io = IOGetByTag(tag); const timerHardware_t *timer = timerGetByTag(tag, TIM_USE_BEEPER); - if (beeperPwm.io && timer) { + IO_t beeperIO = IOGetByTag(tag); + + if (beeperIO && timer) { + beeperPwm.io = beeperIO; IOInit(beeperPwm.io, OWNER_BEEPER, RESOURCE_INDEX(0)); #if defined(USE_HAL_DRIVER) IOConfigGPIOAF(beeperPwm.io, IOCFG_AF_PP, timer->alternateFunction); @@ -498,8 +500,9 @@ void beeperPwmInit(const ioTag_t tag, uint16_t frequency) #endif freqBeep = frequency; pwmOutConfig(&beeperPwm.channel, timer, PWM_TIMER_1MHZ, PWM_TIMER_1MHZ / freqBeep, (PWM_TIMER_1MHZ / freqBeep) / 2, 0); + + *beeperPwm.channel.ccr = 0; + beeperPwm.enabled = false; } - *beeperPwm.channel.ccr = 0; - beeperPwm.enabled = false; } #endif From 22a7788fa373e32159a87725b3577ba4e90f7d30 Mon Sep 17 00:00:00 2001 From: jflyper Date: Tue, 24 Apr 2018 08:02:32 +0900 Subject: [PATCH 2/3] Reset beeper_frequency if valid timer is not found --- src/main/fc/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/fc/config.c b/src/main/fc/config.c index 40e8ab6c95..ba5f655416 100644 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -50,6 +50,7 @@ #include "io/serial.h" #include "pg/beeper.h" +#include "pg/beeper_dev.h" #include "pg/pg.h" #include "pg/pg_ids.h" @@ -356,6 +357,12 @@ static void validateAndFixConfig(void) featureClear(FEATURE_RSSI_ADC); #endif +#if defined(USE_BEEPER) + if (beeperDevConfig()->frequency && !timerGetByTag(beeperDevConfig()->ioTag, TIM_USE_BEEPER)) { + beeperDevConfigMutable()->frequency = 0; + } +#endif + #if defined(TARGET_VALIDATECONFIG) targetValidateConfiguration(); #endif From e87d14fe46563fd96b701038b3aec268a785af12 Mon Sep 17 00:00:00 2001 From: jflyper Date: Tue, 24 Apr 2018 07:43:59 +0900 Subject: [PATCH 3/3] White space tidy & add braces --- src/main/drivers/pwm_output.c | 46 ++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index ff01904712..e6d735568d 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -469,40 +469,42 @@ void servoDevInit(const servoDevConfig_t *servoConfig) #ifdef USE_BEEPER void pwmWriteBeeper(bool onoffBeep) { - if (!beeperPwm.io) - return; - if (onoffBeep == true) { - *beeperPwm.channel.ccr = (PWM_TIMER_1MHZ / freqBeep) / 2; - beeperPwm.enabled = true; - } else { - *beeperPwm.channel.ccr = 0; - beeperPwm.enabled = false; - } + if (!beeperPwm.io) { + return; + } + + if (onoffBeep == true) { + *beeperPwm.channel.ccr = (PWM_TIMER_1MHZ / freqBeep) / 2; + beeperPwm.enabled = true; + } else { + *beeperPwm.channel.ccr = 0; + beeperPwm.enabled = false; + } } void pwmToggleBeeper(void) { - pwmWriteBeeper(!beeperPwm.enabled); + pwmWriteBeeper(!beeperPwm.enabled); } void beeperPwmInit(const ioTag_t tag, uint16_t frequency) { - const timerHardware_t *timer = timerGetByTag(tag, TIM_USE_BEEPER); - IO_t beeperIO = IOGetByTag(tag); + const timerHardware_t *timer = timerGetByTag(tag, TIM_USE_BEEPER); + IO_t beeperIO = IOGetByTag(tag); - if (beeperIO && timer) { - beeperPwm.io = beeperIO; - IOInit(beeperPwm.io, OWNER_BEEPER, RESOURCE_INDEX(0)); + if (beeperIO && timer) { + beeperPwm.io = beeperIO; + IOInit(beeperPwm.io, OWNER_BEEPER, RESOURCE_INDEX(0)); #if defined(USE_HAL_DRIVER) - IOConfigGPIOAF(beeperPwm.io, IOCFG_AF_PP, timer->alternateFunction); + IOConfigGPIOAF(beeperPwm.io, IOCFG_AF_PP, timer->alternateFunction); #else - IOConfigGPIO(beeperPwm.io, IOCFG_AF_PP); + IOConfigGPIO(beeperPwm.io, IOCFG_AF_PP); #endif - freqBeep = frequency; - pwmOutConfig(&beeperPwm.channel, timer, PWM_TIMER_1MHZ, PWM_TIMER_1MHZ / freqBeep, (PWM_TIMER_1MHZ / freqBeep) / 2, 0); + freqBeep = frequency; + pwmOutConfig(&beeperPwm.channel, timer, PWM_TIMER_1MHZ, PWM_TIMER_1MHZ / freqBeep, (PWM_TIMER_1MHZ / freqBeep) / 2, 0); - *beeperPwm.channel.ccr = 0; - beeperPwm.enabled = false; - } + *beeperPwm.channel.ccr = 0; + beeperPwm.enabled = false; + } } #endif