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.
This commit is contained in:
Lake Fu 2021-06-12 21:56:08 +08:00 committed by GitHub
parent ac794eb43d
commit 5f4250e74e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 115 additions and 108 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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)

View File

@ -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
}

View File

@ -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;
}