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

📄 xsdma.h

📁 优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐
💻 H
字号:
/******************************************************************************
**
**  COPYRIGHT (C) 2000, 2001 Intel Corporation.
**
**  This software as well as the software described in it is furnished under 
**  license and may only be used or copied in accordance with the terms of the 
**  license. The information in this file is furnished for informational use 
**  only, is subject to change without notice, and should not be construed as 
**  a commitment by Intel Corporation. Intel Corporation assumes no 
**  responsibility or liability for any errors or inaccuracies that may appear 
**  in this document or any software that may be provided in association with 
**  this document. 
**  Except as permitted by such license, no part of this document may be 
**  reproduced, stored in a retrieval system, or transmitted in any form or by 
**  any means without the express written consent of Intel Corporation. 
**
**  FILENAME:      xsdma.h
**
**  PURPOSE:       Contains module private declarations and definitions for 
**                 the DMA controller.
**
**  LAST MODIFIED: $Modtime: 7/17/03 1:01p $
******************************************************************************/


#ifndef C_DMA_CONTROLLER
#define C_DMA_CONTROLLER
/*
*******************************************************************************
    Error sub-location codes for ERR_L_XSDMA location code
*******************************************************************************
*/

#define ERR_S_DMA_REG_HANDLER    0x01 // XsDmaRegisterHandler
#define ERR_S_DMA_UNR_HANDLER    0x02 // XsDmaUnregisterHandler
#define ERR_S_DMA_INT_HANDLER    0x03 // XsDmaInterruptHandler
#define ERR_S_DMA_HWSETUP        0x04 // XsDmaHWSetup
#define ERR_S_DMA_START          0x05 // XsDmaStart
#define ERR_S_DMA_UNTIL_STOPPED  0x06 // XsDmaWaitUntilStopped() 
#define ERR_S_DMA_DESTROY_LINK   0x07 // XsDmaDestroyLink() 
#define ERR_S_DMA_INT_REASON_EN  0x08 // XsDmaIntReasonEnable()
#define ERR_S_DMA_RANGE_CHANNEL  0x09 // XsDmaRangeCheckChannel()
#define ERR_S_DMA_BACK_LINKS     0x0A // XsDmaMakeBackLinksInChain()
#define ERR_S_DMA_BARE_DESC      0x0B // XsDmaCreateBareDescChain()
#define ERR_S_DMA_POPULATE_DESC  0x0C // XsDmaPopulateDescWithBufs()
#define ERR_S_DMA_POPULATE_CHAIN 0x0D // XsDmaPopulateChainWithBufs()
#define ERR_S_DMA_DESCR_CHAIN    0x0E // XsDmaCreateDescriptorFromChan()
#define ERR_S_DMA_CONFIG_DEVICE  0x0F // XsDmaConfigureDevice()
#define ERR_S_DMA_CONFIG_MEM     0x10 // XsDmaConfigureMemToMem()

/*
*******************************************************************************
Structure for channels and the relative priority. 
*******************************************************************************
*/
typedef struct XsDmaChannelPrioritySearchEntryS
{
    UINT channel;
    XsDmaChannelPriorityT priority;
}XsDmaChannelPrioritySearchEntryT;

/*
*******************************************************************************
This is a structure of DMA register groups that will make accesses more easily
through simple program control instead of long-winded switch constructs.
*******************************************************************************
*/

typedef struct XsDmaDescriptorGroupS {
    VUINT   DDADR;  // descriptor address reg
    VUINT   DSADR;  // source address register
    VUINT   DTADR;  // target address register
    VUINT   DCMD;   // command address register
}XsDmaDescriptorGroupT;

/*
*******************************************************************************
    XsDmaDrcmrIdT for indexing the DRCMR registers.
*******************************************************************************
*/

