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

📄 dma.c

📁 mcs51,2051,x86系列MCU
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <conio.h>
#include <string.h>
#include <DOS.h>

#include "80386ex.h"
#include "EV386EX.h"
#include "support.h"


/* APB_BLOCK_START = DMA */

/*******************************************************************************
   FUNCTION:  int EnableDMAHWRequests(BYTE nChannel)

   DESCRIPTION:
      This function enables channel hardware requests for the given DMA channel.

   PARAMETERS:
      nChannel--channel to enable hardware requests

   RETURN:

   SYNTAX/USAGE:
*******************************************************************************/
int EnableDMAHWRequests(BYTE nChannel)
{
   BYTE regDMAMSK = 0;                       /*Clear regDMAMSK[HRM]*/

                                             /*Check input*/
   if (  (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
      return ERR_BADINPUT;

   regDMAMSK = nChannel;                     /*Set regDMAMSK[CS] to channel*/
   _SetEXRegByte(DMAMSK, regDMAMSK);         /*Clear hardware request mask for*/
                                             /*    given channel*/
   return ERR_NONE;
}


/*******************************************************************************
   FUNCTION:  int DisableDMAHWRequests(BYTE nChannel)

   DESCRIPTION:
      This function disables channel hardware requests for the given DMA
      channel.  The channel, however, can still receive software requests.

   PARAMETERS:
      nChannel--channel to mask hardware requests

   RETURN:

   SYNTAX/USAGE:
*******************************************************************************/
int DisableDMAHWRequests(BYTE nChannel)
{
   BYTE regDMAMSK = 0;
                                             //Check input
   if (  (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
      return ERR_BADINPUT;

   regDMAMSK = nChannel;                     //Set regDMAMSK[CS] to channel
   regDMAMSK &= 0x04;                        //Set regDMAMSK[HRM]
   _SetEXRegByte(DMAMSK, regDMAMSK);         //Set hw request mask for given
                                             //   channel
   return ERR_NONE;
}




/*******************************************************************************
   FUNCTION:  void SetDMAReqIOAddr(BYTE nChannel, WORD wIO)

   DESCRIPTION:
      This function sets the requestor to an I/O port address, wIO, for the DMA
      channel specified by nChannel.

   PARAMETERS:
      nChannel--channel for which to set requestor I/O port address
      wIO--I/O address

   RETURN: (none)

   SYNTAX/USAGE:
      SetDMAReqIOAddr(DMA_Channel1, TBR0);    //Sets Req. to Serial Receiver

   ASSUMPTIONS: (none)

   REAL/PROTECTED MODE:
*******************************************************************************/
int SetDMAReqIOAddr(BYTE nChannel, WORD wIO)
{
   BYTE addrDMAReq0_1;
   BYTE addrDMAReq2_3;
                                             /*Check input*/
   if (  (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
      return ERR_BADINPUT;

   /*Set registers to correct channel*/

   addrDMAReq0_1 = ( nChannel == DMA_Channel0 ? DMA0REQ0_1 : DMA1REQ0_1);
   addrDMAReq2_3 = ( nChannel == DMA_Channel0 ? DMA0REQ2_3 : DMA1REQ2_3);

   _SetEXRegByte(DMACLRBP, 0x0);             /* Clear the byte pointer flip-flop */
                                             /* Write requester I/O address, bits 0-7 */
   _SetEXRegByte(addrDMAReq0_1, (BYTE) (wIO & 0xFF));
                                             /* Write requester I/O address, bits 8-15 */
   _SetEXRegByte(addrDMAReq0_1, (BYTE) ((wIO >> 8) & 0xFF));
   _SetEXRegByte(addrDMAReq2_3, 0x00);       /* Zero requester address bits 16-23 */
   _SetEXRegByte(addrDMAReq2_3, 0x00);       /* Zero requester address bits 24-25 */

   return ERR_NONE;
}



/*******************************************************************************
   FUNCTION:  void SetDMATargMemAddr(BYTE nChannel, void *ptMemory)

   DESCRIPTION:  
      This function sets the target memory address for the DMA channel specified
      by nChannel.

   PARAMETERS:
      nChannel--channel for which to set target address
      ptMemory--pointer to target memory location

   RETURN: (none)

   SYNTAX/USAGE:  
      static char lpsz[]="Hello World";
      SetDMATargMemAddr(DMA_Channel1, lpsz);
   
   ASSUMPTIONS:
      Processor is in real mode.
   
   REAL/PROTECTED MODE:
      The address calculation from ptMemory assumes the processor is in real
      mode.

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

int SetDMATargMemAddr(BYTE nChannel, void *ptMemory)
{
   BYTE addrDMATar0_1;
   BYTE addrDMATar2;
   BYTE addrDMATar3;
   WORD wSegment;
   WORD wOffset;
   DWORD lAddress;
                                             /*Check input*/
   if (  (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )
      return ERR_BADINPUT;
                                             /*Set registers to correct channel*/
   addrDMATar0_1 = ( nChannel == DMA_Channel0 ? DMA0TAR0_1 : DMA1TAR0_1);
   addrDMATar2 = ( nChannel == DMA_Channel0 ? DMA0TAR2 : DMA1TAR2);
   addrDMATar3 = ( nChannel == DMA_Channel0 ? DMA0TAR3 : DMA1TAR3);

                                             /*If in tiny, small, or medium model,*/
   #if defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM)
      _asm                                   
      {                                      /*...then grab our segment from DS*/
         mov ax, ds
         mov wSegment, ds
      }
      wOffset = (WORD) ptMemory;             /*...and our offset from the pointer*/
   #else                                     /*Else, if in compact, large, or huge memory model*/
      wSegment = FP_SEG(ptMemory);          /*...grab the segment from the pointer*/
      wOffset = FP_OFF(ptMemory);           /*...and the offset from the pointer*/
   #endif                                    /*Assuming real mode, compute our physical address*/
      lAddress = ((DWORD) wSegment << 4) + wOffset;
   
   _SetEXRegByte(DMACLRBP, 0x0);             /* Clear the byte pointer flip-flop */
                                             /* Write target address, bits 0-7 */
   _SetEXRegByte(addrDMATar0_1, (BYTE) (lAddress & 0xFF)); 
                                             /* Write target address, bits 8-15 */
   _SetEXRegByte(addrDMATar0_1, (BYTE) ((lAddress >> 8) & 0xFF)); 
                                             /* Write target address, bits 16-23 */
   _SetEXRegByte(addrDMATar2, (BYTE) ((lAddress >> 16) & 0xFF)); 
                                             /* Write target address, bits 24-25 */
   _SetEXRegByte(addrDMATar3, (BYTE) ((lAddress >> 24) & 0x03)); 

   return ERR_NONE;
}


/*******************************************************************************
   FUNCTION:  int SetDMAXferCount(BYTE nChannel, void *ptMemory)

   DESCRIPTION:  
      This function sets the target memory device for the DMA channel specified
      by nChannel.

   PARAMETERS:
      nChannel--channel for which to set target address
      ptMemory--pointer to target memory location

   RETURN: (none)

   SYNTAX/USAGE:  
      static char lpsz[]="Hello World";
      SetDMATargMemAddr(DMA_Channel0, lpsz);      
   
   ASSUMPTIONS:
      Processor is in real mode.
   
   REAL/PROTECTED MODE:
      The address calculation from ptMemory assumes the processor is in real
      mode.

*******************************************************************************/
int SetDMAXferCount(BYTE nChannel, DWORD lCount)
{
   BYTE addrDMAByc0_1;
   BYTE addrDMAByc2;
                                             /*Check input*/
   if (  (nChannel != DMA_Channel0) && (nChannel != DMA_Channel1) )

⌨️ 快捷键说明

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