annotate USBLib/Communication/USBIO/USBIODevice.cs @ 62:edc41c861d96

Updates and cleanup in Windows USB enumeration code
author Ivo Smits <Ivo@UCIS.nl>
date Sun, 13 Oct 2013 02:47:08 +0200
parents 053cc617af54
children abe0d55a2201
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 using System;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections.Generic;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.ComponentModel;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.IO;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Runtime.InteropServices;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 using Microsoft.Win32.SafeHandles;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 using UCIS.USBLib.Internal.Windows;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 namespace UCIS.USBLib.Communication.USBIO {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 public class USBIODevice : UsbInterface, IUsbDevice {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 public string DeviceFilename { get; private set; }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public IUsbDeviceRegistry Registry { get; private set; }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 private SafeFileHandle DeviceHandle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 private SafeFileHandle[] PipeHandlesIn = null;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 private SafeFileHandle[] PipeHandlesOut = null;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 static int CTL_CODE(int DeviceType, int Function, int Method, int Access) { return ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method); }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 static int _USBIO_IOCTL_CODE(int FnCode, int Method) { return CTL_CODE(0x8094, 0x800 + FnCode, Method, 0); }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 const int METHOD_BUFFERED = 0;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 const int METHOD_IN_DIRECT = 1;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 const int METHOD_OUT_DIRECT = 2;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 static readonly int IOCTL_USBIO_GET_DESCRIPTOR = _USBIO_IOCTL_CODE(1, METHOD_OUT_DIRECT);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 static readonly int IOCTL_USBIO_GET_CONFIGURATION = _USBIO_IOCTL_CODE(6, METHOD_BUFFERED);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 static readonly int IOCTL_USBIO_SET_CONFIGURATION = _USBIO_IOCTL_CODE(9, METHOD_BUFFERED);
38
a9c4fed19e99 USBLib: fixes in USBIO driver and LibUsbDotNet compatibility code
Ivo Smits <Ivo@UCIS.nl>
parents: 37
diff changeset
25 static readonly int IOCTL_USBIO_UNCONFIGURE_DEVICE = _USBIO_IOCTL_CODE(10, METHOD_BUFFERED);
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 static readonly int IOCTL_USBIO_CLASS_OR_VENDOR_IN_REQUEST = _USBIO_IOCTL_CODE(12, METHOD_OUT_DIRECT);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 static readonly int IOCTL_USBIO_CLASS_OR_VENDOR_OUT_REQUEST = _USBIO_IOCTL_CODE(13, METHOD_IN_DIRECT);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 static readonly int IOCTL_USBIO_RESET_DEVICE = _USBIO_IOCTL_CODE(21, METHOD_BUFFERED);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 static readonly int IOCTL_USBIO_BIND_PIPE = _USBIO_IOCTL_CODE(30, METHOD_BUFFERED);
46
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
30 static readonly int IOCTL_USBIO_RESET_PIPE = _USBIO_IOCTL_CODE(32, METHOD_BUFFERED);
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 [DllImport("kernel32.dll", SetLastError = true)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 static unsafe extern bool ReadFile(SafeFileHandle hFile, byte* lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 [DllImport("kernel32.dll", SetLastError = true)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 static unsafe extern bool WriteFile(SafeFileHandle hFile, byte* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, IntPtr lpOverlapped);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 enum USBIO_REQUEST_RECIPIENT : uint {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 Device = 0,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 Interface,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 Endpoint,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 Other,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 enum USBIO_REQUEST_TYPE : uint {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 Class = 1,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 Vendor,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 const UInt32 USBIO_SHORT_TRANSFER_OK = 0x00010000;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 [StructLayout(LayoutKind.Sequential, Pack = 1)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 struct USBIO_DESCRIPTOR_REQUEST {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 public USBIO_REQUEST_RECIPIENT Recipient;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 public Byte DescriptorType;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 public Byte DescriptorIndex;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 public Int16 LanguageId;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 [StructLayout(LayoutKind.Sequential, Pack = 1)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 struct USBIO_BIND_PIPE {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 public Byte EndpointAddress;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2 + 2 + 4)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 struct USBIO_INTERFACE_SETTING {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 public UInt16 InterfaceIndex;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 public UInt16 AlternateSettingIndex;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 public UInt32 MaximumTransferSize;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 [StructLayout(LayoutKind.Sequential, Pack = 1)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 unsafe struct USBIO_SET_CONFIGURATION{
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 public UInt16 ConfigurationIndex;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 public UInt16 NbOfInterfaces;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 public fixed byte InterfaceList[32 * (2 + 2 + 4)];
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 [StructLayout(LayoutKind.Sequential, Pack = 1)]
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 struct USBIO_CLASS_OR_VENDOR_REQUEST {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 public UInt32 Flags;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 public USBIO_REQUEST_TYPE Type;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 public USBIO_REQUEST_RECIPIENT Recipient;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 public Byte RequestTypeReservedBits;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 public Byte Request;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 public Int16 Value;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 public Int16 Index;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 public USBIODevice(String path, USBIORegistry registry) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 DeviceFilename = path;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 this.Registry = registry;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 DeviceHandle = OpenHandle();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 private SafeFileHandle OpenHandle() {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 SafeFileHandle handle = Kernel32.CreateFile(DeviceFilename,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 NativeFileAccess.FILE_GENERIC_READ | NativeFileAccess.FILE_GENERIC_WRITE,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 NativeFileShare.FILE_SHARE_WRITE | NativeFileShare.FILE_SHARE_READ,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 IntPtr.Zero,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 NativeFileMode.OPEN_EXISTING,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 NativeFileFlag.FILE_ATTRIBUTE_NORMAL,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 IntPtr.Zero);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 if (handle.IsInvalid || handle.IsClosed) throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not open device");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 return handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 public override void Close() {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 if (PipeHandlesIn != null) for (int i = 0; i < PipeHandlesIn.Length; i++) if (PipeHandlesIn[i] != null) PipeHandlesIn[i].Close();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 if (PipeHandlesOut != null) for (int i = 0; i < PipeHandlesOut.Length; i++) if (PipeHandlesOut[i] != null) PipeHandlesOut[i].Close();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 if (DeviceHandle != null) DeviceHandle.Close();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 public override Byte Configuration {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 get { return base.Configuration; }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 set {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 IList<LibUsbDotNet.Info.UsbConfigInfo> configs = (new LibUsbDotNet.UsbDevice(this)).Configs;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 for (int i = 0; i < configs.Count; i++) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 LibUsbDotNet.Info.UsbConfigInfo config = configs[i];
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 if (config.Descriptor.ConfigID == value) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 unsafe {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 USBIO_SET_CONFIGURATION req = new USBIO_SET_CONFIGURATION();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 req.ConfigurationIndex = (ushort)i;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 req.NbOfInterfaces = Math.Min((ushort)32, config.Descriptor.InterfaceCount);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 for (int j = 0; j < req.NbOfInterfaces; j++) {
38
a9c4fed19e99 USBLib: fixes in USBIO driver and LibUsbDotNet compatibility code
Ivo Smits <Ivo@UCIS.nl>
parents: 37
diff changeset
118 LibUsbDotNet.Info.UsbInterfaceInfo intf = config.InterfaceInfoList[j];
a9c4fed19e99 USBLib: fixes in USBIO driver and LibUsbDotNet compatibility code
Ivo Smits <Ivo@UCIS.nl>
parents: 37
diff changeset
119 *((USBIO_INTERFACE_SETTING*)(req.InterfaceList + sizeof(USBIO_INTERFACE_SETTING) * j)) =
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 new USBIO_INTERFACE_SETTING() { InterfaceIndex = intf.Descriptor.InterfaceID, AlternateSettingIndex = 0, MaximumTransferSize = UInt16.MaxValue };
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 }
44
5a2b51b0d71b USBLib: Fixed initialization of multi-interface USBIO devices
Ivo Smits <Ivo@UCIS.nl>
parents: 38
diff changeset
122 try {
5a2b51b0d71b USBLib: Fixed initialization of multi-interface USBIO devices
Ivo Smits <Ivo@UCIS.nl>
parents: 38
diff changeset
123 DeviceIoControl(DeviceHandle, IOCTL_USBIO_SET_CONFIGURATION, (IntPtr)(&req), sizeof(USBIO_SET_CONFIGURATION), IntPtr.Zero, 0);
5a2b51b0d71b USBLib: Fixed initialization of multi-interface USBIO devices
Ivo Smits <Ivo@UCIS.nl>
parents: 38
diff changeset
124 } catch (Win32Exception ex) {
5a2b51b0d71b USBLib: Fixed initialization of multi-interface USBIO devices
Ivo Smits <Ivo@UCIS.nl>
parents: 38
diff changeset
125 if (ex.NativeErrorCode == unchecked((int)0xE0001005L)) return;
5a2b51b0d71b USBLib: Fixed initialization of multi-interface USBIO devices
Ivo Smits <Ivo@UCIS.nl>
parents: 38
diff changeset
126 throw;
5a2b51b0d71b USBLib: Fixed initialization of multi-interface USBIO devices
Ivo Smits <Ivo@UCIS.nl>
parents: 38
diff changeset
127 }
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 return;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 throw new InvalidOperationException("Requested configuration ID not found");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 public void ClaimInterface(int interfaceID) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 public void ReleaseInterface(int interfaceID) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 public void SetAltInterface(int interfaceID, int alternateID) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 throw new NotImplementedException();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 public void ResetDevice() {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 DeviceIoControl(DeviceHandle, IOCTL_USBIO_RESET_DEVICE, IntPtr.Zero, 0, IntPtr.Zero, 0);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 public unsafe override int GetDescriptor(byte descriptorType, byte index, short langId, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 USBIO_DESCRIPTOR_REQUEST req = new USBIO_DESCRIPTOR_REQUEST() { DescriptorType = descriptorType, DescriptorIndex = index, LanguageId = langId, Recipient = USBIO_REQUEST_RECIPIENT.Device };
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 fixed (Byte* b = buffer) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 return DeviceIoControl(DeviceHandle, IOCTL_USBIO_GET_DESCRIPTOR, (IntPtr)(&req), sizeof(USBIO_DESCRIPTOR_REQUEST), (IntPtr)(b + offset), length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 public override int BulkRead(byte endpoint, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 return PipeRead(endpoint, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 public override int BulkWrite(byte endpoint, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 return PipeWrite(endpoint, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 }
46
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
159 public override void BulkReset(byte endpoint) {
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
160 PipeReset(endpoint);
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
161 }
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 public override int InterruptRead(byte endpoint, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 return PipeRead(endpoint, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 public override int InterruptWrite(byte endpoint, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 return PipeWrite(endpoint, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 }
46
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
168 public override void InterruptReset(byte endpoint) {
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
169 PipeReset(endpoint);
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
170 }
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 public unsafe override int ControlRead(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 return ControlTransfer(requestType, request, value, index, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 public override int ControlWrite(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 return ControlTransfer(requestType, request, value, index, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 private unsafe int ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 if (buffer == null) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 if (offset != 0 || length != 0) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 } else {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 switch (requestType & UsbControlRequestType.TypeMask) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 case UsbControlRequestType.TypeStandard:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 switch ((UsbStandardRequest)request) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 case UsbStandardRequest.GetDescriptor:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 return GetDescriptor((Byte)(value >> 8), (Byte)value, index, buffer, offset, length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 case UsbStandardRequest.GetConfiguration:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 fixed (Byte* b = buffer) return DeviceIoControl(DeviceHandle, IOCTL_USBIO_GET_CONFIGURATION, IntPtr.Zero, 0, (IntPtr)(b + offset), length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 case UsbStandardRequest.SetConfiguration:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 Configuration = (Byte)value;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 return 0;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 default:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 throw new ArgumentException(String.Format("Invalid request: 0x{0:X8}", request));
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 case UsbControlRequestType.TypeVendor:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 case UsbControlRequestType.TypeClass:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 USBIO_CLASS_OR_VENDOR_REQUEST req = new USBIO_CLASS_OR_VENDOR_REQUEST() {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 Flags = USBIO_SHORT_TRANSFER_OK,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 Type = (USBIO_REQUEST_TYPE)((int)(requestType & UsbControlRequestType.TypeMask) >> 5),
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 Recipient = (USBIO_REQUEST_RECIPIENT)((int)(requestType & UsbControlRequestType.RecipMask) >> 0),
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 RequestTypeReservedBits = 0,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 Request = request,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 Value = value,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 Index = index,
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 };
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 fixed (Byte* b = buffer) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 if ((requestType & UsbControlRequestType.EndpointMask) == UsbControlRequestType.EndpointIn) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 return DeviceIoControl(DeviceHandle, IOCTL_USBIO_CLASS_OR_VENDOR_IN_REQUEST, (IntPtr)(&req), sizeof(USBIO_CLASS_OR_VENDOR_REQUEST), (IntPtr)(b + offset), length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 } else {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 return DeviceIoControl(DeviceHandle, IOCTL_USBIO_CLASS_OR_VENDOR_OUT_REQUEST, (IntPtr)(&req), sizeof(USBIO_CLASS_OR_VENDOR_REQUEST), (IntPtr)(b + offset), length);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 case UsbControlRequestType.TypeReserved:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 default:
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 throw new ArgumentException(String.Format("Invalid or unsupported request type: 0x{0:X8}", requestType));
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 private unsafe SafeFileHandle OpenHandleForPipe(Byte epID) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 SafeFileHandle handle = OpenHandle();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 USBIO_BIND_PIPE req = new USBIO_BIND_PIPE() { EndpointAddress = epID };
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 try {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 DeviceIoControl(handle, IOCTL_USBIO_BIND_PIPE, (IntPtr)(&req), sizeof(USBIO_BIND_PIPE), IntPtr.Zero, 0);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 } catch (Exception) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 handle.Close();
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 throw;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 return handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 private SafeFileHandle GetHandleForPipe(Byte epID) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 int epidx = epID & 0x7F;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 if ((epID & 0x80) != 0) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 if (PipeHandlesIn != null && PipeHandlesIn.Length >= epidx && PipeHandlesIn[epidx] != null) return PipeHandlesIn[epidx];
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 SafeFileHandle handle = OpenHandleForPipe(epID);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 if (PipeHandlesIn == null) PipeHandlesIn = new SafeFileHandle[epidx + 1];
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 else Array.Resize(ref PipeHandlesIn, epidx + 1);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 PipeHandlesIn[epidx] = handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 return handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 } else {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 if (PipeHandlesOut != null && PipeHandlesOut.Length >= epidx && PipeHandlesOut[epidx] != null) return PipeHandlesOut[epidx];
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 SafeFileHandle handle = OpenHandleForPipe(epID);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 if (PipeHandlesOut == null) PipeHandlesOut = new SafeFileHandle[epidx + 1];
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243 else Array.Resize(ref PipeHandlesOut, epidx + 1);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 PipeHandlesOut[epidx] = handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 return handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 unsafe int PipeRead(Byte epnum, Byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 SafeFileHandle handle = GetHandleForPipe(epnum);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251 uint ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 fixed (Byte* b = buffer) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 if (!ReadFile(handle, b + offset, (uint)length, out ret, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 return (int)ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 unsafe int PipeWrite(Byte epnum, Byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 SafeFileHandle handle = GetHandleForPipe(epnum);
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 uint ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 fixed (Byte* b = buffer) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 if (!WriteFile(handle, b + offset, (uint)length, out ret, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 return (int)ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 public void PipeReset(byte pipeID) {
46
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
267 SafeFileHandle handle = GetHandleForPipe(pipeID);
053cc617af54 USBLib: added functions to clear USB endpoint halt state
Ivo Smits <Ivo@UCIS.nl>
parents: 44
diff changeset
268 DeviceIoControl(handle, IOCTL_USBIO_RESET_PIPE, IntPtr.Zero, 0, IntPtr.Zero, 0);
35
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 private unsafe int DeviceIoControl(SafeHandle hDevice, int IoControlCode, IntPtr InBuffer, int nInBufferSize, IntPtr OutBuffer, int nOutBufferSize) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 int pBytesReturned;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 if (Kernel32.DeviceIoControl(hDevice, IoControlCode, InBuffer, nInBufferSize, OutBuffer, nOutBufferSize, out pBytesReturned, null))
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 return pBytesReturned;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 throw new Win32Exception(Marshal.GetLastWin32Error());
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 public override UsbPipeStream GetBulkStream(byte endpoint) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 return new PipeStream(this, endpoint, false, GetHandleForPipe(endpoint));
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 public override UsbPipeStream GetInterruptStream(byte endpoint) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 return new PipeStream(this, endpoint, true, GetHandleForPipe(endpoint));
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 class PipeStream : UsbPipeStream {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 private SafeFileHandle Handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 public PipeStream(IUsbInterface device, Byte endpoint, Boolean interrupt, SafeFileHandle handle) : base(device, endpoint, interrupt) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 this.Handle = handle;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
289 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 public unsafe override void Write(byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
292 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 uint ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 fixed (Byte* b = buffer) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
295 if (!WriteFile(Handle, b + offset, (uint)length, out ret, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
297 if (ret <= 0) throw new EndOfStreamException("Could not write all data");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 public unsafe override int Read(byte[] buffer, int offset, int length) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 uint ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 fixed (Byte* b = buffer) {
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 if (!WriteFile(Handle, b + offset, (uint)length, out ret, IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 return (int)ret;
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 }
6fcedb1030bf USBLib: Added support for USBIO driver
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 }