123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957 |
- typedef enum _edma_transfer_size
- {
- kEDMA_TransferSize1Bytes = 0x0U,
- kEDMA_TransferSize2Bytes = 0x1U,
- kEDMA_TransferSize4Bytes = 0x2U,
- kEDMA_TransferSize8Bytes = 0x3U,
- kEDMA_TransferSize16Bytes = 0x4U,
- kEDMA_TransferSize32Bytes = 0x5U,
- } edma_transfer_size_t;
- typedef enum _edma_modulo
- {
- kEDMA_ModuloDisable = 0x0U,
- kEDMA_Modulo2bytes,
- kEDMA_Modulo4bytes,
- kEDMA_Modulo8bytes,
- kEDMA_Modulo16bytes,
- kEDMA_Modulo32bytes,
- kEDMA_Modulo64bytes,
- kEDMA_Modulo128bytes,
- kEDMA_Modulo256bytes,
- kEDMA_Modulo512bytes,
- kEDMA_Modulo1Kbytes,
- kEDMA_Modulo2Kbytes,
- kEDMA_Modulo4Kbytes,
- kEDMA_Modulo8Kbytes,
- kEDMA_Modulo16Kbytes,
- kEDMA_Modulo32Kbytes,
- kEDMA_Modulo64Kbytes,
- kEDMA_Modulo128Kbytes,
- kEDMA_Modulo256Kbytes,
- kEDMA_Modulo512Kbytes,
- kEDMA_Modulo1Mbytes,
- kEDMA_Modulo2Mbytes,
- kEDMA_Modulo4Mbytes,
- kEDMA_Modulo8Mbytes,
- kEDMA_Modulo16Mbytes,
- kEDMA_Modulo32Mbytes,
- kEDMA_Modulo64Mbytes,
- kEDMA_Modulo128Mbytes,
- kEDMA_Modulo256Mbytes,
- kEDMA_Modulo512Mbytes,
- kEDMA_Modulo1Gbytes,
- kEDMA_Modulo2Gbytes,
- } edma_modulo_t;
- typedef enum _edma_bandwidth
- {
- kEDMA_BandwidthStallNone = 0x0U,
- kEDMA_BandwidthStall4Cycle = 0x2U,
- kEDMA_BandwidthStall8Cycle = 0x3U,
- } edma_bandwidth_t;
- typedef enum _edma_channel_link_type
- {
- kEDMA_LinkNone = 0x0U,
- kEDMA_MinorLink,
- kEDMA_MajorLink,
- } edma_channel_link_type_t;
- enum _edma_channel_status_flags
- {
- kEDMA_DoneFlag = 0x1U,
- kEDMA_ErrorFlag = 0x2U,
- kEDMA_InterruptFlag = 0x4U,
- };
- enum _edma_error_status_flags
- {
- kEDMA_DestinationBusErrorFlag = DMA_ES_DBE_MASK,
- kEDMA_SourceBusErrorFlag = DMA_ES_SBE_MASK,
- kEDMA_ScatterGatherErrorFlag = DMA_ES_SGE_MASK,
- kEDMA_NbytesErrorFlag = DMA_ES_NCE_MASK,
- kEDMA_DestinationOffsetErrorFlag = DMA_ES_DOE_MASK,
- kEDMA_DestinationAddressErrorFlag = DMA_ES_DAE_MASK,
- kEDMA_SourceOffsetErrorFlag = DMA_ES_SOE_MASK,
- kEDMA_SourceAddressErrorFlag = DMA_ES_SAE_MASK,
- kEDMA_ErrorChannelFlag = DMA_ES_ERRCHN_MASK,
- kEDMA_ChannelPriorityErrorFlag = DMA_ES_CPE_MASK,
- kEDMA_TransferCanceledFlag = DMA_ES_ECX_MASK,
- kEDMA_GroupPriorityErrorFlag = DMA_ES_GPE_MASK,
- kEDMA_ValidFlag = DMA_ES_VLD_MASK,
- };
- typedef enum _edma_interrupt_enable
- {
- kEDMA_ErrorInterruptEnable = 0x1U,
- kEDMA_MajorInterruptEnable = DMA_CSR_INTMAJOR_MASK,
- kEDMA_HalfInterruptEnable = DMA_CSR_INTHALF_MASK,
- } edma_interrupt_enable_t;
- typedef enum _edma_transfer_type
- {
- kEDMA_MemoryToMemory = 0x0U,
- kEDMA_PeripheralToMemory,
- kEDMA_MemoryToPeripheral,
- } edma_transfer_type_t;
- enum _edma_transfer_status
- {
- kStatus_EDMA_QueueFull = MAKE_STATUS(kStatusGroup_EDMA, 0),
- kStatus_EDMA_Busy = MAKE_STATUS(kStatusGroup_EDMA, 1),
- };
- typedef struct _edma_config
- {
- bool enableContinuousLinkMode;
- bool enableHaltOnError;
- bool enableRoundRobinArbitration;
- bool enableDebugMode;
- } edma_config_t;
- typedef struct _edma_transfer_config
- {
- uint32_t srcAddr;
- uint32_t destAddr;
- edma_transfer_size_t srcTransferSize;
- edma_transfer_size_t destTransferSize;
- int16_t srcOffset;
- int16_t destOffset;
- uint32_t minorLoopBytes;
- uint32_t majorLoopCounts;
- } edma_transfer_config_t;
- typedef struct _edma_channel_Preemption_config
- {
- bool enableChannelPreemption;
- bool enablePreemptAbility;
- uint8_t channelPriority;
- } edma_channel_Preemption_config_t;
- typedef struct _edma_minor_offset_config
- {
- bool enableSrcMinorOffset;
- bool enableDestMinorOffset;
- uint32_t minorOffset;
- } edma_minor_offset_config_t;
- typedef struct _edma_tcd
- {
- __IO uint32_t SADDR;
- __IO uint16_t SOFF;
- __IO uint16_t ATTR;
- __IO uint32_t NBYTES;
- __IO uint32_t SLAST;
- __IO uint32_t DADDR;
- __IO uint16_t DOFF;
- __IO uint16_t CITER;
- __IO uint32_t DLAST_SGA;
- __IO uint16_t CSR;
- __IO uint16_t BITER;
- } edma_tcd_t;
- struct _edma_handle;
- typedef void (*edma_callback)(struct _edma_handle *handle, void *userData, bool transferDone, uint32_t tcds);
- typedef struct _edma_handle
- {
- edma_callback callback;
- void *userData;
- DMA_Type *base;
- edma_tcd_t *tcdPool;
- uint8_t channel;
- volatile int8_t header;
- volatile int8_t tail;
- volatile int8_t tcdUsed;
- volatile int8_t tcdSize;
- uint8_t flags;
- } edma_handle_t;
- extern "C" {
- void EDMA_Init(DMA_Type *base, const edma_config_t *config);
- void EDMA_Deinit(DMA_Type *base);
- void EDMA_InstallTCD(DMA_Type *base, uint32_t channel, edma_tcd_t *tcd);
- void EDMA_GetDefaultConfig(edma_config_t *config);
- void EDMA_ResetChannel(DMA_Type *base, uint32_t channel);
- void EDMA_SetTransferConfig(DMA_Type *base,
- uint32_t channel,
- const edma_transfer_config_t *config,
- edma_tcd_t *nextTcd);
- void EDMA_SetMinorOffsetConfig(DMA_Type *base, uint32_t channel, const edma_minor_offset_config_t *config);
- static inline void EDMA_SetChannelPreemptionConfig(DMA_Type *base,
- uint32_t channel,
- const edma_channel_Preemption_config_t *config)
- {
- assert(channel < FSL_FEATURE_EDMA_MODULE_CHANNEL);
- assert(config != NULL);
- DMA_DCHPRIn(base, channel) =
- (DMA_DCHPRI0_DPA(!config->enablePreemptAbility) | DMA_DCHPRI0_ECP(config->enableChannelPreemption) |
- DMA_DCHPRI0_CHPRI(config->channelPriority));
- }
- void EDMA_SetChannelLink(DMA_Type *base, uint32_t channel, edma_channel_link_type_t type, uint32_t linkedChannel);
- void EDMA_SetBandWidth(DMA_Type *base, uint32_t channel, edma_bandwidth_t bandWidth);
- void EDMA_SetModulo(DMA_Type *base, uint32_t channel, edma_modulo_t srcModulo, edma_modulo_t destModulo);
- static inline void EDMA_EnableAsyncRequest(DMA_Type *base, uint32_t channel, bool enable)
- {
- assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
- base->EARS = (base->EARS & (~(1U << channel))) | ((uint32_t)enable << channel);
- }
- static inline void EDMA_EnableAutoStopRequest(DMA_Type *base, uint32_t channel, bool enable)
- {
- assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
- base->TCD[channel].CSR = (base->TCD[channel].CSR & (~DMA_CSR_DREQ_MASK)) | DMA_CSR_DREQ(enable);
- }
- void EDMA_EnableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask);
- void EDMA_DisableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask);
- void EDMA_TcdReset(edma_tcd_t *tcd);
- void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd);
- void EDMA_TcdSetMinorOffsetConfig(edma_tcd_t *tcd, const edma_minor_offset_config_t *config);
- void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel);
- static inline void EDMA_TcdSetBandWidth(edma_tcd_t *tcd, edma_bandwidth_t bandWidth)
- {
- assert(tcd != NULL);
- assert(((uint32_t)tcd & 0x1FU) == 0);
- tcd->CSR = (tcd->CSR & (~DMA_CSR_BWC_MASK)) | DMA_CSR_BWC(bandWidth);
- }
- void EDMA_TcdSetModulo(edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo);
- static inline void EDMA_TcdEnableAutoStopRequest(edma_tcd_t *tcd, bool enable)
- {
- assert(tcd != NULL);
- assert(((uint32_t)tcd & 0x1FU) == 0);
- tcd->CSR = (tcd->CSR & (~DMA_CSR_DREQ_MASK)) | DMA_CSR_DREQ(enable);
- }
- void EDMA_TcdEnableInterrupts(edma_tcd_t *tcd, uint32_t mask);
- void EDMA_TcdDisableInterrupts(edma_tcd_t *tcd, uint32_t mask);
- static inline void EDMA_EnableChannelRequest(DMA_Type *base, uint32_t channel)
- {
- assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
- base->SERQ = DMA_SERQ_SERQ(channel);
- }
- static inline void EDMA_DisableChannelRequest(DMA_Type *base, uint32_t channel)
- {
- assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
- base->CERQ = DMA_CERQ_CERQ(channel);
- }
- static inline void EDMA_TriggerChannelStart(DMA_Type *base, uint32_t channel)
- {
- assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
- base->SSRT = DMA_SSRT_SSRT(channel);
- }
- uint32_t EDMA_GetRemainingMajorLoopCount(DMA_Type *base, uint32_t channel);
- static inline uint32_t EDMA_GetErrorStatusFlags(DMA_Type *base)
- {
- return base->ES;
- }
- uint32_t EDMA_GetChannelStatusFlags(DMA_Type *base, uint32_t channel);
- void EDMA_ClearChannelStatusFlags(DMA_Type *base, uint32_t channel, uint32_t mask);
- void EDMA_CreateHandle(edma_handle_t *handle, DMA_Type *base, uint32_t channel);
- void EDMA_InstallTCDMemory(edma_handle_t *handle, edma_tcd_t *tcdPool, uint32_t tcdSize);
- void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData);
- void EDMA_PrepareTransfer(edma_transfer_config_t *config,
- void *srcAddr,
- uint32_t srcWidth,
- void *destAddr,
- uint32_t destWidth,
- uint32_t bytesEachRequest,
- uint32_t transferBytes,
- edma_transfer_type_t type);
- status_t EDMA_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config);
- void EDMA_StartTransfer(edma_handle_t *handle);
- void EDMA_StopTransfer(edma_handle_t *handle);
- void EDMA_AbortTransfer(edma_handle_t *handle);
- static inline uint32_t EDMA_GetUnusedTCDNumber(edma_handle_t *handle)
- {
- return (handle->tcdSize - handle->tcdUsed);
- }
- static inline uint32_t EDMA_GetNextTCDAddress(edma_handle_t *handle)
- {
- return (handle->base->TCD[handle->channel].DLAST_SGA);
- }
- void EDMA_HandleIRQ(edma_handle_t *handle);
- }
|