/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MK_DMA_H_ #define MK_DMA_H_ #include "mk_common.h" /** * @addtogroup MK8000_DMA * @{ */ #define DMA_INT_TYPE_ABORT 1 /*!< DMA abort status */ #define DMA_INT_TYPE_ERROR 2 /*!< DMA error status */ #define DMA_INT_TYPE_DONE 3 /*!< DMA done status */ #define DMA_INT_TYPE_FORCE_ABORT 4 /*!< DMA force abort status */ /** * @brief DMA device IDs enumeration */ enum DMA_DEV_T { DMA_ID0 = 0, DMA_MAX_NUM }; /** * @brief DMA Channels definition. * @note Avoid multiple peripherals DMA requests mapped on the same channel of DMA. */ enum DMA_CH_T { DMA_CH0 = 0, /*!< SPI0-RX DMA requests mapped on DMA channel 0 */ DMA_CH1, /*!< ADC or SPI0-TX DMA requests mapped on DMA channel 1 */ DMA_CH2, /*!< AES-IN/FLASH-WRITE/SPI1-RX DMA requests mapped on DMA channel 2 */ DMA_CH3, /*!< AES-OUT/FLASH-READ/SPI1-TX DMA requests mapped on DMA channel 3 */ DMA_CH4, /*!< UART0-RX DMA requests mapped on DMA channel 4 */ DMA_CH5, /*!< UART0-TX DMA requests mapped on DMA channel 5 */ DMA_CH6, /*!< UART1-TX DMA requests mapped on DMA channel 6 */ DMA_CH7, /*!< UART1-TX DMA requests mapped on DMA channel 7 */ DMA_CH_NUM, }; /** * @brief DMA FIFO threshold value. * @note DMA FIFO space >= DMA_FF_TH, DMA will start to transfer data from source to FIFO. * The number of valid data in DMA FIFO >= DMA_FF_TH, the DMA will start to pop out data from FIFO to the destination. */ enum DMA_FIFO_TH_T { DMA_FIFO_TH_1 = 0, /*!< FIFO threshold value is 1 */ DMA_FIFO_TH_2, /*!< FIFO threshold value is 2 */ DMA_FIFO_TH_4, /*!< FIFO threshold value is 4 */ DMA_FIFO_TH_8, /*!< FIFO threshold value is 8 */ DMA_FIFO_TH_16, /*!< FIFO threshold value is 16 */ }; /** * @brief DMA burst size definition. * @note Burst size are set according to the size of the peripheral buffer being accessed. */ enum DMA_SRC_BURST_SIZE_T { DMA_SRC_BURST_SIZE_1 = 0, DMA_SRC_BURST_SIZE_4, DMA_SRC_BURST_SIZE_8, DMA_SRC_BURST_SIZE_16, DMA_SRC_BURST_SIZE_32, DMA_SRC_BURST_SIZE_64, DMA_SRC_BURST_SIZE_128, DMA_SRC_BURST_SIZE_256, }; /** * @brief DMA memory/peripheral data width. * */ enum DMA_WIDTH_T { DMA_WIDTH_1B = 0, /*!< Data aligned by byte */ DMA_WIDTH_2B, /*!< Data aligned by halfword */ DMA_WIDTH_4B /*!< Data aligned by word */ }; /** * @brief DMA SRC/DEST address control mode. */ enum DMA_ADDR_CTRL_T { DMA_ADDR_INC = 0, /*!< ADDR increment mode */ DMA_ADDR_DEC, /*!< ADDR decrement mode */ DMA_ADDR_FIXED, /*!< ADDR fixed mode */ }; /** * @brief DMA source request definition. */ enum DMA_REQ_SEL_T { DMA_REQ_MEM = 0x00, DMA_REQ_SPI0_RX = 0x10, DMA_REQ_SPI0_TX = 0x11, DMA_REQ_SPI1_RX = 0x12, DMA_REQ_SPI1_TX = 0x13, DMA_REQ_FLASH = 0x14, DMA_REQ_AES_RX = 0x15, DMA_REQ_AES_TX = 0x16, DMA_REQ_UART0_RX = 0x17, DMA_REQ_UART0_TX = 0x18, DMA_REQ_UART1_RX = 0x19, DMA_REQ_UART1_TX = 0x1A, DMA_REQ_ADC = 0x1B, }; /** * @brief DMA channel configure Structure */ struct DMA_CH_CFG_T { enum DMA_FIFO_TH_T fifo_th; /*!< Specifies the FIFO threshold level. This parameter can be a value of @ref DMA_FIFO_TH_T */ enum DMA_SRC_BURST_SIZE_T src_burst_size; /*!< Specifies the Burst transfer configuration. This parameter can be a value of @ref DMA_SRC_BURST_SIZE_T */ enum DMA_WIDTH_T src_width; /*!< Specifies the source data width. This parameter can be a value of @ref DMA_WIDTH_T */ enum DMA_WIDTH_T dst_width; /*!< Specifies the destination data width. This parameter can be a value of @ref DMA_WIDTH_T */ enum DMA_ADDR_CTRL_T src_addr_ctrl; /*!< Specifies the source address control mode. This parameter can be a value of @ref DMA_ADDR_CTRL_T */ enum DMA_ADDR_CTRL_T dst_addr_ctrl; /*!< Specifies the destination address control mode. This parameter can be a value of @ref DMA_ADDR_CTRL_T */ enum DMA_REQ_SEL_T src_req_sel; /*!< Specifies the source request dev This parameter can be a value of @ref DMA_REQ_SEL_T */ enum DMA_REQ_SEL_T dst_req_sel; /*!< Specifies the destination request dev This parameter can be a value of @ref DMA_REQ_SEL_T*/ }; struct DMA_HANDLE_T { DMA_TypeDef *const base; /*!< DMA registers base address */ const IRQn_Type irq; /*!< DMA interrupt number */ drv_callback_t callback[DMA_CH_NUM]; /*!< Callback function provided by the user */ drv_callback_t abort_callback[DMA_CH_NUM]; /*!< DMA abort callback function provided by the user */ }; #ifdef __cplusplus extern "C" { #endif /** * @brief Function for initializing the DMA. * * @param[in] ch Enables the specified DMA channel * @param[in] config Pointer to a DMA_CH_CFG_T structure that contains the configuration information for DMA. * @return * @arg DEV_ERROR error id * @arg DEV_OK Operation is successful */ int dma_open(enum DMA_CH_T ch, struct DMA_CH_CFG_T *config); /** * @brief Function for uninitializing the DMA. * * @param[in] ch Disables the specified DMA channel * @return * @arg DEV_ERROR error id * @arg DEV_OK Operation is successful */ int dma_close(enum DMA_CH_T ch); /** * @brief Starts the DMA transfer. * * @param[in] ch Specifies the DMA channel * @param[in] src_addr The source memory Buffer address * @param[out] dst_addr The destination memory Buffer address * @param[in] size The length of data to be transferred from source to destination * @param[in] callback Callback function provided by the user. * @return * @arg DEV_ERROR error id * @arg DEV_BUSY DMA process is ongoing * @arg DEV_OK Operation is successful */ int dma_transfer(enum DMA_CH_T ch, void *src_addr, void *dst_addr, uint32_t size, drv_callback_t callback); /** * @brief Stop the DMA transfer. * * @param[in] ch Specifies the DMA channel * @param[in] callback Callback function provided by the user. * @note If the dma channel is idle, this abort operation is a no-op and the callback function will not be called. * @return * @arg DEV_ERROR error id * @arg DEV_OK Operation is successful */ int dma_abort(enum DMA_CH_T ch, drv_callback_t callback); /** * @brief Force stop DMA transfer. * * @param[in] ch Specifies the DMA channel * @param[in] callback Callback function provided by the user. * @note This function will force clear any pending DMA interrupt requests. */ void dma_force_abort(enum DMA_CH_T ch, drv_callback_t callback); /** * @brief Function for Interrupt handler for DMA. */ void DMA_IRQHandler(void); /** * @brief Function for return cndtr for DMA of uart1 rx. */ uint32_t get_uart1_dma_cndtr(void); /** * @brief Function for return cndtr for DMA of uart0 rx. */ uint32_t get_uart0_dma_cndtr(void); #ifdef __cplusplus } #endif /** * @} */ #endif /* MK_DMA_H_ */