From a5e69393d550691d53ac2af32782ca43ca1b3adb Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Wed, 24 Dec 2025 17:09:50 +0800 Subject: [PATCH] fix(esp_driver_isp): Fix AWB subwindown compatibility for ESP32-P4 ECO4 --- components/esp_driver_isp/src/isp_awb.c | 60 +++++++++++++------------ 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/components/esp_driver_isp/src/isp_awb.c b/components/esp_driver_isp/src/isp_awb.c index c34c2392aa..1332a85cef 100644 --- a/components/esp_driver_isp/src/isp_awb.c +++ b/components/esp_driver_isp/src/isp_awb.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -84,38 +84,40 @@ static esp_err_t s_esp_isp_awb_config_hardware(isp_proc_handle_t isp_proc, const if (!subwindow_is_zero) { ESP_LOGW(TAG, "Subwindow feature is not supported on REV < 3.0, subwindow will not be configured"); } - } + } else { + // Subwindow is just checked and configured on REV >= 3.0 + isp_window_t subwindow = awb_cfg->subwindow; + ESP_RETURN_ON_FALSE( + (subwindow.top_left.x >= awb_cfg->window.top_left.x) && + (subwindow.top_left.y >= awb_cfg->window.top_left.y) && + (subwindow.btm_right.x <= awb_cfg->window.btm_right.x) && + (subwindow.btm_right.y <= awb_cfg->window.btm_right.y), + ESP_ERR_INVALID_ARG, TAG, "subwindow exceeds window range" + ); - isp_window_t subwindow = awb_cfg->subwindow; - ESP_RETURN_ON_FALSE( - (subwindow.top_left.x >= awb_cfg->window.top_left.x) && - (subwindow.top_left.y >= awb_cfg->window.top_left.y) && - (subwindow.btm_right.x <= awb_cfg->window.btm_right.x) && - (subwindow.btm_right.y <= awb_cfg->window.btm_right.y), - ESP_ERR_INVALID_ARG, TAG, "subwindow exceeds window range" - ); + if ((subwindow.btm_right.x - subwindow.top_left.x + 1) / ISP_AWB_WINDOW_X_NUM < 4 || + (subwindow.btm_right.y - subwindow.top_left.y + 1) / ISP_AWB_WINDOW_Y_NUM < 4) { + int block_width = (int)((subwindow.btm_right.x - subwindow.top_left.x + 1) / ISP_AWB_WINDOW_X_NUM); + int block_height = (int)((subwindow.btm_right.y - subwindow.top_left.y + 1) / ISP_AWB_WINDOW_Y_NUM); + ESP_LOGE(TAG, "subwindow block size is too small: width and height must be at least 4 (got %d x %d)", + block_width, block_height); + return ESP_ERR_INVALID_ARG; + } - if ((subwindow.btm_right.x - subwindow.top_left.x + 1) / ISP_AWB_WINDOW_X_NUM < 4 || - (subwindow.btm_right.y - subwindow.top_left.y + 1) / ISP_AWB_WINDOW_Y_NUM < 4) { - ESP_LOGE(TAG, "subwindow block size is too small: width and height must be at least 4 (got %"PRIu32" x %"PRIu32")", - (subwindow.btm_right.x - subwindow.top_left.x + 1) / ISP_AWB_WINDOW_X_NUM, - (subwindow.btm_right.y - subwindow.top_left.y + 1) / ISP_AWB_WINDOW_Y_NUM); - return ESP_ERR_INVALID_ARG; + int size_x = subwindow.btm_right.x - subwindow.top_left.x + 1; + int size_y = subwindow.btm_right.y - subwindow.top_left.y + 1; + if ((size_x % ISP_AWB_WINDOW_X_NUM != 0) || (size_y % ISP_AWB_WINDOW_Y_NUM != 0)) { + ESP_LOGW(TAG, "subwindow size (%d x %d) is not divisible by AWB subwindow blocks grid (%d x %d). \ + Resolution will be floored to the nearest divisible value.", + size_x, size_y, ISP_AWB_WINDOW_X_NUM, ISP_AWB_WINDOW_Y_NUM); + // floor to the nearest divisible value + subwindow.btm_right.x -= size_x % ISP_AWB_WINDOW_X_NUM; + subwindow.btm_right.y -= size_y % ISP_AWB_WINDOW_Y_NUM; + } + ESP_RETURN_ON_FALSE(isp_hal_awb_set_subwindow_range(&isp_proc->hal, &subwindow), + ESP_ERR_INVALID_ARG, TAG, "invalid subwindow range"); } - int size_x = subwindow.btm_right.x - subwindow.top_left.x + 1; - int size_y = subwindow.btm_right.y - subwindow.top_left.y + 1; - if ((size_x % ISP_AWB_WINDOW_X_NUM != 0) || (size_y % ISP_AWB_WINDOW_Y_NUM != 0)) { - ESP_LOGW(TAG, "subwindow size (%d x %d) is not divisible by AWB subwindow blocks grid (%d x %d). \ - Resolution will be floored to the nearest divisible value.", - size_x, size_y, ISP_AWB_WINDOW_X_NUM, ISP_AWB_WINDOW_Y_NUM); - // floor to the nearest divisible value - subwindow.btm_right.x -= size_x % ISP_AWB_WINDOW_X_NUM; - subwindow.btm_right.y -= size_y % ISP_AWB_WINDOW_Y_NUM; - } - ESP_RETURN_ON_FALSE(isp_hal_awb_set_subwindow_range(&isp_proc->hal, &subwindow), - ESP_ERR_INVALID_ARG, TAG, "invalid subwindow range"); - isp_u32_range_t lum_range = awb_cfg->white_patch.luminance; ESP_RETURN_ON_FALSE(isp_hal_awb_set_luminance_range(&isp_proc->hal, lum_range.min, lum_range.max), ESP_ERR_INVALID_ARG, TAG, "invalid luminance range");