blob: 5140eed5b9be15a6e7fc1a6897b80f0ab41d9319 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL 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 _DMAD_H
#define _DMAD_H
/** \addtogroup dmad_module
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include "board.h"
/** \addtogroup dmad_defines DMA Driver Defines
@{*/
/*----------------------------------------------------------------------------
* Consts
*----------------------------------------------------------------------------*/
#define DMAD_TRANSFER_MEMORY 0xFF /**< DMA transfer from or to memory */
#define DMAD_ALLOC_FAILED 0xFFFF /**< Channel allocate failed */
#define DMAD_TRANSFER_TX 0
#define DMAD_TRANSFER_RX 1
/*----------------------------------------------------------------------------
* MACRO
*----------------------------------------------------------------------------*/
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
/** \addtogroup dmad_structs DMA Driver Structs
@{*/
/** DMA status or return code */
typedef enum _DmadStatus {
DMAD_OK = 0, /**< Operation is sucessful */
DMAD_BUSY, /**< Channel occupied or transfer not finished */
DMAD_PARTIAL_DONE, /**< Partial of LLI finished (on each buffer done) */
DMAD_ERROR, /**< Operation failed */
DMAD_CANCELED /**< Operation canceled */
} eDmadStatus, eDmadRC;
/** DMA state for channel */
typedef enum _DmadState {
DMAD_FREE = 0, /**< Free channel */
DMAD_IN_USE, /**< Allocated to some peripheral */
DMAD_IN_XFR, /**< Transferring something */
DMAD_STALL /**< Error stall */
} eDmadState;
/** DMA transfer callback */
typedef void (*DmadTransferCallback)(uint32_t status, void* pArg);
/** DMA driver channel */
typedef struct _DmadChannel {
DmadTransferCallback fCallback; /**< Callback */
void* pArg; /**< Callback argument */
uint8_t bIrqOwner; /**< Uses DMA handler or external one */
uint8_t bSrcPeriphID; /**< HW ID for source */
uint8_t bDstPeriphID; /**< HW ID for destination */
uint8_t bSrcTxIfID; /**< DMA Tx Interface ID for source */
uint8_t bSrcRxIfID; /**< DMA Rx Interface ID for source */
uint8_t bDstTxIfID; /**< DMA Tx Interface ID for destination */
uint8_t bDstRxIfID; /**< DMA Rx Interface ID for destination */
volatile uint8_t state; /**< DMA channel state */
} sDmadChannel;
#if 0
/** DMA driver controller */
typedef struct _DmadController {
Dmac *pHw; /**< Pointer to controler HW base */
sDmadChannel* dmadChannels; /**< Pointer to driver channels list */
uint8_t* dmadIfUsage; /**< AHB Interface usage counting */
uint8_t bHwID; /**< ID for DMAC */
uint8_t bNumChannels; /**< Number of channels for this controller */
uint8_t bNumAHBIf; /**< Number of AHB Interface */
uint8_t reserved;
} sDmadController;
#endif
/** DMA driver instance */
typedef struct _Dmad {
Dmac *pDmacs[2];
sDmadChannel dmaChannels[2][8];
uint8_t numControllers;
uint8_t numChannels;
uint8_t pollingMode;
uint8_t pollingTimeout;
} sDmad;
/** DMA driver channel ID */
typedef struct _DmadChannelID {
uint8_t bDmac; /**< DMA Controller number */
uint8_t bChannel; /**< Channel number */
} sDmadChannelID;
/** @}*/
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
/** \addtogroup dmad_functions DMA Driver Functionos
@{*/
extern void DMAD_Initialize( sDmad *pDmad,
uint8_t bPollingMode );
extern void DMAD_Handler( sDmad *pDmad );
extern uint32_t DMAD_AllocateChannel( sDmad *pDmad,
uint8_t bSrcID, uint8_t bDstID);
extern eDmadRC DMAD_FreeChannel( sDmad *pDmad, uint32_t dwChannel );
extern eDmadRC DMAD_SetCallback( sDmad *pDmad, uint32_t dwChannel,
DmadTransferCallback fCallback, void* pArg );
extern eDmadRC DMAD_ConfigurePIP( sDmad *pDmad, uint32_t dwChannel,
uint32_t dwSrcPIP, uint32_t dwDstPIP );
extern eDmadRC DMAD_PrepareChannel( sDmad *pDmad, uint32_t dwChannel,
uint32_t dwCfg );
extern eDmadRC DMAD_IsTransferDone( sDmad *pDmad, uint32_t dwChannel );
extern eDmadRC DMAD_StartTransfer( sDmad *pDmad, uint32_t dwChannel );
extern eDmadRC DMAD_StartTransfers( sDmad *pDmad,
uint8_t bDmac, uint32_t bmChannels );
extern eDmadRC DMAD_StopTransfer( sDmad *pDmad, uint32_t dwChannel );
extern void DMAD_ClearAuto( sDmad *pDmad, uint32_t _dwChannel );
extern eDmadRC DMAD_PrepareSingleTransfer( sDmad *pDmad, uint32_t dwChannel,
sDmaTransferDescriptor *pXfrDesc );
extern eDmadRC DMAD_PrepareMultiTransfer( sDmad *pDmad, uint32_t dwChannel,
sDmaTransferDescriptor *pXfrDesc );
/** @}*/
/**@}*/
#endif //#ifndef _DMAD_H