typedef enum XsDmaDrcmrIdE
{
    XSDMA_DRCMR_ID_DREQ_0         =   0, // companion chip request 0
    XSDMA_DRCMR_ID_DREQ_1         =   1, // companion chip request 1
    XSDMA_DRCMR_ID_I2S_RX         =   2, // I2S receive request
    XSDMA_DRCMR_ID_I2S_TX         =   3, // I2S transmit request
    XSDMA_DRCMR_ID_BTUART_RX      =   4, // BTUART receive request
    XSDMA_DRCMR_ID_BTUART_TX      =   5, // BTUART transmit request
    XSDMA_DRCMR_ID_FFUART_RX      =   6, // FFUART receive request
    XSDMA_DRCMR_ID_FFUART_TX      =   7, // FFUART transmit request
    XSDMA_DRCMR_ID_AC97_MIC_RX    =   8, // AC97 microphone request
    XSDMA_DRCMR_ID_AC97_MODEM_RX  =   9, // AC97 MODEM receive request
    XSDMA_DRCMR_ID_AC97_MODEM_TX  =   10, // AC97 MODEM transmit request
    XSDMA_DRCMR_ID_AC97_AUDIO_RX  =   11, // AC97 Audio receive request
    XSDMA_DRCMR_ID_AC97_AUDIO_TX  =   12, // AC97 Audio transmit request
    XSDMA_DRCMR_ID_SSP1_RX        =   13, // SSP receive request
    XSDMA_DRCMR_ID_SSP1_TX        =   14, // SSP transmit request
    XSDMA_DRCMR_ID_SSP2_RX        =   15, // SSP2 receive request
    XSDMA_DRCMR_ID_SSP2_TX        =   16, // SSP2 transmit request
    XSDMA_DRCMR_ID_FICP_RX        =   17, // ICP receive request
    XSDMA_DRCMR_ID_FICP_TX        =   18, // ICP transmit request
    XSDMA_DRCMR_ID_STUART_RX      =   19, // STUART receive request
    XSDMA_DRCMR_ID_STUART_TX      =   20, // STUART transmit request
    XSDMA_DRCMR_ID_MMC_RX         =   21, // MMC receive request
    XSDMA_DRCMR_ID_MMC_TX         =   22, // MMC transmit request
    XSDMA_DRCMR_ID_RSVD_23        =   23, // reserved
    XSDMA_DRCMR_ID_USB_UDC_EP_0   =   24, // USB endpoint 0 request
    XSDMA_DRCMR_ID_USB_UDC_EP_A   =   25, // USB endpoint A request
    XSDMA_DRCMR_ID_USB_UDC_EP_B   =   26, // USB endpoint B request
    XSDMA_DRCMR_ID_USB_UDC_EP_C   =   27, // USB endpoint C request
    XSDMA_DRCMR_ID_USB_UDC_EP_D   =   28, // USB endpoint D request
    XSDMA_DRCMR_ID_USB_UDC_EP_E   =   29, // USB endpoint E request
    XSDMA_DRCMR_ID_USB_UDC_EP_F   =   30, // USB endpoint F request
    XSDMA_DRCMR_ID_USB_UDC_EP_G   =   31, // USB endpoint G request
    XSDMA_DRCMR_ID_USB_UDC_EP_H   =   32, // USB endpoint H request
    XSDMA_DRCMR_ID_USB_UDC_EP_I   =   33, // USB endpoint I request
    XSDMA_DRCMR_ID_USB_UDC_EP_J   =   34, // USB endpoint J request
    XSDMA_DRCMR_ID_USB_UDC_EP_K   =   35, // USB endpoint K request
    XSDMA_DRCMR_ID_USB_UDC_EP_L   =   36, // USB endpoint L request
    XSDMA_DRCMR_ID_USB_UDC_EP_M   =   37, // USB endpoint M request
    XSDMA_DRCMR_ID_USB_UDC_EP_N   =   38, // USB endpoint N request
    XSDMA_DRCMR_ID_USB_UDC_EP_P   =   39, // USB endpoint P request
    XSDMA_DRCMR_ID_USB_UDC_EP_Q   =   40, // USB endpoint Q request
    XSDMA_DRCMR_ID_USB_UDC_EP_R   =   41, // USB endpoint R request
    XSDMA_DRCMR_ID_USB_UDC_EP_S   =   42, // USB endpoint S request
    XSDMA_DRCMR_ID_USB_UDC_EP_T   =   43, // USB endpoint T request
    XSDMA_DRCMR_ID_USB_UDC_EP_U   =   44, // USB endpoint U request
    XSDMA_DRCMR_ID_USB_UDC_EP_V   =   45, // USB endpoint V request
    XSDMA_DRCMR_ID_USB_UDC_EP_W   =   46, // USB endpoint W request
    XSDMA_DRCMR_ID_USB_UDC_EP_X   =   47, // USB endpoint X request
    XSDMA_DRCMR_ID_BASEBAND_RX_1  =   48, // Baseband Receive Request 1
    XSDMA_DRCMR_ID_BASEBAND_TX_1  =   49, // Baseband Transmit Request 1
    XSDMA_DRCMR_ID_BASEBAND_RX_2  =   50, // Baseband Receive Request 2
    XSDMA_DRCMR_ID_BASEBAND_TX_2  =   51, // Baseband Transmit Request 2
    XSDMA_DRCMR_ID_BASEBAND_RX_3  =   52, // Baseband Receive Request 3
    XSDMA_DRCMR_ID_BASEBAND_TX_3  =   53, // Baseband Transmit Request 3
    XSDMA_DRCMR_ID_BASEBAND_RX_4  =   54, // Baseband Receive Request 4
    XSDMA_DRCMR_ID_BASEBAND_TX_4  =   55, // Baseband Transmit Request 4
    XSDMA_DRCMR_ID_BASEBAND_RX_5  =   56, // Baseband Receive Request 5
    XSDMA_DRCMR_ID_BASEBAND_TX_5  =   57, // Baseband Transmit Request 5
    XSDMA_DRCMR_ID_BASEBAND_RX_6  =   58, // Baseband Receive Request 6
    XSDMA_DRCMR_ID_BASEBAND_TX_6  =   59, // Baseband Transmit Request 6
    XSDMA_DRCMR_ID_BASEBAND_RX_7  =   60, // Baseband Receive Request 7
    XSDMA_DRCMR_ID_BASEBAND_TX_7  =   61, // Baseband Transmit Request 7
    XSDMA_DRCMR_ID_USIM_RX        =   62, // USIM receive request
    XSDMA_DRCMR_ID_USIM_TX        =   63, // USIM transmit request
    XSDMA_DRCMR2_ID_MEM_STICK_RX  = 1024, // Memory Stick receive request
    XSDMA_DRCMR2_ID_MEM_STICK_TX  = 1025, // Memory Stick transmit request
    XSDMA_DRCMR2_ID_SSP3_RX       = 1026, // SSP3 receive request
    XSDMA_DRCMR2_ID_SSP3_TX       = 1027, // SSP3 transmit request
    
    XSDMA_DRCMR_ID_MAX            = XSDMA_DRCMR_ID_USIM_TX,
    XSDMA_DRCMR_ID_NUM            = (XSDMA_DRCMR_ID_MAX+1),
    XSDMA_DRCMR_ID_ILLEGAL        = XSDMA_DRCMR_ID_NUM,

    XSDMA_DRCMR2_ID_NUM           = (XSDMA_DRCMR2_ID_SSP3_TX - XSDMA_DRCMR2_ID_MEM_STICK_RX) + 1,
    
    // Memory doesn't have a DRCMR.  Define this for users of records
    //  where XsDmaDrcmrIdT values are stored.
    XSDMA_DRCMR_ID_MEMORY         = (XSDMA_DRCMR_ID_NUM+1)

} XsDmaDrcmrIdT;

