1212#include "esp_check.h"
1313#include "esp_heap_caps.h"
1414#include "driver/isp_awb.h"
15- #include "isp_internal .h"
15+ #include "esp_private/isp_private .h"
1616
1717typedef struct isp_awb_controller_t {
1818 isp_fsm_t fsm ;
@@ -142,40 +142,43 @@ esp_err_t esp_isp_awb_controller_enable(isp_awb_ctlr_t awb_ctlr)
142142{
143143 ESP_RETURN_ON_FALSE (awb_ctlr && awb_ctlr -> isp_proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
144144 ESP_RETURN_ON_FALSE (awb_ctlr -> fsm == ISP_FSM_INIT , ESP_ERR_INVALID_STATE , TAG , "controller isn't in init state" );
145+ awb_ctlr -> fsm = ISP_FSM_ENABLE ;
145146
146- esp_intr_enable (awb_ctlr -> intr_handle );
147+ esp_err_t ret = ESP_OK ;
148+ ESP_GOTO_ON_ERROR (esp_intr_enable (awb_ctlr -> intr_handle ), err , TAG , "failed to enable the AWB interrupt" );
147149 isp_ll_awb_clk_enable (awb_ctlr -> isp_proc -> hal .hw , true);
148150 isp_ll_enable_intr (awb_ctlr -> isp_proc -> hal .hw , ISP_LL_EVENT_AWB_MASK , true);
149151 xSemaphoreGive (awb_ctlr -> stat_lock );
150- awb_ctlr -> fsm = ISP_FSM_ENABLE ;
151152
152- return ESP_OK ;
153+ return ret ;
154+ err :
155+ awb_ctlr -> fsm = ISP_FSM_INIT ;
156+ return ret ;
153157}
154158
155159esp_err_t esp_isp_awb_controller_disable (isp_awb_ctlr_t awb_ctlr )
156160{
157161 ESP_RETURN_ON_FALSE (awb_ctlr && awb_ctlr -> isp_proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
158162 ESP_RETURN_ON_FALSE (awb_ctlr -> fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "controller isn't in enable state" );
163+ xSemaphoreTake (awb_ctlr -> stat_lock , 0 );
164+ awb_ctlr -> fsm = ISP_FSM_INIT ;
159165
160166 isp_ll_enable_intr (awb_ctlr -> isp_proc -> hal .hw , ISP_LL_EVENT_AWB_MASK , false);
161167 isp_ll_awb_clk_enable (awb_ctlr -> isp_proc -> hal .hw , false);
162168 esp_intr_disable (awb_ctlr -> intr_handle );
163- awb_ctlr -> fsm = ISP_FSM_INIT ;
164- xSemaphoreTake (awb_ctlr -> stat_lock , 0 );
165169
166170 return ESP_OK ;
167171}
168172
169173esp_err_t esp_isp_awb_controller_get_oneshot_statistics (isp_awb_ctlr_t awb_ctlr , int timeout_ms , isp_awb_stat_result_t * out_res )
170174{
171- ESP_RETURN_ON_FALSE_ISR (awb_ctlr && (out_res || timeout_ms == 0 ), ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
172- ESP_RETURN_ON_FALSE_ISR ( awb_ctlr -> fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "controller isn't in enable state" ) ;
175+ ESP_RETURN_ON_FALSE (awb_ctlr && (out_res || timeout_ms == 0 ), ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
176+ esp_err_t ret = ESP_OK ;
173177 TickType_t ticks = timeout_ms < 0 ? portMAX_DELAY : pdMS_TO_TICKS (timeout_ms );
174-
175178 xSemaphoreTake (awb_ctlr -> stat_lock , ticks );
179+ ESP_GOTO_ON_FALSE (awb_ctlr -> fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , err , TAG , "controller isn't in enable state" );
176180 // Update state to avoid race condition
177181 awb_ctlr -> fsm = ISP_FSM_START ;
178- esp_err_t ret = ESP_OK ;
179182 // Reset the queue in case receiving the legacy data in the queue
180183 xQueueReset (awb_ctlr -> evt_que );
181184 // Start the AWB white patch statistics and waiting it done
@@ -187,30 +190,34 @@ esp_err_t esp_isp_awb_controller_get_oneshot_statistics(isp_awb_ctlr_t awb_ctlr,
187190 // Stop the AWB white patch statistics
188191 isp_ll_awb_enable (awb_ctlr -> isp_proc -> hal .hw , false);
189192 awb_ctlr -> fsm = ISP_FSM_ENABLE ;
193+ err :
190194 xSemaphoreGive (awb_ctlr -> stat_lock );
191-
192195 return ret ;
193196}
194197
195198esp_err_t esp_isp_awb_controller_start_continuous_statistics (isp_awb_ctlr_t awb_ctlr )
196199{
197- ESP_RETURN_ON_FALSE_ISR (awb_ctlr , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
198- ESP_RETURN_ON_FALSE_ISR (awb_ctlr -> fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , TAG , "controller isn't in enable state " );
199-
200+ ESP_RETURN_ON_FALSE (awb_ctlr , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
201+ ESP_RETURN_ON_FALSE (awb_ctlr -> cbs . on_statistics_done , ESP_ERR_INVALID_STATE , TAG , "invalid state: on_statistics_done callback not registered " );
202+ esp_err_t ret = ESP_OK ;
200203 if (xSemaphoreTake (awb_ctlr -> stat_lock , 0 ) == pdFALSE ) {
201204 ESP_LOGW (TAG , "statistics lock is not acquired, controller is busy" );
202205 return ESP_ERR_INVALID_STATE ;
203206 }
207+ ESP_GOTO_ON_FALSE (awb_ctlr -> fsm == ISP_FSM_ENABLE , ESP_ERR_INVALID_STATE , err , TAG , "controller isn't in enable state" );
204208 awb_ctlr -> fsm = ISP_FSM_START ;
205209 isp_ll_awb_enable (awb_ctlr -> isp_proc -> hal .hw , true);
206210
207- return ESP_OK ;
211+ return ret ;
212+ err :
213+ xSemaphoreGive (awb_ctlr -> stat_lock );
214+ return ret ;
208215}
209216
210217esp_err_t esp_isp_awb_controller_stop_continuous_statistics (isp_awb_ctlr_t awb_ctlr )
211218{
212- ESP_RETURN_ON_FALSE_ISR (awb_ctlr , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
213- ESP_RETURN_ON_FALSE_ISR (awb_ctlr -> fsm == ISP_FSM_START , ESP_ERR_INVALID_STATE , TAG , "controller isn't in continuous state" );
219+ ESP_RETURN_ON_FALSE (awb_ctlr , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
220+ ESP_RETURN_ON_FALSE (awb_ctlr -> fsm == ISP_FSM_START , ESP_ERR_INVALID_STATE , TAG , "controller isn't in continuous state" );
214221
215222 isp_ll_awb_enable (awb_ctlr -> isp_proc -> hal .hw , false);
216223 awb_ctlr -> fsm = ISP_FSM_ENABLE ;
@@ -236,7 +243,7 @@ static void IRAM_ATTR s_isp_awb_default_isr(void *arg)
236243 // Get the statistics result
237244 esp_isp_awb_evt_data_t edata = {
238245 .awb_result = {
239- .white_patch_num = isp_ll_awb_get_white_patcherence_cnt (proc -> hal .hw ),
246+ .white_patch_num = isp_ll_awb_get_white_patch_cnt (proc -> hal .hw ),
240247 .sum_r = isp_ll_awb_get_accumulated_r_value (proc -> hal .hw ),
241248 .sum_g = isp_ll_awb_get_accumulated_g_value (proc -> hal .hw ),
242249 .sum_b = isp_ll_awb_get_accumulated_b_value (proc -> hal .hw ),
0 commit comments