blob: 60001e800a9eb3017dd499727a65bc5ea568b0f2 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* SAM Software Package License
* ----------------------------------------------------------------------------
* Copyright (c) 2011, 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.
* ----------------------------------------------------------------------------
*/
/** \file */
/** \addtogroup dmac_module Working with DMAC
*
* \section Usage
* <ul>
* <li> Enable or disable the a DMAC controller with DMAC_Enable() and or DMAC_Disable().</li>
* <li> Enable or disable %Dma interrupt using DMAC_EnableIt()or DMAC_DisableIt().</li>
* <li> Get %Dma interrupt status by DMAC_GetStatus() and DMAC_GetInterruptMask().</li>
* <li> Enable or disable specified %Dma channel with DMAC_EnableChannel() or DMAC_DisableChannel().</li>
* <li> Get %Dma channel status by DMAC_GetChannelStatus().</li>
* <li> ControlA and ControlB register is set by DMAC_SetControlA() and DMAC_SetControlB().</li>
* <li> Configure source and/or destination start address with DMAC_SetSourceAddr() and/or DMAC_SetDestinationAddr().</li>
* <li> Set %Dma descriptor address using DMAC_SetDescriptorAddr().</li>
* <li> Set source transfer buffer size with DMAC_SetBufferSize().</li>
* <li> Configure source and/or destination Picture-In-Picutre mode with DMAC_SetSourcePip() and/or DMAC_SetDestPip().</li>
* </ul>
*
* For more accurate information, please look at the DMAC section of the
* Datasheet.
*
* \sa \ref dmad_module
*
* Related files :\n
* \ref dmac.c\n
* \ref dmac.h.\n
*
*/
#ifndef DMAC_H
#define DMAC_H
/**@{*/
/*------------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include "chip.h"
#include <stdint.h>
/*------------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup dmac_defines DMAC Definitions
* @{
*/
/** Number of DMA channels */
#define DMAC_CHANNEL_NUM 8
/** Max DMA single transfer size */
#define DMAC_MAX_BT_SIZE 0xFFFF
/** @}*/
/*------------------------------------------------------------------------------
* Data structs
*----------------------------------------------------------------------------*/
/** \addtogroup dmac_struct DMAC Data Structs
* @{
*/
/** DMA Transfer Descriptor as well as Linked List Item */
typedef struct _DmaTransferDescriptor {
uint32_t dwSrcAddr; /**< Source buffer address */
uint32_t dwDstAddr; /**< Destination buffer address */
uint32_t dwCtrlA; /**< Control A register settings */
uint32_t dwCtrlB; /**< Control B register settings */
uint32_t dwDscAddr; /**< Next descriptor address */
} sDmaTransferDescriptor;
/** DMA channel control A */
typedef struct _DmaCtrlA {
uint32_t btSize:16, /**< Buffer Transfer size */
scSize:3, /**< Source Chunk Transfer size */
reserve1:1,
dcSize:3, /**< Destination Chunk Transfer size */
reserve2:1,
srcWidth:2, /**< Source width */
reserve3:2,
dstWidth:2, /**< Destination width */
reserve4:1,
done:1; /**< The transfer is done */
} sDmaCtrlA;
/** DMA channel control B */
typedef struct _DmaCtrlB {
uint32_t sIf:2, /**< Source Interface Selection Field */
reserve1:2,
dIf:2, /**< Destination Interface Selection Field */
reserve2:2,
srcPip:1, /**< Source Picture-in-picture mode enable */
reserve3:3,
dstPip:1, /**< Destination Picture-in-picture mode enable */
reserve4:3,
srcDscr:1, /**< Source Descriptor disabled */
reserve5:3,
dstDscr:1, /**< Destination Descriptor disabled */
fc:3, /**< Flow Controller */
srcIncr:2, /**< Source Fixed/Dec/Inc setting */
reserve6,
dstIncr:2, /**< Destination Fixed/Dec/Inc setting */
iEn:1, /**< Active low to enable interrupt */
autoEn:1; /**< Automatic multiple buffer transfer */
} sDmaCtrlB;
/** DMA channel Picture-In-Picture */
typedef struct _DmaPip {
uint32_t pipHole:16, /**< Hole size */
pipBoundary:10,/**< Number of transfers to perform before
hole increse */
reserve:6;
} sDmaPIP;
/** @}*/
/*------------------------------------------------------------------------------
* Global functions
*------------------------------------------------------------------------------*/
/** \addtogroup dmac_functions
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
extern void DMAC_Modified_Arbiter( Dmac *pDmac);
extern void DMAC_Enable( Dmac *pDmac );
extern void DMAC_Disable( Dmac *pDmac );
extern void DMAC_EnableIt (Dmac *pDmac, uint32_t dwInteruptMask );
extern void DMAC_DisableIt (Dmac *pDmac, uint32_t dwInteruptMask );
extern uint32_t DMAC_GetInterruptMask( Dmac *pDmac );
extern uint32_t DMAC_GetStatus( Dmac *pDmac );
extern uint32_t DMAC_GetMaskedStatus( Dmac *pDmac );
extern void DMAC_EnableChannel( Dmac *pDmac, uint8_t channel );
extern void DMAC_EnableChannels( Dmac *pDmac, uint8_t bmChannels );
extern void DMAC_DisableChannel( Dmac *pDmac, uint8_t channel );
extern void DMAC_DisableChannels( Dmac *pDmac, uint8_t bmChannels );
extern void DMAC_SuspendChannel( Dmac *pDmac, uint8_t channel );
extern void DMAC_KeepChannel( Dmac *pDmac, uint8_t channel );
extern void DMAC_RestoreChannel( Dmac *pDmac, uint8_t channel );
extern uint32_t DMAC_GetChannelStatus( Dmac *pDmac );
extern void DMAC_SetSourceAddr( Dmac *pDmac,
uint8_t channel,
uint32_t saddr );
extern uint32_t DMAC_GetSourceAddr( Dmac * pDmac,
uint8_t channel );
extern void DMAC_SetDestinationAddr( Dmac *pDmac,
uint8_t channel,
uint32_t daddr );
extern uint32_t DMAC_GetDestinationAddr( Dmac * pDmac,
uint8_t channel );
extern void DMAC_SetDescriptorAddr( Dmac *pDmac,
uint8_t channel,
uint32_t descr,
uint8_t descrif );
extern void DMAC_SetControlA( Dmac *pDmac,
uint8_t channel,
uint32_t controlA );
extern void DMAC_SetBufferSize( Dmac *pDmac,
uint8_t channel,
uint16_t bsize);
extern void DMAC_SetSingleTransferSize ( Dmac *pDmac,
uint8_t channel,
uint8_t srcWidth,
uint8_t dstWidth );
extern void DMAC_SetChunkTransferSize ( Dmac *pDmac,
uint8_t channel,
uint8_t scSize,
uint8_t dcSize);
extern void DMAC_SetControlB( Dmac *pDmac,
uint8_t channel,
uint32_t controlB );
extern void DMAC_EnableAutoMode( Dmac *pDmac, uint8_t channel );
extern void DMAC_DisableAutoMode( Dmac *pDmac, uint8_t channel );
extern void DMAC_SelectAHBInterface( Dmac *pDmac,
uint8_t channel,
uint8_t srcIf,
uint8_t dstIf );
extern void DMAC_SetPipMode( Dmac *pDmac,
uint8_t channel,
uint8_t srcPip,
uint8_t dstPip );
extern void DMAC_SetDescFetchMode( Dmac *pDmac,
uint8_t channel,
uint8_t srcDscr,
uint8_t dstDscr );
extern void DMAC_SetFlowControl( Dmac *pDmac,
uint8_t channel,
uint8_t flowControl );
extern void DMAC_SetCFG( Dmac *pDmac,
uint8_t channel,
uint32_t configuration );
extern void DMAC_SetReloadMode( Dmac *pDmac,
uint8_t channel,
uint8_t srcRep,
uint8_t dstRep );
extern void DMAC_SethandshakeInterface( Dmac *pDmac,
uint8_t channel,
uint8_t srcH2sel,
uint8_t dstH2sel );
extern void DMAC_SetSourcePip( Dmac *pDmac,
uint8_t channel,
uint16_t pipHole,
uint16_t pipBoundary);
extern void DMAC_SetDestPip( Dmac *pDmac,
uint8_t channel,
uint16_t pipHole,
uint16_t pipBoundary);
#ifdef __cplusplus
}
#endif
/** @}*/
/**@}*/
#endif //#ifndef DMAC_H