?? zl5011xdmampc8260.c
字號(hào):
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);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -