From ff010c06b244674d6cfa2f1bc701a5981de6eb0c Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Tue, 16 Dec 2025 20:08:07 +0800 Subject: [PATCH] fix(esp_driver_cam): fix MIPI-CSI RX data broken --- components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c | 7 +++++++ components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c | 3 +++ .../esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c b/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c index e3bd56f347..c96f459eb7 100644 --- a/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c +++ b/components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c @@ -362,6 +362,10 @@ IRAM_ATTR static bool csi_dma_trans_done_callback(dw_gdma_channel_handle_t chan, } } + esp_err_t ret = esp_cache_msync((void *)(new_trans.buffer), new_trans.buflen, ESP_CACHE_MSYNC_FLAG_DIR_M2C); + assert(ret == ESP_OK); + (void)ret; + ESP_EARLY_LOGD(TAG, "new_trans.buffer: %p, new_trans.buflen: %d", new_trans.buffer, new_trans.buflen); dw_gdma_channel_config_transfer(chan, &csi_dma_transfer_config); dw_gdma_channel_enable_ctrl(chan, true); @@ -469,6 +473,9 @@ esp_err_t s_ctlr_csi_start(esp_cam_ctlr_handle_t handle) } } + ESP_RETURN_ON_ERROR(esp_cache_msync((void *)(trans.buffer), trans.buflen, ESP_CACHE_MSYNC_FLAG_DIR_M2C), + TAG, "failed to sync(M2C) trans buffer"); + ESP_LOGD(TAG, "trans.buffer: %p, trans.buflen: %d", trans.buffer, trans.buflen); ctlr->trans = trans; diff --git a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c index 4e7dfe1aa2..6bd15f0161 100644 --- a/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c +++ b/components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c @@ -184,6 +184,9 @@ static IRAM_ATTR esp_err_t esp_cam_ctlr_dvp_start_trans(esp_cam_ctlr_dvp_cam_t * assert(false && "no new buffer, and no driver internal buffer"); } + ESP_RETURN_ON_ERROR(esp_cache_msync((void *)(trans.buffer), trans.buflen, ESP_CACHE_MSYNC_FLAG_DIR_M2C), + TAG, "failed to sync(M2C) trans buffer"); + ESP_RETURN_ON_ERROR_ISR(esp_cam_ctlr_dvp_dma_reset(&ctlr->dma), TAG, "failed to reset DMA"); ESP_RETURN_ON_ERROR_ISR(esp_cam_ctlr_dvp_dma_start(&ctlr->dma, trans.buffer, ctlr->fb_size_in_bytes), TAG, "failed to start DMA"); diff --git a/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c b/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c index 3dd347c7af..391d1ec4a6 100644 --- a/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c +++ b/components/esp_driver_cam/isp_dvp/src/esp_cam_ctlr_isp_dvp.c @@ -373,6 +373,9 @@ static esp_err_t s_isp_dvp_start(esp_cam_ctlr_handle_t handle) } } + ESP_RETURN_ON_ERROR(esp_cache_msync((void *)(trans.buffer), trans.buflen, ESP_CACHE_MSYNC_FLAG_DIR_M2C), + TAG, "failed to sync(M2C) trans buffer"); + ESP_LOGD(TAG, "trans.buffer: %p, trans.buflen: %d", trans.buffer, trans.buflen); dvp_ctlr->trans = trans; @@ -496,6 +499,10 @@ IRAM_ATTR static bool s_dvp_dma_trans_done_callback(dw_gdma_channel_handle_t cha } } + esp_err_t ret = esp_cache_msync((void *)(new_trans.buffer), new_trans.buflen, ESP_CACHE_MSYNC_FLAG_DIR_M2C); + assert(ret == ESP_OK); + (void)ret; + ESP_EARLY_LOGD(TAG, "new_trans.buffer: %p, new_trans.buflen: %d", new_trans.buffer, new_trans.buflen); dw_gdma_channel_config_transfer(chan, &dvp_dma_transfer_config); dw_gdma_channel_enable_ctrl(chan, true);