/*
*******************************************************************************
Mask version of the DMA control register set structure
*******************************************************************************
*/

typedef struct XsDmaCtrlS {
    VUINT32   DCSR[XSDMA_CHANNEL_NUM]; //DMA CSRs by channel

    UINT32    PAD0[28];  // unused addresses
    VUINT32   DINT;        // DMA interrupt register

    UINT32    PAD1[3];  // unused addresses                           // Indexed by the XsDmaDrcmrIdT enums.
    VUINT32   DRCMR[XSDMA_DRCMR_ID_NUM];
    XsDmaDescriptorGroupT DDG[XSDMA_CHANNEL_NUM]; // DMA descriptor group array
    UINT32    PAD2[832];
    VUINT32   DRCMR2[XSDMA_DRCMR2_ID_NUM];

} XsDmaCtrlT;

/*
*******************************************************************************
This structure is used to pass a bucket of parameters around when creating 
DMA descriptors.  Descriptors can be for memory to memory transfers,
peripheral to memory, or mem to peripheral.
*******************************************************************************
*/

typedef struct XsDmaDescriptorParamsS
{
    // Information to create and determine the properties of the descriptor
    XsDmaDescriptorElementsTPT thisDescP;
    INT channel;
    INT transferLength;
    BOOL setStopBit;

    // Contents of the descriptor to be built
    UINT32 nextPhysicalAddr;
    UINT32 sourcePhysicalAddr;
    UINT32 targetPhysicalAddr;
    UINT32 commandRegister;
    XsDmaDescriptorElementsTPT nextVirtualAddr;
    PVOID  sourceVirtualAddr;
    PVOID  targetVirtualAddr;
    UINT32 sourceDeviceType;
    UINT32 targetDeviceType;
    UINT32 currentPhysicalAddr; // the physical address of this descriptor
    XsDmaDescriptorElementsTPT prevDescrP;

} XsDmaDescriptorParamsT;

