//***************************************************************************** // //! Stop the DMA transfer //! //! \param None //! //! This function //! 1. Stops the uDMA transfer on specified channel //! //! \return None. // //***************************************************************************** void UDMAStopTransfer(unsigned long ulChannel) { // // Disable the channel // MAP_uDMAChannelDisable(ulChannel); }
//***************************************************************************** // // USBLibDMAChannelDisable() for USB controllers that use uDMA. // //***************************************************************************** static void uDMAUSBChannelDisable(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel) { // // Disable DMA for the endpoint. // if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1])) { MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base, psUSBDMAInst->pui8Endpoint[ui32Channel - 1], USB_EP_DEV_OUT); } else { MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base, psUSBDMAInst->pui8Endpoint[ui32Channel - 1], USB_EP_DEV_IN); } // // Disable the DMA channel in the uDMA controller. // MAP_uDMAChannelDisable(ui32Channel - 1); // // Clear out any pending or complete flag set for this DMA channel. // psUSBDMAInst->ui32Pending &= ~(1 << (ui32Channel - 1)); psUSBDMAInst->ui32Complete &= ~(1 << (ui32Channel - 1)); }
/* * ======== CameraCC3200DMA_hwiIntFxn ======== * Hwi function that processes Camera interrupts. * * The Frame end,DMA interrupts is enabled for the camera. * The DMA interrupt is triggered for every 64 elements. * The ISR will check for Frame end interrupt to trigger the callback * in the non-blocking mode/post a semaphore in the blocking mode to * indicate capture complete. * * @param(arg) The Camera_Handle for this Hwi. */ static void CameraCC3200DMA_hwiIntFxn(uintptr_t arg) { uint32_t status; CameraCC3200DMA_Object *object = ((Camera_Handle)arg)->object; CameraCC3200DMA_HWAttrs const *hwAttrs = ((Camera_Handle)arg)->hwAttrs; unsigned long **bufferPtr = (unsigned long**)&object->captureBuf; status = MAP_CameraIntStatus(hwAttrs->baseAddr); if ((object->cameraDMAxIntrRcvd > 1) && (status & (CAM_INT_FE))) { DebugP_log2("Camera:(%p) Interrupt with mask 0x%x", hwAttrs->baseAddr,status); MAP_CameraIntClear(hwAttrs->baseAddr, CAM_INT_FE); object->captureCallback((Camera_Handle)arg, *bufferPtr, object->frameLength); DebugP_log2("Camera:(%p) capture finished, %d bytes written", hwAttrs->baseAddr, object->frameLength); object->inUse = 0; MAP_CameraCaptureStop(hwAttrs->baseAddr, true); Power_releaseConstraint(PowerCC3200_DISALLOW_DEEPSLEEP); } if (status & CAM_INT_DMA) { // Camera DMA Done clear MAP_CameraIntClear(hwAttrs->baseAddr, CAM_INT_DMA); object->cameraDMAxIntrRcvd++; object->frameLength += (CameraCC3200DMA_DMA_TRANSFER_SIZE*sizeof(unsigned long)); if (object->frameLength < object->bufferlength) { if (object->cameraDMA_PingPongMode == 0) { MAP_uDMAChannelControlSet(hwAttrs->channelIndex, UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_32 | UDMA_ARB_8); MAP_uDMAChannelAttributeEnable(hwAttrs->channelIndex, UDMA_ATTR_USEBURST); MAP_uDMAChannelTransferSet(hwAttrs->channelIndex, UDMA_MODE_PINGPONG, (void *)CAM_BUFFER_ADDR, (void *)*bufferPtr, CameraCC3200DMA_DMA_TRANSFER_SIZE); MAP_uDMAChannelEnable(hwAttrs->channelIndex); *bufferPtr += CameraCC3200DMA_DMA_TRANSFER_SIZE; object->cameraDMA_PingPongMode = 1; } else { MAP_uDMAChannelControlSet(hwAttrs->channelIndex | UDMA_ALT_SELECT, UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_32 | UDMA_ARB_8); MAP_uDMAChannelAttributeEnable( hwAttrs->channelIndex | UDMA_ALT_SELECT, UDMA_ATTR_USEBURST); MAP_uDMAChannelTransferSet( hwAttrs->channelIndex | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, (void *)CAM_BUFFER_ADDR, (void *)*bufferPtr, CameraCC3200DMA_DMA_TRANSFER_SIZE); MAP_uDMAChannelEnable(hwAttrs->channelIndex | UDMA_ALT_SELECT); *bufferPtr += CameraCC3200DMA_DMA_TRANSFER_SIZE; object->cameraDMA_PingPongMode = 0; } } else { // Disable DMA MAP_UtilsDelay(20000); MAP_uDMAChannelDisable(hwAttrs->channelIndex); MAP_CameraIntDisable(hwAttrs->baseAddr, CAM_INT_DMA); object->cameraDMA_PingPongMode = 0; object->captureCallback((Camera_Handle)arg, *bufferPtr, object->frameLength); DebugP_log2("Camera:(%p) capture finished, %d bytes written", hwAttrs->baseAddr, object->frameLength); MAP_CameraCaptureStop(hwAttrs->baseAddr, true); Power_releaseConstraint(PowerCC3200_DISALLOW_DEEPSLEEP); } } }