mirror of
https://github.com/espressif/esp-idf.git
synced 2026-01-21 16:22:14 +00:00
Merge branch 'fix/fix_ccm_shadow_configure_v5.4' into 'release/v5.4'
isp: support bypass shadow register check for CCM (v5.4) See merge request espressif/esp-idf!44758
This commit is contained in:
@@ -26,6 +26,9 @@ typedef struct {
|
||||
* When saturation is true, and final value will be limited to 4.0, and won't rise error
|
||||
* When saturation is false, `esp_isp_ccm_configure` will rise ESP_ERR_INVALID_ARG error
|
||||
*/
|
||||
struct {
|
||||
uint32_t update_once_configured : 1; ///< If set, apply configuration to hardware immediately; otherwise defer to frame boundary
|
||||
} flags; ///< Driver behaviour flags
|
||||
} esp_isp_ccm_config_t;
|
||||
|
||||
/**
|
||||
|
||||
@@ -26,7 +26,7 @@ esp_err_t esp_isp_ccm_configure(isp_proc_handle_t proc, const esp_isp_ccm_config
|
||||
portENTER_CRITICAL(&proc->spinlock);
|
||||
isp_ll_ccm_set_clk_ctrl_mode(proc->hal.hw, ISP_LL_PIPELINE_CLK_CTRL_AUTO);
|
||||
ret = isp_hal_ccm_set_matrix(&proc->hal, ccm_cfg->saturation, ccm_cfg->matrix);
|
||||
valid = isp_ll_shadow_update_ccm(proc->hal.hw);
|
||||
valid = isp_ll_shadow_update_ccm(proc->hal.hw, ccm_cfg->flags.update_once_configured);
|
||||
portEXIT_CRITICAL(&proc->spinlock);
|
||||
ESP_RETURN_ON_FALSE(ret, ESP_ERR_INVALID_ARG, TAG, "invalid argument: ccm matrix contain NaN or out of range");
|
||||
ESP_RETURN_ON_FALSE(valid, ESP_ERR_INVALID_STATE, TAG, "failed to update ccm shadow register");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@@ -210,15 +210,20 @@ TEST_CASE("ISP CCM basic function", "[isp]")
|
||||
|
||||
esp_isp_ccm_config_t ccm_cfg = {
|
||||
.matrix = {
|
||||
{5.0, 0.0, 0.0},
|
||||
{16.0, 0.0, 0.0},
|
||||
{0.0, 1.0, 0.0},
|
||||
{0.0, 0.0, 1.0}
|
||||
},
|
||||
.saturation = false,
|
||||
.flags = {
|
||||
.update_once_configured = true,
|
||||
},
|
||||
};
|
||||
// Out of range case
|
||||
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_isp_ccm_configure(isp_proc, &ccm_cfg));
|
||||
|
||||
// saturation case
|
||||
ccm_cfg.matrix[0][0] = 5.0;
|
||||
ccm_cfg.saturation = true;
|
||||
TEST_ESP_OK(esp_isp_ccm_configure(isp_proc, &ccm_cfg));
|
||||
TEST_ESP_OK(esp_isp_ccm_enable(isp_proc));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@@ -1955,21 +1955,27 @@ static inline bool isp_ll_shadow_update_wbg(isp_dev_t *hw)
|
||||
/**
|
||||
* @brief Update CCM shadow register
|
||||
*
|
||||
* @param[in] hw Hardware instance address
|
||||
* @param[in] hw Hardware instance address
|
||||
* @param[in] force_update Force update
|
||||
* @return
|
||||
* - True if update is successful, False otherwise
|
||||
*/
|
||||
static inline bool isp_ll_shadow_update_ccm(isp_dev_t *hw)
|
||||
static inline bool isp_ll_shadow_update_ccm(isp_dev_t *hw, bool force_update)
|
||||
{
|
||||
//only valid when ISP_SHADOW_MODE_UPDATE_ONLY_NEXT_VSYNC
|
||||
HAL_ASSERT(hw->shadow_reg_ctrl.shadow_update_sel == ISP_SHADOW_MODE_UPDATE_ONLY_NEXT_VSYNC);
|
||||
|
||||
if (hw->shadow_reg_ctrl.ccm_update == 1) {
|
||||
return false;
|
||||
}
|
||||
if (force_update) {
|
||||
//don't care shadow register
|
||||
hw->shadow_reg_ctrl.ccm_update = 1;
|
||||
} else {
|
||||
if (hw->shadow_reg_ctrl.ccm_update == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//self clear when ISP_SHADOW_MODE_UPDATE_ONLY_NEXT_VSYNC
|
||||
hw->shadow_reg_ctrl.ccm_update = 1;
|
||||
//self clear when ISP_SHADOW_MODE_UPDATE_ONLY_NEXT_VSYNC
|
||||
hw->shadow_reg_ctrl.ccm_update = 1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -2048,7 +2054,7 @@ static inline bool isp_ll_shadow_update_wbg(isp_dev_t *hw)
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool isp_ll_shadow_update_ccm(isp_dev_t *hw)
|
||||
static inline bool isp_ll_shadow_update_ccm(isp_dev_t *hw, bool force_update)
|
||||
{
|
||||
//for compatibility
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user