/*
*******************************************************************************
    Constants and structure for main processor DMA Controller's channel 
    configuration table.  Includes members for the registered client interrupt 
    handlers (callbacks).
*******************************************************************************
*/

typedef struct XsDmaChannelConfigEntryS
{
    BOOL        isAssigned;            // Channel has been assigned
    XsDmaDeviceNamesT
                sourceDeviceName;
    XsDmaDeviceNamesT
                targetDeviceName;
    XsDmaDrcmrIdT
                drcmrId;
    XsDmaHandlerFnPT                   // Pointer to the client's registered 
                registeredHandlerFnP;  //  handler for this channel.
    void*       registeredParamP;      // Pass back to registered handler

} XsDmaChannelConfigEntryT;


static
XsDmaChannelConfigEntryT XsDmaChannelConfigTable [XSDMA_CHANNEL_NUM];

/*
*******************************************************************************
    Function prototypes
*******************************************************************************
*/

static void XsDmaInitAll(void);
static INT  XsDmaModifyChannelUsage(ChannelOperationsT, 
                                      INT32, 
                                      XsDmaChannelPriorityT, 
                                      XsDmaChannelStatusT*);
static void XsDmaSetupMem2MemDescriptor (XsDmaDescriptorParamsT* );
static void XsDmaSetupMem2PeriphDescriptor(XsDmaDescriptorParamsT* );
static void XsDmaSetupPeriph2MemDescriptor(XsDmaDescriptorParamsT* );
static void XsDmaInterruptHandler (void *);
static XsDmaDrcmrIdT XsDmaMapDevice2DrcmrId (XsDmaDeviceNamesT, BOOL);
static void XsDmaFillDescriptorStructure (XsDmaDescriptorParamsT*);
static UINT32 XsDmaDestroyLink (XsDmaDescriptorElementsTPT);
static UINT32 XsDmaPopulateDescWithBufs (XsDmaDescriptorElementsTPT );


/********************************************************************************/

#endif // C_DMA_CONTROLLER

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -