⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xsdma.c

📁 优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐
💻 C
📖 第 1 页 / 共 4 页
字号:
        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 + -