diff --git a/simplicity_sdk/platform/emdrv/dmadrv/inc/dmadrv.h b/simplicity_sdk/platform/emdrv/dmadrv/inc/dmadrv.h index a013acfe..522c8680 100644 --- a/simplicity_sdk/platform/emdrv/dmadrv/inc/dmadrv.h +++ b/simplicity_sdk/platform/emdrv/dmadrv/inc/dmadrv.h @@ -102,6 +102,8 @@ typedef bool (*DMADRV_Callback_t)(unsigned int channel, Ecode_t DMADRV_AllocateChannel(unsigned int *channelId, void *capabilities); +Ecode_t DMADRV_AllocateChannelById(unsigned int channelId, + void *capabilities); Ecode_t DMADRV_DeInit(void); Ecode_t DMADRV_FreeChannel(unsigned int channelId); Ecode_t DMADRV_Init(void); diff --git a/simplicity_sdk/platform/emdrv/dmadrv/src/dmadrv.c b/simplicity_sdk/platform/emdrv/dmadrv/src/dmadrv.c index 4bf2f4fc..c4b27cff 100644 --- a/simplicity_sdk/platform/emdrv/dmadrv/src/dmadrv.c +++ b/simplicity_sdk/platform/emdrv/dmadrv/src/dmadrv.c @@ -165,6 +165,44 @@ Ecode_t DMADRV_AllocateChannel(unsigned int *channelId, void *capabilities) return ECODE_EMDRV_DMADRV_CHANNELS_EXHAUSTED; } +/***************************************************************************//** + * @brief + * Allocate (reserve) the given DMA channel if he is free. + * + * @param[out] channelId + * The channel ID to be assigned by DMADRV. + * + * @param[in] capabilities + * Not used. + * + * @return + * @ref ECODE_EMDRV_DMADRV_OK on success. On failure, an appropriate + * DMADRV @ref Ecode_t is returned. + ******************************************************************************/ +Ecode_t DMADRV_AllocateChannelById(unsigned int channelId, void *capabilities) +{ + (void)capabilities; + CORE_DECLARE_IRQ_STATE; + + if ( !initialized ) { + return ECODE_EMDRV_DMADRV_NOT_INITIALIZED; + } + + if ( channelId >= EMDRV_DMADRV_DMA_CH_COUNT ) { + return ECODE_EMDRV_DMADRV_PARAM_ERROR; + } + + CORE_ENTER_ATOMIC(); + if ( !chTable[channelId].allocated ) { + chTable[channelId].allocated = true; + chTable[channelId].callback = NULL; + CORE_EXIT_ATOMIC(); + return ECODE_EMDRV_DMADRV_OK; + } + CORE_EXIT_ATOMIC(); + return ECODE_EMDRV_DMADRV_IN_USE; +} + /***************************************************************************//** * @brief * Deinitialize DMADRV.