diff USBLib/Communication/USBIO/USBIODevice.cs @ 67:2d16447eff12

Simplified USB communication code, added functions to abort pipe transfers
author Ivo Smits <Ivo@UCIS.nl>
date Wed, 16 Oct 2013 01:11:49 +0200
parents abe0d55a2201
children e811297f5aa4
line wrap: on
line diff
--- a/USBLib/Communication/USBIO/USBIODevice.cs	Tue Oct 15 16:22:54 2013 +0200
+++ b/USBLib/Communication/USBIO/USBIODevice.cs	Wed Oct 16 01:11:49 2013 +0200
@@ -28,6 +28,7 @@
 		static readonly int IOCTL_USBIO_RESET_DEVICE = _USBIO_IOCTL_CODE(21, METHOD_BUFFERED);
 		static readonly int IOCTL_USBIO_BIND_PIPE = _USBIO_IOCTL_CODE(30, METHOD_BUFFERED);
 		static readonly int IOCTL_USBIO_RESET_PIPE = _USBIO_IOCTL_CODE(32, METHOD_BUFFERED);
+		static readonly int IOCTL_USBIO_ABORT_PIPE = _USBIO_IOCTL_CODE(33, METHOD_BUFFERED);
 
 		[DllImport("kernel32.dll", SetLastError = true)]
 		static unsafe extern bool ReadFile(SafeFileHandle hFile, byte* lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
@@ -150,31 +151,7 @@
 				return DeviceIoControl(DeviceHandle, IOCTL_USBIO_GET_DESCRIPTOR, (IntPtr)(&req), sizeof(USBIO_DESCRIPTOR_REQUEST), (IntPtr)(b + offset), length);
 			}
 		}
-		public override int BulkRead(byte endpoint, byte[] buffer, int offset, int length) {
-			return PipeRead(endpoint, buffer, offset, length);
-		}
-		public override int BulkWrite(byte endpoint, byte[] buffer, int offset, int length) {
-			return PipeWrite(endpoint, buffer, offset, length);
-		}
-		public override void BulkReset(byte endpoint) {
-			PipeReset(endpoint);
-		}
-		public override int InterruptRead(byte endpoint, byte[] buffer, int offset, int length) {
-			return PipeRead(endpoint, buffer, offset, length);
-		}
-		public override int InterruptWrite(byte endpoint, byte[] buffer, int offset, int length) {
-			return PipeWrite(endpoint, buffer, offset, length);
-		}
-		public override void InterruptReset(byte endpoint) {
-			PipeReset(endpoint);
-		}
-		public unsafe override int ControlRead(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
-			return ControlTransfer(requestType, request, value, index, buffer, offset, length);
-		}
-		public override int ControlWrite(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
-			return ControlTransfer(requestType, request, value, index, buffer, offset, length);
-		}
-		private unsafe int ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
+		public override unsafe int ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
 			if (buffer == null) {
 				if (offset != 0 || length != 0) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
 			} else {
@@ -245,28 +222,28 @@
 				return handle;
 			}
 		}
-		unsafe int PipeRead(Byte epnum, Byte[] buffer, int offset, int length) {
+		public unsafe override int PipeTransfer(Byte epnum, Byte[] buffer, int offset, int length) {
 			if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
 			SafeFileHandle handle = GetHandleForPipe(epnum);
 			uint ret;
 			fixed (Byte* b = buffer) {
-				if (!ReadFile(handle, b + offset, (uint)length, out ret, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
+				Boolean success;
+				if ((epnum & (Byte)UsbControlRequestType.EndpointMask) == (Byte)UsbControlRequestType.EndpointIn)
+					success = ReadFile(handle, b + offset, (uint)length, out ret, IntPtr.Zero);
+				else
+					success = WriteFile(handle, b + offset, (uint)length, out ret, IntPtr.Zero);
+				if (!success) throw new Win32Exception(Marshal.GetLastWin32Error());
 			}
 			return (int)ret;
 		}
-		unsafe int PipeWrite(Byte epnum, Byte[] buffer, int offset, int length) {
-			if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
-			SafeFileHandle handle = GetHandleForPipe(epnum);
-			uint ret;
-			fixed (Byte* b = buffer) {
-				if (!WriteFile(handle, b + offset, (uint)length, out ret, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
-			}
-			return (int)ret;
-		}
-		public void PipeReset(byte pipeID) {
+		public override void PipeReset(byte pipeID) {
 			SafeFileHandle handle = GetHandleForPipe(pipeID);
 			DeviceIoControl(handle, IOCTL_USBIO_RESET_PIPE, IntPtr.Zero, 0, IntPtr.Zero, 0);
 		}
+		public override void PipeAbort(byte pipeID) {
+			SafeFileHandle handle = GetHandleForPipe(pipeID);
+			DeviceIoControl(handle, IOCTL_USBIO_ABORT_PIPE, IntPtr.Zero, 0, IntPtr.Zero, 0);
+		}
 
 		private unsafe int DeviceIoControl(SafeHandle hDevice, int IoControlCode, IntPtr InBuffer, int nInBufferSize, IntPtr OutBuffer, int nOutBufferSize) {
 			int pBytesReturned;
@@ -275,16 +252,13 @@
 			throw new Win32Exception(Marshal.GetLastWin32Error());
 		}
 
-		public override UsbPipeStream GetBulkStream(byte endpoint) {
-			return new PipeStream(this, endpoint, false, GetHandleForPipe(endpoint));
-		}
-		public override UsbPipeStream GetInterruptStream(byte endpoint) {
-			return new PipeStream(this, endpoint, true, GetHandleForPipe(endpoint));
+		public override UsbPipeStream GetPipeStream(byte endpoint) {
+			return new PipeStream(this, endpoint, GetHandleForPipe(endpoint));
 		}
 
 		class PipeStream : UsbPipeStream {
 			private SafeFileHandle Handle;
-			public PipeStream(IUsbInterface device, Byte endpoint, Boolean interrupt, SafeFileHandle handle) : base(device, endpoint, interrupt) {
+			public PipeStream(IUsbInterface device, Byte endpoint, SafeFileHandle handle) : base(device, endpoint) {
 				this.Handle = handle;
 			}