/** ********************************************************************************************************* * Copyright(c) 2019, Realtek Semiconductor Corporation. All rights reserved. ********************************************************************************************************* * \file rtl876x_gdma.h * \brief The header file of the peripheral GDMA driver. * \details This file provides all GDMA firmware functions. * \author yuan * \date 2019-11-14 * \version v1.0 * ********************************************************************************************************* */ #ifndef _RTL876X_GDMA_H_ #define _RTL876X_GDMA_H_ #ifdef __cplusplus extern "C" { #endif /** * \addtogroup IO Peripheral Drivers * \defgroup GDMA GDMA * * \brief Manage the GDMA peripheral functions. * * \ingroup IO */ /*============================================================================* * Includes *============================================================================*/ #include "rtl876x.h" /*============================================================================* * Types *============================================================================*/ /** * \defgroup GDMA_Exported_Types Init Params Struct * * \ingroup GDMA */ /** * \brief GDMA init structure definition. * * \ingroup GDMA_Exported_Types */ typedef struct { uint8_t GDMA_ChannelNum; /*!< Specifies channel number for GDMA. */ uint8_t GDMA_DIR; /*!< Specifies if the peripheral is the source or destination. This parameter can be a value of \ref GDMA_Data_Transfer_Direction. */ uint32_t GDMA_BufferSize; /*!< Specifies the buffer size(<=4095), in data unit, of the specified Channel. The data unit is equal to the configuration set in DMA_PeripheralDataSize or DMA_MemoryDataSize members depending in the transfer direction. */ uint8_t GDMA_SourceInc; /*!< Specifies whether the source address register is incremented or not. This parameter can be a value of \ref GDMA_Source_Incremented_Mode */ uint8_t GDMA_DestinationInc; /*!< Specifies whether the destination address register is incremented or not. This parameter can be a value of \ref GDMA_Destination_Incremented_Mode. */ uint32_t GDMA_SourceDataSize; /*!< Specifies the source data width. This parameter can be a value of \ref GDMA_Data_Size */ uint32_t GDMA_DestinationDataSize; /*!< Specifies the Memory data width. This parameter can be a value of \ref GDMA_Data_Size */ uint32_t GDMA_SourceMsize; /*!< Specifies the number of data items to be transferred. This parameter can be a value of \ref GDMA_Msize */ uint32_t GDMA_DestinationMsize; /*!< Specifies the number of data items to be transferred. This parameter can be a value of \ref GDMA_Msize */ uint32_t GDMA_SourceAddr; /*!< Specifies the source base address for GDMA Channelx. */ uint32_t GDMA_DestinationAddr; /*!< Specifies the destination base address for GDMA Channelx. */ uint32_t GDMA_ChannelPriority; /*!< Specifies the software priority for the GDMA Channelx. */ uint32_t GDMA_Multi_Block_Mode; /*!< Specifies the multi block transfer mode. This parameter can be a value of \ref GDMA_Multiblock_Mode. */ uint32_t GDMA_Multi_Block_Struct; /*!< Pointer to the first struct of LLI. */ uint8_t GDMA_Multi_Block_En; /*!< Enable or disable multi-block function. */ uint8_t GDMA_SourceHandshake; /*!< Specifies the handshake index in source. This parameter can be a value of \ref GDMA_Handshake_Type. */ uint8_t GDMA_DestHandshake; /*!< Specifies the handshake index in Destination. This parameter can be a value of \ref GDMA_Handshake_Type. */ } GDMA_InitTypeDef; /** * \brief GDMA link list item structure definition. * * \ingroup GDMA_Exported_Types */ typedef struct { __IO uint32_t SAR; __IO uint32_t DAR; __IO uint32_t LLP; __IO uint32_t CTL_LOW; __IO uint32_t CTL_HIGH; } GDMA_LLIDef; #define DMA_CH_BASE(ChNum) ((GDMA_ChannelTypeDef *) (GDMA_CHANNEL_REG_BASE + ChNum * 0x0058)) /*============================================================================* * Constants *============================================================================*/ /** * \defgroup GDMA_Exported_Constants Macro Definitions * * \ingroup GDMA */ #define IS_GDMA_ALL_PERIPH(PERIPH) (((PERIPH) == GDMA_Channel0) || \ ((PERIPH) == GDMA_Channel1) || \ ((PERIPH) == GDMA_Channel2) || \ ((PERIPH) == GDMA_Channel3)) #define IS_GDMA_ChannelNum(NUM) ((NUM) < 4) /** * \defgroup GDMA_Handshake_Type GDMA Handshake Type * \{ * \ingroup GDMA_Exported_Constants */ #define GDMA_Handshake_UART0_TX (0) #define GDMA_Handshake_UART0_RX (1) #define GDMA_Handshake_ENH_TIM0 (2) #define GDMA_Handshake_ENH_TIM1 (3) #define GDMA_Handshake_SPI0_TX (4) #define GDMA_Handshake_SPI0_RX (5) #define GDMA_Handshake_SPI1_TX (6) #define GDMA_Handshake_SPI1_RX (7) #define GDMA_Handshake_I2C0_TX (8) #define GDMA_Handshake_I2C0_RX (9) #define GDMA_Handshake_I2C1_TX (10) #define GDMA_Handshake_I2C1_RX (11) #define GDMA_Handshake_ADC (12) #define GDMA_Handshake_AES_TX (13) #define GDMA_Handshake_AES_RX (14) #define GDMA_Handshake_UART1_TX (15) #define GDMA_Handshake_I2S0_TX (16) #define GDMA_Handshake_I2S0_RX (17) #define GDMA_Handshake_SPIC0_TX (20) #define GDMA_Handshake_SPIC0_RX (21) #define GDMA_Handshake_UART1_RX (23) #define GDMA_Handshake_TIM0 (24) #define GDMA_Handshake_TIM1 (25) #define GDMA_Handshake_TIM2 (26) #define GDMA_Handshake_IR_TX (27) #define GDMA_Handshake_IR_RX (28) #define GDMA_Handshake_TIM3 (29) #define GDMA_Handshake_TIM4 (30) #define GDMA_Handshake_TIM5 (31) /** \} */ #define IS_GDMA_TransferType(Type) (((Type) == GDMA_Handshake_UART0_TX) || \ ((Type) == GDMA_Handshake_UART0_RX) || \ ((Type) == GDMA_Handshake_ENH_TIM0) || \ ((Type) == GDMA_Handshake_ENH_TIM1) || \ ((Type) == GDMA_Handshake_SPI0_TX) || \ ((Type) == GDMA_Handshake_SPI0_RX) || \ ((Type) == GDMA_Handshake_SPI1_TX) || \ ((Type) == GDMA_Handshake_SPI1_RX) || \ ((Type) == GDMA_Handshake_I2C0_TX) || \ ((Type) == GDMA_Handshake_I2C0_RX) || \ ((Type) == GDMA_Handshake_I2C1_TX) || \ ((Type) == GDMA_Handshake_I2C1_RX) || \ ((Type) == GDMA_Handshake_ADC) || \ ((Type) == GDMA_Handshake_AES_TX) || \ ((Type) == GDMA_Handshake_AES_RX) || \ ((Type) == GDMA_Handshake_UART1_TX) || \ ((Type) == GDMA_Handshake_I2S0_TX) || \ ((Type) == GDMA_Handshake_I2S0_RX) || \ ((Type) == GDMA_Handshake_SPIC0_TX) || \ ((Type) == GDMA_Handshake_SPIC0_RX) ||\ ((Type) == GDMA_Handshake_UART1_RX) || \ ((Type) == GDMA_Handshake_IR_TX) ||\ ((Type) == GDMA_Handshake_IR_RX) ||\ ((Type) == GDMA_Handshake_TIM0) ||\ ((Type) == GDMA_Handshake_TIM1) ||\ ((Type) == GDMA_Handshake_TIM2) ||\ ((Type) == GDMA_Handshake_TIM3) ||\ ((Type) == GDMA_Handshake_TIM4) ||\ ((Type) == GDMA_Handshake_TIM5)) /** * \defgroup GDMA_Data_Size GDMA Data Size * \{ * \ingroup GDMA_Exported_Constants */ #define GDMA_DataSize_Byte ((uint32_t)0x00000000) #define GDMA_DataSize_HalfWord ((uint32_t)0x00000001) #define GDMA_DataSize_Word ((uint32_t)0x00000002) /** \} */ #define IS_GDMA_DATA_SIZE(SIZE) (((SIZE) == GDMA_DataSize_Byte) || \ ((SIZE) == GDMA_DataSize_HalfWord) || \ ((SIZE) == GDMA_DataSize_Word)) /** * \defgroup GDMA_Msize GDMA Msize * \{ * \ingroup GDMA_Exported_Constants */ #define GDMA_Msize_1 ((uint32_t)0x00000000) #define GDMA_Msize_4 ((uint32_t)0x00000001) #define GDMA_Msize_8 ((uint32_t)0x00000002) #define GDMA_Msize_16 ((uint32_t)0x00000003) #define GDMA_Msize_32 ((uint32_t)0x00000004) #define GDMA_Msize_64 ((uint32_t)0x00000005) #define GDMA_Msize_128 ((uint32_t)0x00000006) #define GDMA_Msize_256 ((uint32_t)0x00000007) /** \} */ #define IS_GDMA_MSIZE(SIZE) (((SIZE) == GDMA_Msize_1) || \ ((SIZE) == GDMA_Msize_4) || \ ((SIZE) == GDMA_Msize_8) || \ ((SIZE) == GDMA_Msize_16) || \ ((SIZE) == GDMA_Msize_32) || \ ((SIZE) == GDMA_Msize_64) || \ ((SIZE) == GDMA_Msize_128) || \ ((SIZE) == GDMA_Msize_256)) /** * \defgroup GDMA_Data_Transfer_Direction GDMA Data Transfer Direction * \{ * \ingroup GDMA_Exported_Constants */ #define GDMA_DIR_MemoryToMemory ((uint32_t)0x00000000) #define GDMA_DIR_MemoryToPeripheral ((uint32_t)0x00000001) #define GDMA_DIR_PeripheralToMemory ((uint32_t)0x00000002) #define GDMA_DIR_PeripheralToPeripheral ((uint32_t)0x00000003) /** \} */ #define IS_GDMA_DIR(DIR) (((DIR) == GDMA_DIR_MemoryToMemory) || \ ((DIR) == GDMA_DIR_MemoryToPeripheral) || \ ((DIR) == GDMA_DIR_PeripheralToMemory) ||\ ((DIR) == GDMA_DIR_PeripheralToPeripheral)) /** * \defgroup GDMA_Source_Incremented_Mode GDMA Source Incremented Mode * \{ * \ingroup GDMA_Exported_Constants */ #define DMA_SourceInc_Inc ((uint32_t)0x00000000) #define DMA_SourceInc_Dec ((uint32_t)0x00000001) #define DMA_SourceInc_Fix ((uint32_t)0x00000002) /** \} */ #define IS_GDMA_SourceInc(STATE) (((STATE) == DMA_SourceInc_Inc) || \ ((STATE) == DMA_SourceInc_Dec) || \ ((STATE) == DMA_SourceInc_Fix)) /** * \defgroup GDMA_Destination_Incremented_Mode GDMA Destination Incremented Mode * \{ * \ingroup GDMA_Exported_Constants */ #define DMA_DestinationInc_Inc ((uint32_t)0x00000000) #define DMA_DestinationInc_Dec ((uint32_t)0x00000001) #define DMA_DestinationInc_Fix ((uint32_t)0x00000002) /** \} */ #define IS_GDMA_DestinationInc(STATE) (((STATE) == DMA_DestinationInc_Inc) || \ ((STATE) == DMA_DestinationInc_Dec) || \ ((STATE) == DMA_DestinationInc_Fix)) /** * \defgroup DMA_Interrupts_Definition DMA Interrupts Definition * \{ * \ingroup GDMA_Exported_Constants */ #define GDMA_INT_Transfer ((uint32_t)0x00000001) #define GDMA_INT_Block ((uint32_t)0x00000002) #define GDMA_INT_SrcTransfer ((uint32_t)0x00000004) #define GDMA_INT_DstTransfer ((uint32_t)0x00000008) #define GDMA_INT_Error ((uint32_t)0x00000010) /** \} */ #define IS_GDMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFE00) == 0x00) && ((IT) != 0x00)) /** * \defgroup GDMA_Multiblock_Mode GDMA Multi-block Mode * \{ * \ingroup GDMA_Exported_Constants */ #define AUTO_RELOAD_WITH_CONTIGUOUS_SAR (BIT31) #define AUTO_RELOAD_WITH_CONTIGUOUS_DAR (BIT30) #define AUTO_RELOAD_TRANSFER (BIT30 | BIT31) #define LLI_WITH_CONTIGUOUS_SAR (BIT27) #define LLI_WITH_AUTO_RELOAD_SAR (BIT27 | BIT30) #define LLI_WITH_CONTIGUOUS_DAR (BIT28) #define LLI_WITH_AUTO_RELOAD_DAR (BIT28 | BIT31) #define LLI_TRANSFER (BIT27 | BIT28) /** \} */ #define IS_GDMA_MULTIBLOCKMODE(MODE) (((MODE) == AUTO_RELOAD_WITH_CONTIGUOUS_SAR) || ((MODE) == AUTO_RELOAD_WITH_CONTIGUOUS_DAR)\ ||((MODE) == AUTO_RELOAD_TRANSFER) || ((MODE) == LLI_WITH_CONTIGUOUS_SAR)\ ||((MODE) == LLI_WITH_AUTO_RELOAD_SAR) || ((MODE) == LLI_WITH_CONTIGUOUS_DAR)\ ||((MODE) == LLI_WITH_AUTO_RELOAD_DAR) || ((MODE) == LLI_TRANSFER)) /** * \def GDMA_Multiblock_Select_Bit Multi-Block Select Bit * */ #define AUTO_RELOAD_SELECTED_BIT (uint32_t)(0xC0000000) #define LLP_SELECTED_BIT (uint32_t)(0x18000000) /** * \def DMA_Suspend_Flag_Definition DMA Suspend Flag Definition */ #define GDMA_FIFO_STATUS (BIT(9)) #define GDMA_SUSPEND_TRANSMISSSION (BIT(8)) #define GDMA_SUSPEND_CMD_STATUS (BIT(2) | BIT(1)) #define GDMA_SUSPEND_CHANNEL_STATUS (BIT(0)) /*============================================================================* * Functions *============================================================================*/ /** * \defgroup GDMA_Exported_Functions Peripheral APIs * \{ * \ingroup GDMA */ /** * \brief Deinitializes the GDMA registers to their default reset * values. * \param None. * \return None. * * Example usage * \code{.c} * * void driver_gdma_init(void) * { * GDMA_DeInit(); * } * \endcode */ void GDMA_DeInit(void); /** * \brief Initializes the GDMA Channelx according to the specified * parameters in the GDMA_InitStruct. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the DMA Channel. * \param[in] GDMA_InitStruct: Pointer to a GDMA_InitTypeDef structure that * contains the configuration information for the specified DMA Channel. * \return None. * * Example usage * \code{.c} * * void driver_gdma_init(void) * { * * for (uint32_t i = 0; i < UART_TX_GDMA_BUFFER_SIZE; i++) * { * GDMA_SendData_Buffer[i] = 0x10 + i; * } * GDMA_InitTypeDef GDMA_InitStruct; * GDMA_StructInit(&GDMA_InitStruct); * GDMA_InitStruct.GDMA_ChannelNum = 1; * GDMA_InitStruct.GDMA_DIR = GDMA_DIR_MemoryToPeripheral; * GDMA_InitStruct.GDMA_BufferSize = UART_TX_GDMA_BUFFER_SIZE;//determine total transfer size * GDMA_InitStruct.GDMA_SourceInc = DMA_SourceInc_Inc; * GDMA_InitStruct.GDMA_DestinationInc = DMA_DestinationInc_Fix; * GDMA_InitStruct.GDMA_SourceDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_DestinationDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_SourceMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_DestinationMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_SourceAddr = (uint32_t)GDMA_SendData_Buffer; * GDMA_InitStruct.GDMA_DestinationAddr = (uint32_t)(&(UART0->RB_THR)); * GDMA_InitStruct.GDMA_DestHandshake = GDMA_Handshake_UART0_TX; * GDMA_InitStruct.GDMA_ChannelPriority = 2;//channel prority between 0 to 5 * GDMA_Init(UART_TX_GDMA_CHANNEL, &GDMA_InitStruct); * GDMA_INTConfig(UART_TX_GDMA_CHANNEL_NUM, GDMA_INT_Transfer, ENABLE); * NVIC_InitTypeDef NVIC_InitStruct; * NVIC_InitStruct.NVIC_IRQChannel = UART_TX_GDMA_CHANNEL_IRQN; * NVIC_InitStruct.NVIC_IRQChannelPriority = 3; * NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; * NVIC_Init(&NVIC_InitStruct); * GDMA_Cmd(UART_TX_GDMA_CHANNEL_NUM, ENABLE); * } * \endcode */ void GDMA_Init(GDMA_ChannelTypeDef *GDMA_Channelx, GDMA_InitTypeDef *GDMA_InitStruct); /** * \brief Fills each GDMA_InitStruct member with its default value. * \param[in] GDMA_InitStruct : pointer to a GDMA_InitTypeDef structure which will * be initialized. * \return None. * * Example usage * \code{.c} * * void driver_gdma_init(void) * { * * for (uint32_t i = 0; i < UART_TX_GDMA_BUFFER_SIZE; i++) * { * GDMA_SendData_Buffer[i] = 0x10 + i; * } * GDMA_InitTypeDef GDMA_InitStruct; * GDMA_StructInit(&GDMA_InitStruct); * GDMA_InitStruct.GDMA_ChannelNum = 1; * GDMA_InitStruct.GDMA_DIR = GDMA_DIR_MemoryToPeripheral; * GDMA_InitStruct.GDMA_BufferSize = UART_TX_GDMA_BUFFER_SIZE;//determine total transfer size * GDMA_InitStruct.GDMA_SourceInc = DMA_SourceInc_Inc; * GDMA_InitStruct.GDMA_DestinationInc = DMA_DestinationInc_Fix; * GDMA_InitStruct.GDMA_SourceDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_DestinationDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_SourceMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_DestinationMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_SourceAddr = (uint32_t)GDMA_SendData_Buffer; * GDMA_InitStruct.GDMA_DestinationAddr = (uint32_t)(&(UART0->RB_THR)); * GDMA_InitStruct.GDMA_DestHandshake = GDMA_Handshake_UART0_TX; * GDMA_InitStruct.GDMA_ChannelPriority = 2;//channel prority between 0 to 5 * GDMA_Init(UART_TX_GDMA_CHANNEL, &GDMA_InitStruct); * * } * \endcode */ void GDMA_StructInit(GDMA_InitTypeDef *GDMA_InitStruct); /** * \brief Enables or disables the selected GDMA channel. * \param[in] GDMA_Channel_Num: GDMA channel number, can be 0~3. * \param[in] NewState: New state of the selected DMA channel. * This parameter can be: ENABLE or DISABLE. * \return None. * * Example usage * \code{.c} * * void driver_gdma_init(void) * { * * for (uint32_t i = 0; i < UART_TX_GDMA_BUFFER_SIZE; i++) * { * GDMA_SendData_Buffer[i] = 0x10 + i; * } * GDMA_InitTypeDef GDMA_InitStruct; * GDMA_StructInit(&GDMA_InitStruct); * GDMA_InitStruct.GDMA_ChannelNum = 1; * GDMA_InitStruct.GDMA_DIR = GDMA_DIR_MemoryToPeripheral; * GDMA_InitStruct.GDMA_BufferSize = UART_TX_GDMA_BUFFER_SIZE;//determine total transfer size * GDMA_InitStruct.GDMA_SourceInc = DMA_SourceInc_Inc; * GDMA_InitStruct.GDMA_DestinationInc = DMA_DestinationInc_Fix; * GDMA_InitStruct.GDMA_SourceDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_DestinationDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_SourceMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_DestinationMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_SourceAddr = (uint32_t)GDMA_SendData_Buffer; * GDMA_InitStruct.GDMA_DestinationAddr = (uint32_t)(&(UART0->RB_THR)); * GDMA_InitStruct.GDMA_DestHandshake = GDMA_Handshake_UART0_TX; * GDMA_InitStruct.GDMA_ChannelPriority = 2;//channel prority between 0 to 5 * GDMA_Init(UART_TX_GDMA_CHANNEL, &GDMA_InitStruct); * GDMA_INTConfig(UART_TX_GDMA_CHANNEL_NUM, GDMA_INT_Transfer, ENABLE); * NVIC_InitTypeDef NVIC_InitStruct; * NVIC_InitStruct.NVIC_IRQChannel = UART_TX_GDMA_CHANNEL_IRQN; * NVIC_InitStruct.NVIC_IRQChannelPriority = 3; * NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; * NVIC_Init(&NVIC_InitStruct); * GDMA_Cmd(UART_TX_GDMA_CHANNEL_NUM, ENABLE); * } * \endcode */ void GDMA_Cmd(uint8_t GDMA_Channel_Num, FunctionalState NewState); /** * \brief Enables or disables the specified DMA channelx interrupt source. * \param[in] GDMA_Channel_Num: GDMA channel number, can be 0~3. * \param[in] GDMA_IT: Specifies the GDMA interrupt source to be enabled or disabled. * This parameter can be any combination of the following values: * \arg GDMA_INT_Transfer: Transfer complete interrupt source. * \arg GDMA_INT_Block: Block transfer interrupt source. * \arg GDMA_INT_SrcTransfer: SourceTransfer interrupt source. * \arg GDMA_INT_DstTransfer: Destination Transfer interruptsource. * \arg GDMA_INT_Error: Transfer error interrupt source. * \param[in] NewState: New state of the specified DMA interrupt source. * This parameter can be: ENABLE or DISABLE. * \return None. * * Example usage * \code{.c} * * void driver_gdma_init(void) * { * * for (uint32_t i = 0; i < UART_TX_GDMA_BUFFER_SIZE; i++) * { * GDMA_SendData_Buffer[i] = 0x10 + i; * } * GDMA_InitTypeDef GDMA_InitStruct; * GDMA_StructInit(&GDMA_InitStruct); * GDMA_InitStruct.GDMA_ChannelNum = 1; * GDMA_InitStruct.GDMA_DIR = GDMA_DIR_MemoryToPeripheral; * GDMA_InitStruct.GDMA_BufferSize = UART_TX_GDMA_BUFFER_SIZE;//determine total transfer size * GDMA_InitStruct.GDMA_SourceInc = DMA_SourceInc_Inc; * GDMA_InitStruct.GDMA_DestinationInc = DMA_DestinationInc_Fix; * GDMA_InitStruct.GDMA_SourceDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_DestinationDataSize = GDMA_DataSize_Byte; * GDMA_InitStruct.GDMA_SourceMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_DestinationMsize = GDMA_Msize_1; * GDMA_InitStruct.GDMA_SourceAddr = (uint32_t)GDMA_SendData_Buffer; * GDMA_InitStruct.GDMA_DestinationAddr = (uint32_t)(&(UART0->RB_THR)); * GDMA_InitStruct.GDMA_DestHandshake = GDMA_Handshake_UART0_TX; * GDMA_InitStruct.GDMA_ChannelPriority = 2;//channel prority between 0 to 5 * GDMA_Init(UART_TX_GDMA_CHANNEL, &GDMA_InitStruct); * GDMA_INTConfig(UART_TX_GDMA_CHANNEL_NUM, GDMA_INT_Transfer, ENABLE); * NVIC_InitTypeDef NVIC_InitStruct; * NVIC_InitStruct.NVIC_IRQChannel = UART_TX_GDMA_CHANNEL_IRQN; * NVIC_InitStruct.NVIC_IRQChannelPriority = 3; * NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; * NVIC_Init(&NVIC_InitStruct); * GDMA_Cmd(UART_TX_GDMA_CHANNEL_NUM, ENABLE); * } * \endcode */ void GDMA_INTConfig(uint8_t GDMA_Channel_Num, uint32_t GDMA_IT, FunctionalState NewState); /** * \brief Clear the specified DMA channelx interrupt pending bit. * \param[in] GDMA_Channel_Num: GDMA channel number, can be 0~3. * \param[in] GDMA_IT: Specifies the GDMA interrupts sources to be enabled or disabled. * This parameter can be any combination of the following values: * \arg GDMA_INT_Transfer: Transfer complete interrupt source. * \arg GDMA_INT_Block: Block transfer interrupt source. * \arg GDMA_INT_SrcTransfer: SourceTransfer interrupt source. * \arg GDMA_INT_DstTransfer: Destination Transfer interruptsource. * \arg GDMA_INT_Error: Transfer error interrupt source. * \return None. * * Example usage * \code{.c} * * void gdma_demo(void) * { * driver_gdma_init(); * } * * void UART_TX_GDMA_Handler(void) * { * GDMA_ClearINTPendingBit(1, GDMA_INT_Transfer); * //Add user code here. * } * \endcode */ void GDMA_ClearINTPendingBit(uint8_t GDMA_Channel_Num, uint32_t GDMA_IT); /** * \brief Get selected GDMA channel status. * \param[in] GDMA_Channel_Num: GDMA channel number, can be 0~3. * \return GDMA channel status. * \retval SET: Channel is be used * \retval RESET: Channel is free. * * Example usage * \code{.c} * * void gdma_demo(void) * { * FlagStatus flag_status = GDMA_GetChannelStatus(0); * } * \endcode */ __STATIC_INLINE FlagStatus GDMA_GetChannelStatus(uint8_t GDMA_Channel_Num) { FlagStatus bit_status = RESET; /* Check the parameters */ assert_param(IS_GDMA_ChannelNum(GDMA_Channel_Num)); if ((GDMA_BASE->ChEnReg & BIT(GDMA_Channel_Num)) != (uint32_t)RESET) { bit_status = SET; } /* Return the selected channel status */ return bit_status; } /** * \brief Check whether GDMA Channel transfer interrupt is set. * \param[in] GDMA_Channel_Num: GDMA channel number, can be 0~3. * \return Transfer interrupt status, SET or RESET. * * Example usage * \code{.c} * * void gdma_demo(void) * { * ITStatus int_status = GDMA_GetTransferINTStatus(0); * } * \endcode */ __STATIC_INLINE ITStatus GDMA_GetTransferINTStatus(uint8_t GDMA_Channel_Num) { ITStatus bit_status = RESET; /* Check the parameters */ assert_param(IS_GDMA_ChannelNum(GDMA_Channel_Num)); if ((GDMA_BASE->STATUS_TFR & BIT(GDMA_Channel_Num)) != (uint32_t)RESET) { bit_status = SET; } /* Return the transfer interrupt status */ return bit_status; } /** * \brief Clear GDMA Channelx all interrupt. * \param[in] GDMA_Channel_Num: GDMA channel number, can be 0~3. * \return None. * * Example usage * \code{.c} * * void gdma_demo(void) * { * GDMA_ClearAllTypeINT(0); * } * \endcode */ __STATIC_INLINE void GDMA_ClearAllTypeINT(uint8_t GDMA_Channel_Num) { /* Check the parameters */ assert_param(IS_GDMA_ChannelNum(GDMA_Channel_Num)); GDMA_BASE->CLEAR_TFR = BIT(GDMA_Channel_Num); GDMA_BASE->CLEAR_BLOCK = BIT(GDMA_Channel_Num); GDMA_BASE->CLEAR_DST_TRAN = BIT(GDMA_Channel_Num); GDMA_BASE->CLEAR_SRC_TRAN = BIT(GDMA_Channel_Num); GDMA_BASE->CLEAR_ERR = BIT(GDMA_Channel_Num); } /** * \brief Set GDMA transmission source address. * \param[in] GDMA_Channelx: where x can be 0 to 3 to select the DMA Channel. * \param[in] Address: Source address. * \return None. * * Example usage * \code{.c} * * void gdma_demo(void) * { * uint32_t data_buf[10] = {0}; * GDMA_SetSourceAddress(GDMA_Channel0,(uint32_t)data_buf); * } * \endcode */ __STATIC_INLINE void GDMA_SetSourceAddress(GDMA_ChannelTypeDef *GDMA_Channelx, uint32_t Address) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); GDMA_Channelx->SAR = Address; } /** * \brief Set GDMA transmission destination address. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \param[in] Address: Destination address. * \return None. * * Example usage * \code{.c} * * void gdma_demo(void) * { * uint32_t data_buf[10] = {0}; * GDMA_SetDestinationAddress(GDMA_Channel0,(uint32_t)data_buf); * } * \endcode */ __STATIC_INLINE void GDMA_SetDestinationAddress(GDMA_ChannelTypeDef *GDMA_Channelx, uint32_t Address) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); GDMA_Channelx->DAR = Address; } /** * \brief Set GDMA buffer size. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \param[in] buffer_size: Set GDMA_BufferSize. * \return None. * * Example usage * \code{.c} * * void gdma_demo(void) * { * uint32_t data_buf_size = 4095;//max * GDMA_SetBufferSize(GDMA_Channel0,data_buf_size); * } * \endcode */ __STATIC_INLINE void GDMA_SetBufferSize(GDMA_ChannelTypeDef *GDMA_Channelx, uint32_t buffer_size) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); /* configure high 32 bit of CTL register */ GDMA_Channelx->CTL_HIGH = buffer_size; } /** * \brief Suspend GDMA transmission from the source. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \param[in] NewState: New state of the DMA Channelx. * This parameter can be: ENABLE or DISABLE. * \return None. * \note To prevent data loss, it is necessary to check whether FIFO data transmission is completed * after suspend, and judge by checking whether GDMA FIFO is empty. * * Example usage * \code{.c} * * void gdma_demo(void) * { * GDMA_SuspendCmd(GDMA_Channel0,ENABLE); * } * \endcode */ __STATIC_INLINE void GDMA_SuspendCmd(GDMA_ChannelTypeDef *GDMA_Channelx, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState == DISABLE) { /* Not suspend transmission*/ GDMA_Channelx->CFG_LOW &= ~(GDMA_SUSPEND_TRANSMISSSION); } else { /* Suspend transmission */ GDMA_Channelx->CFG_LOW |= GDMA_SUSPEND_TRANSMISSSION; } } /** * \brief Get GDMA transfer data length. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \return GDMA transfer data length. * * Example usage * \code{.c} * * void gdma_demo(void) * { * uint16_t data_len = GDMA_GetTransferLen(GDMA_Channel0); * } * \endcode */ __STATIC_INLINE uint16_t GDMA_GetTransferLen(GDMA_ChannelTypeDef *GDMA_Channelx) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); return (uint16_t)(GDMA_Channelx->CTL_HIGH & 0xffff); } /** * \brief Set GDMA LLP stucture address. * \param[in] GDMA_Channelx: Only for GDMA_Channel0~3. * \param[in] Address: LLP stucture address. * \return None. * * Example usage * \code{.c} * * void gdma_demo(void) * { * GDMA_LLIDef GDMA_LLIStruct[4000]; * GDMA_SetLLPAddress(GDMA_Channel0,(uint32_t)GDMA_LLIStruct); * } * \endcode */ __STATIC_INLINE void GDMA_SetLLPAddress(GDMA_ChannelTypeDef *GDMA_Channelx, uint32_t Address) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); if ((GDMA_Channelx == GDMA_Channel0) | (GDMA_Channelx == GDMA_Channel1) | \ (GDMA_Channelx == GDMA_Channel2) | (GDMA_Channelx == GDMA_Channel3)) { GDMA_Channelx->LLP = Address; } } /** * \brief Check GDMA suspend channel status. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \return GDMA suspend channel status. * \retval SET: Inactive. * \retval RESET: Active. * * Example usage * \code{.c} * * void gdma_demo(void) * { * FlagStatus flag_status = GDMA_GetSuspendChannelStatus(GDMA_Channel0); * } * \endcode */ __STATIC_INLINE FlagStatus GDMA_GetSuspendChannelStatus(GDMA_ChannelTypeDef *GDMA_Channelx) { FlagStatus bit_status = RESET; /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); if ((GDMA_Channelx->CFG_LOW & GDMA_SUSPEND_CHANNEL_STATUS) == GDMA_SUSPEND_CHANNEL_STATUS) { bit_status = SET; } /* Return the selected channel suspend status */ return bit_status; } /** * \brief Check GDMA suspend command status. * \param GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \return GDMA suspend command status. * \retval SET: Suspend. * \retval RESET: Not suspend. * * Example usage * \code{.c} * * void gdma_demo(void) * { * FlagStatus flag_status = GDMA_GetSuspendCmdStatus(GDMA_Channel0); * } * \endcode */ __STATIC_INLINE FlagStatus GDMA_GetSuspendCmdStatus(GDMA_ChannelTypeDef *GDMA_Channelx) { FlagStatus bit_status = RESET; /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); if ((GDMA_Channelx->CFG_LOW & GDMA_SUSPEND_CMD_STATUS) == GDMA_SUSPEND_CMD_STATUS) { bit_status = SET; } /* Return the selected channel suspend status */ return bit_status; } /** * \brief Check GDMA FIFO status. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the GDMA Channel. * \return GDMA FIFO status. * \retval SET: FIFO empty. * \retval RESET: FIFO not empty. * * Example usage * \code{.c} * * void gdma_demo(void) * { * FlagStatus flag_status = GDMA_GetFIFOStatus(GDMA_Channel0); * } * \endcode */ __STATIC_INLINE FlagStatus GDMA_GetFIFOStatus(GDMA_ChannelTypeDef *GDMA_Channelx) { FlagStatus bit_status = RESET; /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); if ((GDMA_Channelx->CFG_LOW & GDMA_FIFO_STATUS) != (uint32_t)RESET) { bit_status = SET; } /* Return the selected channel status */ return bit_status; } /** * \brief Get GDMA source address. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the DMA Channel. * \return Source address. * * Example usage * \code{.c} * * void gdma_demo(void) * { * uint32_t address = GDMA_GetSrcTransferAddress(GDMA_Channel0); * } * \endcode */ __STATIC_INLINE uint32_t GDMA_GetSrcTransferAddress(GDMA_ChannelTypeDef *GDMA_Channelx) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); uint32_t address = 0; address = GDMA_Channelx->SAR; return address; } /** * \brief Get GDMA destination address. * \param[in] GDMA_Channelx: Where x can be 0 to 3 to select the DMA Channel. * \return Destination address. * * Example usage * \code{.c} * * void gdma_demo(void) * { * uint32_t address = GDMA_GetDstTransferAddress(GDMA_Channel0); * } * \endcode */ __STATIC_INLINE uint32_t GDMA_GetDstTransferAddress(GDMA_ChannelTypeDef *GDMA_Channelx) { /* Check the parameters */ assert_param(IS_GDMA_ALL_PERIPH(GDMA_Channelx)); uint32_t address = 0; address = GDMA_Channelx->DAR; return address; } /** \} */ /* End of group GDMA_Exported_Functions */ #ifdef __cplusplus } #endif #endif /*_RTL8762X_GDMA_H_*/ /******************* (C) COPYRIGHT 2019 Realtek Semiconductor Corporation *****END OF FILE****/