private void DmaTransfer(byte[] data, int bytes, DataDirection direction) { Place source, destination; uint currentDescriptorAddress = descriptorListBaseAddress; int bytesTransferred = 0; while (bytesTransferred < bytes) { int bytesLeft = bytes - bytesTransferred; var currentDescriptor = new SunxiDMADescriptor(currentDescriptorAddress, dmaEngine); int bytesToTransfer = currentDescriptor.BufferSize > bytesLeft ? bytesLeft : (int)currentDescriptor.BufferSize; if (direction == DataDirection.ReadFromSD) { destination = currentDescriptor.BufferAddress; source = new Place(data, bytesTransferred); } else { destination = new Place(data, bytesTransferred); source = currentDescriptor.BufferAddress; } var request = new Request(source, destination, bytesToTransfer, TransferType.DoubleWord, TransferType.DoubleWord); dmaEngine.IssueCopy(request); currentDescriptor.Release(); bytesTransferred += bytesToTransfer; currentDescriptorAddress = currentDescriptor.NextDescriptor; } }
private void DmaTransfer(byte[] data, int bytes, DataDirection direction) { Place source, destination; uint currentDescriptorAddress = descriptorListBaseAddress; int bytesTransferred = 0; while(bytesTransferred < bytes) { int bytesLeft = bytes - bytesTransferred; var currentDescriptor = new SunxiDMADescriptor(currentDescriptorAddress, dmaEngine); int bytesToTransfer = currentDescriptor.BufferSize > bytesLeft ? bytesLeft : (int) currentDescriptor.BufferSize; if(direction == DataDirection.ReadFromSD) { destination = currentDescriptor.BufferAddress; source = new Place(data, bytesTransferred); } else { destination = new Place(data, bytesTransferred); source = currentDescriptor.BufferAddress; } var request = new Request(source, destination, bytesToTransfer, TransferType.DoubleWord, TransferType.DoubleWord); dmaEngine.IssueCopy(request); currentDescriptor.Release(); bytesTransferred += bytesToTransfer; currentDescriptorAddress = currentDescriptor.NextDescriptor; } }