📄 xsdma.c
字号:
if (XSDMA_DRCMR_ID_MEMORY != thisDrcmrId)
{
XsDmaControlRegsP->DRCMR[thisDrcmrId] = 0;
}
} // if (non-memory device using this channel)
return (status);
} // XsDmaFreeChannel()
/*
*******************************************************************************
*
* FUNCTION: XsDmaModifyChannelUsage
*
* DESCRIPTION: Perform an operation on the DMA channel pool as specified
* by the first parameter (ChannelOperationsT usage).
*
* INPUT PARAMETERS:
* ChannelOperationsT usage:
* Operation to be performed relative to the channel
* (CHANNEL_OP_GET, CHANNEL_OP_SET, CHANNEL_OP_RESET).
* - Get: request the allocation of an unallocated channel.
* - Set: mark a channel as allocated without reference to
* its previous state
* - Reset: mark a channel as deallocated without reference
* to its previous state
* INT channel:
* Target channel (ignored for gets)
* XsDmaChannelPriorityT priority:
* Desired priority (applies to gets only)
* XsDmaChannelStatusT* statusP:
* Pointer to variable to receive the following indication:
* channel not available, or priority of allocated channel
* relative to that which was requested. Meaningful only
* for gets.
*
* RETURNS: UINT32
* Success: channel - 0..XSDMA_CHANNEL_MAX that is gotten or set
* Failure: XSDMA_CHANNEL_UNAVAILABLE if no chan. from "get" oper
*
* GLOBAL EFFECTS: None
*
* ASSUMPTIONS: None
*
* CALLS: None
*
* CALLED BY: XsDmaGetFreeChannel, XsDmaFreeChannel
*
* PROTOTYPE: static INT XsDmaModifyChannelUsage (ChannelOperationsT,
* INT,
* XsDmaChannelPriorityT,
* XsDmaChannelStatusT*);
*
*******************************************************************************
*/
static
INT XsDmaModifyChannelUsage(ChannelOperationsT usage,
INT channel,
XsDmaChannelPriorityT priority,
XsDmaChannelStatusT* statusP)
{
UINT32 chan; // internal loop counter
UINT32 returnval;
BOOL found = FALSE;
static
XsDmaChannelPrioritySearchEntryT xsDmaHighSequenceChannelTable[] = {
{0, XSDMA_CH_PR_HIGH},
{1, XSDMA_CH_PR_HIGH},
{2, XSDMA_CH_PR_HIGH},
{3, XSDMA_CH_PR_HIGH},
{16, XSDMA_CH_PR_HIGH},
{17, XSDMA_CH_PR_HIGH},
{18, XSDMA_CH_PR_HIGH},
{19, XSDMA_CH_PR_HIGH},
{4, XSDMA_CH_PR_MEDIUM},
{5, XSDMA_CH_PR_MEDIUM},
{6, XSDMA_CH_PR_MEDIUM},
{7, XSDMA_CH_PR_MEDIUM},
{20, XSDMA_CH_PR_MEDIUM},
{21, XSDMA_CH_PR_MEDIUM},
{22, XSDMA_CH_PR_MEDIUM},
{23, XSDMA_CH_PR_MEDIUM},
{8, XSDMA_CH_PR_LOW},
{9, XSDMA_CH_PR_LOW},
{10, XSDMA_CH_PR_LOW},
{11, XSDMA_CH_PR_LOW},
{24, XSDMA_CH_PR_LOW},
{25, XSDMA_CH_PR_LOW},
{26, XSDMA_CH_PR_LOW},
{27, XSDMA_CH_PR_LOW},
{12, XSDMA_CH_PR_LOWEST},
{13, XSDMA_CH_PR_LOWEST},
{14, XSDMA_CH_PR_LOWEST},
{15, XSDMA_CH_PR_LOWEST},
{28, XSDMA_CH_PR_LOWEST},
{29, XSDMA_CH_PR_LOWEST},
{30, XSDMA_CH_PR_LOWEST},
{31, XSDMA_CH_PR_LOWEST}
};
static
XsDmaChannelPrioritySearchEntryT xsDmaMediumSequenceChannelTable[] = {
{4, XSDMA_CH_PR_MEDIUM},
{5, XSDMA_CH_PR_MEDIUM},
{6, XSDMA_CH_PR_MEDIUM},
{7, XSDMA_CH_PR_MEDIUM},
{20, XSDMA_CH_PR_MEDIUM},
{21, XSDMA_CH_PR_MEDIUM},
{22, XSDMA_CH_PR_MEDIUM},
{23, XSDMA_CH_PR_MEDIUM},
{0, XSDMA_CH_PR_HIGH},
{1, XSDMA_CH_PR_HIGH},
{2, XSDMA_CH_PR_HIGH},
{3, XSDMA_CH_PR_HIGH},
{16, XSDMA_CH_PR_HIGH},
{17, XSDMA_CH_PR_HIGH},
{18, XSDMA_CH_PR_HIGH},
{19, XSDMA_CH_PR_HIGH},
{8, XSDMA_CH_PR_LOW},
{9, XSDMA_CH_PR_LOW},
{10, XSDMA_CH_PR_LOW},
{11, XSDMA_CH_PR_LOW},
{24, XSDMA_CH_PR_LOW},
{25, XSDMA_CH_PR_LOW},
{26, XSDMA_CH_PR_LOW},
{27, XSDMA_CH_PR_LOW},
{12, XSDMA_CH_PR_LOWEST},
{13, XSDMA_CH_PR_LOWEST},
{14, XSDMA_CH_PR_LOWEST},
{15, XSDMA_CH_PR_LOWEST},
{28, XSDMA_CH_PR_LOWEST},
{29, XSDMA_CH_PR_LOWEST},
{30, XSDMA_CH_PR_LOWEST},
{31, XSDMA_CH_PR_LOWEST}
};
static
XsDmaChannelPrioritySearchEntryT xsDmaLowSequenceChannelTable[] = {
{8, XSDMA_CH_PR_LOW},
{9, XSDMA_CH_PR_LOW},
{10, XSDMA_CH_PR_LOW},
{11, XSDMA_CH_PR_LOW},
{24, XSDMA_CH_PR_LOW},
{25, XSDMA_CH_PR_LOW},
{26, XSDMA_CH_PR_LOW},
{27, XSDMA_CH_PR_LOW},
{4, XSDMA_CH_PR_MEDIUM},
{5, XSDMA_CH_PR_MEDIUM},
{6, XSDMA_CH_PR_MEDIUM},
{7, XSDMA_CH_PR_MEDIUM},
{20, XSDMA_CH_PR_MEDIUM},
{21, XSDMA_CH_PR_MEDIUM},
{22, XSDMA_CH_PR_MEDIUM},
{23, XSDMA_CH_PR_MEDIUM},
{0, XSDMA_CH_PR_HIGH},
{1, XSDMA_CH_PR_HIGH},
{2, XSDMA_CH_PR_HIGH},
{3, XSDMA_CH_PR_HIGH},
{16, XSDMA_CH_PR_HIGH},
{17, XSDMA_CH_PR_HIGH},
{18, XSDMA_CH_PR_HIGH},
{19, XSDMA_CH_PR_HIGH},
{12, XSDMA_CH_PR_LOWEST},
{13, XSDMA_CH_PR_LOWEST},
{14, XSDMA_CH_PR_LOWEST},
{15, XSDMA_CH_PR_LOWEST},
{28, XSDMA_CH_PR_LOWEST},
{29, XSDMA_CH_PR_LOWEST},
{30, XSDMA_CH_PR_LOWEST},
{31, XSDMA_CH_PR_LOWEST}
};
static
XsDmaChannelPrioritySearchEntryT xsDmaLowestSequenceChannelTable[] = {
{12, XSDMA_CH_PR_LOWEST},
{13, XSDMA_CH_PR_LOWEST},
{14, XSDMA_CH_PR_LOWEST},
{15, XSDMA_CH_PR_LOWEST},
{28, XSDMA_CH_PR_LOWEST},
{29, XSDMA_CH_PR_LOWEST},
{30, XSDMA_CH_PR_LOWEST},
{31, XSDMA_CH_PR_LOWEST},
{8, XSDMA_CH_PR_LOW},
{9, XSDMA_CH_PR_LOW},
{10, XSDMA_CH_PR_LOW},
{11, XSDMA_CH_PR_LOW},
{24, XSDMA_CH_PR_LOW},
{25, XSDMA_CH_PR_LOW},
{26, XSDMA_CH_PR_LOW},
{27, XSDMA_CH_PR_LOW},
{4, XSDMA_CH_PR_MEDIUM},
{5, XSDMA_CH_PR_MEDIUM},
{6, XSDMA_CH_PR_MEDIUM},
{7, XSDMA_CH_PR_MEDIUM},
{20, XSDMA_CH_PR_MEDIUM},
{21, XSDMA_CH_PR_MEDIUM},
{22, XSDMA_CH_PR_MEDIUM},
{23, XSDMA_CH_PR_MEDIUM},
{0, XSDMA_CH_PR_HIGH},
{1, XSDMA_CH_PR_HIGH},
{2, XSDMA_CH_PR_HIGH},
{3, XSDMA_CH_PR_HIGH},
{16, XSDMA_CH_PR_HIGH},
{17, XSDMA_CH_PR_HIGH},
{18, XSDMA_CH_PR_HIGH},
{19, XSDMA_CH_PR_HIGH}
};
XsDmaChannelPrioritySearchEntryT *sequenceP;
if (priority == XSDMA_CH_PR_HIGH)
{
sequenceP = xsDmaHighSequenceChannelTable;
}
if (priority == XSDMA_CH_PR_MEDIUM)
{
sequenceP = xsDmaMediumSequenceChannelTable;
}
if (priority == XSDMA_CH_PR_LOW)
{
sequenceP = xsDmaLowSequenceChannelTable;
}
if (priority == XSDMA_CH_PR_LOWEST)
{
sequenceP = xsDmaLowestSequenceChannelTable;
}
if (usage == CHANNEL_OP_GET)
{
// shift through the word to find an unused channel
chan = 0;
while ((chan < XSDMA_CHANNEL_NUM) && (!found))
{
if ((XsDmaChannelsUsedWord & (1 << (UINT32)sequenceP[chan].channel)) == 0)
{
XsDmaChannelsUsedWord |= 1 << (UINT32)sequenceP[chan].channel;
returnval = (UINT32)sequenceP[chan].channel;
found = TRUE; // set the found flag
// determine if we're handing back a channel of the desired priority
switch(priority)
{
case XSDMA_CH_PR_HIGH:
if (sequenceP[chan].priority == XSDMA_CH_PR_HIGH) *statusP = XSDMA_CS_GOT_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_MEDIUM) *statusP = XSDMA_CS_LOWER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOW) *statusP = XSDMA_CS_LOWER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOWEST) *statusP = XSDMA_CS_LOWER_THAN_EXPECTED;
break;
case XSDMA_CH_PR_MEDIUM:
if (sequenceP[chan].priority == XSDMA_CH_PR_HIGH) *statusP = XSDMA_CS_HIGHER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_MEDIUM) *statusP = XSDMA_CS_GOT_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOW) *statusP = XSDMA_CS_LOWER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOWEST) *statusP = XSDMA_CS_LOWER_THAN_EXPECTED;
break;
case XSDMA_CH_PR_LOW:
if (sequenceP[chan].priority == XSDMA_CH_PR_HIGH) *statusP = XSDMA_CS_HIGHER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_MEDIUM) *statusP = XSDMA_CS_HIGHER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOW) *statusP = XSDMA_CS_GOT_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOWEST) *statusP = XSDMA_CS_LOWER_THAN_EXPECTED;
break;
case XSDMA_CH_PR_LOWEST:
if (sequenceP[chan].priority == XSDMA_CH_PR_HIGH) *statusP = XSDMA_CS_HIGHER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_MEDIUM) *statusP = XSDMA_CS_HIGHER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOW) *statusP = XSDMA_CS_HIGHER_THAN_EXPECTED;
if (sequenceP[chan].priority == XSDMA_CH_PR_LOWEST) *statusP = XSDMA_CS_GOT_EXPECTED;
break;
}
}
chan++;
} // while
if(!found)
{
returnval = XSDMA_CHANNEL_UNAVAILABLE;
*statusP = XSDMA_CS_NONE_AVAILABLE;
}
}
if (usage == CHANNEL_OP_RESET)
{
// unconditionally reset the channel bit. Make no assumptions about
// the previous state.
XsDmaChannelsUsedWord &= ~1 << channel;
returnval = channel;
}
if (usage == CHANNEL_OP_SET)
{
// unconditionally set the channel bit. Make no assumptions about
// the previous state.
XsDmaChannelsUsedWord |= 1 << channel;
returnval = channel;
}
return returnval;
}
/*
*******************************************************************************
*
* FUNCTION: XsDmaSetupMem2MemDescriptor
*
* DESCRIPTION: Fills in a descriptor that will do a memory to memory
* transfer.
*
* INPUT PARAMETERS:
* XsDmaDescriptorParamsT* descInfoP:
* Pointer to the descriptor information structure that
* carries the address of a DMA descriptor and all information
* necessary to fill it in.
*
* RETURNS: None
*
* GLOBAL EFFECTS: None
*
* ASSUMPTIONS: None
*
* CALLS: XsDmaFillDescriptorStructure
*
* CALLED BY: XsDmaCreateDescriptorFromChan
*
* PROTOTYPE: static void SetupMem2MemDescriptor (XsDmaDescriptorParamsT*);
*
* DETAILS: Adds the contents of the command register member and then
* invokes XsDmaFillDescriptorStructure(). Except for the
* buffer length, these contents are hard-coded.
*
*******************************************************************************
*/
static
void XsDmaSetupMem2MemDescriptor (XsDmaDescriptorParamsT* descInfoP)
{
UINT32 dmaCommandRegister;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -