PeripheralDriver_AutoChips_.../inc/dma_drv.h

351 lines
13 KiB
C

/* Copyright Statement:
*
* This software/firmware and related documentation ("AutoChips Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
* the prior written permission of AutoChips inc. and/or its licensors, any
* reproduction, modification, use or disclosure of AutoChips Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*
* AutoChips Inc. (C) 2021. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
*/
/*!
* @file dma_drv.h
*
* @brief This file provides dma integration functions interface.
*
*/
#ifndef DMA_DRV_H
#define DMA_DRV_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* =========================================== Includes =========================================== */
#include "device_register.h"
/*=====================================SOURCE FILE VERSION INFORMATION==============================*/
#define DMA_HAL_MODULE_ID (21U)
#define DMA_HAL_SW_MAJOR_VERSION (1U)
#define DMA_HAL_SW_MINOR_VERSION (2U)
#define DMA_HAL_SW_PATCH_VERSION (0U)
/* ============================================ Define ============================================ */
/* =========================================== Typedef ============================================ */
/*!
* @brief DMA channel interrupts.
*/
typedef enum {
DMA_CHN_ERR_INT = 0U, /*!< Error interrupt */
DMA_CHN_FINISH_INT /*!< Tansfer finish interrupt. */
} dma_channel_interrupt_t;
/*!
* @brief DMA channel priority setting
*/
typedef enum {
DMA_CHN_PRIORITY_LOW = 0U, /*!< 0: DMA priority low */
DMA_CHN_PRIORITY_MEDIUM, /*!< 1: DMA priority medium */
DMA_CHN_PRIORITY_HIGH, /*!< 2: DMA priority high */
DMA_CHN_PRIORITY_VERY_HIGH /*!< 3: DMA priority very high */
} dma_channel_priority_t;
/*!
* @brief DMA transfer size configuration
*/
typedef enum {
DMA_TRANSFER_SIZE_1B = 0x0U,
DMA_TRANSFER_SIZE_2B = 0x1U,
DMA_TRANSFER_SIZE_4B = 0x2U
} dma_transfer_size_t;
/*!
* @brief Channel status for DMA channel.
* The user can get the status by callback parameter
* or by calling DMA_DRV_getStatus() function.
*/
typedef enum {
DMA_CHN_NORMAL = 0U, /*!< DMA channel normal state. */
DMA_CHN_ERROR /*!< An error occurred in the DMA channel. */
} dma_chn_status_t;
/*!< Definition for the DMA channel callback function. */
typedef void (*dma_callback_t)(void *parameter, dma_chn_status_t status);
/*!
* @brief Data structure for the DMA channel state.
*/
typedef struct {
uint8_t virtChn; /*!< Virtual channel number. */
dma_callback_t callback; /*!< Callback function pointer for the DMA channel. It will
be called at the DMA channel complete and DMA channel
error. */
void *parameter; /*!< Parameter for the callback function pointer. */
volatile dma_chn_status_t status; /*!< DMA channel status. */
} dma_chn_state_t;
/*!
* @brief The user configuration structure for the an DMA driver channel.
*/
typedef struct {
dma_channel_priority_t channelPriority; /*!< DMA channel priority */
uint8_t virtChnConfig; /*!< DMA virtual channel number */
dma_request_source_t source; /*!< Selects the source of the DMA request for this channel */
dma_callback_t callback; /*!< Callback that will be registered for this channel */
void *callbackParam; /*!< Parameter passed to the channel callback */
bool enableTrigger; /*!< Enables the periodic trigger capability for the DMA channel. */
} dma_channel_config_t;
/*!
* @brief Type for the DMA transfer.
*/
typedef enum {
DMA_TRANSFER_PERIPH2MEM = 0U, /*!< Transfer from peripheral to memory */
DMA_TRANSFER_MEM2PERIPH, /*!< Transfer from memory to peripheral */
DMA_TRANSFER_MEM2MEM, /*!< Transfer from memory to memory */
DMA_TRANSFER_PERIPH2PERIPH /*!< Transfer from peripheral to peripheral */
} dma_transfer_type_t;
/*!
* @brief This bit only control DMA channel FIFO and DMA transfer always
* move from source address to destination address.
*/
typedef enum {
DMA_READ_FROM_PERIPH = 0U, /*!< Error interrupt */
DMA_READ_FROM_MEM /*!< Tansfer half finish interrupt. */
} dma_dirction_t;
/*!
* @brief Runtime state structure for the DMA driver.
*/
typedef struct {
dma_chn_state_t * volatile virtChnState[(uint32_t)DMA_VIRTUAL_CH_MAX]; /*!< Pointer array storing channel state. */
} dma_state_t;
/* ========================================== Variables =========================================== */
/* ==================================== Functions declaration ===================================== */
/*!
* @brief Initializes the DMA module.
*
* @param[in] dmaState: The pointer to the DMA module state structure
* @param[in] chnStateArray: Array of pointers to run-time state structures for DMA channels
* @param[in] chnConfigArray: Array of pointers to channel initialization structures
* @param[in] chnCount: The number of DMA channels to be initialized
* @return STATUS_ERROR or STATUS_SUCCESS.
*/
status_t DMA_DRV_Init(dma_state_t *dmaState,
dma_chn_state_t * const chnStateArray[],
const dma_channel_config_t * const chnConfigArray[],
uint32_t chnCount);
/*!
* @brief De-initializes the DMA module.
*
* @param[in] none
* @return STATUS_SUCCESS
*/
status_t DMA_DRV_Deinit(void);
/*!
* @brief Initializes an DMA channel.
*
* @param[in] dmaChannelState: Pointer to the DMA channel state structure
* @param[in] dmaChannelConfig: User configuration structure for DMA channel
* @return STATUS_ERROR or STATUS_SUCCESS
*/
status_t DMA_DRV_ChannelInit(dma_chn_state_t *dmaChannelState, const dma_channel_config_t *dmaChannelConfig);
/*!
* @brief Releases a DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @return STATUS_SUCCESS
*/
status_t DMA_DRV_ReleaseChannel(uint8_t virtualChannel);
/*!
* @brief Configures a data transfer with DMA.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] type: Transfer type (M->M, P->M, M->P, P->P)
* @param[in] srcAddr: A source register address or a source memory address
* @param[in] destAddr: A destination register address or a destination memory address
* @param[in] transferSize: The number of bytes to be transferred on every DMA write/read
* Source/Dest share the same write/read size.
* @param[in] dataBufferSize: The total number of bytes to be transferred
* @return STATUS_ERROR or STATUS_SUCCESS
*/
status_t DMA_DRV_ConfigTransfer(uint8_t virtualChannel,
dma_transfer_type_t type,
uint32_t srcAddr,
uint32_t destAddr,
dma_transfer_size_t transferSize,
uint32_t dataBufferSize);
/*!
* @brief Set DMA channel circular mode
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] enable: enable/disable DMA channel circular mode
* @return none
*/
void DMA_DRV_SetCircularMode(uint8_t virtualChannel, bool enable);
/*!
* @brief Starts an DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @return STATUS_SUCCESS
*/
status_t DMA_DRV_StartChannel(uint8_t virtualChannel);
/*!
* @brief Stops the DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @return STATUS_SUCCESS
*/
status_t DMA_DRV_StopChannel(uint8_t virtualChannel);
/*!
* @brief Set DMA channel transfer length by bytes.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] bytesLength: DMA channel transfer length(0~32767 byte, bit 15 should be 0)
* @return none
*/
void DMA_DRV_SetTranferLength(uint8_t virtualChannel, uint16_t bytesLength);
/*!
* @brief Get the remaining bytes to be transferred by DMA.
*
* @param[in] virtualChannel: DMA virtual channel number
* @return The remaining bytes to be transferred by DMA
*/
uint32_t DMA_DRV_GetRemainingBytes(uint8_t virtualChannel);
/*!
* @brief Configures the DMA request and trigger function for the DMA channel
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] request: DMA request source
* @param[in] enableTrigger: DMA channel periodic trigger
* @return STATUS_SUCCESS
*/
status_t DMA_DRV_SetChannelRequestAndTrigger(uint8_t virtualChannel, uint8_t request, bool enableTrigger);
/*!
* @brief Configures the source address for the DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] startAddr: The pointer to the source start address
* @param[in] endAddr: The pointer to the source end address
* @return none
*/
void DMA_DRV_SetSrcAddr(uint8_t virtualChannel, uint32_t startAddr, uint32_t endAddr);
/*!
* @brief Configures the source address unsigned offset for the DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] offset: Unsigned-offset for source address
* @return none
*/
void DMA_DRV_SetSrcOffset(uint8_t virtualChannel, uint16_t offset);
/*!
* @brief Configures the destination address for the DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] startAddr: The pointer to the destination start address
* @param[in] endAddr: The pointer to the destination end address
* @return none
*/
void DMA_DRV_SetDestAddr(uint8_t virtualChannel, uint32_t startAddr, uint32_t endAddr);
/*!
* @brief Configures the destination address unsigned offset for the DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] offset: Unsigned-offset for destination address
* @return none
*/
void DMA_DRV_SetDestOffset(uint8_t virtualChannel, uint16_t offset);
/*!
* @brief Disables/Enables the channel interrupt.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] interrupt: Half finish/finish/error interrupt
* @param[in] enable: Enable (true)/Disable (false) interrupts for the current channel
* @return none
*/
void DMA_DRV_ConfigureInterrupt(uint8_t virtualChannel, dma_channel_interrupt_t intSrc, bool enable);
/*!
* @brief Registers the callback function and the parameter for DMA channel.
*
* @param[in] virtualChannel: DMA virtual channel number
* @param[in] callback: The pointer to the callback function
* @param[in] parameter: The pointer to the callback function's parameter
* @return STATUS_SUCCESS.
*/
status_t DMA_DRV_InstallCallback(uint8_t virtualChannel, dma_callback_t callback, void *parameter);
/*!
* @brief Gets the DMA channel status.
*
* @param[in] virtualChannel: DMA virtual channel number
* @return Channel status
*/
dma_chn_status_t DMA_DRV_GetChannelStatus(uint8_t virtualChannel);
/*!
* @brief Gets the DMA channel base pointer.
*
* @param[in] virtualChannel: DMA virtual channel number
* @return DMA channel base pointer
*/
DMA_ChannelType *DMA_DRV_GetDmaRegBaseAddr(uint32_t virtualChannel);
/*!
* @brief Get module version information.
*
* @param[out] versionInfo: Module version information address.
* @return void
*/
void DMA_DRV_GetVersionInfo(Drv_VersionInfo_Type *versionInfo);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
#endif /* DMA_DRV_H */
/* ============================================= EOF ============================================== */