From f41c5b3199b926b240ea29c1e7ec651339ee43d9 Mon Sep 17 00:00:00 2001 From: "Kwabena W. Agyeman" Date: Mon, 8 Mar 2021 21:49:06 -0800 Subject: [PATCH] Use DMA buffer for FIR Lepton --- src/omv/boards/BORMIO/omv_boardconfig.h | 1 + src/omv/boards/OPENMV2/omv_boardconfig.h | 9 +++++---- src/omv/boards/OPENMV3/omv_boardconfig.h | 3 ++- src/omv/boards/OPENMV4/omv_boardconfig.h | 1 + src/omv/boards/OPENMV4P/omv_boardconfig.h | 1 + src/omv/boards/OPENMVPT/omv_boardconfig.h | 1 + src/omv/boards/PORTENTA/omv_boardconfig.h | 1 + src/omv/ports/stm32/modules/py_fir_lepton.c | 15 ++++----------- src/omv/ports/stm32/stm32fxxx.ld.S | 4 ++++ src/uvc/stm32fxxx.ld.S | 4 ++++ 10 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/omv/boards/BORMIO/omv_boardconfig.h b/src/omv/boards/BORMIO/omv_boardconfig.h index 5f0a79ae0..eb2633c28 100644 --- a/src/omv/boards/BORMIO/omv_boardconfig.h +++ b/src/omv/boards/BORMIO/omv_boardconfig.h @@ -144,6 +144,7 @@ #define OMV_LINE_BUF_SIZE (3 * 1024) // Image line buffer round(640 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_JPEG_BUF_SIZE (32 * 1024) // IDE JPEG buffer (header + data). #define OMV_BOOT_ORIGIN 0x08000000 diff --git a/src/omv/boards/OPENMV2/omv_boardconfig.h b/src/omv/boards/OPENMV2/omv_boardconfig.h index ad4a3475b..8bf713b0e 100644 --- a/src/omv/boards/OPENMV2/omv_boardconfig.h +++ b/src/omv/boards/OPENMV2/omv_boardconfig.h @@ -104,13 +104,14 @@ #define OMV_DMA_MEMORY SRAM2 // Misc DMA buffers #define OMV_FB_SIZE (150K) // FB memory: header + QVGA/GS image -#define OMV_FB_ALLOC_SIZE (13K) // minimum fb alloc size +#define OMV_FB_ALLOC_SIZE (12K) // minimum fb alloc size #define OMV_STACK_SIZE (4K) #define OMV_HEAP_SIZE (51K) #define OMV_LINE_BUF_SIZE (2 * 1024) // Image line buffer round(320 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_FFS_BUF_SIZE (16K) // Flash filesystem cache #define OMV_JPEG_BUF_SIZE (8 * 1024) // IDE JPEG buffer size (header + data). @@ -121,9 +122,9 @@ #define OMV_DTCM_ORIGIN 0x10000000 #define OMV_DTCM_LENGTH 64K #define OMV_SRAM1_ORIGIN 0x20000000 -#define OMV_SRAM1_LENGTH 163K -#define OMV_SRAM2_ORIGIN 0x20028C00 -#define OMV_SRAM2_LENGTH 29K +#define OMV_SRAM1_LENGTH 162K +#define OMV_SRAM2_ORIGIN 0x20028800 +#define OMV_SRAM2_LENGTH 30K // Image sensor I2C #define ISC_I2C (I2C1) diff --git a/src/omv/boards/OPENMV3/omv_boardconfig.h b/src/omv/boards/OPENMV3/omv_boardconfig.h index e0b5e615b..e1f12be79 100644 --- a/src/omv/boards/OPENMV3/omv_boardconfig.h +++ b/src/omv/boards/OPENMV3/omv_boardconfig.h @@ -106,11 +106,12 @@ #define OMV_FB_SIZE (300K) // FB memory: header + VGA/GS image #define OMV_FB_ALLOC_SIZE (84K) // minimum fb alloc size #define OMV_STACK_SIZE (16K) -#define OMV_HEAP_SIZE (56K) +#define OMV_HEAP_SIZE (55K) #define OMV_LINE_BUF_SIZE (3 * 1024) // Image line buffer round(640 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_FFS_BUF_SIZE (32K) // Flash filesystem cache #define OMV_JPEG_BUF_SIZE (22 * 1024) // IDE JPEG buffer (header + data). diff --git a/src/omv/boards/OPENMV4/omv_boardconfig.h b/src/omv/boards/OPENMV4/omv_boardconfig.h index 28460be48..69e9b42ae 100644 --- a/src/omv/boards/OPENMV4/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4/omv_boardconfig.h @@ -151,6 +151,7 @@ #define OMV_LINE_BUF_SIZE (3 * 1024) // Image line buffer round(640 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_JPEG_BUF_SIZE (32 * 1024) // IDE JPEG buffer (header + data). #define OMV_BOOT_ORIGIN 0x08000000 diff --git a/src/omv/boards/OPENMV4P/omv_boardconfig.h b/src/omv/boards/OPENMV4P/omv_boardconfig.h index 5c69e88d0..3dee61bbd 100644 --- a/src/omv/boards/OPENMV4P/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4P/omv_boardconfig.h @@ -158,6 +158,7 @@ #define OMV_LINE_BUF_SIZE (11 * 1024) // Image line buffer round(2592 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_JPEG_BUF_SIZE (1024*1024) // IDE JPEG buffer (header + data). #define OMV_BOOT_ORIGIN 0x08000000 diff --git a/src/omv/boards/OPENMVPT/omv_boardconfig.h b/src/omv/boards/OPENMVPT/omv_boardconfig.h index 43064ca97..1687dede8 100644 --- a/src/omv/boards/OPENMVPT/omv_boardconfig.h +++ b/src/omv/boards/OPENMVPT/omv_boardconfig.h @@ -155,6 +155,7 @@ #define OMV_LINE_BUF_SIZE (11 * 1024) // Image line buffer round(2592 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_JPEG_BUF_SIZE (1024*1024) // IDE JPEG buffer (header + data). #define OMV_BOOT_ORIGIN 0x08000000 diff --git a/src/omv/boards/PORTENTA/omv_boardconfig.h b/src/omv/boards/PORTENTA/omv_boardconfig.h index 224cd55d1..306e99b87 100644 --- a/src/omv/boards/PORTENTA/omv_boardconfig.h +++ b/src/omv/boards/PORTENTA/omv_boardconfig.h @@ -158,6 +158,7 @@ #define OMV_LINE_BUF_SIZE (11 * 1024) // Image line buffer round(2592 * 2BPP * 2 buffers). #define OMV_MSC_BUF_SIZE (2K) // USB MSC bot data #define OMV_VFS_BUF_SIZE (1K) // VFS sturct + FATFS file buffer (624 bytes) +#define OMV_FIR_LEPTON_BUF_SIZE (1K) // FIR Lepton Packet Double Buffer (328 bytes) #define OMV_JPEG_BUF_SIZE (1024*1024) // IDE JPEG buffer (header + data). #define OMV_BOOT_ORIGIN 0x08000000 diff --git a/src/omv/ports/stm32/modules/py_fir_lepton.c b/src/omv/ports/stm32/modules/py_fir_lepton.c index 01fe28a59..426a8931b 100644 --- a/src/omv/ports/stm32/modules/py_fir_lepton.c +++ b/src/omv/ports/stm32/modules/py_fir_lepton.c @@ -62,7 +62,7 @@ static soft_timer_entry_t flir_lepton_spi_rx_timer = {}; static int fir_lepton_spi_rx_cb_head = 0; static int fir_lepton_spi_rx_cb_expected_pid = 0; static int fir_lepton_spi_rx_cb_expected_seg = 0; -static uint16_t *fir_lepton_spi_rx_cb_dma_buffer = NULL; +extern int _fir_lepton_buf; STATIC mp_obj_t fir_lepton_spi_resync_callback(mp_obj_t unused) { @@ -75,7 +75,7 @@ STATIC mp_obj_t fir_lepton_spi_resync_callback(mp_obj_t unused) OMV_FIR_LEPTON_CS_LOW(); HAL_SPI_Receive_DMA(OMV_FIR_LEPTON_CONTROLLER->spi, - (uint8_t *) fir_lepton_spi_rx_cb_dma_buffer, + (uint8_t *) &_fir_lepton_buf, VOSPI_BUFFER_SIZE); return mp_const_none; @@ -115,10 +115,6 @@ static mp_obj_t fir_lepton_frame_cb = mp_const_none; void fir_lepton_spi_callback(const uint16_t *base) { - #if defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7) - SCB_InvalidateDCache_by_Addr((uint32_t *) base, VOSPI_PACKET_SIZE * sizeof(uint16_t)); - #endif - int id = base[0]; // Ignore don't care packets. @@ -198,12 +194,12 @@ void fir_lepton_spi_callback(const uint16_t *base) static void fir_lepton_spi_callback_half(SPI_HandleTypeDef *hspi) { - fir_lepton_spi_callback(fir_lepton_spi_rx_cb_dma_buffer); + fir_lepton_spi_callback((uint16_t *) &_fir_lepton_buf); } static void fir_lepton_spi_callback_full(SPI_HandleTypeDef *hspi) { - fir_lepton_spi_callback(fir_lepton_spi_rx_cb_dma_buffer + VOSPI_PACKET_SIZE); + fir_lepton_spi_callback(((uint16_t *) &_fir_lepton_buf) + VOSPI_PACKET_SIZE); } #if defined(OMV_FIR_LEPTON_VSYNC_PRESENT) @@ -451,9 +447,6 @@ int fir_lepton_init(cambus_t *bus, int *w, int *h, int *refresh, int *resolution FB_ALLOC_NO_HINT); } - fir_lepton_spi_rx_cb_dma_buffer = (uint16_t *) fb_alloc(VOSPI_BUFFER_SIZE * sizeof(uint16_t), - FB_ALLOC_PREFER_SPEED | FB_ALLOC_CACHE_ALIGN); - dma_init(&fir_lepton_spi_rx_dma, OMV_FIR_LEPTON_CONTROLLER->rx_dma_descr, DMA_PERIPH_TO_MEMORY, diff --git a/src/omv/ports/stm32/stm32fxxx.ld.S b/src/omv/ports/stm32/stm32fxxx.ld.S index 5d3895933..7b9f0b1e1 100755 --- a/src/omv/ports/stm32/stm32fxxx.ld.S +++ b/src/omv/ports/stm32/stm32fxxx.ld.S @@ -145,6 +145,10 @@ SECTIONS _vfs_buf = .; // VFS sturct + FATFS file buffer (around 624 bytes) . = . + OMV_VFS_BUF_SIZE; + . = ALIGN(16); + _fir_lepton_buf = .; // FIR Lepton Packet Double Buffer (328 bytes) + . = . + OMV_FIR_LEPTON_BUF_SIZE; + #if !defined(OMV_FFS_MEMORY) && defined(OMV_FFS_BUF_SIZE) . = ALIGN(16); _ffs_cache = .; // Flash filesystem cache diff --git a/src/uvc/stm32fxxx.ld.S b/src/uvc/stm32fxxx.ld.S index 59e112661..507903ec3 100755 --- a/src/uvc/stm32fxxx.ld.S +++ b/src/uvc/stm32fxxx.ld.S @@ -126,6 +126,10 @@ SECTIONS _vfs_buf = .; // VFS sturct + FATFS file buffer (around 624 bytes) . = . + OMV_VFS_BUF_SIZE; + . = ALIGN(16); + _fir_lepton_buf = .; // FIR Lepton Packet Double Buffer (328 bytes) + . = . + OMV_FIR_LEPTON_BUF_SIZE; + #if !defined(OMV_FFS_MEMORY) && defined(OMV_FFS_BUF_SIZE) . = ALIGN(16); _ffs_cache = .; // Flash filesystem cache