From f31a5dc543fb50a6ac2bc5f4a02700f792b5ec34 Mon Sep 17 00:00:00 2001 From: armando Date: Tue, 11 Mar 2025 17:11:43 +0800 Subject: [PATCH] feat(isp): supported byte endianness swap --- components/esp_driver_isp/include/driver/isp_core.h | 3 ++- components/esp_driver_isp/src/isp_core.c | 3 +++ components/hal/esp32p4/include/hal/isp_ll.h | 11 +++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/components/esp_driver_isp/include/driver/isp_core.h b/components/esp_driver_isp/include/driver/isp_core.h index 16f5ab77dd..bcc2c4de5c 100644 --- a/components/esp_driver_isp/include/driver/isp_core.h +++ b/components/esp_driver_isp/include/driver/isp_core.h @@ -34,7 +34,8 @@ typedef struct { color_raw_element_order_t bayer_order; ///< Bayer order int intr_priority; ///< The interrupt priority, range 0~3, if set to 0, the driver will try to allocate an interrupt with a relative low priority (1,2,3) struct { - uint32_t bypass_isp: 1; ///< Bypass ISP pipelines + uint32_t bypass_isp : 1; ///< Bypass ISP pipelines + uint32_t byte_swap_en : 1; ///< Enable byte swap } flags; ///< Flags } esp_isp_processor_cfg_t; diff --git a/components/esp_driver_isp/src/isp_core.c b/components/esp_driver_isp/src/isp_core.c index b02ffc060f..fd5aa59213 100644 --- a/components/esp_driver_isp/src/isp_core.c +++ b/components/esp_driver_isp/src/isp_core.c @@ -166,6 +166,9 @@ esp_err_t esp_isp_new_processor(const esp_isp_processor_cfg_t *proc_config, isp_ if (out_color_format.color_space == COLOR_SPACE_RGB && proc_config->input_data_source == ISP_INPUT_DATA_SOURCE_DVP) { isp_ll_color_enable(proc->hal.hw, true); // workaround for DIG-474 } + if (proc_config->flags.byte_swap_en) { + isp_ll_set_byte_swap(proc->hal.hw, true); + } proc->in_color_format = in_color_format; proc->out_color_format = out_color_format; diff --git a/components/hal/esp32p4/include/hal/isp_ll.h b/components/hal/esp32p4/include/hal/isp_ll.h index 5284263091..63ff39e033 100644 --- a/components/hal/esp32p4/include/hal/isp_ll.h +++ b/components/hal/esp32p4/include/hal/isp_ll.h @@ -499,6 +499,17 @@ static inline void isp_ll_set_bayer_mode(isp_dev_t *hw, color_raw_element_order_ hw->frame_cfg.bayer_mode = bayer_order; } +/** + * @brief Swap the data endianness order in bytes + * + * @param[in] hw Hardware instance address + * @param[in] byte_swap_en byte swap enable or not + */ +static inline void isp_ll_set_byte_swap(isp_dev_t *hw, bool byte_swap_en) +{ + hw->cntl.byte_endian_order = byte_swap_en; +} + /*--------------------------------------------------------------- AF ---------------------------------------------------------------*/