Fix furi_hal_bus related crashes in plugins (#2799)
* Fix furi_hal_bus issues in plugins * Rework pwm is running check * ApiSymbols: update and sync targets Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
e52fdcf109
commit
ee96e34767
@ -60,7 +60,9 @@ static int32_t avr_isp_worker_rw_thread(void* context) {
|
|||||||
AvrIspWorkerRW* instance = context;
|
AvrIspWorkerRW* instance = context;
|
||||||
|
|
||||||
/* start PWM on &gpio_ext_pa4 */
|
/* start PWM on &gpio_ext_pa4 */
|
||||||
furi_hal_pwm_start(FuriHalPwmOutputIdLptim2PA4, 4000000, 50);
|
if(!furi_hal_pwm_is_running(FuriHalPwmOutputIdLptim2PA4)) {
|
||||||
|
furi_hal_pwm_start(FuriHalPwmOutputIdLptim2PA4, 4000000, 50);
|
||||||
|
}
|
||||||
|
|
||||||
FURI_LOG_D(TAG, "Start");
|
FURI_LOG_D(TAG, "Start");
|
||||||
|
|
||||||
@ -122,7 +124,9 @@ static int32_t avr_isp_worker_rw_thread(void* context) {
|
|||||||
}
|
}
|
||||||
FURI_LOG_D(TAG, "Stop");
|
FURI_LOG_D(TAG, "Stop");
|
||||||
|
|
||||||
furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4);
|
if(furi_hal_pwm_is_running(FuriHalPwmOutputIdLptim2PA4)) {
|
||||||
|
furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -136,7 +140,12 @@ bool avr_isp_worker_rw_detect_chip(AvrIspWorkerRW* instance) {
|
|||||||
instance->chip_arr_ind = avr_isp_chip_arr_size + 1;
|
instance->chip_arr_ind = avr_isp_chip_arr_size + 1;
|
||||||
|
|
||||||
/* start PWM on &gpio_ext_pa4 */
|
/* start PWM on &gpio_ext_pa4 */
|
||||||
furi_hal_pwm_start(FuriHalPwmOutputIdLptim2PA4, 4000000, 50);
|
bool was_pwm_enabled = false;
|
||||||
|
if(!furi_hal_pwm_is_running(FuriHalPwmOutputIdLptim2PA4)) {
|
||||||
|
furi_hal_pwm_start(FuriHalPwmOutputIdLptim2PA4, 4000000, 50);
|
||||||
|
} else {
|
||||||
|
was_pwm_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if(!avr_isp_auto_set_spi_speed_start_pmode(instance->avr_isp)) {
|
if(!avr_isp_auto_set_spi_speed_start_pmode(instance->avr_isp)) {
|
||||||
@ -200,7 +209,9 @@ bool avr_isp_worker_rw_detect_chip(AvrIspWorkerRW* instance) {
|
|||||||
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4);
|
if(furi_hal_pwm_is_running(FuriHalPwmOutputIdLptim2PA4) && !was_pwm_enabled) {
|
||||||
|
furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4);
|
||||||
|
}
|
||||||
|
|
||||||
if(instance->callback) {
|
if(instance->callback) {
|
||||||
if(instance->chip_arr_ind > avr_isp_chip_arr_size) {
|
if(instance->chip_arr_ind > avr_isp_chip_arr_size) {
|
||||||
|
|||||||
@ -33,7 +33,13 @@ void signal_gen_scene_pwm_on_enter(void* context) {
|
|||||||
signal_gen_pwm_set_callback(app->pwm_view, signal_gen_pwm_callback, app);
|
signal_gen_pwm_set_callback(app->pwm_view, signal_gen_pwm_callback, app);
|
||||||
|
|
||||||
signal_gen_pwm_set_params(app->pwm_view, 0, DEFAULT_FREQ, DEFAULT_DUTY);
|
signal_gen_pwm_set_params(app->pwm_view, 0, DEFAULT_FREQ, DEFAULT_DUTY);
|
||||||
furi_hal_pwm_start(pwm_ch_id[0], DEFAULT_FREQ, DEFAULT_DUTY);
|
|
||||||
|
if(!furi_hal_pwm_is_running(pwm_ch_id[0])) {
|
||||||
|
furi_hal_pwm_start(pwm_ch_id[0], DEFAULT_FREQ, DEFAULT_DUTY);
|
||||||
|
} else {
|
||||||
|
furi_hal_pwm_stop(pwm_ch_id[0]);
|
||||||
|
furi_hal_pwm_start(pwm_ch_id[0], DEFAULT_FREQ, DEFAULT_DUTY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool signal_gen_scene_pwm_on_event(void* context, SceneManagerEvent event) {
|
bool signal_gen_scene_pwm_on_event(void* context, SceneManagerEvent event) {
|
||||||
@ -46,8 +52,18 @@ bool signal_gen_scene_pwm_on_event(void* context, SceneManagerEvent event) {
|
|||||||
furi_hal_pwm_set_params(app->pwm_ch, app->pwm_freq, app->pwm_duty);
|
furi_hal_pwm_set_params(app->pwm_ch, app->pwm_freq, app->pwm_duty);
|
||||||
} else if(event.event == SignalGenPwmEventChannelChange) {
|
} else if(event.event == SignalGenPwmEventChannelChange) {
|
||||||
consumed = true;
|
consumed = true;
|
||||||
furi_hal_pwm_stop(app->pwm_ch_prev);
|
// Stop previous channel PWM
|
||||||
furi_hal_pwm_start(app->pwm_ch, app->pwm_freq, app->pwm_duty);
|
if(furi_hal_pwm_is_running(app->pwm_ch_prev)) {
|
||||||
|
furi_hal_pwm_stop(app->pwm_ch_prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start PWM and restart if it was starter already
|
||||||
|
if(furi_hal_pwm_is_running(app->pwm_ch)) {
|
||||||
|
furi_hal_pwm_stop(app->pwm_ch);
|
||||||
|
furi_hal_pwm_start(app->pwm_ch, app->pwm_freq, app->pwm_duty);
|
||||||
|
} else {
|
||||||
|
furi_hal_pwm_start(app->pwm_ch, app->pwm_freq, app->pwm_duty);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return consumed;
|
return consumed;
|
||||||
@ -56,5 +72,8 @@ bool signal_gen_scene_pwm_on_event(void* context, SceneManagerEvent event) {
|
|||||||
void signal_gen_scene_pwm_on_exit(void* context) {
|
void signal_gen_scene_pwm_on_exit(void* context) {
|
||||||
SignalGenApp* app = context;
|
SignalGenApp* app = context;
|
||||||
variable_item_list_reset(app->var_item_list);
|
variable_item_list_reset(app->var_item_list);
|
||||||
furi_hal_pwm_stop(app->pwm_ch);
|
|
||||||
|
if(furi_hal_pwm_is_running(app->pwm_ch)) {
|
||||||
|
furi_hal_pwm_stop(app->pwm_ch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,31.1,,
|
Version,+,31.2,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
@ -1061,6 +1061,7 @@ Function,+,furi_hal_power_sleep,void,
|
|||||||
Function,+,furi_hal_power_sleep_available,_Bool,
|
Function,+,furi_hal_power_sleep_available,_Bool,
|
||||||
Function,+,furi_hal_power_suppress_charge_enter,void,
|
Function,+,furi_hal_power_suppress_charge_enter,void,
|
||||||
Function,+,furi_hal_power_suppress_charge_exit,void,
|
Function,+,furi_hal_power_suppress_charge_exit,void,
|
||||||
|
Function,+,furi_hal_pwm_is_running,_Bool,FuriHalPwmOutputId
|
||||||
Function,+,furi_hal_pwm_set_params,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
Function,+,furi_hal_pwm_set_params,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
||||||
Function,+,furi_hal_pwm_start,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
Function,+,furi_hal_pwm_start,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
||||||
Function,+,furi_hal_pwm_stop,void,FuriHalPwmOutputId
|
Function,+,furi_hal_pwm_stop,void,FuriHalPwmOutputId
|
||||||
|
|||||||
|
@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,31.1,,
|
Version,+,31.2,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
@ -1286,6 +1286,7 @@ Function,+,furi_hal_power_sleep,void,
|
|||||||
Function,+,furi_hal_power_sleep_available,_Bool,
|
Function,+,furi_hal_power_sleep_available,_Bool,
|
||||||
Function,+,furi_hal_power_suppress_charge_enter,void,
|
Function,+,furi_hal_power_suppress_charge_enter,void,
|
||||||
Function,+,furi_hal_power_suppress_charge_exit,void,
|
Function,+,furi_hal_power_suppress_charge_exit,void,
|
||||||
|
Function,+,furi_hal_pwm_is_running,_Bool,FuriHalPwmOutputId
|
||||||
Function,+,furi_hal_pwm_set_params,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
Function,+,furi_hal_pwm_set_params,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
||||||
Function,+,furi_hal_pwm_start,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
Function,+,furi_hal_pwm_start,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
||||||
Function,+,furi_hal_pwm_stop,void,FuriHalPwmOutputId
|
Function,+,furi_hal_pwm_stop,void,FuriHalPwmOutputId
|
||||||
|
|||||||
|
@ -82,6 +82,15 @@ void furi_hal_pwm_stop(FuriHalPwmOutputId channel) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool furi_hal_pwm_is_running(FuriHalPwmOutputId channel) {
|
||||||
|
if(channel == FuriHalPwmOutputIdTim1PA7) {
|
||||||
|
return furi_hal_bus_is_enabled(FuriHalBusTIM1);
|
||||||
|
} else if(channel == FuriHalPwmOutputIdLptim2PA4) {
|
||||||
|
return furi_hal_bus_is_enabled(FuriHalBusLPTIM2);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void furi_hal_pwm_set_params(FuriHalPwmOutputId channel, uint32_t freq, uint8_t duty) {
|
void furi_hal_pwm_set_params(FuriHalPwmOutputId channel, uint32_t freq, uint8_t duty) {
|
||||||
furi_assert(freq > 0);
|
furi_assert(freq > 0);
|
||||||
uint32_t freq_div = 64000000LU / freq;
|
uint32_t freq_div = 64000000LU / freq;
|
||||||
|
|||||||
@ -9,6 +9,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FuriHalPwmOutputIdTim1PA7,
|
FuriHalPwmOutputIdTim1PA7,
|
||||||
@ -37,6 +38,13 @@ void furi_hal_pwm_stop(FuriHalPwmOutputId channel);
|
|||||||
*/
|
*/
|
||||||
void furi_hal_pwm_set_params(FuriHalPwmOutputId channel, uint32_t freq, uint8_t duty);
|
void furi_hal_pwm_set_params(FuriHalPwmOutputId channel, uint32_t freq, uint8_t duty);
|
||||||
|
|
||||||
|
/** Is PWM channel running?
|
||||||
|
*
|
||||||
|
* @param[in] channel PWM channel (FuriHalPwmOutputId)
|
||||||
|
* @return bool - true if running
|
||||||
|
*/
|
||||||
|
bool furi_hal_pwm_is_running(FuriHalPwmOutputId channel);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user