int dma_transfer(DMA_Handle_t handle, /* */ dmacHw_TRANSFER_TYPE_e transferType, /* */ dma_addr_t srcData, /* */ dma_addr_t dstData, /* */ size_t numBytes /* */ ) { DMA_Channel_t *channel; DMA_DeviceAttribute_t *devAttr; int rc = 0; channel = HandleToChannel(handle); if (channel == NULL) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[channel->devType]; if (devAttr->config.transferType != transferType) { return -EINVAL; } /* */ /* */ /* */ { rc = dma_alloc_descriptors(handle, transferType, srcData, dstData, numBytes); if (rc != 0) { return rc; } } /* */ devAttr->numBytes = numBytes; devAttr->transferStartTime = timer_get_tick_count(); dmacHw_initiateTransfer(channel->dmacHwHandle, &devAttr->config, devAttr->ring.virtAddr); /* */ return 0; }
int dma_transfer(DMA_Handle_t handle, /* DMA Handle */ dmacHw_TRANSFER_TYPE_e transferType, /* Type of transfer being performed */ dma_addr_t srcData, /* Place to get data to write to device */ dma_addr_t dstData, /* Pointer to device data address */ size_t numBytes /* Number of bytes to transfer to the device */ ) { DMA_Channel_t *channel; DMA_DeviceAttribute_t *devAttr; int rc = 0; channel = HandleToChannel(handle); if (channel == NULL) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[channel->devType]; if (devAttr->config.transferType != transferType) { return -EINVAL; } /* We keep track of the information about the previous request for this */ /* device, and if the attributes match, then we can use the descriptors we setup */ /* the last time, and not have to reinitialize everything. */ { rc = dma_alloc_descriptors(handle, transferType, srcData, dstData, numBytes); if (rc != 0) { return rc; } } /* And kick off the transfer */ devAttr->numBytes = numBytes; devAttr->transferStartTime = timer_get_tick_count(); dmacHw_initiateTransfer(channel->dmacHwHandle, &devAttr->config, devAttr->ring.virtAddr); /* Since we got this far, everything went successfully */ return 0; }
int dma_start_transfer(DMA_Handle_t handle) { DMA_Channel_t *channel; DMA_DeviceAttribute_t *devAttr; channel = HandleToChannel(handle); if (channel == NULL) { return -ENODEV; } devAttr = &DMA_gDeviceAttribute[channel->devType]; dmacHw_initiateTransfer(channel->dmacHwHandle, &devAttr->config, devAttr->ring.virtAddr); /* */ return 0; }