diff --git a/targets/TARGET_STM/TARGET_STM32F4/objects.h b/targets/TARGET_STM/TARGET_STM32F4/objects.h index 1b32200e2ec..6f1882ca445 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/objects.h +++ b/targets/TARGET_STM/TARGET_STM32F4/objects.h @@ -156,7 +156,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32F7/objects.h b/targets/TARGET_STM/TARGET_STM32F7/objects.h index 44f0b3e0e38..0712ef6d569 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/objects.h +++ b/targets/TARGET_STM/TARGET_STM32F7/objects.h @@ -130,7 +130,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32G0/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32G0/stm_dma_info.h index 419f2f806b1..1d941f6aef7 100644 --- a/targets/TARGET_STM/TARGET_STM32G0/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32G0/stm_dma_info.h @@ -26,26 +26,16 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_TX}, - {1, 3, DMA_REQUEST_SPI2_TX}, -#ifdef DMA2 - // For better performance, on devices with DMA2 (STM32G0Bxx/Cxx), put SPI3 on DMA2 - {2, 1, DMA_REQUEST_SPI3_TX} -#else - {1, 5, DMA_REQUEST_SPI3_TX} -#endif + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_TX} }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 2, DMA_REQUEST_SPI1_RX}, - {1, 4, DMA_REQUEST_SPI2_RX}, -#ifdef DMA2 - // For better performance, on devices with DMA2 (STM32G0Bxx/Cxx), put SPI3 on DMA2 - {2, 2, DMA_REQUEST_SPI3_RX} -#else - {1, 6, DMA_REQUEST_SPI3_RX} -#endif + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_RX} }; diff --git a/targets/TARGET_STM/TARGET_STM32G4/objects.h b/targets/TARGET_STM/TARGET_STM32G4/objects.h index 3fbd97297ff..63b7fd74192 100644 --- a/targets/TARGET_STM/TARGET_STM32G4/objects.h +++ b/targets/TARGET_STM/TARGET_STM32G4/objects.h @@ -113,7 +113,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32G4/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32G4/stm_dma_info.h index 315b1a18348..bbf8fadd6c8 100644 --- a/targets/TARGET_STM/TARGET_STM32G4/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32G4/stm_dma_info.h @@ -26,28 +26,28 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_TX}, - {1, 3, DMA_REQUEST_SPI2_TX}, - {1, 5, DMA_REQUEST_SPI3_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_TX}, #ifdef SPI4 - {2, 1, DMA_REQUEST_SPI4_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI4_TX} #endif }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 2, DMA_REQUEST_SPI1_RX}, - {1, 4, DMA_REQUEST_SPI2_RX}, - {1, 6, DMA_REQUEST_SPI3_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_RX}, #ifdef SPI4 - {2, 2, DMA_REQUEST_SPI4_RX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI4_RX} #endif }; /// Mapping from QSPI index to DMA link info static const DMALinkInfo QSPIDMALinks[] = { #if defined(QUADSPI) - {1, 7, DMA_REQUEST_QUADSPI }, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_QUADSPI }, #endif }; diff --git a/targets/TARGET_STM/TARGET_STM32H5/objects.h b/targets/TARGET_STM/TARGET_STM32H5/objects.h index ecacb21672a..135a024b09f 100644 --- a/targets/TARGET_STM/TARGET_STM32H5/objects.h +++ b/targets/TARGET_STM/TARGET_STM32H5/objects.h @@ -94,7 +94,8 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; + DMAHandlePointer dmaHandleTX; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; @@ -118,7 +119,8 @@ struct ospi_s { PinName sclk; PinName ssel; PinName dqs; - bool dmaInitialized; + DMAHandlePointer dmaHandle; + DMAHandlePointer dmaHandleTX; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32H5/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32H5/stm_dma_info.h index c9c421d7fe2..3b9f43e6bc0 100644 --- a/targets/TARGET_STM/TARGET_STM32H5/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32H5/stm_dma_info.h @@ -26,41 +26,41 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 0, GPDMA1_REQUEST_SPI1_TX}, - {1, 2, GPDMA1_REQUEST_SPI2_TX}, - {1, 4, GPDMA1_REQUEST_SPI3_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI3_TX} #if defined (SPI4) - ,{1, 6, GPDMA1_REQUEST_SPI4_TX} + ,{MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI4_TX} #endif #if defined (SPI5) - ,{2, 0, GPDMA2_REQUEST_SPI5_TX} + ,{MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA2_REQUEST_SPI5_TX} #endif #if defined (SPI6) - ,{2, 2, GPDMA2_REQUEST_SPI6_TX} + ,{MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA2_REQUEST_SPI6_TX} #endif }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 1, GPDMA1_REQUEST_SPI1_RX}, - {1, 3, GPDMA1_REQUEST_SPI2_RX}, - {1, 5, GPDMA1_REQUEST_SPI3_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI3_TX} #if defined (SPI4) - ,{1, 7, GPDMA1_REQUEST_SPI4_RX} + ,{MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI4_RX} #endif #if defined (SPI5) - ,{2, 1, GPDMA2_REQUEST_SPI5_RX} + ,{MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA2_REQUEST_SPI5_RX} #endif #if defined (SPI6) - ,{2, 3, GPDMA2_REQUEST_SPI6_RX} + ,{MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA2_REQUEST_SPI6_RX} #endif }; /// Mapping from OSPI index to DMA link info #ifdef OCTOSPI1 static const DMALinkInfo OSPIDMALinks[] = { - {2, 4, GPDMA2_REQUEST_OCTOSPI1}, - {2, 5, GPDMA2_REQUEST_OCTOSPI1}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA2_REQUEST_OCTOSPI1}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA2_REQUEST_OCTOSPI1}, }; #endif diff --git a/targets/TARGET_STM/TARGET_STM32H7/objects.h b/targets/TARGET_STM/TARGET_STM32H7/objects.h index 880074678e1..f9f48f1bcf1 100644 --- a/targets/TARGET_STM/TARGET_STM32H7/objects.h +++ b/targets/TARGET_STM/TARGET_STM32H7/objects.h @@ -101,7 +101,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; @@ -125,7 +125,7 @@ struct ospi_s { PinName sclk; PinName ssel; PinName dqs; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32H7/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32H7/stm_dma_info.h index d5210b2ffda..563adfa372d 100644 --- a/targets/TARGET_STM/TARGET_STM32H7/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32H7/stm_dma_info.h @@ -26,31 +26,31 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_TX}, - {1, 3, DMA_REQUEST_SPI2_TX}, - {1, 5, DMA_REQUEST_SPI3_TX}, - {1, 7, DMA_REQUEST_SPI4_TX}, - {2, 1, DMA_REQUEST_SPI5_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI4_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI5_TX}, }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 0, DMA_REQUEST_SPI1_RX}, - {1, 2, DMA_REQUEST_SPI2_RX}, - {1, 4, DMA_REQUEST_SPI3_RX}, - {1, 6, DMA_REQUEST_SPI4_RX}, - {2, 0, DMA_REQUEST_SPI5_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI4_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI5_RX}, }; /// Mapping from QSPI/OSPI index to DMA link info #if defined(OCTOSPI1) static const DMALinkInfo OSPIDMALinks[] = { - {MDMA_IDX, 0, MDMA_REQUEST_OCTOSPI1_FIFO_TH}, - {MDMA_IDX, 1, MDMA_REQUEST_OCTOSPI2_FIFO_TH} + {MDMA_IDX, MBED_ANY_DMA_CHANNEL, MDMA_REQUEST_OCTOSPI1_FIFO_TH}, + {MDMA_IDX, MBED_ANY_DMA_CHANNEL, MDMA_REQUEST_OCTOSPI2_FIFO_TH} }; #else static const DMALinkInfo QSPIDMALinks[] = { - {MDMA_IDX, 0, MDMA_REQUEST_QUADSPI_FIFO_TH}, + {MDMA_IDX, MBED_ANY_DMA_CHANNEL, MDMA_REQUEST_QUADSPI_FIFO_TH}, }; #endif diff --git a/targets/TARGET_STM/TARGET_STM32L4/objects.h b/targets/TARGET_STM/TARGET_STM32L4/objects.h index 45b86bb0e96..cdcf0650b18 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/objects.h +++ b/targets/TARGET_STM/TARGET_STM32L4/objects.h @@ -123,7 +123,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; @@ -147,7 +147,7 @@ struct ospi_s { PinName sclk; PinName ssel; PinName dqs; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32L4/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32L4/stm_dma_info.h index c0167c607ae..93767ff830a 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32L4/stm_dma_info.h @@ -28,22 +28,22 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_TX}, - {1, 3, DMA_REQUEST_SPI2_TX}, - {1, 5, DMA_REQUEST_SPI3_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_TX} }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 2, DMA_REQUEST_SPI1_RX}, - {1, 4, DMA_REQUEST_SPI2_RX}, - {1, 6, DMA_REQUEST_SPI3_RX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_RX} }; /// Mapping from OSPI index to DMA link info static const DMALinkInfo OSPIDMALinks[] = { - {1, 7, DMA_REQUEST_OCTOSPI1}, - {2, 1, DMA_REQUEST_OCTOSPI2}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_OCTOSPI1}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_OCTOSPI2}, }; #else diff --git a/targets/TARGET_STM/TARGET_STM32L5/objects.h b/targets/TARGET_STM/TARGET_STM32L5/objects.h index f4c0e5bf79c..bf5e5cb510d 100644 --- a/targets/TARGET_STM/TARGET_STM32L5/objects.h +++ b/targets/TARGET_STM/TARGET_STM32L5/objects.h @@ -120,7 +120,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; @@ -142,7 +142,7 @@ struct ospi_s { PinName sclk; PinName ssel; PinName dqs; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32L5/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32L5/stm_dma_info.h index 3f4e19123df..ef34975fa7b 100644 --- a/targets/TARGET_STM/TARGET_STM32L5/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32L5/stm_dma_info.h @@ -26,21 +26,21 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_TX}, - {1, 3, DMA_REQUEST_SPI2_TX}, - {1, 5, DMA_REQUEST_SPI3_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_TX}, }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 2, DMA_REQUEST_SPI1_RX}, - {1, 4, DMA_REQUEST_SPI2_RX}, - {1, 6, DMA_REQUEST_SPI3_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_RX}, }; /// Mapping from OSPI index to DMA link info static const DMALinkInfo OSPIDMALinks[] = { - {1, 7, DMA_REQUEST_OCTOSPI1}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_OCTOSPI1}, }; #endif //MBED_OS_STM_DMA_INFO_H diff --git a/targets/TARGET_STM/TARGET_STM32U0/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32U0/stm_dma_info.h index 929159998c9..3a73c74f71c 100644 --- a/targets/TARGET_STM/TARGET_STM32U0/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32U0/stm_dma_info.h @@ -26,19 +26,19 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 2, DMA_REQUEST_SPI1_TX}, - {1, 4, DMA_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX}, #if defined (SPI3) - {1, 6, DMA_REQUEST_SPI3_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_TX} #endif }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_RX}, - {1, 3, DMA_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX}, #if defined (SPI3) - {1, 5, DMA_REQUEST_SPI3_RX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI3_RX} #endif }; diff --git a/targets/TARGET_STM/TARGET_STM32U5/objects.h b/targets/TARGET_STM/TARGET_STM32U5/objects.h index c6dc11449bc..49039e73e9e 100644 --- a/targets/TARGET_STM/TARGET_STM32U5/objects.h +++ b/targets/TARGET_STM/TARGET_STM32U5/objects.h @@ -120,7 +120,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; @@ -142,7 +142,7 @@ struct ospi_s { PinName sclk; PinName ssel; PinName dqs; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32U5/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32U5/stm_dma_info.h index 53d75bdee74..b1febf90717 100644 --- a/targets/TARGET_STM/TARGET_STM32U5/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32U5/stm_dma_info.h @@ -26,23 +26,23 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 0, GPDMA1_REQUEST_SPI1_TX}, - {1, 2, GPDMA1_REQUEST_SPI2_TX}, - {1, 4, GPDMA1_REQUEST_SPI3_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI2_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI3_TX} }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 1, GPDMA1_REQUEST_SPI1_RX}, - {1, 3, GPDMA1_REQUEST_SPI2_RX}, - {1, 5, GPDMA1_REQUEST_SPI3_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI2_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_SPI3_TX} }; /// Mapping from OSPI index to DMA link info static const DMALinkInfo OSPIDMALinks[] = { - {1, 6, GPDMA1_REQUEST_OCTOSPI1}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_OCTOSPI1}, #if defined(OCTOSPI2) - {1, 7, GPDMA1_REQUEST_OCTOSPI2} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, GPDMA1_REQUEST_OCTOSPI2} #endif }; diff --git a/targets/TARGET_STM/TARGET_STM32WB/objects.h b/targets/TARGET_STM/TARGET_STM32WB/objects.h index a0372a67524..828d25ad500 100644 --- a/targets/TARGET_STM/TARGET_STM32WB/objects.h +++ b/targets/TARGET_STM/TARGET_STM32WB/objects.h @@ -104,7 +104,7 @@ struct qspi_s { PinName io3; PinName sclk; PinName ssel; - bool dmaInitialized; + DMAHandlePointer dmaHandle; #if MBED_CONF_RTOS_PRESENT osSemaphoreId_t semaphoreId; osRtxSemaphore_t semaphoreMem; diff --git a/targets/TARGET_STM/TARGET_STM32WB/stm_dma_info.h b/targets/TARGET_STM/TARGET_STM32WB/stm_dma_info.h index ce044509db0..e62f6fb72a7 100644 --- a/targets/TARGET_STM/TARGET_STM32WB/stm_dma_info.h +++ b/targets/TARGET_STM/TARGET_STM32WB/stm_dma_info.h @@ -26,23 +26,23 @@ /// Mapping from SPI index to DMA link info for Tx static const DMALinkInfo SPITxDMALinks[] = { - {1, 1, DMA_REQUEST_SPI1_TX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_TX}, #ifdef SPI2 - {1, 3, DMA_REQUEST_SPI2_TX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_TX} #endif }; /// Mapping from SPI index to DMA link info for Rx static const DMALinkInfo SPIRxDMALinks[] = { - {1, 2, DMA_REQUEST_SPI1_RX}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI1_RX}, #ifdef SPI2 - {1, 4, DMA_REQUEST_SPI2_RX} + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_SPI2_RX} #endif }; static const DMALinkInfo QSPIDMALinks[] = { #if defined(QUADSPI) - {1, 5, DMA_REQUEST_QUADSPI}, + {MBED_ANY_GPDMA_MODULE, MBED_ANY_DMA_CHANNEL, DMA_REQUEST_QUADSPI}, #endif }; diff --git a/targets/TARGET_STM/mbed_overrides.c b/targets/TARGET_STM/mbed_overrides.c index 8611202c85e..084f82ad057 100644 --- a/targets/TARGET_STM/mbed_overrides.c +++ b/targets/TARGET_STM/mbed_overrides.c @@ -17,6 +17,7 @@ #include "objects.h" #include "platform/mbed_error.h" #include "rtc_api_hal.h" +#include "stm_dma_utils.h" int mbed_sdk_inited = 0; extern void SetSysClock(void); @@ -308,6 +309,9 @@ void mbed_sdk_init() #endif #endif + /* Initialize the mutex for DMA */ + stm_init_dma_mutex(); + /* BSP initialization hook (external RAM, etc) */ TargetBSP_Init(); diff --git a/targets/TARGET_STM/ospi_api.c b/targets/TARGET_STM/ospi_api.c index f9dfa83b1c0..aed90704828 100644 --- a/targets/TARGET_STM/ospi_api.c +++ b/targets/TARGET_STM/ospi_api.c @@ -258,7 +258,7 @@ ospi_status_t ospi_prepare_command(const ospi_command_t *command, OSPI_RegularCm */ static void ospi_init_dma(struct ospi_s * obj) { - if(!obj->dmaInitialized) + if(obj->dmaHandle.dmaIdx == 0) { // Get DMA handle DMALinkInfo const *dmaLink; @@ -275,30 +275,29 @@ static void ospi_init_dma(struct ospi_s * obj) dmaLink = &OSPIDMALinks[0]; #endif // Initialize DMA channel - DMAHandlePointer dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); - if(dmaHandle.hdma == NULL) + obj->dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); + if(obj->dmaHandle.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } #if defined(MDMA) - __HAL_LINKDMA(&obj->handle, hmdma, *dmaHandle.hmdma); + __HAL_LINKDMA(&obj->handle, hmdma, *obj->dmaHandle.hmdma); #elif defined(TARGET_STM32H5) - __HAL_LINKDMA(&obj->handle, hdmarx, *dmaHandle.hdma); + __HAL_LINKDMA(&obj->handle, hdmarx, *obj->dmaHandle.hdma); #else - __HAL_LINKDMA(&obj->handle, hdma, *dmaHandle.hdma); + __HAL_LINKDMA(&obj->handle, hdma, *obj->dmaHandle.hdma); #endif #if defined(TARGET_STM32H5) // STM32H5 has only one OCTOSPI instance, but it requires separate DMA channels for RX and TX DMALinkInfo const *dmaLinkTX = &OSPIDMALinks[1]; // Initialize DMA channel - DMAHandlePointer dmaHandleTX = stm_init_dma_link(dmaLinkTX, DMA_MEMORY_TO_PERIPH, false, true, 1, 1, DMA_NORMAL); - if(dmaHandleTX.hdma == NULL) + obj->dmaHandleTX = stm_init_dma_link(dmaLinkTX, DMA_MEMORY_TO_PERIPH, false, true, 1, 1, DMA_NORMAL); + if(obj->dmaHandleTX.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } - __HAL_LINKDMA(&obj->handle, hdmatx, *dmaHandleTX.hdma); + __HAL_LINKDMA(&obj->handle, hdmatx, *obj->dmaHandleTX.hdma); #endif - obj->dmaInitialized = true; #if MBED_CONF_RTOS_PRESENT osSemaphoreAttr_t attr = { 0 }; attr.cb_mem = &obj->semaphoreMem; @@ -361,7 +360,7 @@ static ospi_status_t _ospi_init_direct(ospi_t *obj, const ospi_pinmap_t *pinmap, // tested all combinations, take first obj->ospi = pinmap->peripheral; - obj->dmaInitialized = false; + obj->dmaHandle.dmaIdx = 0; #if defined(OCTOSPI1) if (obj->ospi == OSPI_1) { @@ -516,26 +515,12 @@ ospi_status_t ospi_free(ospi_t *obj) { tr_debug("ospi_free"); - if(obj->dmaInitialized) + if(obj->dmaHandle.dmaIdx != 0) { - // Get DMA handle - DMALinkInfo const *dmaLink; -#if defined(OCTOSPI2) - if(obj->ospi == (OSPIName) OSPI_1) - { - dmaLink = &OSPIDMALinks[0]; - } - else - { - dmaLink = &OSPIDMALinks[1]; - } -#else - dmaLink = &OSPIDMALinks[0]; -#endif - stm_free_dma_link(dmaLink); + stm_free_dma_link(&obj->dmaHandle); #if defined(STM32H5) // Free TX DMA handle for STM32H5 - stm_free_dma_link(&OSPIDMALinks[1]); + stm_free_dma_link(&obj->dmaHandleTX); #endif } @@ -682,6 +667,7 @@ ospi_status_t ospi_read(ospi_t *obj, const ospi_command_t *command, void *data, } #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + extern void split_buffer_by_cacheline(void *buffer, const size_t *length, size_t *pre_aligned_size, size_t *aligned_size, size_t *post_aligned_size); size_t pre_aligned_size, aligned_size, post_aligned_size; split_buffer_by_cacheline(data, length, &pre_aligned_size, &aligned_size, &post_aligned_size); if(pre_aligned_size > 0) diff --git a/targets/TARGET_STM/qspi_api.c b/targets/TARGET_STM/qspi_api.c index 0b3918ab6b1..6c712eddc42 100644 --- a/targets/TARGET_STM/qspi_api.c +++ b/targets/TARGET_STM/qspi_api.c @@ -528,7 +528,7 @@ qspi_status_t qspi_prepare_command(const qspi_command_t *command, QSPI_CommandTy */ static void qspi_init_dma(struct qspi_s * obj) { - if(!obj->dmaInitialized) + if(obj->dmaHandle.dmaIdx == 0) { // Get DMA handle DMALinkInfo const *dmaLink; @@ -545,30 +545,29 @@ static void qspi_init_dma(struct qspi_s * obj) dmaLink = &OSPIDMALinks[0]; #endif // Initialize DMA channel - DMAHandlePointer dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); - if(dmaHandle.hdma == NULL) + obj->dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); + if(obj->dmaHandle.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } #if defined(MDMA) - __HAL_LINKDMA(&obj->handle, hmdma, *dmaHandle.hmdma); + __HAL_LINKDMA(&obj->handle, hmdma, *obj->dmaHandle.hmdma); #elif defined(TARGET_STM32H5) - __HAL_LINKDMA(&obj->handle, hdmarx, *dmaHandle.hdma); + __HAL_LINKDMA(&obj->handle, hdmarx, *obj->dmaHandle.hdma); #else - __HAL_LINKDMA(&obj->handle, hdma, *dmaHandle.hdma); + __HAL_LINKDMA(&obj->handle, hdma, *obj->dmaHandle.hdma); #endif #if defined(TARGET_STM32H5) // STM32H5 has only one OCTOSPI instance, but it requires separate DMA channels for RX and TX DMALinkInfo const *dmaLinkTX = &OSPIDMALinks[1]; // Initialize DMA channel - DMAHandlePointer dmaHandleTX = stm_init_dma_link(dmaLinkTX, DMA_MEMORY_TO_PERIPH, false, true, 1, 1, DMA_NORMAL); - if(dmaHandleTX.hdma == NULL) + obj->dmaHandleTX = stm_init_dma_link(dmaLinkTX, DMA_MEMORY_TO_PERIPH, false, true, 1, 1, DMA_NORMAL); + if(obj->dmaHandleTX.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } - __HAL_LINKDMA(&obj->handle, hdmatx, *dmaHandleTX.hdma); + __HAL_LINKDMA(&obj->handle, hdmatx, *obj->dmaHandleTX.hdma); #endif - obj->dmaInitialized = true; #if MBED_CONF_RTOS_PRESENT osSemaphoreAttr_t attr = { 0 }; attr.cb_mem = &obj->semaphoreMem; @@ -621,7 +620,7 @@ static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap, // tested all combinations, take first obj->qspi = pinmap->peripheral; - obj->dmaInitialized = false; + obj->dmaHandle.dmaIdx = 0; #if defined(OCTOSPI1) if (obj->qspi == QSPI_1) { @@ -755,23 +754,22 @@ qspi_status_t qspi_init(qspi_t *obj, PinName io0, PinName io1, PinName io2, PinN */ static void qspi_init_dma(struct qspi_s * obj) { - if(!obj->dmaInitialized) + if(obj->dmaHandle.dmaIdx == 0) { // Get DMA handle DMALinkInfo const *dmaLink = &QSPIDMALinks[0]; // Initialize DMA channel - DMAHandlePointer dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); - if(dmaHandle.hdma == NULL) + obj->dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); + if(obj->dmaHandle.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } #if defined(MDMA) - __HAL_LINKDMA(&obj->handle, hmdma, *dmaHandle.hmdma); + __HAL_LINKDMA(&obj->handle, hmdma, *obj->dmaHandle.hmdma); #else - __HAL_LINKDMA(&obj->handle, hdma, *dmaHandle.hdma); + __HAL_LINKDMA(&obj->handle, hdma, *obj->dmaHandle.hdma); #endif - obj->dmaInitialized = true; #if MBED_CONF_RTOS_PRESENT osSemaphoreAttr_t attr = { 0 }; attr.cb_mem = &obj->semaphoreMem; @@ -828,6 +826,7 @@ static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap, // tested all combinations, take first obj->handle.Instance = (QUADSPI_TypeDef *)pinmap->peripheral; + obj->dmaHandle.dmaIdx = 0; // pinmap for pins (enable clock) obj->io0 = pinmap->data0_pin; @@ -894,29 +893,20 @@ qspi_status_t qspi_free(qspi_t *obj) { tr_debug("qspi_free"); - if(obj->dmaInitialized) + if(obj->dmaHandle.dmaIdx != 0) { - // Get DMA handle - DMALinkInfo const *dmaLink; -#if defined(OCTOSPI2) - if(obj->qspi == (QSPIName) OSPI_1) - { - dmaLink = &OSPIDMALinks[0]; - } - else - { - dmaLink = &OSPIDMALinks[1]; - } -#else - dmaLink = &OSPIDMALinks[0]; -#endif - stm_free_dma_link(dmaLink); + stm_free_dma_link(&obj->dmaHandle); #if defined(STM32H5) // Free TX DMA handle for STM32H5 - stm_free_dma_link(&OSPIDMALinks[1]); + stm_free_dma_link(&obj->dmaHandleTX); #endif } +#if MBED_CONF_RTOS_PRESENT + // Free semaphore + osSemaphoreRelease(obj->semaphoreId); +#endif + if (HAL_OSPI_DeInit(&obj->handle) != HAL_OK) { return QSPI_STATUS_ERROR; } @@ -950,11 +940,9 @@ qspi_status_t qspi_free(qspi_t *obj) { tr_debug("qspi_free"); - if(obj->dmaInitialized) + if(obj->dmaHandle.dmaIdx != 0) { - // Get DMA handle - DMALinkInfo const *dmaLink = &QSPIDMALinks[0]; - stm_free_dma_link(dmaLink); + stm_free_dma_link(&obj->dmaHandle); #if MBED_CONF_RTOS_PRESENT // Free semaphore @@ -1176,7 +1164,7 @@ qspi_status_t qspi_write(qspi_t *obj, const qspi_command_t *command, const void #endif /* OCTOSPI */ #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) -static void split_buffer_by_cacheline(void *buffer, const size_t *length, size_t *pre_aligned_size, size_t *aligned_size, size_t *post_aligned_size) +void split_buffer_by_cacheline(void *buffer, const size_t *length, size_t *pre_aligned_size, size_t *aligned_size, size_t *post_aligned_size) { *pre_aligned_size = 0; *aligned_size = 0; diff --git a/targets/TARGET_STM/stm_dma_utils.c b/targets/TARGET_STM/stm_dma_utils.c index e1fde93e5a7..8f912c71bce 100644 --- a/targets/TARGET_STM/stm_dma_utils.c +++ b/targets/TARGET_STM/stm_dma_utils.c @@ -23,10 +23,119 @@ #include #include +#ifdef MBED_CONF_RTOS_PRESENT +#include "cmsis_os.h" +#include "cmsis_os2.h" +static osMutexId dmaMutex; +#endif + // Array to store pointer to DMA handle for each DMA channel. // Note: arrays are 0-indexed, so DMA1 Channel2 is at stmDMAHandles[0][1]. static DMAHandlePointer stmDMAHandles[NUM_DMA_CONTROLLERS][MAX_DMA_CHANNELS_PER_CONTROLLER]; +void stm_init_dma_mutex() +{ +#ifdef MBED_CONF_RTOS_PRESENT + osMutexAttr_t attr = { + .name = "dma_mutex", + .attr_bits = osMutexRecursive|osMutexPrioInherit, + .cb_mem = NULL, + .cb_size = 0 + }; + dmaMutex = osMutexNew(&attr); +#endif +} + +void stm_lock_dma_mutex() +{ +#ifdef MBED_CONF_RTOS_PRESENT + osMutexWait(dmaMutex, osWaitForever); +#endif +} + +void stm_unlock_dma_mutex() +{ +#ifdef MBED_CONF_RTOS_PRESENT + osMutexRelease(dmaMutex); +#endif +} + +bool stm_find_free_dma_channel(DMALinkInfo const * dmaLink, DMALinkInfo * freeDmaLink) +{ + bool found = false; +#if STM_DEVICE_HAS_DMA_SOURCE_SELECTION + freeDmaLink->sourceNumber = dmaLink->sourceNumber; +#endif + if(dmaLink->dmaIdx != MBED_ANY_GPDMA_MODULE) + { + freeDmaLink->dmaIdx = dmaLink->dmaIdx; + uint8_t maxChannels = MAX_DMA_CHANNELS_PER_CONTROLLER; +#ifdef MDMA + if(freeDmaLink->dmaIdx == MDMA_IDX) + { + maxChannels = MAX_MDMA_CHANNELS; + } +#endif + for(uint8_t channelIdx = 0; channelIdx < maxChannels; channelIdx++) + { +#ifdef MDMA + if(dmaLink->dmaIdx == MDMA_IDX) + { + if(stmDMAHandles[dmaLink->dmaIdx][channelIdx].hmdma == NULL) + { + freeDmaLink->channelIdx = channelIdx; + found = true; + break; + } + } + else +#endif + if(stmDMAHandles[dmaLink->dmaIdx][channelIdx].hdma == NULL) + { +#ifdef DMA_IP_VERSION_V2 + // Channels start from 1 in IP v2 only + freeDmaLink->channelIdx = channelIdx + 1; +#else + freeDmaLink->channelIdx = channelIdx; +#endif + found = true; + break; + } + } + } + else + { + uint8_t maxDMAs = NUM_DMA_CONTROLLERS; + if(maxDMAs > 2) + { + maxDMAs = 2; + } + for(uint8_t dmaIdx = 1; dmaIdx <= maxDMAs; dmaIdx++) + { + for(uint8_t channelIdx = 0; channelIdx < MAX_DMA_CHANNELS_PER_CONTROLLER; channelIdx++) + { + if(stmDMAHandles[dmaIdx - 1][channelIdx].hdma == NULL) + { + freeDmaLink->dmaIdx = dmaIdx; +#ifdef DMA_IP_VERSION_V2 + // Channels start from 1 in IP v2 only + freeDmaLink->channelIdx = channelIdx + 1; +#else + freeDmaLink->channelIdx = channelIdx; +#endif + found = true; + break; + } + } + if(found) + { + break; + } + } + } + return found; +} + DMAInstancePointer stm_get_dma_instance(DMALinkInfo const * dmaLink) { DMAInstancePointer dma_instance; @@ -927,10 +1036,23 @@ DMAHandlePointer stm_get_dma_handle_for_link(DMALinkInfo const * dmaLink) } DMAHandlePointer stm_init_dma_link(const DMALinkInfo *dmaLink, uint32_t direction, bool periphInc, bool memInc, - uint8_t periphDataAlignment, uint8_t memDataAlignment, uint32_t mode){ + uint8_t periphDataAlignment, uint8_t memDataAlignment, uint32_t mode) { + stm_lock_dma_mutex(); DMAHandlePointer dmaHandlePointer; dmaHandlePointer.hdma = NULL; + DMALinkInfo actualDmaLink; + if(dmaLink->channelIdx == MBED_ANY_DMA_CHANNEL) + { + if(!stm_find_free_dma_channel(dmaLink, &actualDmaLink)) + { + mbed_error(MBED_ERROR_ITEM_NOT_FOUND, "DMA channel not found", dmaLink->channelIdx, MBED_FILENAME, __LINE__); + } + dmaLink = &actualDmaLink; + } + dmaHandlePointer.dmaIdx = dmaLink->dmaIdx; + dmaHandlePointer.channelIdx = dmaLink->channelIdx; + #ifdef DMA_IP_VERSION_V2 // Channels start from 1 in IP v2 only uint8_t channelIdx = dmaLink->channelIdx - 1; @@ -941,6 +1063,7 @@ DMAHandlePointer stm_init_dma_link(const DMALinkInfo *dmaLink, uint32_t directio if(stmDMAHandles[dmaLink->dmaIdx - 1][channelIdx].hdma != NULL) { // Channel already allocated (e.g. two SPI busses which use the same DMA request tried to be initialized) + stm_unlock_dma_mutex(); return dmaHandlePointer; } @@ -1243,7 +1366,7 @@ DMAHandlePointer stm_init_dma_link(const DMALinkInfo *dmaLink, uint32_t directio dmaHandle->Instance = stm_get_dma_channel(dmaLink).mchannel; - HAL_MDMA_Init(dmaHandle); + HAL_MDMA_Init(dmaHandle); } #endif // Set up interrupt @@ -1251,44 +1374,50 @@ DMAHandlePointer stm_init_dma_link(const DMALinkInfo *dmaLink, uint32_t directio NVIC_EnableIRQ(irqNum); NVIC_SetPriority(irqNum, 7); + stm_unlock_dma_mutex(); return dmaHandlePointer; } -void stm_free_dma_link(const DMALinkInfo *dmaLink) +void stm_free_dma_link(DMAHandlePointer *handle) { // Note: we can't disable the interrupt here, in case one ISR is shared by multiple DMA channels // and another channel is still using the interrupt. + stm_lock_dma_mutex(); + DMALinkInfo dmaLink = { .dmaIdx = handle->dmaIdx, .channelIdx = handle->channelIdx }; #ifdef DMA_IP_VERSION_V2 // Channels start from 1 in IP v2 only - uint8_t channelIdx = dmaLink->channelIdx - 1; + uint8_t channelIdx = dmaLink.channelIdx - 1; #else - uint8_t channelIdx = dmaLink->channelIdx; + uint8_t channelIdx = dmaLink.channelIdx; #endif - if(stmDMAHandles[dmaLink->dmaIdx - 1][channelIdx].hdma == NULL) + if(stmDMAHandles[dmaLink.dmaIdx - 1][channelIdx].hdma == NULL) { + stm_unlock_dma_mutex(); return; } // Deinit hardware channel - switch(dmaLink->dmaIdx) + switch(dmaLink.dmaIdx) { case 1: case 2: case 3: - HAL_DMA_DeInit(stmDMAHandles[dmaLink->dmaIdx - 1][channelIdx].hdma); + HAL_DMA_DeInit(stmDMAHandles[dmaLink.dmaIdx - 1][channelIdx].hdma); break; #ifdef MDMA case 4: - HAL_MDMA_DeInit(stmDMAHandles[dmaLink->dmaIdx - 1][channelIdx].hmdma); + HAL_MDMA_DeInit(stmDMAHandles[dmaLink.dmaIdx - 1][channelIdx].hmdma); break; #endif } - IRQn_Type irqNum = stm_get_dma_irqn(dmaLink); + IRQn_Type irqNum = stm_get_dma_irqn(&dmaLink); NVIC_DisableIRQ(irqNum); - free(stmDMAHandles[dmaLink->dmaIdx - 1][channelIdx].hdma); - stmDMAHandles[dmaLink->dmaIdx - 1][channelIdx].hdma = NULL; + free(stmDMAHandles[dmaLink.dmaIdx - 1][channelIdx].hdma); + stmDMAHandles[dmaLink.dmaIdx - 1][channelIdx].hdma = NULL; + memset(handle, 0, sizeof(DMAHandlePointer)); + stm_unlock_dma_mutex(); } #ifdef DMA_IP_VERSION_V2 diff --git a/targets/TARGET_STM/stm_dma_utils.h b/targets/TARGET_STM/stm_dma_utils.h index 6ab84df3307..c284cbc0408 100644 --- a/targets/TARGET_STM/stm_dma_utils.h +++ b/targets/TARGET_STM/stm_dma_utils.h @@ -46,6 +46,12 @@ extern "C" { #endif +// Any general-purpose DMA module (DMA1/DMA2 or GPDMA1/GPDMA2) +#define MBED_ANY_GPDMA_MODULE 255 + +// Any DMA channel +#define MBED_ANY_DMA_CHANNEL 255 + /* * Structure containing info about a peripheral's link to the DMA controller. */ @@ -79,11 +85,15 @@ typedef union DMAInstancePointer { #endif } DMAInstancePointer; -typedef union DMAHandlePointer { - DMA_HandleTypeDef *hdma; +typedef struct { + uint8_t dmaIdx; // Index of the DMA module + uint8_t channelIdx; // Index of the channel + union { + DMA_HandleTypeDef *hdma; // General purpose DMA pointer #ifdef MDMA - MDMA_HandleTypeDef *hmdma; + MDMA_HandleTypeDef *hmdma; // STM32H7 MDMA pointer #endif + }; } DMAHandlePointer; typedef union DMAChannelPointer { @@ -96,10 +106,37 @@ typedef union DMAChannelPointer { #endif } DMAChannelPointer; +/** + * @brief Initialize the mutex for DMA + */ +void stm_init_dma_mutex(); + +/** + * @brief Lock the mutex for DMA + */ +void stm_lock_dma_mutex(); + +/** + * @brief Unlock the mutex for DMA + */ +void stm_unlock_dma_mutex(); + +/** + * @brief Find a free DMA channel for a DMA link with MBED_ANY_DMA_CHANNEL + * + * @param dmaLink DMA link instance with MBED_ANY_DMA_CHANNEL + * @param freeDmaLink DMA link instance with the actual DMA instance and channel indexes + * + * @return true if a free DMA channel is found + * @return false if a free DMA channel is not found + */ +bool stm_find_free_dma_channel(DMALinkInfo const * dmaLink, DMALinkInfo * freeDmaLink); + + /** * @brief Get the DMA instance for a DMA link * - * @param dmaLink DMA instance + * @param dmaLink DMA link instance */ DMAInstancePointer stm_get_dma_instance(DMALinkInfo const * dmaLink); @@ -158,13 +195,13 @@ DMAHandlePointer stm_get_dma_handle_for_link(DMALinkInfo const * dmaLink); DMAHandlePointer stm_init_dma_link(DMALinkInfo const * dmaLink, uint32_t direction, bool periphInc, bool memInc, uint8_t periphDataAlignment, uint8_t memDataAlignment, uint32_t mode); /** - * @brief Free a DMA link. + * @brief Free a DMA channel. * * This frees memory associated with it and unlocks the hardware DMA channel so that it can be used by somebody else. * - * @param dmaLink DMA link ponter to free. + * @param handle pointer to the DMA channel handle to free. */ -void stm_free_dma_link(DMALinkInfo const * dmaLink); +void stm_free_dma_link(DMAHandlePointer *handle); #if defined(__cplusplus) } diff --git a/targets/TARGET_STM/stm_spi_api.c b/targets/TARGET_STM/stm_spi_api.c index 53585365b77..291c65afd4d 100644 --- a/targets/TARGET_STM/stm_spi_api.c +++ b/targets/TARGET_STM/stm_spi_api.c @@ -284,7 +284,7 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap) #if defined (RCC_SPI123CLKSOURCE_PLL) PeriphClkInit.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; #elif defined (RCC_SPI1CLKSOURCE_SYSCLK) - PeriphClkInit.Spi1ClockSelection = RCC_SPI1CLKSOURCE_SYSCLK; + PeriphClkInit.Spi1ClockSelection = RCC_SPI1CLKSOURCE_SYSCLK; #else PeriphClkInit.Spi1ClockSelection = RCC_SPI1CLKSOURCE_PLL1Q; #endif @@ -311,7 +311,7 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap) #elif defined (RCC_SPI2CLKSOURCE_SYSCLK) PeriphClkInit.Spi2ClockSelection = RCC_SPI2CLKSOURCE_SYSCLK; #else - PeriphClkInit.Spi2ClockSelection = RCC_SPI2CLKSOURCE_PLL1Q; + PeriphClkInit.Spi2ClockSelection = RCC_SPI2CLKSOURCE_PLL1Q; #endif if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { error("HAL_RCCEx_PeriphCLKConfig\n"); @@ -526,7 +526,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel */ static void spi_init_tx_dma(struct spi_s * obj) { - if(!obj->txDMAInitialized) + if(obj->txDMAHandle.dmaIdx == 0) { #ifdef TARGET_MCU_STM32H7 // For STM32H7, SPI6 does not support DMA through the normal mechanism -- it would require use of the BDMA @@ -541,15 +541,14 @@ static void spi_init_tx_dma(struct spi_s * obj) DMALinkInfo const *dmaLink = &SPITxDMALinks[obj->spiIndex - 1]; // Initialize DMA channel - DMA_HandleTypeDef *dmaHandle = stm_init_dma_link(dmaLink, DMA_MEMORY_TO_PERIPH, false, true, 1, 1, DMA_NORMAL).hdma; + obj->txDMAHandle = stm_init_dma_link(dmaLink, DMA_MEMORY_TO_PERIPH, false, true, 1, 1, DMA_NORMAL); - if(dmaHandle == NULL) + if(obj->txDMAHandle.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "Tx DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } - __HAL_LINKDMA(&obj->handle, hdmatx, *dmaHandle); - obj->txDMAInitialized = true; + __HAL_LINKDMA(&obj->handle, hdmatx, *obj->txDMAHandle.hdma); } } @@ -559,7 +558,7 @@ static void spi_init_tx_dma(struct spi_s * obj) */ static void spi_init_rx_dma(struct spi_s * obj) { - if(!obj->rxDMAInitialized) + if(obj->rxDMAHandle.dmaIdx == 0) { #ifdef TARGET_MCU_STM32H7 // For STM32H7, SPI6 does not support DMA through the normal mechanism -- it would require use of the BDMA @@ -574,15 +573,14 @@ static void spi_init_rx_dma(struct spi_s * obj) DMALinkInfo const *dmaLink = &SPIRxDMALinks[obj->spiIndex - 1]; // Initialize DMA channel - DMA_HandleTypeDef *dmaHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL).hdma; + obj->rxDMAHandle = stm_init_dma_link(dmaLink, DMA_PERIPH_TO_MEMORY, false, true, 1, 1, DMA_NORMAL); - if(dmaHandle == NULL) + if(obj->rxDMAHandle.hdma == NULL) { mbed_error(MBED_ERROR_ALREADY_IN_USE, "Rx DMA channel already used by something else!", 0, MBED_FILENAME, __LINE__); } - __HAL_LINKDMA(&obj->handle, hdmarx, *dmaHandle); - obj->rxDMAInitialized = true; + __HAL_LINKDMA(&obj->handle, hdmarx, *obj->rxDMAHandle.hdma); } } @@ -597,15 +595,13 @@ void spi_free(spi_t *obj) #if STM32_SPI_CAPABILITY_DMA // Free DMA channels if allocated - if(spiobj->txDMAInitialized) + if(spiobj->txDMAHandle.dmaIdx != 0) { - stm_free_dma_link(&SPITxDMALinks[spiobj->spiIndex - 1]); - spiobj->txDMAInitialized = false; + stm_free_dma_link(&spiobj->txDMAHandle); } - if(spiobj->rxDMAInitialized) + if(spiobj->rxDMAHandle.dmaIdx != 0) { - stm_free_dma_link(&SPIRxDMALinks[spiobj->spiIndex - 1]); - spiobj->rxDMAInitialized = false; + stm_free_dma_link(&spiobj->rxDMAHandle); } #endif diff --git a/targets/TARGET_STM/stm_spi_api.h b/targets/TARGET_STM/stm_spi_api.h index f34f7d17ef7..5f9254d5a2c 100644 --- a/targets/TARGET_STM/stm_spi_api.h +++ b/targets/TARGET_STM/stm_spi_api.h @@ -46,8 +46,8 @@ struct spi_s { #endif uint8_t spiIndex; // Index of the SPI peripheral, from 1-6 #if STM32_SPI_CAPABILITY_DMA - bool txDMAInitialized; - bool rxDMAInitialized; + DMAHandlePointer txDMAHandle; + DMAHandlePointer rxDMAHandle; #endif };