Data Structures | |
struct | EDMA3_RM_ParamentryRegs |
EDMA3 PaRAM Set. More... | |
struct | EDMA3_RM_PaRAMRegs |
EDMA3 PaRAM Set in User Configurable format. More... | |
Defines | |
#define | EDMA3_RM_DMA_CHANNEL_ANY (1011u) |
#define | EDMA3_RM_QDMA_CHANNEL_ANY (1012u) |
#define | EDMA3_RM_TCC_ANY (1013u) |
#define | EDMA3_RM_PARAM_ANY (1014u) |
#define | EDMA3_RM_CH_NO_PARAM_MAP (1015u) |
#define | EDMA3_RM_CH_NO_TCC_MAP (1016u) |
Enumerations | |
enum | EDMA3_RM_HW_CHANNEL_EVENT { EDMA3_RM_HW_CHANNEL_EVENT_0 = 0, EDMA3_RM_HW_CHANNEL_EVENT_1, EDMA3_RM_HW_CHANNEL_EVENT_2, EDMA3_RM_HW_CHANNEL_EVENT_3, EDMA3_RM_HW_CHANNEL_EVENT_4, EDMA3_RM_HW_CHANNEL_EVENT_5, EDMA3_RM_HW_CHANNEL_EVENT_6, EDMA3_RM_HW_CHANNEL_EVENT_7, EDMA3_RM_HW_CHANNEL_EVENT_8, EDMA3_RM_HW_CHANNEL_EVENT_9, EDMA3_RM_HW_CHANNEL_EVENT_10, EDMA3_RM_HW_CHANNEL_EVENT_11, EDMA3_RM_HW_CHANNEL_EVENT_12, EDMA3_RM_HW_CHANNEL_EVENT_13, EDMA3_RM_HW_CHANNEL_EVENT_14, EDMA3_RM_HW_CHANNEL_EVENT_15, EDMA3_RM_HW_CHANNEL_EVENT_16, EDMA3_RM_HW_CHANNEL_EVENT_17, EDMA3_RM_HW_CHANNEL_EVENT_18, EDMA3_RM_HW_CHANNEL_EVENT_19, EDMA3_RM_HW_CHANNEL_EVENT_20, EDMA3_RM_HW_CHANNEL_EVENT_21, EDMA3_RM_HW_CHANNEL_EVENT_22, EDMA3_RM_HW_CHANNEL_EVENT_23, EDMA3_RM_HW_CHANNEL_EVENT_24, EDMA3_RM_HW_CHANNEL_EVENT_25, EDMA3_RM_HW_CHANNEL_EVENT_26, EDMA3_RM_HW_CHANNEL_EVENT_27, EDMA3_RM_HW_CHANNEL_EVENT_28, EDMA3_RM_HW_CHANNEL_EVENT_29, EDMA3_RM_HW_CHANNEL_EVENT_30, EDMA3_RM_HW_CHANNEL_EVENT_31, EDMA3_RM_HW_CHANNEL_EVENT_32, EDMA3_RM_HW_CHANNEL_EVENT_33, EDMA3_RM_HW_CHANNEL_EVENT_34, EDMA3_RM_HW_CHANNEL_EVENT_35, EDMA3_RM_HW_CHANNEL_EVENT_36, EDMA3_RM_HW_CHANNEL_EVENT_37, EDMA3_RM_HW_CHANNEL_EVENT_38, EDMA3_RM_HW_CHANNEL_EVENT_39, EDMA3_RM_HW_CHANNEL_EVENT_40, EDMA3_RM_HW_CHANNEL_EVENT_41, EDMA3_RM_HW_CHANNEL_EVENT_42, EDMA3_RM_HW_CHANNEL_EVENT_43, EDMA3_RM_HW_CHANNEL_EVENT_44, EDMA3_RM_HW_CHANNEL_EVENT_45, EDMA3_RM_HW_CHANNEL_EVENT_46, EDMA3_RM_HW_CHANNEL_EVENT_47, EDMA3_RM_HW_CHANNEL_EVENT_48, EDMA3_RM_HW_CHANNEL_EVENT_49, EDMA3_RM_HW_CHANNEL_EVENT_50, EDMA3_RM_HW_CHANNEL_EVENT_51, EDMA3_RM_HW_CHANNEL_EVENT_52, EDMA3_RM_HW_CHANNEL_EVENT_53, EDMA3_RM_HW_CHANNEL_EVENT_54, EDMA3_RM_HW_CHANNEL_EVENT_55, EDMA3_RM_HW_CHANNEL_EVENT_56, EDMA3_RM_HW_CHANNEL_EVENT_57, EDMA3_RM_HW_CHANNEL_EVENT_58, EDMA3_RM_HW_CHANNEL_EVENT_59, EDMA3_RM_HW_CHANNEL_EVENT_60, EDMA3_RM_HW_CHANNEL_EVENT_61, EDMA3_RM_HW_CHANNEL_EVENT_62, EDMA3_RM_HW_CHANNEL_EVENT_63 } |
DMA Channels assigned to different Hardware Events. They should be used while requesting a specific DMA channel. One possible usage is to maintain a SoC specific file, which will contain the mapping of these hardware events to the respective peripherals for better understanding and lesser probability of errors. Also, if any event associated with a particular peripheral gets changed, only that SoC specific file needs to be changed. More... | |
enum | EDMA3_RM_QdmaTrigWord { EDMA3_RM_QDMA_TRIG_OPT = 0, EDMA3_RM_QDMA_TRIG_SRC = 1, EDMA3_RM_QDMA_TRIG_ACNT_BCNT = 2, EDMA3_RM_QDMA_TRIG_DST = 3, EDMA3_RM_QDMA_TRIG_SRC_DST_BIDX = 4, EDMA3_RM_QDMA_TRIG_LINK_BCNTRLD = 5, EDMA3_RM_QDMA_TRIG_SRC_DST_CIDX = 6, EDMA3_RM_QDMA_TRIG_CCNT = 7, EDMA3_RM_QDMA_TRIG_DEFAULT = 7 } |
QDMA Trigger Word. More... | |
enum | EDMA3_RM_Cntrlr_PhyAddr { EDMA3_RM_CC_PHY_ADDR = 0, EDMA3_RM_TC0_PHY_ADDR, EDMA3_RM_TC1_PHY_ADDR, EDMA3_RM_TC2_PHY_ADDR, EDMA3_RM_TC3_PHY_ADDR, EDMA3_RM_TC4_PHY_ADDR, EDMA3_RM_TC5_PHY_ADDR, EDMA3_RM_TC6_PHY_ADDR, EDMA3_RM_TC7_PHY_ADDR } |
CC/TC Physical Address. More... | |
enum | EDMA3_RM_IoctlCmd { EDMA3_RM_IOCTL_MIN_IOCTL = 0, EDMA3_RM_IOCTL_SET_PARAM_CLEAR_OPTION, EDMA3_RM_IOCTL_GET_PARAM_CLEAR_OPTION, EDMA3_RM_IOCTL_SET_GBL_REG_MODIFY_OPTION, EDMA3_RM_IOCTL_GET_GBL_REG_MODIFY_OPTION, EDMA3_RM_IOCTL_MAX_IOCTL } |
EDMA3 Resource Manager IOCTL commands. More... | |
Functions | |
EDMA3_RM_Result | EDMA3_RM_allocResource (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *resObj) |
This API is used to allocate specified EDMA3 Resources like DMA/QDMA channel, PaRAM Set or TCC. | |
EDMA3_RM_Result | EDMA3_RM_freeResource (EDMA3_RM_Handle hEdmaResMgr, const EDMA3_RM_ResDesc *resObj) |
This API is used to free previously allocated EDMA3 Resources like DMA/QDMA channel, PaRAM Set or TCC. | |
EDMA3_RM_Result | EDMA3_RM_allocContiguousResource (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *firstResIdObj, unsigned int numResources) |
Allocate a contiguous region of specified EDMA3 Resource like DMA channel, QDMA channel, PaRAM Set or TCC. | |
EDMA3_RM_Result | EDMA3_RM_freeContiguousResource (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *firstResIdObj, unsigned int numResources) |
Free a contiguous region of specified EDMA3 Resource like DMA channel, QDMA channel, PaRAM Set or TCC, previously allocated. | |
EDMA3_RM_Result | EDMA3_RM_allocLogicalChannel (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *lChObj, unsigned int *pParam, unsigned int *pTcc) |
Request a DMA/QDMA/Link channel. | |
EDMA3_RM_Result | EDMA3_RM_freeLogicalChannel (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *lChObj) |
This API is used to free the specified channel (DMA/QDMA/Link) and its associated resources (PaRAM Set, TCC etc). | |
EDMA3_RM_Result | EDMA3_RM_mapEdmaChannel (EDMA3_RM_Handle hEdmaResMgr, unsigned int channelId, unsigned int paRAMId) |
Bind the resources DMA Channel and PaRAM Set. Both the DMA channel and the PaRAM set should be previously allocated. If they are not, this API will result in error. | |
EDMA3_RM_Result | EDMA3_RM_mapQdmaChannel (EDMA3_RM_Handle hEdmaResMgr, unsigned int channelId, unsigned int paRAMId, EDMA3_RM_QdmaTrigWord trigWord) |
Bind the resources QDMA Channel and PaRAM Set. Also, Set the trigger word for the QDMA channel. Both the QDMA channel and the PaRAM set should be previously allocated. If they are not, this API will result in error. | |
EDMA3_RM_Result | EDMA3_RM_setCCRegister (EDMA3_RM_Handle hEdmaResMgr, unsigned int regOffset, unsigned int newRegValue) |
Set the Channel Controller (CC) Register value. | |
EDMA3_RM_Result | EDMA3_RM_getCCRegister (EDMA3_RM_Handle hEdmaResMgr, unsigned int regOffset, unsigned int *regValue) |
Get the Channel Controller (CC) Register value. | |
EDMA3_RM_Result | EDMA3_RM_waitAndClearTcc (EDMA3_RM_Handle hEdmaResMgr, unsigned int tccNo) |
Wait for a transfer completion interrupt to occur and clear it. | |
EDMA3_RM_Result | EDMA3_RM_checkAndClearTcc (EDMA3_RM_Handle hEdmaResMgr, unsigned int tccNo, unsigned short *tccStatus) |
Returns the status of a previously initiated transfer. | |
EDMA3_RM_Result | EDMA3_RM_setPaRAM (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *lChObj, const EDMA3_RM_PaRAMRegs *newPaRAM) |
Copy the user specified PaRAM Set onto the PaRAM Set associated with the logical channel (DMA/QDMA/Link). | |
EDMA3_RM_Result | EDMA3_RM_getPaRAM (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *lChObj, EDMA3_RM_PaRAMRegs *currPaRAM) |
Retrieve existing PaRAM set associated with specified logical channel (DMA/QDMA/Link). | |
EDMA3_RM_Result | EDMA3_RM_getPaRAMPhyAddr (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_ResDesc *lChObj, unsigned int *paramPhyAddr) |
Get the PaRAM Set Physical Address associated with a logical channel. | |
EDMA3_RM_Result | EDMA3_RM_getBaseAddress (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_Cntrlr_PhyAddr controllerId, unsigned int *phyAddress) |
Get the Channel Controller or Transfer Controller (n) Physical Address. | |
EDMA3_RM_Result | EDMA3_RM_getGblConfigParams (unsigned int phyCtrllerInstId, EDMA3_RM_GblConfigParams *gblCfgParams) |
Get the SoC specific configuration structure for the EDMA3 Hardware. | |
EDMA3_RM_Result | EDMA3_RM_getInstanceInitCfg (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_InstanceInitConfig *instanceInitConfig) |
Get the RM Instance specific configuration structure for different EDMA3 resources' usage (owned resources, reserved resources etc). | |
EDMA3_RM_Result | EDMA3_RM_Ioctl (EDMA3_RM_Handle hEdmaResMgr, EDMA3_RM_IoctlCmd cmd, void *cmdArg, void *param) |
EDMA3 Resource Manager IOCTL. |
#define EDMA3_RM_CH_NO_PARAM_MAP (1015u) |
This define is used to specify that a DMA channel is NOT tied to any PaRAM Set and hence any available PaRAM Set could be used for that DMA channel. It could be used in dmaChannelPaRAMMap [EDMA3_MAX_DMA_CH], in global configuration structure EDMA3_RM_GblConfigParams.
This value should mandatorily be used to mark DMA channels with no initial mapping to specific PaRAM Sets.
Referenced by EDMA3_RM_allocLogicalChannel(), and EDMA3_RM_open().
#define EDMA3_RM_CH_NO_TCC_MAP (1016u) |
This define is used to specify that the DMA/QDMA channel is not tied to any TCC and hence any available TCC could be used for that DMA/QDMA channel. It could be used in dmaChannelTccMap [EDMA3_MAX_DMA_CH], in global configuration structure EDMA3_RM_GblConfigParams.
This value should mandatorily be used to mark DMA channels with no initial mapping to specific TCCs.
Referenced by EDMA3_RM_allocLogicalChannel().
#define EDMA3_RM_DMA_CHANNEL_ANY (1011u) |
Used to specify any available DMA Channel while requesting one. Used in the API EDMA3_RM_allocLogicalChannel (). DMA channel from the pool of (owned && non_reserved && available_right_now) DMA channels will be chosen and returned.
Referenced by EDMA3_RM_allocLogicalChannel().
#define EDMA3_RM_PARAM_ANY (1014u) |
Used to specify any available PaRAM Set while requesting one. Used in the API EDMA3_RM_allocLogicalChannel(), for both DMA/QDMA and Link channels. PaRAM Set from the pool of (owned && non_reserved && available_right_now) PaRAM Sets will be chosen and returned.
Referenced by EDMA3_RM_allocLogicalChannel().
#define EDMA3_RM_QDMA_CHANNEL_ANY (1012u) |
Used to specify any available QDMA Channel while requesting one. Used in the API EDMA3_RM_allocLogicalChannel(). QDMA channel from the pool of (owned && non_reserved && available_right_now) QDMA channels will be chosen and returned.
Referenced by EDMA3_RM_allocLogicalChannel().
#define EDMA3_RM_TCC_ANY (1013u) |
Used to specify any available TCC while requesting one. Used in the API EDMA3_RM_allocLogicalChannel(), for both DMA and QDMA channels. TCC from the pool of (owned && non_reserved && available_right_now) TCCs will be chosen and returned.
Referenced by EDMA3_RM_allocLogicalChannel().
CC/TC Physical Address.
Use this enum to get the physical address of the Channel Controller or the Transfer Controller. The address returned could be used by the advanced usres to set/get some specific registers direclty.
DMA Channels assigned to different Hardware Events. They should be used while requesting a specific DMA channel. One possible usage is to maintain a SoC specific file, which will contain the mapping of these hardware events to the respective peripherals for better understanding and lesser probability of errors. Also, if any event associated with a particular peripheral gets changed, only that SoC specific file needs to be changed.
for eg, the sample SoC specific file "soc.h" can have these defines:
define EDMA3_RM_HW_CHANNEL_MCBSP_TX EDMA3_RM_HW_CHANNEL_EVENT_2 define EDMA3_RM_HW_CHANNEL_MCBSP_RX EDMA3_RM_HW_CHANNEL_EVENT_3
These defines will be used by the MCBSP driver. The same event EDMA3_RM_HW_CHANNEL_EVENT_2/3 could be mapped to some other peripheral also.
enum EDMA3_RM_IoctlCmd |
EDMA3 Resource Manager IOCTL commands.
QDMA Trigger Word.
Use this enum to set the QDMA trigger word to any of the 8 DWords(unsigned int) within a Parameter RAM set
EDMA3_RM_Result EDMA3_RM_allocContiguousResource | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | firstResIdObj, | |||
unsigned int | numResources | |||
) |
Allocate a contiguous region of specified EDMA3 Resource like DMA channel, QDMA channel, PaRAM Set or TCC.
This API is used to allocate a contiguous region of specified EDMA3 Resources like DMA channel, QDMA channel, PaRAM Set or TCC.
User can specify a particular resource Id to start with and go up to the number of resources requested. The specific resource id to start from could be passed in 'firstResIdObject->resId' and the number of resources requested in 'numResources'.
User can also request ANY available resource(s) of the type 'firstResIdObject->type' by specifying 'firstResIdObject->resId' as EDMA3_RM_RES_ANY.
ANY types of resources are those resources when user doesn't care about the actual resource allocated; user just wants a resource of the type specified. One use-case is to perform memory-to-memory data transfer operation. This operation can be performed using any available DMA or QDMA channel. User doesn't need any specific channel for the same.
To allocate specific contiguous resources, first this API checks whether those requested resources are OWNED by the Resource Manager instance. Then it checks the current availability of those resources.
To allocate ANY available contiguous resources, this API tries to allocate resources from the pool of (owned && non_reserved && available_right_now) resources.
After allocating DMA/QDMA channels or TCCs, the same resources are enabled in the shadow region specific register (DRAE/DRAEH/QRAE). Allocated PaRAM Sets are initialized to NULL before this API returns.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
firstResIdObj | [IN] Handle to the first resource descriptor object, which needs to be allocated. firstResIdObject->resId could be a valid resource id in case user wants to allocate specific resources OR it could be EDMA3_RM_RES_ANY in case user wants only the required number of resources and doesn't care about which resources were allocated. | |
numResources | [IN] Number of contiguous resources user wants to allocate. |
Take the instance specific semaphore, to prevent simultaneous access to the shared resources.
Enable the DMA channel in the DRAE registers also.
Enable the DMA channel in the DRAEH registers also.
Enable the QDMA channel in the QRAE register also.
Enable the Interrupt channel in the DRAE/DRAEH registers also. Also, If the region id coming from this RM instance is same as the Master RM Instance's region id, only then we will be getting the interrupts on the same side. So save the TCC in the allocatedTCCs[] array.
Also, make the actual PARAM Set NULL, checking the flag whether it is required or not.
Take the instance specific semaphore, to prevent simultaneous access to the shared resources.
We have to search three different arrays, namely ownedResoures, avlblResources and resvdResources, to find the 'common' contiguous resources. For this, take an 'AND' of all three arrays in one single array and use your algorithm on that array.
Try to allocate 'numResources' contiguous resources of type RES_ANY.
If result != EDMA3_RM_SOK, resource allocation failed. Else resources successfully allocated.
Check the Resource Allocation Result 'result' first. If Resource Allocation has resulted in an error, return it (having more priority than semResult. Else, return semResult.
Resource Allocation successful, return semResult for returning semaphore.
References EDMA3_RM_Instance::avlblDmaChannels, EDMA3_RM_Instance::avlblPaRAMSets, EDMA3_RM_Instance::avlblQdmaChannels, EDMA3_RM_Instance::avlblTccs, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_E_RES_NOT_OWNED, EDMA3_RM_E_SPECIFIED_RES_NOT_AVAILABLE, EDMA3_RM_RES_ANY, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_RES_TCC, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_GblConfigParams::numDmaChannels, EDMA3_RM_GblConfigParams::numPaRAMSets, EDMA3_RM_GblConfigParams::numQdmaChannels, EDMA3_RM_GblConfigParams::numTccs, EDMA3_RM_InstanceInitConfig::ownDmaChannels, EDMA3_RM_InstanceInitConfig::ownPaRAMSets, EDMA3_RM_InstanceInitConfig::ownQdmaChannels, EDMA3_RM_InstanceInitConfig::ownTccs, EDMA3_RM_Instance::paramInitRequired, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_Param::regionId, EDMA3_RM_ResDesc::resId, EDMA3_RM_InstanceInitConfig::resvdDmaChannels, EDMA3_RM_InstanceInitConfig::resvdPaRAMSets, EDMA3_RM_InstanceInitConfig::resvdQdmaChannels, EDMA3_RM_InstanceInitConfig::resvdTccs, EDMA3_RM_Param::rmInstInitConfig, EDMA3_RM_Param::rmSemHandle, EDMA3_RM_Instance::shadowRegs, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_allocLogicalChannel | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | lChObj, | |||
unsigned int * | pParam, | |||
unsigned int * | pTcc | |||
) |
Request a DMA/QDMA/Link channel.
This API is used to allocate a logical channel (DMA/QDMA/Link) along with the associated resources. For DMA and QDMA channels, TCC and PaRAM Set are also allocated along with the requested channel. For Link channel, ONLY a PaRAM Set is allocated.
Note: To free the logical channel allocated by this API, user should call EDMA3_RM_freeLogicalChannel () ONLY to de-allocate all the allocated resources and remove certain mappings.
User can request a specific logical channel by passing the channel id in 'lChObj->resId' and channel type in 'lChObj->type'. Note that the channel id is the same as the actual resource id. For e.g. in the case of QDMA channels, valid channel ids are from 0 to 7 only.
User can also request ANY available logical channel of the type 'lChObj->type' by specifying 'lChObj->resId' as: a) EDMA3_RM_DMA_CHANNEL_ANY: For DMA channels b) EDMA3_RM_QDMA_CHANNEL_ANY: For QDMA channels, and c) EDMA3_RM_PARAM_ANY: For Link channels. Normally user should use this value to request link channels (PaRAM Sets used for linking purpose only), unless he wants to use some specific link channels (PaRAM Sets) which is also allowed.
This API internally uses EDMA3_RM_allocResource () to allocate the desired resources (DMA/QDMA channel, PaRAM Set and TCC).
For DMA/QDMA channels, after allocating all the EDMA3 resources, this API sets the TCC field of the OPT PaRAM Word with the allocated TCC.
For DMA channel, it also sets the DCHMAP register, if required.
For QDMA channel, it sets the QCHMAP register and CCNT as trigger word and enables the QDMA channel by writing to the QEESR register.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
lChObj | [IN/OUT] Handle to the requested logical channel object, which needs to be allocated. It could be a specific logical channel or ANY available logical channel of the requested type. In case user passes a specific resource Id, lChObj value is left unchanged. In case user requests ANY available resource, the allocated resource id is returned in lChObj->resId. | |
pParam | [IN/OUT] PaRAM Set for a particular logical (DMA/QDMA) channel. Not used if user requested for a Link channel. In case user passes a specific PaRAM Set value, pParam value is left unchanged. In case user requests ANY available PaRAM Set by passing 'EDMA3_RM_PARAM_ANY' in pParam, the allocated one is returned in pParam. | |
pTcc | [IN/OUT] TCC for a particular logical (DMA/QDMA) channel. Not used if user requested for a Link channel. In case user passes a specific TCC value, pTcc value is left unchanged. In case user requests ANY available TCC by passing 'EDMA3_RM_TCC_ANY' in pTcc, the allocated one is returned in pTcc. |
Note: To free the logical channel allocated by this API, user should call EDMA3_RM_freeLogicalChannel () ONLY to de-allocate all the allocated resources and remove certain mappings.
User can request a specific logical channel by passing the channel id in 'lChObj->resId' and channel type in 'lChObj->type'. Note that the channel id is the same as the actual resource id. For e.g. in the case of QDMA channels, valid channel ids are from 0 to 7 only.
User can also request ANY available logical channel of the type 'lChObj->type' by specifying 'lChObj->resId' as: a) EDMA3_RM_DMA_CHANNEL_ANY: For DMA channels b) EDMA3_RM_QDMA_CHANNEL_ANY: For QDMA channels, and c) EDMA3_RM_PARAM_ANY: For Link channels. Normally user should use this value to request link channels (PaRAM Sets used for linking purpose only), unless he wants to use some specific link channels (PaRAM Sets) which is also allowed.
This API internally uses EDMA3_RM_allocResource () to allocate the desired resources (DMA/QDMA channel, PaRAM Set and TCC).
For DMA/QDMA channels, after allocating all the EDMA3 resources, this API sets the TCC field of the OPT PaRAM Word with the allocated TCC.
For DMA channel, it also sets the DCHMAP register, if required.
For QDMA channel, it sets the QCHMAP register and CCNT as trigger word and enables the QDMA channel by writing to the QEESR register.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
lChObj | [IN/OUT] Handle to the requested logical channel object, which needs to be allocated. It could be a specific logical channel or ANY available logical channel of the requested type. In case user passes a specific resource Id, lChObj value is left unchanged. In case user requests ANY available resource, the allocated resource id is returned in lChObj->resId. | |
pParam | [IN/OUT] PaRAM Set for a particular logical (DMA/QDMA) channel. Not used if user requested for a Link channel. In case user passes a specific PaRAM Set value, pParam value is left unchanged. In case user requests ANY available PaRAM Set, the allocated one is returned in pParam. | |
pTcc | [IN/OUT] TCC for a particular logical (DMA/QDMA) channel. Not used if user requested for a Link channel. In case user passes a specific TCC value, pTcc value is left unchanged. In case user requests ANY available TCC, the allocated one is returned in pTcc |
If the request is for a DMA or QDMA channel, check the pParam and pTcc objects also. For the Link channel request, they could be NULL.
Check the PaRAM Set user has specified for this DMA channel. Two cases exist: a) DCHMAP exists: Any PaRAM Set can be used b) DCHMAP does not exist: Should not be possible only if the channel allocated (ANY) and PaRAM requested are same.
If some PaRAM set is statically mapped to the returned channel number, use that.
Channel mapping does not exist. If the PaRAM Set requested is the same as dma channel allocated (coincidentally), it is fine. Else return error.
Free the previously allocated DMA channel also.
Check the PaRAM Set user has specified for this DMA channel. Two cases exist: a) DCHMAP exists: Any PaRAM Set can be used b) DCHMAP does not exist: Should not be possible only if the channel allocated (ANY) and PaRAM requested are same.
If some PaRAM set is statically mapped to the returned channel number, use that.
Channel mapping does not exist. If the PaRAM Set requested is the same as dma channel allocated (coincidentally), it is fine. Else return error.
Free the previously allocated DMA channel also.
Check the PaRAM Set user has specified for this QDMA channel. If he has specified any particular PaRAM Set, use that.
Check the PaRAM Set user has specified for this QDMA channel. If he has specified any particular PaRAM Set, use that.
Remove any linking. Before doing that, check whether it is permitted or not.
For DMA/QDMA channels, we still have to allocate more resources like TCC, PaRAM Set etc. For Link channel, only the PaRAMSet is required and that has been allocated so no further operations required.
PaRAM Set allocation succeeded. Save the PaRAM Set first.
Check first whether the global registers and the allocated PaRAM Set can be modified or not. If yes, do the needful. Else leave this for the user.
Do the mapping between DMA channel and PaRAM Set. Do this for the EDMA3 Controllers which have a register for mapping DMA Channel to a particular PaRAM Set.
TCC allocation failed, free the previously allocated PaRAM Set and DMA channel.
PaRAM Set allocation failed, free the previously allocated DMA channel also.
PaRAM Set allocation succeeded. Save the PaRAM Set first.
Check first whether the global registers and the allocated PaRAM Set can be modified or not. If yes, do the needful. Else leave this for the user.
TCC allocation failed, free the previously allocated PaRAM Set and QDMA channel.
PaRAM Set allocation failed, free the previously allocated QDMA channel also.
References EDMA3_RM_GblConfigParams::dmaChannelPaRAMMap, EDMA3_RM_GblConfigParams::dmaChannelTccMap, EDMA3_RM_GblConfigParams::dmaChPaRAMMapExists, EDMA3_RM_allocResource(), EDMA3_RM_CH_NO_PARAM_MAP, EDMA3_RM_CH_NO_TCC_MAP, EDMA3_RM_DMA_CH_MAX_VAL, EDMA3_RM_DMA_CHANNEL_ANY, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_freeResource(), EDMA3_RM_LINK_CH_MAX_VAL, EDMA3_RM_LINK_CH_MIN_VAL, EDMA3_RM_PARAM_ANY, EDMA3_RM_QDMA_CH_MIN_VAL, EDMA3_RM_QDMA_CHANNEL_ANY, EDMA3_RM_QDMA_TRIG_DEFAULT, EDMA3_RM_RES_ANY, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_RES_TCC, EDMA3_RM_TCC_ANY, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_ChBoundResources::paRAMId, EDMA3_RM_Obj::phyCtrllerInstId, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_Instance::regModificationRequired, EDMA3_RM_ResDesc::resId, EDMA3_RM_Instance::shadowRegs, EDMA3_RM_ChBoundResources::tcc, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_allocResource | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | resObj | |||
) |
This API is used to allocate specified EDMA3 Resources like DMA/QDMA channel, PaRAM Set or TCC.
Note: To free the resources allocated by this API, user should call EDMA3_RM_freeResource () ONLY to de-allocate all the allocated resources.
User can either request a specific resource by passing the resource id in 'resObj->resId' OR request ANY available resource of the type 'resObj->type'.
ANY types of resources are those resources when user doesn't care about the actual resource allocated; user just wants a resource of the type specified. One use-case is to perform memory-to-memory data transfer operation. This operation can be performed using any available DMA or QDMA channel. User doesn't need any specific channel for the same.
To allocate a specific resource, first this API checks whether that resource is OWNED by the Resource Manager instance. Then it checks the current availability of that resource.
To allocate ANY available resource, this API tries to allocate a resource from the pool of (owned && non_reserved && available_right_now) resources.
After allocating a DMA/QDMA channel or TCC, the same resource is enabled in the shadow region specific register (DRAE/DRAEH/QRAE).
Allocated PaRAM Set is initialized to NULL before this API returns if user has requested for one.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
resObj | [IN/OUT] Handle to the resource descriptor object, which needs to be allocated. In case user passes a specific resource Id, resObj value is left unchanged. In case user requests ANY available resource, the allocated resource id is returned in resObj. |
Take the instance specific semaphore, to prevent simultaneous access to the shared resources.
Check if the register modification flag is set or not.
Enable the DMA channel in the DRAE/DRAEH registers also.
Check if the register modification flag is set or not.
Enable the DMA channel in the DRAE registers also.
Enable the DMA channel in the DRAEH registers also.
Check if the register modification flag is set or not.
Enable the QDMA channel in the QRAE register also.
Check if the register modification flag is set or not.
Enable the QDMA channel in the QRAE register also.
Check if the register modification flag is set or not.
Enable the Interrupt channel in the DRAE/DRAEH registers also. Also, If the region id coming from this RM instance is same as the Master RM Instance's region id, only then we will be getting the interrupts on the same side. So save the TCC in the allocatedTCCs[] array.
Do not modify this global array if the register modificatio flag is not set. Reason being is based on this flag, the IPR/ICR or error bit is cleared in the completion or error handler ISR.
Do not modify this global array if the register modificatio flag is not set. Reason being is based on this flag, the IPR/ICR or error bit is cleared in the completion or error handler ISR.
Check if the register modification flag is set or not.
Enable the Interrupt channel in the DRAE/DRAEH registers also. Also, If the region id coming from this RM instance is same as the Master RM Instance's region id, only then we will be getting the interrupts on the same side. So save the TCC in the allocatedTCCs[] array.
Do not modify this global array if the register modification flag is not set. Reason being is based on this flag, the IPR/ICR or error bit is cleared in the completion or error handler ISR.
Do not modify this global array if the register modificatio flag is not set. Reason being is based on this flag, the IPR/ICR or error bit is cleared in the completion or error handler ISR.
Also, make the actual PARAM Set NULL, checking the flag whether it is required or not.
Also, make the actual PARAM Set NULL, checking the flag whether it is required or not.
Check the Resource Allocation Result 'result' first. If Resource Allocation has resulted in an error, return it (having more priority than semResult. Else, return semResult.
Resource Allocation successful, return semResult for returning semaphore.
References EDMA3_RM_Instance::avlblDmaChannels, EDMA3_RM_Instance::avlblPaRAMSets, EDMA3_RM_Instance::avlblQdmaChannels, EDMA3_RM_Instance::avlblTccs, EDMA3_RM_E_ALL_RES_NOT_AVAILABLE, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_E_RES_NOT_OWNED, EDMA3_RM_E_SPECIFIED_RES_NOT_AVAILABLE, EDMA3_RM_RES_ANY, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_RES_TCC, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_GblConfigParams::numDmaChannels, EDMA3_RM_GblConfigParams::numPaRAMSets, EDMA3_RM_GblConfigParams::numQdmaChannels, EDMA3_RM_GblConfigParams::numTccs, EDMA3_RM_InstanceInitConfig::ownDmaChannels, EDMA3_RM_InstanceInitConfig::ownPaRAMSets, EDMA3_RM_InstanceInitConfig::ownQdmaChannels, EDMA3_RM_InstanceInitConfig::ownTccs, EDMA3_RM_Instance::paramInitRequired, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_Param::regionId, EDMA3_RM_Instance::regModificationRequired, EDMA3_RM_ResDesc::resId, EDMA3_RM_InstanceInitConfig::resvdDmaChannels, EDMA3_RM_InstanceInitConfig::resvdPaRAMSets, EDMA3_RM_InstanceInitConfig::resvdQdmaChannels, EDMA3_RM_InstanceInitConfig::resvdTccs, EDMA3_RM_Param::rmInstInitConfig, EDMA3_RM_Param::rmSemHandle, EDMA3_RM_Instance::shadowRegs, and EDMA3_RM_ResDesc::type.
Referenced by EDMA3_RM_allocLogicalChannel().
EDMA3_RM_Result EDMA3_RM_checkAndClearTcc | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
unsigned int | tccNo, | |||
unsigned short * | tccStatus | |||
) |
Returns the status of a previously initiated transfer.
This is a non-blocking function that returns the status of a previously initiated transfer, based on the IPR/IPRH bit. This bit corresponds to the tccNo specified by the user. It clears the corresponding bit, if SET, while returning also.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
tccNo | [IN] TCC, specific to which the function checks the status of the IPR/IPRH bit. | |
tccStatus | [IN/OUT] Status of the transfer is returned here. Returns "TRUE" if the transfer has completed (IPR/IPRH bit SET), "FALSE" if the transfer has not completed successfully (IPR/IPRH bit NOT SET). |
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_GblConfigParams::numTccs, EDMA3_RM_Instance::pResMgrObjHandle, and EDMA3_RM_Param::regionId.
EDMA3_RM_Result EDMA3_RM_freeContiguousResource | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | firstResIdObj, | |||
unsigned int | numResources | |||
) |
Free a contiguous region of specified EDMA3 Resource like DMA channel, QDMA channel, PaRAM Set or TCC, previously allocated.
This API frees a contiguous region of specified EDMA3 Resources like DMA channel, QDMA channel, PaRAM Set or TCC, which have been previously allocated. In case of an error during the freeing of any specific resource, user can check the 'firstResIdObj' object to know the last resource id whose freeing has failed. In case of success, there is no need to check this object.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
firstResIdObj | [IN/OUT] Handle to the first resource descriptor object, which needs to be freed. In case of an error while freeing any particular resource, the last resource id whose freeing has failed is returned in this resource descriptor object. | |
numResources | [IN] Number of contiguous resources allocated previously which user wants to release |
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_freeResource(), EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_RES_TCC, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::numDmaChannels, EDMA3_RM_GblConfigParams::numPaRAMSets, EDMA3_RM_GblConfigParams::numQdmaChannels, EDMA3_RM_GblConfigParams::numTccs, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_ResDesc::resId, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_freeLogicalChannel | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | lChObj | |||
) |
This API is used to free the specified channel (DMA/QDMA/Link) and its associated resources (PaRAM Set, TCC etc).
This API internally uses EDMA3_RM_freeResource () to free the desired resources.
For DMA/QDMA channels, it also clears the DCHMAP/QCHMAP registers
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
lChObj | [IN] Handle to the logical channel object, which needs to be freed |
Validate DMA channel id first. It should be a valid channel id.
Perfectly valid channel id. Clear some channel specific registers, if it is permitted.
Try to free the DMA Channel now. DMA Channel should be freed only in the end because while freeing, DRAE registers will be RESET. After that, no shadow region specific DMA channel register can be modified. So reset that DRAE register ONLY in the end.
Calculate QDMA Logical Channel Id first. User has given the actual QDMA channel id. So we have to convert it to make the logical QDMA channel id first.
Validate QDMA channel id first. It should be a valid channel id.
Perfectly valid channel id. Clear some channel specific registers, if it is permitted.
Try to free the QDMA Channel now. QDMA Channel should be freed only in the end because while freeing, QRAE registers will be RESET. After that, no shadow region specific QDMA channel register can be modified. So reset that QDRAE register ONLY in the end.
References EDMA3_RM_Instance::avlblDmaChannels, EDMA3_RM_Instance::avlblQdmaChannels, EDMA3_RM_GblConfigParams::dmaChPaRAMMapExists, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_freeResource(), EDMA3_RM_LINK_CH_MAX_VAL, EDMA3_RM_LINK_CH_MIN_VAL, EDMA3_RM_QDMA_CH_MIN_VAL, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_RES_TCC, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_InstanceInitConfig::ownDmaChannels, EDMA3_RM_InstanceInitConfig::ownQdmaChannels, EDMA3_RM_ChBoundResources::paRAMId, EDMA3_RM_Obj::phyCtrllerInstId, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_Instance::regModificationRequired, EDMA3_RM_ResDesc::resId, EDMA3_RM_Param::rmInstInitConfig, EDMA3_RM_Instance::shadowRegs, EDMA3_RM_ChBoundResources::tcc, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_freeResource | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
const EDMA3_RM_ResDesc * | resObj | |||
) |
This API is used to free previously allocated EDMA3 Resources like DMA/QDMA channel, PaRAM Set or TCC.
To free a specific resource, first this API checks whether that resource is OWNED by the Resource Manager Instance. Then it checks whether that resource has been allocated by the Resource Manager instance or not.
After freeing a DMA/QDMA channel or TCC, the same resource is disabled in the shadow region specific register (DRAE/DRAEH/QRAE).
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
resObj | [IN] Handle to the resource descriptor object, which needs to be freed. |
Check if the register modification flag is set or not.
DMA Channel is freed. Reset the bit specific to the DMA channel in the DRAE/DRAEH register also.
Check if the register modification flag is set or not.
QDMA Channel is freed. Reset the bit specific to the QDMA channel in the QRAE register also.
Check if the register modification flag is set or not.
Interrupt Channel is freed. Reset the bit specific to the Interrupt channel in the DRAE/DRAEH register also. Also, if we have earlier saved this TCC in allocatedTCCs[] array, remove it from there too.
References EDMA3_RM_Instance::avlblDmaChannels, EDMA3_RM_Instance::avlblPaRAMSets, EDMA3_RM_Instance::avlblQdmaChannels, EDMA3_RM_Instance::avlblTccs, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_E_RES_ALREADY_FREE, EDMA3_RM_E_RES_NOT_OWNED, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_RES_TCC, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_InstanceInitConfig::ownDmaChannels, EDMA3_RM_InstanceInitConfig::ownPaRAMSets, EDMA3_RM_InstanceInitConfig::ownQdmaChannels, EDMA3_RM_InstanceInitConfig::ownTccs, EDMA3_RM_Obj::phyCtrllerInstId, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_Param::regionId, EDMA3_RM_Instance::regModificationRequired, EDMA3_RM_ResDesc::resId, EDMA3_RM_Param::rmInstInitConfig, and EDMA3_RM_ResDesc::type.
Referenced by EDMA3_RM_allocLogicalChannel(), EDMA3_RM_freeContiguousResource(), and EDMA3_RM_freeLogicalChannel().
EDMA3_RM_Result EDMA3_RM_getBaseAddress | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_Cntrlr_PhyAddr | controllerId, | |||
unsigned int * | phyAddress | |||
) |
Get the Channel Controller or Transfer Controller (n) Physical Address.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
controllerId | [IN] Channel Controller or Transfer Controller (n) for which the physical address is required. | |
phyAddress | [IN/OUT] Physical address is returned here. |
Since the TCs enum start from 1, and TCs start from 0, subtract 1 from the enum to get the actual address.
References EDMA3_RM_CC_PHY_ADDR, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_GblConfigParams::numTcs, EDMA3_RM_Instance::pResMgrObjHandle, and EDMA3_RM_GblConfigParams::tcRegs.
EDMA3_RM_Result EDMA3_RM_getCCRegister | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
unsigned int | regOffset, | |||
unsigned int * | regValue | |||
) |
Get the Channel Controller (CC) Register value.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
regOffset | [IN] CC Register offset whose value is needed. It should be word-aligned. | |
regValue | [IN/OUT] Fetched CC Register Value |
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, and EDMA3_RM_Instance::pResMgrObjHandle.
EDMA3_RM_Result EDMA3_RM_getGblConfigParams | ( | unsigned int | phyCtrllerInstId, | |
EDMA3_RM_GblConfigParams * | gblCfgParams | |||
) |
Get the SoC specific configuration structure for the EDMA3 Hardware.
This API is used to fetch the global SoC specific configuration structure for the EDMA3 Hardware. It is useful for the user who has not passed this information during EDMA3_RM_create() and taken the default configuration coming along with the package.
phyCtrllerInstId | [IN] EDMA3 Controller Instance Id (Hardware instance id, starting from 0). | |
gblCfgParams | [IN/OUT] SoC specific configuration structure for the EDMA3 Hardware will be returned here. |
References EDMA3_RM_E_INVALID_PARAM.
EDMA3_RM_Result EDMA3_RM_getInstanceInitCfg | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_InstanceInitConfig * | instanceInitConfig | |||
) |
Get the RM Instance specific configuration structure for different EDMA3 resources' usage (owned resources, reserved resources etc).
This API is used to fetch the Resource Manager Instance specific configuration structure, for a specific shadow region. It is useful for the user who has not passed this information during EDMA3_RM_opn() and taken the default configuration coming along with the package. EDMA3 resources, owned and reserved by this RM instance, will be returned from this API.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
instanceInitConfig | [IN/OUT] RM Instance specific configuration structure will be returned here. |
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_Obj::phyCtrllerInstId, and EDMA3_RM_Instance::pResMgrObjHandle.
EDMA3_RM_Result EDMA3_RM_getPaRAM | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | lChObj, | |||
EDMA3_RM_PaRAMRegs * | currPaRAM | |||
) |
Retrieve existing PaRAM set associated with specified logical channel (DMA/QDMA/Link).
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
lChObj | [IN] Logical Channel object for which the PaRAM set is requested. User should pass the resource type and id in this object. | |
currPaRAM | [IN/OUT] User gets the existing PaRAM here. |
User has passed the actual param set value here. Use this value only
References EDMA3_RM_DMA_CH_MAX_VAL, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_QDMA_CH_MIN_VAL, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_ChBoundResources::paRAMId, EDMA3_RM_Obj::phyCtrllerInstId, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_ResDesc::resId, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_getPaRAMPhyAddr | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | lChObj, | |||
unsigned int * | paramPhyAddr | |||
) |
Get the PaRAM Set Physical Address associated with a logical channel.
This function returns the PaRAM Set Phy Address (unsigned 32 bits). The returned address could be used by the advanced users to program the PaRAM Set directly without using any APIs.
Least significant 16 bits of this address could be used to program the LINK field in the PaRAM Set. Users which program the LINK field directly SHOULD use this API to get the associated PaRAM Set address with the LINK channel.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
lChObj | [IN] Logical Channel object for which the PaRAM set physical address is required. User should pass the resource type and id in this object. | |
paramPhyAddr | [IN/OUT] PaRAM Set physical address is returned here. |
User has passed the actual param set value here. Use this value only
References EDMA3_RM_DMA_CH_MAX_VAL, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_QDMA_CH_MIN_VAL, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_ChBoundResources::paRAMId, EDMA3_RM_Obj::phyCtrllerInstId, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_ResDesc::resId, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_Ioctl | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_IoctlCmd | cmd, | |||
void * | cmdArg, | |||
void * | param | |||
) |
EDMA3 Resource Manager IOCTL.
This function provides IOCTL functionality for EDMA3 Resource Manager
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
cmd | [IN] IOCTL command to be performed | |
cmdArg | [IN/OUT] IOCTL command argument (if any) | |
param | [IN/OUT] Device/Cmd specific argument. |
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
cmd | [IN] IOCTL command to be performed | |
cmdArg | [IN/OUT] IOCTL command argument (if any) | |
param | [IN/OUT] Device/Cmd specific argument |
Set/Reset the flag which is being used to do the global registers and PaRAM modification.
Get the flag which is being used to do the global registers and PaRAM modification.
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_IOCTL_GET_GBL_REG_MODIFY_OPTION, EDMA3_RM_IOCTL_GET_PARAM_CLEAR_OPTION, EDMA3_RM_IOCTL_SET_GBL_REG_MODIFY_OPTION, EDMA3_RM_IOCTL_SET_PARAM_CLEAR_OPTION, EDMA3_RM_Instance::paramInitRequired, and EDMA3_RM_Instance::regModificationRequired.
EDMA3_RM_Result EDMA3_RM_mapEdmaChannel | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
unsigned int | channelId, | |||
unsigned int | paRAMId | |||
) |
Bind the resources DMA Channel and PaRAM Set. Both the DMA channel and the PaRAM set should be previously allocated. If they are not, this API will result in error.
This API sets the DCHMAP register for a specific DMA channel. This register is used to specify the PaRAM Set associated with that particular DMA Channel.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
channelId | [IN] Previously allocated DMA Channel on which Transfer will occur. | |
paRAMId | [IN] Previously allocated PaRAM Set which needs to be associated with the dma channel. |
Do this for the EDMA3 Controllers which have a register for mapping DMA Channel to a particular PaRAM Set. So check dmaChPaRAMMapExists first.
References EDMA3_RM_Instance::avlblDmaChannels, EDMA3_RM_Instance::avlblPaRAMSets, EDMA3_RM_GblConfigParams::dmaChPaRAMMapExists, EDMA3_RM_E_FEATURE_UNSUPPORTED, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_E_RES_NOT_ALLOCATED, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_GblConfigParams::numDmaChannels, EDMA3_RM_GblConfigParams::numPaRAMSets, EDMA3_RM_InstanceInitConfig::ownDmaChannels, EDMA3_RM_InstanceInitConfig::ownPaRAMSets, EDMA3_RM_Instance::pResMgrObjHandle, and EDMA3_RM_Param::rmInstInitConfig.
EDMA3_RM_Result EDMA3_RM_mapQdmaChannel | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
unsigned int | channelId, | |||
unsigned int | paRAMId, | |||
EDMA3_RM_QdmaTrigWord | trigWord | |||
) |
Bind the resources QDMA Channel and PaRAM Set. Also, Set the trigger word for the QDMA channel. Both the QDMA channel and the PaRAM set should be previously allocated. If they are not, this API will result in error.
This API sets the QCHMAP register for a specific QDMA channel. This register is used to specify the PaRAM Set associated with that particular QDMA Channel along with the trigger word.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
channelId | [IN] Previously allocated QDMA Channel on which Transfer will occur. | |
paRAMId | [IN] Previously allocated PaRAM Set, which needs to be associated with channelId | |
trigWord | [IN] The Trigger Word for the channel. Trigger Word is the word in the PaRAM Register Set which - when written to by CPU -will start the QDMA transfer automatically |
References EDMA3_RM_Instance::avlblPaRAMSets, EDMA3_RM_Instance::avlblQdmaChannels, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_E_RES_NOT_ALLOCATED, EDMA3_RM_QDMA_TRIG_CCNT, EDMA3_RM_QDMA_TRIG_OPT, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_GblConfigParams::numPaRAMSets, EDMA3_RM_GblConfigParams::numQdmaChannels, EDMA3_RM_InstanceInitConfig::ownPaRAMSets, EDMA3_RM_InstanceInitConfig::ownQdmaChannels, EDMA3_RM_Instance::pResMgrObjHandle, and EDMA3_RM_Param::rmInstInitConfig.
EDMA3_RM_Result EDMA3_RM_setCCRegister | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
unsigned int | regOffset, | |||
unsigned int | newRegValue | |||
) |
Set the Channel Controller (CC) Register value.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
regOffset | [IN] CC Register offset whose value needs to be set. It should be word-aligned. | |
newRegValue | [IN] New CC Register Value |
Take the instance specific semaphore, to prevent simultaneous access to the shared resources.
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_Instance::pResMgrObjHandle, and EDMA3_RM_Param::rmSemHandle.
EDMA3_RM_Result EDMA3_RM_setPaRAM | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
EDMA3_RM_ResDesc * | lChObj, | |||
const EDMA3_RM_PaRAMRegs * | newPaRAM | |||
) |
Copy the user specified PaRAM Set onto the PaRAM Set associated with the logical channel (DMA/QDMA/Link).
This API takes a PaRAM Set as input and copies it onto the actual PaRAM Set associated with the logical channel. OPT field of the PaRAM Set is written first and the CCNT field is written last.
Caution: It should be used carefully when programming the QDMA channels whose trigger words are not CCNT field.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
lChObj | [IN] Logical Channel object for which new PaRAM set is specified. User should pass the resource type and id in this object. | |
newPaRAM | [IN] PaRAM set to be copied onto existing one |
User has passed the actual param set value here. Use this value only
References EDMA3_RM_DMA_CH_MAX_VAL, EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_QDMA_CH_MIN_VAL, EDMA3_RM_RES_DMA_CHANNEL, EDMA3_RM_RES_PARAM_SET, EDMA3_RM_RES_QDMA_CHANNEL, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_ChBoundResources::paRAMId, EDMA3_RM_Obj::phyCtrllerInstId, EDMA3_RM_Instance::pResMgrObjHandle, EDMA3_RM_ResDesc::resId, and EDMA3_RM_ResDesc::type.
EDMA3_RM_Result EDMA3_RM_waitAndClearTcc | ( | EDMA3_RM_Handle | hEdmaResMgr, | |
unsigned int | tccNo | |||
) |
Wait for a transfer completion interrupt to occur and clear it.
This is a blocking function that returns when the IPR/IPRH bit corresponding to the tccNo specified, is SET. It clears the corresponding bit while returning also.
This function waits for the specific bit indefinitely in a tight loop, with out any delay in between. USE IT CAUTIOUSLY.
hEdmaResMgr | [IN] Handle to the previously opened Resource Manager Instance. | |
tccNo | [IN] TCC, specific to which the function waits on a IPR/IPRH bit. |
Bit found SET, transfer is completed, clear the pending interrupt and return.
Bit found SET, transfer is completed, clear the pending interrupt and return.
References EDMA3_RM_E_INVALID_PARAM, EDMA3_RM_Obj::gblCfgParams, EDMA3_RM_GblConfigParams::globalRegs, EDMA3_RM_Instance::initParam, EDMA3_RM_GblConfigParams::numTccs, EDMA3_RM_Instance::pResMgrObjHandle, and EDMA3_RM_Param::regionId.