예제 #1
0
        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;
            }
        }
예제 #2
0
        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;
            }
        }