@@ -119,7 +119,16 @@ esp_err_t esp_isp_new_processor(const esp_isp_processor_cfg_t *proc_config, isp_
119119 isp_ll_set_clock_div (proc -> hal .hw , & clk_div );
120120 }
121121 proc -> clk_src = clk_src ;
122- proc -> isp_fsm = ISP_FSM_INIT ;
122+ atomic_init (& proc -> isp_fsm , ISP_FSM_INIT );
123+ atomic_init (& proc -> bf_fsm , ISP_FSM_INIT );
124+ atomic_init (& proc -> blc_fsm , ISP_FSM_INIT );
125+ atomic_init (& proc -> ccm_fsm , ISP_FSM_INIT );
126+ atomic_init (& proc -> color_fsm , ISP_FSM_INIT );
127+ atomic_init (& proc -> demosaic_fsm , ISP_FSM_INIT );
128+ atomic_init (& proc -> gamma_fsm , ISP_FSM_INIT );
129+ atomic_init (& proc -> lsc_fsm , ISP_FSM_INIT );
130+ atomic_init (& proc -> sharpen_fsm , ISP_FSM_INIT );
131+ atomic_init (& proc -> wbg_fsm , ISP_FSM_INIT );
123132 proc -> spinlock = (portMUX_TYPE )portMUX_INITIALIZER_UNLOCKED ;
124133
125134 //Input & Output color format
@@ -189,7 +198,7 @@ esp_err_t esp_isp_new_processor(const esp_isp_processor_cfg_t *proc_config, isp_
189198esp_err_t esp_isp_del_processor (isp_proc_handle_t proc )
190199{
191200 ESP_RETURN_ON_FALSE (proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
192- ESP_RETURN_ON_FALSE (proc -> isp_fsm == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "processor isn't in init state" );
201+ ESP_RETURN_ON_FALSE (atomic_load ( & proc -> isp_fsm ) == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "processor isn't in init state" );
193202
194203 //declaim first, then do free
195204 ESP_RETURN_ON_ERROR (s_isp_declaim_processor (proc ), TAG , "declaim processor fail" );
@@ -205,7 +214,7 @@ esp_err_t esp_isp_del_processor(isp_proc_handle_t proc)
205214esp_err_t esp_isp_register_event_callbacks (isp_proc_handle_t proc , const esp_isp_evt_cbs_t * cbs , void * user_data )
206215{
207216 ESP_RETURN_ON_FALSE (proc && cbs , ESP_ERR_INVALID_ARG , TAG , "invalid argument" );
208- ESP_RETURN_ON_FALSE (proc -> isp_fsm == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "processor isn't in the init state" );
217+ ESP_RETURN_ON_FALSE (atomic_load ( & proc -> isp_fsm ) == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "processor isn't in the init state" );
209218
210219#if CONFIG_ISP_ISR_IRAM_SAFE
211220 if (cbs -> on_sharpen_frame_done ) {
@@ -230,22 +239,22 @@ esp_err_t esp_isp_register_event_callbacks(isp_proc_handle_t proc, const esp_isp
230239esp_err_t esp_isp_enable (isp_proc_handle_t proc )
231240{
232241 ESP_RETURN_ON_FALSE (proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
233- ESP_RETURN_ON_FALSE (proc -> isp_fsm == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "processor isn't in init state" );
242+ isp_fsm_t expected_fsm = ISP_FSM_INIT ;
243+ ESP_RETURN_ON_FALSE (atomic_compare_exchange_strong (& proc -> isp_fsm , & expected_fsm , ISP_FSM_ENABLE ), ESP_ERR_INVALID_STATE , TAG , "processor isn't in init state" );
234244 ESP_RETURN_ON_FALSE (proc -> bypass_isp == false, ESP_ERR_INVALID_STATE , TAG , "processor is configured to be bypassed" );
235245
236246 isp_ll_enable (proc -> hal .hw , true);
237- proc -> isp_fsm = ISP_FSM_ENABLE ;
238247
239248 return ESP_OK ;
240249}
241250
242251esp_err_t esp_isp_disable (isp_proc_handle_t proc )
243252{
244253 ESP_RETURN_ON_FALSE (proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
245- ESP_RETURN_ON_FALSE (proc -> isp_fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "processor isn't in enable state" );
254+ isp_fsm_t expected_fsm = ISP_FSM_ENABLE ;
255+ ESP_RETURN_ON_FALSE (atomic_compare_exchange_strong (& proc -> isp_fsm , & expected_fsm , ISP_FSM_INIT ), ESP_ERR_INVALID_STATE , TAG , "processor isn't in enable state" );
246256
247257 isp_ll_enable (proc -> hal .hw , false);
248- proc -> isp_fsm = ISP_FSM_INIT ;
249258
250259 return ESP_OK ;
251260}
0 commit comments