@@ -64,11 +64,11 @@ esp_err_t esp_isp_blc_configure(isp_proc_handle_t isp_proc, const esp_isp_blc_co
6464esp_err_t esp_isp_blc_enable (isp_proc_handle_t isp_proc )
6565{
6666 ESP_RETURN_ON_FALSE (isp_proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
67- ESP_RETURN_ON_FALSE (isp_proc -> blc_fsm == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "blc is enabled already" );
67+ isp_fsm_t expected_fsm = ISP_FSM_INIT ;
68+ ESP_RETURN_ON_FALSE (atomic_compare_exchange_strong (& isp_proc -> blc_fsm , & expected_fsm , ISP_FSM_ENABLE ), ESP_ERR_INVALID_STATE , TAG , "blc is enabled already" );
6869
6970 // Enable BLC module
7071 isp_ll_blc_enable (isp_proc -> hal .hw , true);
71- isp_proc -> blc_fsm = ISP_FSM_ENABLE ;
7272
7373 ESP_LOGD (TAG , "BLC enabled" );
7474 return ESP_OK ;
@@ -77,7 +77,7 @@ esp_err_t esp_isp_blc_enable(isp_proc_handle_t isp_proc)
7777esp_err_t esp_isp_blc_set_correction_offset (isp_proc_handle_t isp_proc , esp_isp_blc_offset_t * offset )
7878{
7979 ESP_RETURN_ON_FALSE (isp_proc && offset , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
80- ESP_RETURN_ON_FALSE (isp_proc -> blc_fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "blc isn't enabled yet" );
80+ ESP_RETURN_ON_FALSE (atomic_load ( & isp_proc -> blc_fsm ) == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "blc isn't enabled yet" );
8181
8282 // Set correction offset for each channel
8383 isp_ll_blc_set_correction_offset (isp_proc -> hal .hw , offset -> top_left_chan_offset , offset -> top_right_chan_offset , offset -> bottom_left_chan_offset , offset -> bottom_right_chan_offset );
@@ -92,11 +92,11 @@ esp_err_t esp_isp_blc_set_correction_offset(isp_proc_handle_t isp_proc, esp_isp_
9292esp_err_t esp_isp_blc_disable (isp_proc_handle_t isp_proc )
9393{
9494 ESP_RETURN_ON_FALSE (isp_proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
95- ESP_RETURN_ON_FALSE (isp_proc -> blc_fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "blc isn't enabled yet" );
95+ isp_fsm_t expected_fsm = ISP_FSM_ENABLE ;
96+ ESP_RETURN_ON_FALSE (atomic_compare_exchange_strong (& isp_proc -> blc_fsm , & expected_fsm , ISP_FSM_INIT ), ESP_ERR_INVALID_STATE , TAG , "blc isn't enabled yet" );
9697
9798 // Disable BLC module
9899 isp_ll_blc_enable (isp_proc -> hal .hw , false);
99- isp_proc -> blc_fsm = ISP_FSM_INIT ;
100100
101101 ESP_LOGD (TAG , "BLC disabled" );
102102 return ESP_OK ;
0 commit comments