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

📄 zl5011xdmampc8260.c

📁 Zalink50114----TDMoIP芯片驱动源码
💻 C
📖 第 1 页 / 共 4 页
字号:
             dma->bufferDescrip[n].ctlsts =  PPC8260_IDMA_BD_DDTB_60X
                       | PPC8260_IDMA_BD_SDTB_60X
                       | PPC8260_IDMA_BD_SBO_PPC
                       | PPC8260_IDMA_BD_DBO_PPC;
           }
           else
           {
             dma->bufferDescrip[n].source =
                       dmaChannel->devParams->baseAdd + ZL5011X_CPU_PACKET_RX;
             dma->bufferDescrip[n].destination =
                          ZL5011X_DMA_BUFFER_BURST_ALIGNED(dmaChannel->buffer[n]);
             dma->bufferDescrip[n].ctlsts =  PPC8260_IDMA_BD_DDTB_60X
                       | PPC8260_IDMA_BD_SDTB_60X
                       | PPC8260_IDMA_BD_SBO_PPC
                       | PPC8260_IDMA_BD_DBO_PPC
                       | PPC8260_IDMA_BD_VALID;

             /* Packet sizes are fixed for receive queues (and set to the buffer
                size in whole number of words)                                */
             zl5011xDmaWriteLength(dmaChannel,n,
                                       dmaChannel->bufferSize*sizeof(Uint32T));
           }

           if (n == (dmaChannel->numberOfBuffers -1))
           {
             /* Last descriptor of chain - set the wrap bit                   */
             dma->bufferDescrip[n].ctlsts = dma->bufferDescrip[n].ctlsts
                       | PPC8260_IDMA_BD_WRAP;
           }
         }
       }
     }

     /* Connect DMA to outside world                                         */
     if (status == ZL5011X_OK)
     {
       zl5011xassignDmaPorts(dmaChannel);

       /* Start the task which identifies when the IDMA channel is out of
          buffers and stops it                                                */
       IdmaMonitor.channelEnabled[dmaChannel->channelNumber] = ZL5011X_TRUE;
       IdmaMonitor.dmaChannel[dmaChannel->channelNumber] = dmaChannel;
       IdmaMonitor.goFlag = ZL5011X_TRUE;

       if (OS_TASK_ID_VERIFY(IdmaMonitor.taskId) == OS_ERROR)
       {
         /* Note: There are no checks between goFlag and the task status. If the
            task is not running - start it anyway!                            */
         IdmaMonitor.taskId = OS_TASK_SPAWN("zlIdmaMonitor",
                         ZL5011X_DMA_TASK_PRIORITY,
                         OS_VX_NO_STACK_FILL,
                         ZL5011X_DMA_TASK_STACK_SIZE,
                         (FUNCPTR)zl5011xDmaOutOfBuffers,
                         0,0,0,0,0,0,0,0,0,0);
         if (IdmaMonitor.taskId == (Uint32T)OS_ERROR)
         {
           status = ZL5011X_PARAMETER_INVALID;
         }
       }
     }
   }

   return status;

}

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

 Function:
   zl5011xDmaDisable

 Description:
    This function will free all memory associated with a DMA channel

 Inputs:
    dmaChannel             DMA channel to set

 Outputs
   None

 Returns:
   None

 Remarks:

*******************************************************************************/
extern void zl5011xDmaDisable(zl5011xDmaChannelS *dmaChannel)
{
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;
   Uint32T n;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaDisable:", 0, 0, 0, 0, 0, 0);

   if (OS_TASK_ID_VERIFY(IdmaMonitor.taskId) == OS_OK)
   {
     IdmaMonitor.channelEnabled[dmaChannel->channelNumber] = ZL5011X_FALSE;

     for(n=0;n<ZL5011X_DMA_NUMBER_OF_CHANNELS;n++)
     {
       if (IdmaMonitor.channelEnabled[n] == ZL5011X_TRUE)
       {
         break;
       }
     }

     if (n == ZL5011X_DMA_NUMBER_OF_CHANNELS)
     {
       /* No channels are active - can delete task                            */
       IdmaMonitor.goFlag = ZL5011X_FALSE;
     }
   }

   for(n=0;n<dmaChannel->numberOfBuffers;n++)
   {
     (void)OS_CACHE_DMA_FREE(dmaChannel->buffer[n]);
   }
   OS_FREE(dmaChannel->buffer);

   sys82xxDpramFree((void *)((Uint32T)dma->params->dpr_buf +dmaChannel->imm));
   sys82xxDpramFree(dma->bufferDescrip);
   sys82xxDpramFree(dma->params);
}

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

 Function:
   zl5011xDmaReadBufferStatus

 Description:
   This function will determine if the specified buffer is full or empty

 Inputs:
   dmaChannel     DMA channel to check
   bufferNumber   Buffer to check

 Outputs
   None

 Returns:
   zl5011xDmaBufferStatusE   Any of: ZL5011X_DMA_BUFFER_FULL,
                                    ZL5011X_DMA_BUFFER_EMPTY

 Remarks:

