From 5f4250e74e2198e3ed2b29a5f57b32ea14703f20 Mon Sep 17 00:00:00 2001 From: Lake Fu Date: Sat, 12 Jun 2021 21:56:08 +0800 Subject: [PATCH] Reorganize the ISC SPI related handles/macros. (#1360) * Reorganize the ISC SPI related handles/macros. The SPI bus on image sensor connector is not design for Lepton sensor only. Thereforce, change the related functions and macros name from LEPTON_SPI_* to ISC_SPI_* and move interrupt callback to sensor.c. --- src/omv/boards/OPENMV4/omv_boardconfig.h | 48 +++++++------- src/omv/boards/OPENMV4P/omv_boardconfig.h | 48 +++++++------- src/omv/ports/stm32/sensor.c | 17 +++++ src/omv/ports/stm32/stm32fxxx_hal_msp.c | 30 ++++----- src/omv/sensors/lepton.c | 80 ++++++++++------------- 5 files changed, 115 insertions(+), 108 deletions(-) diff --git a/src/omv/boards/OPENMV4/omv_boardconfig.h b/src/omv/boards/OPENMV4/omv_boardconfig.h index b530537dc..5742e9d1e 100644 --- a/src/omv/boards/OPENMV4/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4/omv_boardconfig.h @@ -322,39 +322,39 @@ #define SOFT_I2C_SPIN_DELAY 64 -#define LEPTON_SPI (SPI3) +#define ISC_SPI (SPI3) // SPI1/2/3 clock source is PLL3 (160MHz/8 == 20MHz) - Minimum (164*240*8*27 = 8,501,760Hz) -#define LEPTON_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_8) +#define ISC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_8) -#define LEPTON_SPI_IRQn (SPI3_IRQn) -#define LEPTON_SPI_IRQHandler (SPI3_IRQHandler) +#define ISC_SPI_IRQn (SPI3_IRQn) +#define ISC_SPI_IRQHandler (SPI3_IRQHandler) -#define LEPTON_SPI_DMA_IRQn (DMA1_Stream0_IRQn) -#define LEPTON_SPI_DMA_STREAM (DMA1_Stream0) +#define ISC_SPI_DMA_IRQn (DMA1_Stream0_IRQn) +#define ISC_SPI_DMA_STREAM (DMA1_Stream0) -#define LEPTON_SPI_DMA_REQUEST (DMA_REQUEST_SPI3_RX) -#define LEPTON_SPI_DMA_IRQHandler (DMA1_Stream0_IRQHandler) +#define ISC_SPI_DMA_REQUEST (DMA_REQUEST_SPI3_RX) +#define ISC_SPI_DMA_IRQHandler (DMA1_Stream0_IRQHandler) -#define LEPTON_SPI_RESET() __HAL_RCC_SPI3_FORCE_RESET() -#define LEPTON_SPI_RELEASE() __HAL_RCC_SPI3_RELEASE_RESET() +#define ISC_SPI_RESET() __HAL_RCC_SPI3_FORCE_RESET() +#define ISC_SPI_RELEASE() __HAL_RCC_SPI3_RELEASE_RESET() -#define LEPTON_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() -#define LEPTON_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() +#define ISC_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() +#define ISC_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() -#define LEPTON_SPI_SCLK_AF (GPIO_AF6_SPI3) -#define LEPTON_SPI_MISO_AF (GPIO_AF6_SPI3) -#define LEPTON_SPI_MOSI_AF (GPIO_AF7_SPI3) -#define LEPTON_SPI_SSEL_AF (GPIO_AF6_SPI3) +#define ISC_SPI_SCLK_AF (GPIO_AF6_SPI3) +#define ISC_SPI_MISO_AF (GPIO_AF6_SPI3) +#define ISC_SPI_MOSI_AF (GPIO_AF7_SPI3) +#define ISC_SPI_SSEL_AF (GPIO_AF6_SPI3) -#define LEPTON_SPI_SCLK_PIN (GPIO_PIN_3) -#define LEPTON_SPI_MISO_PIN (GPIO_PIN_4) -#define LEPTON_SPI_MOSI_PIN (GPIO_PIN_5) -#define LEPTON_SPI_SSEL_PIN (GPIO_PIN_15) +#define ISC_SPI_SCLK_PIN (GPIO_PIN_3) +#define ISC_SPI_MISO_PIN (GPIO_PIN_4) +#define ISC_SPI_MOSI_PIN (GPIO_PIN_5) +#define ISC_SPI_SSEL_PIN (GPIO_PIN_15) -#define LEPTON_SPI_SCLK_PORT (GPIOB) -#define LEPTON_SPI_MISO_PORT (GPIOB) -#define LEPTON_SPI_MOSI_PORT (GPIOB) -#define LEPTON_SPI_SSEL_PORT (GPIOA) +#define ISC_SPI_SCLK_PORT (GPIOB) +#define ISC_SPI_MISO_PORT (GPIOB) +#define ISC_SPI_MOSI_PORT (GPIOB) +#define ISC_SPI_SSEL_PORT (GPIOA) // The IMU sensor is on the same SPI bus pins as the camera module interface // SPI bus. While the buses overlap both devices will never be in-use at once. diff --git a/src/omv/boards/OPENMV4P/omv_boardconfig.h b/src/omv/boards/OPENMV4P/omv_boardconfig.h index e5fa7ef2b..824f3bc8d 100644 --- a/src/omv/boards/OPENMV4P/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4P/omv_boardconfig.h @@ -330,39 +330,39 @@ #define SOFT_I2C_SPIN_DELAY 64 -#define LEPTON_SPI (SPI3) +#define ISC_SPI (SPI3) // SPI1/2/3 clock source is PLL3 (160MHz/8 == 20MHz) - Minimum (164*240*8*27 = 8,501,760Hz) -#define LEPTON_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_8) +#define ISC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_8) -#define LEPTON_SPI_IRQn (SPI3_IRQn) -#define LEPTON_SPI_IRQHandler (SPI3_IRQHandler) +#define ISC_SPI_IRQn (SPI3_IRQn) +#define ISC_SPI_IRQHandler (SPI3_IRQHandler) -#define LEPTON_SPI_DMA_IRQn (DMA1_Stream0_IRQn) -#define LEPTON_SPI_DMA_STREAM (DMA1_Stream0) +#define ISC_SPI_DMA_IRQn (DMA1_Stream0_IRQn) +#define ISC_SPI_DMA_STREAM (DMA1_Stream0) -#define LEPTON_SPI_DMA_REQUEST (DMA_REQUEST_SPI3_RX) -#define LEPTON_SPI_DMA_IRQHandler (DMA1_Stream0_IRQHandler) +#define ISC_SPI_DMA_REQUEST (DMA_REQUEST_SPI3_RX) +#define ISC_SPI_DMA_IRQHandler (DMA1_Stream0_IRQHandler) -#define LEPTON_SPI_RESET() __HAL_RCC_SPI3_FORCE_RESET() -#define LEPTON_SPI_RELEASE() __HAL_RCC_SPI3_RELEASE_RESET() +#define ISC_SPI_RESET() __HAL_RCC_SPI3_FORCE_RESET() +#define ISC_SPI_RELEASE() __HAL_RCC_SPI3_RELEASE_RESET() -#define LEPTON_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() -#define LEPTON_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() +#define ISC_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() +#define ISC_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() -#define LEPTON_SPI_SCLK_AF (GPIO_AF6_SPI3) -#define LEPTON_SPI_MISO_AF (GPIO_AF6_SPI3) -#define LEPTON_SPI_MOSI_AF (GPIO_AF7_SPI3) -#define LEPTON_SPI_SSEL_AF (GPIO_AF6_SPI3) +#define ISC_SPI_SCLK_AF (GPIO_AF6_SPI3) +#define ISC_SPI_MISO_AF (GPIO_AF6_SPI3) +#define ISC_SPI_MOSI_AF (GPIO_AF7_SPI3) +#define ISC_SPI_SSEL_AF (GPIO_AF6_SPI3) -#define LEPTON_SPI_SCLK_PIN (GPIO_PIN_3) -#define LEPTON_SPI_MISO_PIN (GPIO_PIN_4) -#define LEPTON_SPI_MOSI_PIN (GPIO_PIN_5) -#define LEPTON_SPI_SSEL_PIN (GPIO_PIN_15) +#define ISC_SPI_SCLK_PIN (GPIO_PIN_3) +#define ISC_SPI_MISO_PIN (GPIO_PIN_4) +#define ISC_SPI_MOSI_PIN (GPIO_PIN_5) +#define ISC_SPI_SSEL_PIN (GPIO_PIN_15) -#define LEPTON_SPI_SCLK_PORT (GPIOB) -#define LEPTON_SPI_MISO_PORT (GPIOB) -#define LEPTON_SPI_MOSI_PORT (GPIOB) -#define LEPTON_SPI_SSEL_PORT (GPIOA) +#define ISC_SPI_SCLK_PORT (GPIOB) +#define ISC_SPI_MISO_PORT (GPIOB) +#define ISC_SPI_MOSI_PORT (GPIOB) +#define ISC_SPI_SSEL_PORT (GPIOA) // QSPI flash configuration for the bootloader. #define QSPIF_SIZE_BITS (25) // 2**25 == 32MBytes. diff --git a/src/omv/ports/stm32/sensor.c b/src/omv/ports/stm32/sensor.c index 7b9420403..7058eb9fa 100644 --- a/src/omv/ports/stm32/sensor.c +++ b/src/omv/ports/stm32/sensor.c @@ -50,6 +50,11 @@ static DCMI_HandleTypeDef DCMIHandle = {.Instance = DCMI}; static MDMA_HandleTypeDef DCMI_MDMA_Handle0 = {.Instance = MDMA_Channel0}; static MDMA_HandleTypeDef DCMI_MDMA_Handle1 = {.Instance = MDMA_Channel1}; #endif +// SPI on image sensor connector. +#ifdef ISC_SPI +SPI_HandleTypeDef ISC_SPIHandle = {.Instance = ISC_SPI}; +#endif // ISC_SPI + static bool first_line = false; static bool drop_frame = false; @@ -108,6 +113,18 @@ void DMA2_Stream1_IRQHandler(void) { HAL_DMA_IRQHandler(DCMIHandle.DMA_Handle); } +#ifdef ISC_SPI +void ISC_SPI_IRQHandler(void) +{ + HAL_SPI_IRQHandler(&ISC_SPIHandle); +} + +void ISC_SPI_DMA_IRQHandler(void) +{ + HAL_DMA_IRQHandler(ISC_SPIHandle.hdmarx); +} +#endif // ISC_SPI + static int extclk_config(int frequency) { #if (OMV_XCLK_SOURCE == OMV_XCLK_TIM) diff --git a/src/omv/ports/stm32/stm32fxxx_hal_msp.c b/src/omv/ports/stm32/stm32fxxx_hal_msp.c index a4af0dd6c..2f7be05d5 100644 --- a/src/omv/ports/stm32/stm32fxxx_hal_msp.c +++ b/src/omv/ports/stm32/stm32fxxx_hal_msp.c @@ -418,30 +418,30 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) } #endif - #if defined(LEPTON_SPI) - if (hspi->Instance == LEPTON_SPI) { - LEPTON_SPI_CLK_ENABLE(); + #if defined(ISC_SPI) + if (hspi->Instance == ISC_SPI) { + ISC_SPI_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Alternate = LEPTON_SPI_SCLK_AF; - GPIO_InitStructure.Pin = LEPTON_SPI_SCLK_PIN; - HAL_GPIO_Init(LEPTON_SPI_SCLK_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Alternate = ISC_SPI_SCLK_AF; + GPIO_InitStructure.Pin = ISC_SPI_SCLK_PIN; + HAL_GPIO_Init(ISC_SPI_SCLK_PORT, &GPIO_InitStructure); - GPIO_InitStructure.Alternate = LEPTON_SPI_MISO_AF; - GPIO_InitStructure.Pin = LEPTON_SPI_MISO_PIN; - HAL_GPIO_Init(LEPTON_SPI_MISO_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Alternate = ISC_SPI_MISO_AF; + GPIO_InitStructure.Pin = ISC_SPI_MISO_PIN; + HAL_GPIO_Init(ISC_SPI_MISO_PORT, &GPIO_InitStructure); - GPIO_InitStructure.Alternate = LEPTON_SPI_MOSI_AF; - GPIO_InitStructure.Pin = LEPTON_SPI_MOSI_PIN; - HAL_GPIO_Init(LEPTON_SPI_MOSI_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Alternate = ISC_SPI_MOSI_AF; + GPIO_InitStructure.Pin = ISC_SPI_MOSI_PIN; + HAL_GPIO_Init(ISC_SPI_MOSI_PORT, &GPIO_InitStructure); - GPIO_InitStructure.Alternate = LEPTON_SPI_SSEL_AF; - GPIO_InitStructure.Pin = LEPTON_SPI_SSEL_PIN; - HAL_GPIO_Init(LEPTON_SPI_SSEL_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Alternate = ISC_SPI_SSEL_AF; + GPIO_InitStructure.Pin = ISC_SPI_SSEL_PIN; + HAL_GPIO_Init(ISC_SPI_SSEL_PORT, &GPIO_InitStructure); } #endif } diff --git a/src/omv/sensors/lepton.c b/src/omv/sensors/lepton.c index 06f696c2e..35ebfc6ad 100644 --- a/src/omv/sensors/lepton.c +++ b/src/omv/sensors/lepton.c @@ -52,7 +52,7 @@ static bool measurement_mode = false; static float min_temp = DEFAULT_MIN_TEMP; static float max_temp = DEFAULT_MAX_TEMP; -static SPI_HandleTypeDef SPIHandle; +extern SPI_HandleTypeDef ISC_SPIHandle; static DMA_HandleTypeDef DMAHandle; LEP_CAMERA_PORT_DESC_T LEPHandle; extern uint8_t _line_buf[]; @@ -66,22 +66,12 @@ static volatile uint32_t vospi_seg = 1; static uint32_t vospi_packets = 60; static int lepton_reset(sensor_t *sensor, bool measurement_mode); -void LEPTON_SPI_IRQHandler(void) -{ - HAL_SPI_IRQHandler(&SPIHandle); -} - -void LEPTON_SPI_DMA_IRQHandler(void) -{ - HAL_DMA_IRQHandler(SPIHandle.hdmarx); -} - static void lepton_sync() { - HAL_SPI_Abort(&SPIHandle); + HAL_SPI_Abort(&ISC_SPIHandle); // Disable DMA IRQ - HAL_NVIC_DisableIRQ(LEPTON_SPI_DMA_IRQn); + HAL_NVIC_DisableIRQ(ISC_SPI_DMA_IRQn); debug_printf("resync...\n"); mp_hal_delay_ms(200); @@ -90,8 +80,8 @@ static void lepton_sync() vospi_pid = VOSPI_FIRST_PACKET; vospi_seg = VOSPI_FIRST_SEGMENT; - HAL_NVIC_EnableIRQ(LEPTON_SPI_DMA_IRQn); - HAL_SPI_Receive_DMA(&SPIHandle, vospi_packet, VOSPI_PACKET_SIZE); + HAL_NVIC_EnableIRQ(ISC_SPI_DMA_IRQn); + HAL_SPI_Receive_DMA(&ISC_SPIHandle, vospi_packet, VOSPI_PACKET_SIZE); } static uint16_t lepton_calc_crc(uint8_t *buf) @@ -510,10 +500,10 @@ static int snapshot(sensor_t *sensor, image_t *image, uint32_t flags) // If we need to re-sync we do it. Otherwise, after we finish pulling data // in we exit and let the SPI bus keep running. Then on the next call to // snapshot we read in more data and pull in the next frame. - HAL_NVIC_DisableIRQ(LEPTON_SPI_DMA_IRQn); + HAL_NVIC_DisableIRQ(ISC_SPI_DMA_IRQn); vospi_pid = VOSPI_FIRST_PACKET; vospi_seg = VOSPI_FIRST_SEGMENT; - HAL_NVIC_EnableIRQ(LEPTON_SPI_DMA_IRQn); + HAL_NVIC_EnableIRQ(ISC_SPI_DMA_IRQn); // Snapshot start tick mp_uint_t tick_start = mp_hal_ticks_ms(); @@ -546,10 +536,10 @@ static int snapshot(sensor_t *sensor, image_t *image, uint32_t flags) } // Reset the VOSPI interface again. - HAL_NVIC_DisableIRQ(LEPTON_SPI_DMA_IRQn); + HAL_NVIC_DisableIRQ(ISC_SPI_DMA_IRQn); vospi_pid = VOSPI_FIRST_PACKET; vospi_seg = VOSPI_FIRST_SEGMENT; - HAL_NVIC_EnableIRQ(LEPTON_SPI_DMA_IRQn); + HAL_NVIC_EnableIRQ(ISC_SPI_DMA_IRQn); } } while (vospi_pid < vospi_packets); // only checking one volatile var so atomic. @@ -675,8 +665,8 @@ int lepton_init(sensor_t *sensor) SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_JPEGE, 0); // Configure the DMA handler for Transmission process - DMAHandle.Instance = LEPTON_SPI_DMA_STREAM; - DMAHandle.Init.Request = LEPTON_SPI_DMA_REQUEST; + DMAHandle.Instance = ISC_SPI_DMA_STREAM; + DMAHandle.Init.Request = ISC_SPI_DMA_REQUEST; DMAHandle.Init.Mode = DMA_CIRCULAR; DMAHandle.Init.Priority = DMA_PRIORITY_HIGH; DMAHandle.Init.Direction = DMA_PERIPH_TO_MEMORY; @@ -694,8 +684,8 @@ int lepton_init(sensor_t *sensor) DMAHandle.Init.PeriphInc = DMA_PINC_DISABLE; // NVIC configuration for DMA transfer complete interrupt - NVIC_SetPriority(LEPTON_SPI_DMA_IRQn, IRQ_PRI_DMA21); - HAL_NVIC_DisableIRQ(LEPTON_SPI_DMA_IRQn); + NVIC_SetPriority(ISC_SPI_DMA_IRQn, IRQ_PRI_DMA21); + HAL_NVIC_DisableIRQ(ISC_SPI_DMA_IRQn); HAL_DMA_DeInit(&DMAHandle); if (HAL_DMA_Init(&DMAHandle) != HAL_OK) { @@ -703,36 +693,36 @@ int lepton_init(sensor_t *sensor) return -1; } - memset(&SPIHandle, 0, sizeof(SPIHandle)); - SPIHandle.Instance = LEPTON_SPI; - SPIHandle.Init.NSS = SPI_NSS_HARD_OUTPUT; - SPIHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - SPIHandle.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; - SPIHandle.Init.Mode = SPI_MODE_MASTER; - SPIHandle.Init.TIMode = SPI_TIMODE_DISABLE; - SPIHandle.Init.Direction = SPI_DIRECTION_2LINES_RXONLY; - SPIHandle.Init.DataSize = SPI_DATASIZE_8BIT; - SPIHandle.Init.FifoThreshold = SPI_FIFO_THRESHOLD_04DATA; - SPIHandle.Init.FirstBit = SPI_FIRSTBIT_MSB; - SPIHandle.Init.CLKPhase = SPI_PHASE_2EDGE; - SPIHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; - SPIHandle.Init.BaudRatePrescaler = LEPTON_SPI_PRESCALER; + memset(&ISC_SPIHandle, 0, sizeof(ISC_SPIHandle)); + ISC_SPIHandle.Instance = ISC_SPI; + ISC_SPIHandle.Init.NSS = SPI_NSS_HARD_OUTPUT; + ISC_SPIHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + ISC_SPIHandle.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + ISC_SPIHandle.Init.Mode = SPI_MODE_MASTER; + ISC_SPIHandle.Init.TIMode = SPI_TIMODE_DISABLE; + ISC_SPIHandle.Init.Direction = SPI_DIRECTION_2LINES_RXONLY; + ISC_SPIHandle.Init.DataSize = SPI_DATASIZE_8BIT; + ISC_SPIHandle.Init.FifoThreshold = SPI_FIFO_THRESHOLD_04DATA; + ISC_SPIHandle.Init.FirstBit = SPI_FIRSTBIT_MSB; + ISC_SPIHandle.Init.CLKPhase = SPI_PHASE_2EDGE; + ISC_SPIHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; + ISC_SPIHandle.Init.BaudRatePrescaler = ISC_SPI_PRESCALER; // Recommanded setting to avoid glitches - SPIHandle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; + ISC_SPIHandle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; - if (HAL_SPI_Init(&SPIHandle) != HAL_OK) { - LEPTON_SPI_RESET(); - LEPTON_SPI_RELEASE(); - LEPTON_SPI_CLK_DISABLE(); + if (HAL_SPI_Init(&ISC_SPIHandle) != HAL_OK) { + ISC_SPI_RESET(); + ISC_SPI_RELEASE(); + ISC_SPI_CLK_DISABLE(); return -1; } // Associate the initialized DMA handle to the the SPI handle - __HAL_LINKDMA(&SPIHandle, hdmarx, DMAHandle); + __HAL_LINKDMA(&ISC_SPIHandle, hdmarx, DMAHandle); // NVIC configuration for SPI transfer complete interrupt - NVIC_SetPriority(LEPTON_SPI_IRQn, IRQ_PRI_DCMI); - HAL_NVIC_EnableIRQ(LEPTON_SPI_IRQn); + NVIC_SetPriority(ISC_SPI_IRQn, IRQ_PRI_DCMI); + HAL_NVIC_EnableIRQ(ISC_SPI_IRQn); return 0; }