From 5949cd5cd32367f57b44b37d5abe2f923b46f40e Mon Sep 17 00:00:00 2001 From: armando Date: Mon, 5 Jan 2026 15:58:08 +0800 Subject: [PATCH] fix(isp): fixed awb subwindow always need to be set issue --- components/esp_driver_isp/src/isp_awb.c | 66 +++++++++++++------------ 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/components/esp_driver_isp/src/isp_awb.c b/components/esp_driver_isp/src/isp_awb.c index 19c03acd27..6469134f91 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 */ @@ -74,46 +74,48 @@ static esp_err_t s_esp_isp_awb_config_hardware(isp_proc_handle_t isp_proc, const ESP_RETURN_ON_FALSE(isp_hal_awb_set_window_range(&isp_proc->hal, &awb_cfg->window), ESP_ERR_INVALID_ARG, TAG, "invalid window range"); + bool subwindow_is_zero = awb_cfg->subwindow.top_left.x == 0 && + awb_cfg->subwindow.top_left.y == 0 && + awb_cfg->subwindow.btm_right.x == 0 && + awb_cfg->subwindow.btm_right.y == 0; // Subwindow feature is only supported on REV >= 3.0 if (efuse_hal_chip_revision() < 300) { - bool subwindow_is_zero = awb_cfg->subwindow.top_left.x == 0 && - awb_cfg->subwindow.top_left.y == 0 && - awb_cfg->subwindow.btm_right.x == 0 && - awb_cfg->subwindow.btm_right.y == 0; 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" - ); + if (!subwindow_is_zero) { + // 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" + ); - 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 %d x %d)", - (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; - } + 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 %d x %d)", + (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; + 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"); } - 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;