diff --git a/components/esp_driver_isp/include/driver/isp_hist.h b/components/esp_driver_isp/include/driver/isp_hist.h index e7568e64d7..331b0207d9 100644 --- a/components/esp_driver_isp/include/driver/isp_hist.h +++ b/components/esp_driver_isp/include/driver/isp_hist.h @@ -15,14 +15,25 @@ extern "C" { #endif -typedef struct { - isp_window_t window; /*!< The sampling window of histogram, see `isp_window_t`*/ - isp_hist_sampling_mode_t hist_mode; /*!< ISP histogram sampling mode */ - isp_hist_rgb_coefficient rgb_coefficient; /*!< RGB coefficients, adjust the sensitivity to red, geen, and blue colors in the image, - only effect when hist_mode is ISP_HIST_SAMPLING_RGB, the sum of all coefficients should be 100**/ - uint32_t windows_weight[ISP_HIST_BLOCK_X_NUM][ISP_HIST_BLOCK_Y_NUM]; /*!< Weights of histogram's each subwindows, the sum of all subwindows's weight should be 100*/ - uint32_t segment_threshold[ISP_HIST_INTERVAL_NUMS]; /*!< Threshold to segment the histogram into intervals, range 0~256 */ +/* + * ISP Histogram Struct + * |<----------------------------- INTERVAL_NUMS = 16 ------------------------------>| + * | | | | | + * | Segment 0 | Segment 1 | ............ | Segment 15 | + * 0 threshold 0 threshold 1 ... threshold 14 255 + * |<------------------------------------------------------------------------------->| + */ +/** + * @brief Hist controller config + */ +typedef struct { + isp_window_t window; /*!< The sampling window of histogram, see `isp_window_t`*/ + isp_hist_sampling_mode_t hist_mode; /*!< ISP histogram sampling mode */ + isp_hist_rgb_coefficient_t rgb_coefficient; /*!< RGB coefficients, adjust the sensitivity to red, geen, and blue colors in the image, + only effect when hist_mode is ISP_HIST_SAMPLING_RGB, the sum of all coefficients decimal should be 256**/ + isp_hist_weight_t window_weight[ISP_HIST_BLOCK_X_NUM * ISP_HIST_BLOCK_Y_NUM]; /*!< Weights of histogram's each subwindows, the sum of all subwindows's weight decimal should be 256*/ + uint32_t segment_threshold[ISP_HIST_INTERVAL_NUMS]; /*!< Threshold to segment the histogram into intervals, range 0~255 */ } esp_isp_hist_config_t; /** diff --git a/components/esp_driver_isp/src/isp_hist.c b/components/esp_driver_isp/src/isp_hist.c index 225b0d46ed..739a8a2ac7 100644 --- a/components/esp_driver_isp/src/isp_hist.c +++ b/components/esp_driver_isp/src/isp_hist.c @@ -70,6 +70,34 @@ static void s_isp_hist_free_controller(isp_hist_ctlr_t hist_ctlr) } } +static esp_err_t s_esp_isp_hist_config_hardware(isp_proc_handle_t isp_proc, const esp_isp_hist_config_t *hist_cfg) +{ + for (int i = 0; i < SOC_ISP_HIST_INTERVAL_NUMS; i++) { + ESP_RETURN_ON_FALSE((hist_cfg->segment_threshold[i] > 0 && hist_cfg->segment_threshold[i] < 256), ESP_ERR_INVALID_ARG, TAG, "invalid segment threshold"); + } + ESP_RETURN_ON_FALSE(hist_cfg->rgb_coefficient.coeff_r.integer == 0 && hist_cfg->rgb_coefficient.coeff_g.integer == 0 && hist_cfg->rgb_coefficient.coeff_b.integer == 0, \ + ESP_ERR_INVALID_ARG, TAG, "The rgb_coefficient's integer value is bigger than 0"); + + int weight_sum = 0; + for (int i = 0; i < SOC_ISP_HIST_BLOCK_X_NUMS * SOC_ISP_HIST_BLOCK_Y_NUMS; i++) { + ESP_RETURN_ON_FALSE(hist_cfg->window_weight[i].integer == 0, ESP_ERR_INVALID_ARG, TAG, "The subwindow weight's integer value is bigger than -"); + weight_sum = weight_sum + hist_cfg->window_weight[i].decimal; + } + ESP_RETURN_ON_FALSE(weight_sum == 256, ESP_ERR_INVALID_ARG, TAG, "The sum of all subwindow weight's decimal value is not 256"); + + isp_ll_hist_set_mode(isp_proc->hal.hw, hist_cfg->hist_mode); + isp_hal_hist_window_config(&isp_proc->hal, &hist_cfg->window); + + isp_ll_hist_set_subwindow_weight(isp_proc->hal.hw, hist_cfg->window_weight); + + isp_ll_hist_set_segment_threshold(isp_proc->hal.hw, hist_cfg->segment_threshold); + if (hist_cfg->hist_mode == ISP_HIST_SAMPLING_RGB) { + isp_ll_hist_set_rgb_coefficient(isp_proc->hal.hw, &hist_cfg->rgb_coefficient); + } + + return ESP_OK; +} + esp_err_t esp_isp_new_hist_controller(isp_proc_handle_t isp_proc, const esp_isp_hist_config_t *hist_cfg, isp_hist_ctlr_t *ret_hdl) { esp_err_t ret = ESP_FAIL; @@ -85,22 +113,8 @@ esp_err_t esp_isp_new_hist_controller(isp_proc_handle_t isp_proc, const esp_isp_ hist_ctlr->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; hist_ctlr->isp_proc = isp_proc; - for (int i = 0; i < SOC_ISP_HIST_INTERVAL_NUMS; i++) { - ESP_GOTO_ON_FALSE((hist_cfg->segment_threshold[i] > 0 && hist_cfg->segment_threshold[i] < 256), ESP_ERR_INVALID_ARG, err1, TAG, "invalid segment threshold"); - } - - int weight_sum = 0; - for (int i = 0; i < SOC_ISP_HIST_BLOCK_X_NUMS; i++) { - for (int j = 0; j < SOC_ISP_HIST_BLOCK_Y_NUMS; j++) { - weight_sum = weight_sum + hist_cfg->windows_weight[i][j]; - } - } - ESP_GOTO_ON_FALSE(weight_sum == 100, ESP_ERR_INVALID_ARG, err1, TAG, "The sum of all subwindow's weight is not 100"); - - if (hist_cfg->hist_mode == ISP_HIST_SAMPLING_RGB) { - int rgb_coefficient_sum = hist_cfg->rgb_coefficient.coeff_r + hist_cfg->rgb_coefficient.coeff_g + hist_cfg->rgb_coefficient.coeff_b; - ESP_GOTO_ON_FALSE(rgb_coefficient_sum == 100, ESP_ERR_INVALID_ARG, err1, TAG, "The sum of rgb_coefficient is not 100"); - } + // Configure the hardware + ESP_GOTO_ON_ERROR(s_esp_isp_hist_config_hardware(isp_proc, hist_cfg), err1, TAG, "configure HIST hardware failed"); // Claim an hist controller ESP_GOTO_ON_ERROR(s_isp_claim_hist_controller(isp_proc, hist_ctlr), err1, TAG, "no available controller"); @@ -108,17 +122,6 @@ esp_err_t esp_isp_new_hist_controller(isp_proc_handle_t isp_proc, const esp_isp_ // Register the HIGT ISR ESP_GOTO_ON_ERROR(esp_isp_register_isr(hist_ctlr->isp_proc, ISP_SUBMODULE_HIST), err2, TAG, "fail to register ISR"); - // Configure the hardware - isp_ll_hist_set_mode(isp_proc->hal.hw, hist_cfg->hist_mode); - isp_hal_hist_window_config(&isp_proc->hal, &hist_cfg->window); - - isp_ll_hist_set_subwindow_weight(isp_proc->hal.hw, hist_cfg->windows_weight); - - isp_ll_hist_set_segment_threshold(isp_proc->hal.hw, hist_cfg->segment_threshold); - if (hist_cfg->hist_mode == ISP_HIST_SAMPLING_RGB) { - isp_ll_hist_set_rgb_coefficient(isp_proc->hal.hw, &hist_cfg->rgb_coefficient); - } - *ret_hdl = hist_ctlr; return ESP_OK; @@ -191,7 +194,7 @@ esp_err_t esp_isp_hist_controller_get_oneshot_statistics(isp_hist_ctlr_t hist_ct // Start the histogram reference statistics and waiting it done isp_ll_hist_enable(hist_ctlr->isp_proc->hal.hw, true); // Wait the statistics to finish and receive the result from the queue - if ((ticks > 0) && xQueueReceive(hist_ctlr->evt_que, out_res, ticks) != pdTRUE) { + if (xQueueReceive(hist_ctlr->evt_que, out_res, ticks) != pdTRUE) { ret = ESP_ERR_TIMEOUT; } // Stop the histogram reference statistics diff --git a/components/esp_driver_isp/test_apps/isp/main/test_isp_driver.c b/components/esp_driver_isp/test_apps/isp/main/test_isp_driver.c index 0895852749..d14f6033a2 100644 --- a/components/esp_driver_isp/test_apps/isp/main/test_isp_driver.c +++ b/components/esp_driver_isp/test_apps/isp/main/test_isp_driver.c @@ -358,17 +358,33 @@ TEST_CASE("ISP HIST driver basic function", "[isp]") /* Test when sum of weight is not 256 */ esp_isp_hist_config_t hist_config_error = { .segment_threshold = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}, - .windows_weight = {{5, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}}, + .hist_mode = ISP_HIST_SAMPLING_RGB, + .rgb_coefficient.coeff_r = {{86, 0}}, + .rgb_coefficient.coeff_g = {{85, 0}}, + .rgb_coefficient.coeff_b = {{85, 0}}, + .window_weight = { + {{15, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + }, }; TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_isp_new_hist_controller(isp_proc, &hist_config_error, &hist_ctlr)); esp_isp_hist_config_t hist_config = { .segment_threshold = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}, .hist_mode = ISP_HIST_SAMPLING_RGB, - .rgb_coefficient.coeff_r = 33, - .rgb_coefficient.coeff_g = 33, - .rgb_coefficient.coeff_b = 34, - .windows_weight = {{4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}}, + .rgb_coefficient.coeff_r = {{86, 0}}, + .rgb_coefficient.coeff_g = {{85, 0}}, + .rgb_coefficient.coeff_b = {{85, 0}}, + .window_weight = { + {{16, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + }, }; TEST_ESP_OK(esp_isp_new_hist_controller(isp_proc, &hist_config, &hist_ctlr)); @@ -408,10 +424,16 @@ TEST_CASE("ISP HIST controller exhausted allocation", "[isp]") esp_isp_hist_config_t hist_config = { .segment_threshold = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}, .hist_mode = ISP_HIST_SAMPLING_RGB, - .rgb_coefficient.coeff_r = 33, - .rgb_coefficient.coeff_g = 33, - .rgb_coefficient.coeff_b = 34, - .windows_weight = {{4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}}, + .rgb_coefficient.coeff_r = {{86, 0}}, + .rgb_coefficient.coeff_g = {{85, 0}}, + .rgb_coefficient.coeff_b = {{85, 0}}, + .window_weight = { + {{16, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + }, }; isp_hist_ctlr_t hist_ctlr[SOC_ISP_HIST_CTLR_NUMS + 1] = {}; diff --git a/components/hal/esp32p4/include/hal/isp_ll.h b/components/hal/esp32p4/include/hal/isp_ll.h index 6be3b69c9b..90d268256a 100644 --- a/components/hal/esp32p4/include/hal/isp_ll.h +++ b/components/hal/esp32p4/include/hal/isp_ll.h @@ -1635,12 +1635,11 @@ static inline void isp_ll_hist_clk_enable(isp_dev_t *hw, bool enable) * @param[in] hw Hardware instance address * @param[in] window_weight array for window weight */ -static inline void isp_ll_hist_set_subwindow_weight(isp_dev_t *hw, const uint32_t window_weight[SOC_ISP_HIST_BLOCK_X_NUMS][SOC_ISP_HIST_BLOCK_Y_NUMS]) +static inline void isp_ll_hist_set_subwindow_weight(isp_dev_t *hw, const isp_hist_weight_t hist_window_weight[SOC_ISP_HIST_BLOCK_X_NUMS * SOC_ISP_HIST_BLOCK_Y_NUMS]) { - for (int i = 0; i < SOC_ISP_HIST_BLOCK_X_NUMS; i++) { - for (int j = 0; j < SOC_ISP_HIST_BLOCK_Y_NUMS; j++) { - hw->hist_weight[i / 4].hist_weight_b[3 - (i % 4)] = (window_weight[i][j] * 256) / 100; - } + for (int i = 0; i < SOC_ISP_HIST_BLOCK_X_NUMS * SOC_ISP_HIST_BLOCK_Y_NUMS; i++) { + // On ESP32P4, hist_weight [7,0] are decimal + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_weight[i / 4], hist_weight_b[3 - (i % 4)], hist_window_weight[i].decimal); } } @@ -1652,9 +1651,8 @@ static inline void isp_ll_hist_set_subwindow_weight(isp_dev_t *hw, const uint32_ */ static inline void isp_ll_hist_set_segment_threshold(isp_dev_t *hw, const uint32_t segment_threshold[SOC_ISP_HIST_INTERVAL_NUMS]) { - for (int i = 0; i < SOC_ISP_HIST_INTERVAL_NUMS; i++) - { - HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_seg[i / 4], hist_seg_b[3 - (i % 4)], segment_threshold[i]) + for (int i = 0; i < SOC_ISP_HIST_INTERVAL_NUMS; i++) { + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_seg[i / 4], hist_seg_b[3 - (i % 4)], segment_threshold[i]); } } @@ -1717,11 +1715,11 @@ static inline void isp_ll_hist_set_mode(isp_dev_t *hw, isp_hist_sampling_mode_t * @param[in] hw Hardware instance address * @param[in] rgb_coeff RGB coefficients */ -static inline void isp_ll_hist_set_rgb_coefficient(isp_dev_t *hw, const isp_hist_rgb_coefficient *rgb_coeff) +static inline void isp_ll_hist_set_rgb_coefficient(isp_dev_t *hw, const isp_hist_rgb_coefficient_t *rgb_coeff) { - HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_coeff, hist_coeff_r, (rgb_coeff->coeff_r * 256) / 100); - HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_coeff, hist_coeff_g, (rgb_coeff->coeff_g * 256) / 100); - HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_coeff, hist_coeff_b, (rgb_coeff->coeff_b * 256) / 100); + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_coeff, hist_coeff_r, rgb_coeff->coeff_r.decimal); + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_coeff, hist_coeff_g, rgb_coeff->coeff_g.decimal); + HAL_FORCE_MODIFY_U32_REG_FIELD(hw->hist_coeff, hist_coeff_b, rgb_coeff->coeff_b.decimal); } #ifdef __cplusplus diff --git a/components/hal/include/hal/isp_types.h b/components/hal/include/hal/isp_types.h index 47fda745f5..81210da06e 100644 --- a/components/hal/include/hal/isp_types.h +++ b/components/hal/include/hal/isp_types.h @@ -23,6 +23,19 @@ typedef soc_periph_isp_clk_src_t isp_clk_src_t; ///< Clock source type of typedef int isp_clk_src_t; ///< Default type #endif +/* + ISP window and subwindow + +----------------------------------------------------------+ + | <-- top left point coordinate | + | | subwindow[0][0] |......| subwindow[0][Y_NUM]| | + | . | + | . | + | . | + | | subwindow[X_NUM][0] |......| subwindow[X_NUM][Y_NUM]| | + | bottom right point coordinate --> | + +----------------------------------------------------------+ +*/ + /** * @brief ISP coordinate type * @@ -180,14 +193,13 @@ typedef enum { #define ISP_SHARPEN_M_FREQ_COEF_RES_BITS 16 #endif - /** * @brief High freq pixel sharpeness coeff */ typedef union { struct { - uint32_t decimal:ISP_SHARPEN_H_FREQ_COEF_DEC_BITS; ///< Integer part - uint32_t integer:ISP_SHARPEN_H_FREQ_COEF_INT_BITS; ///< Decimal part + uint32_t decimal:ISP_SHARPEN_H_FREQ_COEF_DEC_BITS; ///< Decimal part + uint32_t integer:ISP_SHARPEN_H_FREQ_COEF_INT_BITS; ///< Integer part uint32_t reserved:ISP_SHARPEN_H_FREQ_COEF_RES_BITS; ///< Reserved }; uint32_t val; ///< 32-bit high freq pixel sharpeness coeff register value @@ -198,8 +210,8 @@ typedef union { */ typedef union { struct { - uint32_t decimal:ISP_SHARPEN_M_FREQ_COEF_DEC_BITS; ///< Integer part - uint32_t integer:ISP_SHARPEN_M_FREQ_COEF_INT_BITS; ///< Decimal part + uint32_t decimal:ISP_SHARPEN_M_FREQ_COEF_DEC_BITS; ///< Decimal part + uint32_t integer:ISP_SHARPEN_M_FREQ_COEF_INT_BITS; ///< Integer part uint32_t reserved:ISP_SHARPEN_M_FREQ_COEF_RES_BITS; ///< Reserved }; uint32_t val; ///< 32-bit medium freq pixel sharpeness coeff register value @@ -238,43 +250,74 @@ typedef struct { HIST ---------------------------------------------------------------*/ #if (SOC_ISP_HIST_BLOCK_X_NUMS && SOC_ISP_HIST_BLOCK_Y_NUMS) -#define ISP_HIST_BLOCK_X_NUM SOC_ISP_HIST_BLOCK_X_NUMS // The AF window number for sampling -#define ISP_HIST_BLOCK_Y_NUM SOC_ISP_HIST_BLOCK_Y_NUMS // The AF window number for sampling +#define ISP_HIST_BLOCK_X_NUM SOC_ISP_HIST_BLOCK_X_NUMS // The AF window number for sampling +#define ISP_HIST_BLOCK_Y_NUM SOC_ISP_HIST_BLOCK_Y_NUMS // The AF window number for sampling #else -#define ISP_HIST_BLOCK_X_NUM 0 -#define ISP_HIST_BLOCK_Y_NUM 0 +#define ISP_HIST_BLOCK_X_NUM 0 +#define ISP_HIST_BLOCK_Y_NUM 0 #endif #if (SOC_ISP_HIST_SEGMENT_NUMS && SOC_ISP_HIST_INTERVAL_NUMS) -#define ISP_HIST_SEGMENT_NUMS SOC_ISP_HIST_SEGMENT_NUMS // The segment of histogram -#define ISP_HIST_INTERVAL_NUMS SOC_ISP_HIST_INTERVAL_NUMS // The interval of histogram +#define ISP_HIST_SEGMENT_NUMS SOC_ISP_HIST_SEGMENT_NUMS // The segment of histogram +#define ISP_HIST_INTERVAL_NUMS SOC_ISP_HIST_INTERVAL_NUMS // The interval of histogram #else -#define ISP_HIST_SEGMENT_NUMS 0 -#define ISP_HIST_INTERVAL_NUMS 0 +#define ISP_HIST_SEGMENT_NUMS 0 +#define ISP_HIST_INTERVAL_NUMS 0 #endif +#define ISP_HIST_WEIGHT_INT_BITS 8 +#define ISP_HIST_WEIGHT_DEC_BITS 7 +#define ISP_HIST_WEIGHT_RES_BITS 17 +#define ISP_HIST_COEFF_INT_BITS 8 +#define ISP_HIST_COEFF_DEC_BITS 7 +#define ISP_HIST_COEFF_RES_BITS 17 + /** * @brief ISP histogram mode. */ typedef enum { - ISP_HIST_SAMPLING_RAW_RGB_B, ///< histogram mode for B component of raw image - ISP_HIST_SAMPLING_RAW_RGB_GB, ///< histogram mode for GB component of raw image - ISP_HIST_SAMPLING_RAW_RGB_GR, ///< histogram mode for GR component of raw image - ISP_HIST_SAMPLING_RAW_RGB_R, ///< histogram mode for R component of raw image + ISP_HIST_SAMPLING_RAW_B, ///< histogram mode for B component of raw image + ISP_HIST_SAMPLING_RAW_GB, ///< histogram mode for GB component of raw image + ISP_HIST_SAMPLING_RAW_GR, ///< histogram mode for GR component of raw image + ISP_HIST_SAMPLING_RAW_R, ///< histogram mode for R component of raw image ISP_HIST_SAMPLING_RGB, ///< histogram mode for RGB ISP_HIST_SAMPLING_YUV_Y, ///< histogram mode for Y component for YUV ISP_HIST_SAMPLING_YUV_U, ///< histogram mode for U component for YUV ISP_HIST_SAMPLING_YUV_V, ///< histogram mode for V component for YUV } isp_hist_sampling_mode_t; +/** + * @brief ISP histogram weight value +*/ +typedef union { + struct { + uint32_t decimal:ISP_HIST_WEIGHT_DEC_BITS; ///< Decimal part + uint32_t integer:ISP_HIST_WEIGHT_INT_BITS; ///< Integer part + uint32_t reserved:ISP_HIST_WEIGHT_RES_BITS; ///< Reserved + }; + uint32_t val; ///< 32-bit histogram weight value +} isp_hist_weight_t; + +/** + * @brief ISP histogram coefficient value +*/ +typedef union { + struct { + uint32_t decimal:ISP_HIST_COEFF_DEC_BITS; ///< Decimal part + uint32_t integer:ISP_HIST_COEFF_INT_BITS; ///< Integer part + uint32_t reserved:ISP_HIST_COEFF_RES_BITS; ///< Reserved + }; + uint32_t val; ///< 32-bit histogram coefficient value +} isp_hist_coeff_t; + /** * @brief ISP histogram r,g,b coefficient */ typedef struct { - uint8_t coeff_r; ///< R coefficient - uint8_t coeff_g; ///< G coefficient - uint8_t coeff_b; ///< B coefficient -} isp_hist_rgb_coefficient; + isp_hist_coeff_t coeff_r; ///< R coefficient + isp_hist_coeff_t coeff_g; ///< G coefficient + isp_hist_coeff_t coeff_b; ///< B coefficient +} isp_hist_rgb_coefficient_t; /** * @brief ISP histogram result. diff --git a/docs/doxygen/Doxyfile_esp32p4 b/docs/doxygen/Doxyfile_esp32p4 index f408182d6a..0883585060 100644 --- a/docs/doxygen/Doxyfile_esp32p4 +++ b/docs/doxygen/Doxyfile_esp32p4 @@ -36,6 +36,7 @@ INPUT += \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_sharpen.h \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_core.h \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_gamma.h \ + $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_hist.h \ $(PROJECT_PATH)/components/esp_driver_jpeg/include/driver/jpeg_decode.h \ $(PROJECT_PATH)/components/esp_driver_jpeg/include/driver/jpeg_encode.h \ $(PROJECT_PATH)/components/esp_driver_ppa/include/driver/ppa.h \ diff --git a/docs/en/api-reference/peripherals/isp.rst b/docs/en/api-reference/peripherals/isp.rst index 40a1bf0cca..1e08164848 100644 --- a/docs/en/api-reference/peripherals/isp.rst +++ b/docs/en/api-reference/peripherals/isp.rst @@ -158,17 +158,38 @@ Install ISP histogram (HIST) Driver ISP histogram (HIST) driver requires the configuration that specified by :cpp:type:`esp_isp_hist_config_t`. -If the configurations in :cpp:type:`esp_isp_hist_config_t` is specified, users can call :cpp:func:`esp_isp_new_hist_controller` to allocate and initialize an ISP HISTG processor. This function will return an ISP HIST processor handle if it runs correctly. You can take following code as reference. +If the configurations in :cpp:type:`esp_isp_hist_config_t` is specified, users can call :cpp:func:`esp_isp_new_hist_controller` to allocate and initialize an ISP Histogram processor. This function will return an ISP HIST processor handle if it runs correctly. You can take following code as reference. + +.. list:: + + - The sum of all subwindows weight's decimal value should be 256 or the statistics will be small, and integer value should be 0. + - The sum of all RGB coefficients' decimal value should be 256 or the statistics will be small, and integer value should be 0. + - The segment_threshold must be 0 ~ 255 and in order .. code:: c esp_isp_hist_config_t hist_cfg = { .segment_threshold = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}, - .rgb_coefficient.coeff_r = 33, - .rgb_coefficient.coeff_g = 33, - .rgb_coefficient.coeff_b = 34, .hist_mode = ISP_HIST_SAMPLING_RGB, - .windows_weight = {{4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}}, + .rgb_coefficient.coeff_r = { + .integer = 0, + .decimal = 86, + }, + .rgb_coefficient.coeff_g = { + .integer = 0, + .decimal = 85, + }, + .rgb_coefficient.coeff_b = { + .integer = 0, + .decimal = 85, + }, + .window_weight = { + {{16, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, {{10, 0}}, + }, }; isp_hist_ctlr_t hist_ctlr_ctlr = NULL; ESP_ERROR_CHECK(esp_isp_new_hist_controller(isp_proc, &hist_config, &hist_ctlr)); @@ -444,8 +465,6 @@ Aside from the above oneshot API, the ISP histogram driver also provides a way t Note that if you want to use the continuous statistics, you need to register the :cpp:member:`esp_isp_hist_cbs_t::on_statistics_done` callback to get the statistics result. See how to register it in `Register Event Callbacks <#isp-callback>`__ -Note that the sum of all subwindows's weight should be 100, the sum of all RGB coefficients should be 100, and segment_threshold must be 0 ~ 256. - .. code:: c static bool s_hist_scheme_on_statistics_done_callback(isp_hist_ctlr_t awb_ctrlr, const esp_isp_hist_evt_data_t *edata, void *user_data) @@ -456,17 +475,6 @@ Note that the sum of all subwindows's weight should be 100, the sum of all RGB c return true; } - isp_hist_ctlr_t hist_ctlr = NULL; - esp_isp_hist_config_t hist_cfg = { - .segment_threshold = {16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}, - .rgb_coefficient.coeff_r = 33, - .rgb_coefficient.coeff_g = 33, - .rgb_coefficient.coeff_b = 34, - .hist_mode = ISP_HIST_SAMPLING_RGB, - .windows_weight = {{4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}}, - }; - - esp_isp_new_hist_controller(isp_proc, &hist_cfg, &hist_ctlr); esp_isp_hist_cbs_t hist_cbs = { .on_statistics_done = s_hist_scheme_on_statistics_done_callback, }; @@ -715,3 +723,4 @@ API Reference .. include-build-file:: inc/isp_ccm.inc .. include-build-file:: inc/isp_sharpen.inc .. include-build-file:: inc/isp_gamma.inc +.. include-build-file:: inc/isp_hist.inc