@@ -18,6 +18,7 @@ typedef struct isp_awb_controller_t {
1818 isp_fsm_t fsm ;
1919 portMUX_TYPE spinlock ;
2020 intr_handle_t intr_handle ;
21+ int intr_priority ;
2122 isp_proc_handle_t isp_proc ;
2223 QueueHandle_t evt_que ;
2324 SemaphoreHandle_t stat_lock ;
@@ -72,6 +73,25 @@ static void s_isp_awb_free_controller(isp_awb_ctlr_t awb_ctlr)
7273 }
7374}
7475
76+ static esp_err_t s_esp_isp_awb_config_hardware (isp_proc_handle_t isp_proc , const esp_isp_awb_config_t * awb_cfg )
77+ {
78+ isp_ll_awb_set_sample_point (isp_proc -> hal .hw , awb_cfg -> sample_point );
79+ ESP_RETURN_ON_FALSE (isp_hal_awb_set_window_range (& isp_proc -> hal , & awb_cfg -> window ),
80+ ESP_ERR_INVALID_ARG , TAG , "invalid window" );
81+ isp_u32_range_t lum_range = awb_cfg -> white_patch .luminance ;
82+ ESP_RETURN_ON_FALSE (isp_hal_awb_set_luminance_range (& isp_proc -> hal , lum_range .min , lum_range .max ),
83+ ESP_ERR_INVALID_ARG , TAG , "invalid luminance range" );
84+ isp_float_range_t rg_range = awb_cfg -> white_patch .red_green_ratio ;
85+ ESP_RETURN_ON_FALSE (rg_range .min < rg_range .max && rg_range .min >= 0 &&
86+ isp_hal_awb_set_rg_ratio_range (& isp_proc -> hal , rg_range .min , rg_range .max ),
87+ ESP_ERR_INVALID_ARG , TAG , "invalid range of Red Green ratio" );
88+ isp_float_range_t bg_range = awb_cfg -> white_patch .blue_green_ratio ;
89+ ESP_RETURN_ON_FALSE (bg_range .min < bg_range .max && bg_range .min >= 0 &&
90+ isp_hal_awb_set_bg_ratio_range (& isp_proc -> hal , bg_range .min , bg_range .max ),
91+ ESP_ERR_INVALID_ARG , TAG , "invalid range of Blue to Green ratio" );
92+ return ESP_OK ;
93+ }
94+
7595esp_err_t esp_isp_new_awb_controller (isp_proc_handle_t isp_proc , const esp_isp_awb_config_t * awb_cfg , isp_awb_ctlr_t * ret_hdl )
7696{
7797 esp_err_t ret = ESP_FAIL ;
@@ -91,27 +111,14 @@ esp_err_t esp_isp_new_awb_controller(isp_proc_handle_t isp_proc, const esp_isp_a
91111 ESP_GOTO_ON_ERROR (s_isp_claim_awb_controller (isp_proc , awb_ctlr ), err1 , TAG , "no available controller" );
92112 // Register the AWB ISR
93113 uint32_t intr_st_reg_addr = isp_ll_get_intr_status_reg_addr (isp_proc -> hal .hw );
94- int intr_priority = awb_cfg -> intr_priority > 0 && awb_cfg -> intr_priority <= 7 ? BIT (awb_cfg -> intr_priority ) : ESP_INTR_FLAG_LOWMED ;
95- ESP_GOTO_ON_ERROR (esp_intr_alloc_intrstatus (isp_hw_info .instances [isp_proc -> proc_id ].irq , ISP_INTR_ALLOC_FLAGS | intr_priority , intr_st_reg_addr , ISP_LL_EVENT_AWB_MASK ,
114+ awb_ctlr -> intr_priority = awb_cfg -> intr_priority > 0 && awb_cfg -> intr_priority <= 3 ? BIT (awb_cfg -> intr_priority ) : ESP_INTR_FLAG_LOWMED ;
115+ ESP_GOTO_ON_ERROR (esp_intr_alloc_intrstatus (isp_hw_info .instances [isp_proc -> proc_id ].irq , ISP_INTR_ALLOC_FLAGS | awb_ctlr -> intr_priority , intr_st_reg_addr , ISP_LL_EVENT_AWB_MASK ,
96116 s_isp_awb_default_isr , awb_ctlr , & awb_ctlr -> intr_handle ), err2 , TAG , "allocate interrupt failed" );
97117
98118 // Configure the hardware
99119 isp_ll_awb_enable (isp_proc -> hal .hw , false);
100- isp_ll_awb_set_sample_point (isp_proc -> hal .hw , awb_cfg -> sample_point );
101120 isp_ll_awb_enable_algorithm_mode (isp_proc -> hal .hw , true);
102- ESP_GOTO_ON_FALSE (isp_hal_awb_set_window_range (& isp_proc -> hal , & awb_cfg -> window ),
103- ESP_ERR_INVALID_ARG , err2 , TAG , "invalid window" );
104- isp_u32_range_t lum_range = awb_cfg -> white_patch .luminance ;
105- ESP_GOTO_ON_FALSE (isp_hal_awb_set_luminance_range (& isp_proc -> hal , lum_range .min , lum_range .max ),
106- ESP_ERR_INVALID_ARG , err2 , TAG , "invalid luminance range" );
107- isp_float_range_t rg_range = awb_cfg -> white_patch .red_green_ratio ;
108- ESP_GOTO_ON_FALSE (rg_range .min < rg_range .max && rg_range .min >= 0 &&
109- isp_hal_awb_set_rg_ratio_range (& isp_proc -> hal , rg_range .min , rg_range .max ),
110- ESP_ERR_INVALID_ARG , err2 , TAG , "invalid range of Red Green ratio" );
111- isp_float_range_t bg_range = awb_cfg -> white_patch .blue_green_ratio ;
112- ESP_GOTO_ON_FALSE (bg_range .min < bg_range .max && bg_range .min >= 0 &&
113- isp_hal_awb_set_bg_ratio_range (& isp_proc -> hal , bg_range .min , bg_range .max ),
114- ESP_ERR_INVALID_ARG , err2 , TAG , "invalid range of Blue to Green ratio" );
121+ ESP_GOTO_ON_ERROR (s_esp_isp_awb_config_hardware (isp_proc , awb_cfg ), err2 , TAG , "configure awb hardware failed" );
115122
116123 * ret_hdl = awb_ctlr ;
117124
@@ -138,6 +145,15 @@ esp_err_t esp_isp_del_awb_controller(isp_awb_ctlr_t awb_ctlr)
138145 return ESP_OK ;
139146}
140147
148+ esp_err_t esp_isp_awb_controller_reconfig (isp_awb_ctlr_t awb_ctlr , const esp_isp_awb_config_t * awb_cfg )
149+ {
150+ ESP_RETURN_ON_FALSE (awb_ctlr && awb_cfg , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
151+ int intr_priority = awb_cfg -> intr_priority > 0 && awb_cfg -> intr_priority <= 3 ? BIT (awb_cfg -> intr_priority ) : ESP_INTR_FLAG_LOWMED ;
152+ ESP_RETURN_ON_FALSE (intr_priority == awb_ctlr -> intr_priority , ESP_ERR_INVALID_ARG , TAG , "can't change interrupt priority after initialized" );
153+
154+ return s_esp_isp_awb_config_hardware (awb_ctlr -> isp_proc , awb_cfg );
155+ }
156+
141157esp_err_t esp_isp_awb_controller_enable (isp_awb_ctlr_t awb_ctlr )
142158{
143159 ESP_RETURN_ON_FALSE (awb_ctlr && awb_ctlr -> isp_proc , ESP_ERR_INVALID_ARG , TAG , "invalid argument: null pointer" );
0 commit comments