int dmacHw_readTransferredData(dmacHw_HANDLE_t handle, /* [ IN ] DMA Channel handle */ dmacHw_CONFIG_t *pConfig, /* [ IN ] Configuration settings */ void *pDescriptor, /* [ IN ] Descriptor buffer */ void **ppBbuf, /* [ OUT ] Data received */ size_t *pLlen /* [ OUT ] Length of the data received */ ) { dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor); (void)handle; if (pConfig->transferMode != dmacHw_TRANSFER_MODE_CONTINUOUS) { if (((pRing->pTail->ctl.hi & dmacHw_DESC_FREE) == 0) || (pRing->pTail == pRing->pHead) ) { /* No receive data available */ *ppBbuf = (char *)NULL; *pLlen = 0; return 0; } } /* Return read buffer and length */ *ppBbuf = (char *)pRing->pTail->dar; /* Extract length of the received data */ if (DmaIsFlowController(pDescriptor)) { uint32_t srcTrSize = 0; switch (pRing->pTail->ctl.lo & dmacHw_REG_CTL_SRC_TR_WIDTH_MASK) { case dmacHw_REG_CTL_SRC_TR_WIDTH_8: srcTrSize = 1; break; case dmacHw_REG_CTL_SRC_TR_WIDTH_16: srcTrSize = 2; break; case dmacHw_REG_CTL_SRC_TR_WIDTH_32: srcTrSize = 4; break; case dmacHw_REG_CTL_SRC_TR_WIDTH_64: srcTrSize = 8; break; default: dmacHw_ASSERT(0); } /* Calculate length from the block size */ *pLlen = (pRing->pTail->ctl.hi & dmacHw_REG_CTL_BLOCK_TS_MASK) * srcTrSize; } else { /* Extract length from the source peripheral */ *pLlen = pRing->pTail->sstat; } /* Advance tail to next descriptor */ dmacHw_NEXT_DESC(pRing, pTail); return 1; }
int dmacHw_readTransferredData(dmacHw_HANDLE_t handle, dmacHw_CONFIG_t *pConfig, void *pDescriptor, void **ppBbuf, size_t *pLlen ) { dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor); (void)handle; if (pConfig->transferMode != dmacHw_TRANSFER_MODE_CONTINUOUS) { if (((pRing->pTail->ctl.hi & dmacHw_DESC_FREE) == 0) || (pRing->pTail == pRing->pHead) ) { *ppBbuf = (char *)NULL; *pLlen = 0; return 0; } } *ppBbuf = (char *)pRing->pTail->dar; if (DmaIsFlowController(pDescriptor)) { uint32_t srcTrSize = 0; switch (pRing->pTail->ctl.lo & dmacHw_REG_CTL_SRC_TR_WIDTH_MASK) { case dmacHw_REG_CTL_SRC_TR_WIDTH_8: srcTrSize = 1; break; case dmacHw_REG_CTL_SRC_TR_WIDTH_16: srcTrSize = 2; break; case dmacHw_REG_CTL_SRC_TR_WIDTH_32: srcTrSize = 4; break; case dmacHw_REG_CTL_SRC_TR_WIDTH_64: srcTrSize = 8; break; default: dmacHw_ASSERT(0); } *pLlen = (pRing->pTail->ctl.hi & dmacHw_REG_CTL_BLOCK_TS_MASK) * srcTrSize; } else { *pLlen = pRing->pTail->sstat; } dmacHw_NEXT_DESC(pRing, pTail); return 1; }