*******************************************************************************/
extern zl5011xDmaBufferStatusE zl5011xDmaReadBufferStatus(
                             zl5011xDmaChannelS *dmaChannel,Uint32T bufferNumber)
{
   zl5011xDmaBufferStatusE bufferStatus;
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaReadBufferStatus:", 0, 0, 0, 0, 0, 0);

   if (dmaChannel->dmaDirection == ZL5011X_DMA_TRANSMIT)
   {
     if ((dma->bufferDescrip[bufferNumber].ctlsts & PPC8260_IDMA_BD_VALID) != 0)
     {
       bufferStatus = ZL5011X_DMA_BUFFER_FULL;
     }
     else
     {
       bufferStatus = ZL5011X_DMA_BUFFER_EMPTY;
     }
   }
   else
   {
     if ((dma->bufferDescrip[bufferNumber].ctlsts & PPC8260_IDMA_BD_VALID) != 0)
     {
       bufferStatus = ZL5011X_DMA_BUFFER_EMPTY;
     }
     else
     {
       bufferStatus = ZL5011X_DMA_BUFFER_FULL;
     }
   }

   return(bufferStatus);
}

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

 Function:
   zl5011xDmaFreeDescriptorBuffer

 Description:
    This function will mark the descriptor buffer as free for re-use

 Inputs:
    dmaChannel             DMA channel to set

 Outputs
   None

 Returns:
   None

 Remarks:

*******************************************************************************/
extern void zl5011xDmaFreeDescriptorBuffer(zl5011xDmaChannelS *dmaChannel)
{
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaFreeDescriptorBuffer:", 0, 0, 0, 0, 0, 0);

   dma->bufferDescrip[dmaChannel->bufferIndex].ctlsts =
        dma->bufferDescrip[dmaChannel->bufferIndex].ctlsts |
                                                        PPC8260_IDMA_BD_VALID;
}

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

 Function:
   zl5011xDmaWriteSourceAddress

 Description:
    This function will write the source address field of the specified buffer
    descriptor


 Inputs:
    dmaChannel        DMA channel
    descriptorNumber  Descriptor number
    sourceAddress     Value to write

 Outputs
   None

 Returns:
   None

 Remarks:

*******************************************************************************/
extern void zl5011xDmaWriteSourceAddress(zl5011xDmaChannelS *dmaChannel,
                               Uint32T descriptorNumber, Uint32T sourceAddress)
{
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaWriteSourceAddress:", 0, 0, 0, 0, 0, 0);

   dma->bufferDescrip[descriptorNumber].source = sourceAddress;
}

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

 Function:
   zl5011xDmaWriteDestinationAddress

 Description:
    This function will write the destination address field of the specified
     buffer descriptor


 Inputs:
    dmaChannel             DMA channel
    descriptorNumber       Descriptor number
    destinationAddress     Value to write

 Outputs
   None

 Returns:
   None

 Remarks:

*******************************************************************************/
extern void zl5011xDmaWriteDestinationAddress(zl5011xDmaChannelS *dmaChannel,
                          Uint32T descriptorNumber, Uint32T destinationAddress)
{
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaWriteDestinationAddress:", 0, 0, 0, 0, 0, 0);

   dma->bufferDescrip[descriptorNumber].destination = destinationAddress;
}

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

 Function:
   zl5011xDmaWriteLength

 Description:
    This function will write the length field of the specified buffer descriptor

 Inputs:
    dmaChannel        DMA channel
    descriptorNumber  Descriptor number
    length            Value to write

 Outputs
   None

 Returns:
   None

 Remarks:

*******************************************************************************/
extern void zl5011xDmaWriteLength(zl5011xDmaChannelS *dmaChannel,
                               Uint32T descriptorNumber, Uint32T length)
{
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaWriteLength:", 0, 0, 0, 0, 0, 0);

    dma->bufferDescrip[descriptorNumber].length = length;
}

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

 Function:
   zl5011xDmaReadSourceAddress

 Description:
    This function will read the source address field of the specified buffer
    descriptor

 Inputs:
    dmaChannel        DMA channel
    descriptorNumber  Descriptor number

 Outputs
   None

 Returns:
   Uint32T            Source address

 Remarks:

*******************************************************************************/
extern Uint32T zl5011xDmaReadSourceAddress(zl5011xDmaChannelS *dmaChannel,
                               Uint32T descriptorNumber)
{
   zl5011xDmaStructS *dma = (zl5011xDmaStructS *)dmaChannel->dma;

   ZL5011X_TRACE(ZL5011X_DMA_FN_ID,"zl5011xDmaReadSourceAddress:", 0, 0, 0, 0, 0, 0);

⌨️ 快捷键说明

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