Mercurial > hg > ucis.core
annotate USBLib/Windows/USB/UsbHub.cs @ 58:fd63c453ff65
Improved Windows USB enumeration classes
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Wed, 09 Oct 2013 20:54:15 +0200 |
parents | 5b14fed54a89 |
children | 3424fa5a12c9 |
rev | line source |
---|---|
21 | 1 using System; |
22 | 2 using System.Collections.Generic; |
21 | 3 using System.Runtime.InteropServices; |
4 using Microsoft.Win32.SafeHandles; | |
5 using UCIS.USBLib.Internal.Windows; | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
6 using System.ComponentModel; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
7 using UCIS.USBLib.Communication; |
21 | 8 |
9 namespace UCIS.HWLib.Windows.USB { | |
10 public class UsbHub : UsbDevice { | |
11 public bool IsRootHub { get; private set; } | |
12 internal USB_NODE_INFORMATION NodeInformation { get; private set; } | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
13 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
14 public int PortCount { get { return NodeInformation.HubInformation.HubDescriptor.bNumberOfPorts; } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
15 public bool IsBusPowered { get { return NodeInformation.HubInformation.HubIsBusPowered; } } |
21 | 16 public override string DeviceDescription { get { return IsRootHub ? "RootHub" : "Standard-USB-Hub"; } } |
17 | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
18 public override string DriverKey { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
19 get { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
20 if (Parent == null) return null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
21 using (SafeFileHandle handle = OpenHandle(Parent.DevicePath)) return UsbHub.GetNodeConnectionDriverKey(handle, AdapterNumber); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
22 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
23 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
24 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
25 internal UsbHub(UsbDevice parent, USB_NODE_CONNECTION_INFORMATION_EX nci, string devicePath, uint port, Boolean roothub) |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
26 : base(parent, nci, port, devicePath) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
27 this.IsRootHub = roothub; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
28 using (SafeFileHandle handle = OpenHandle(DevicePath)) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
29 USB_NODE_INFORMATION NodeInfo; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
30 GetNodeInformation(handle, out NodeInfo); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
31 this.NodeInformation = NodeInfo; |
21 | 32 } |
33 } | |
34 | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
35 public override int GetDescriptor(byte descriptorType, byte index, short langId, byte[] buffer, int offset, int length) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
36 if (Parent == null) return 0; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
37 using (SafeFileHandle handle = UsbHub.OpenHandle(Parent.DevicePath)) return UsbHub.GetDescriptor(handle, AdapterNumber, descriptorType, index, langId, buffer, offset, length); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
38 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
39 |
21 | 40 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
41 public IList<UsbDevice> Devices { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
42 get { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
43 List<UsbDevice> devices = new List<UsbDevice>(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
44 using (SafeFileHandle handle = OpenHandle(DevicePath)) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
45 for (uint index = 1; index <= PortCount; index++) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
46 devices.Add(BuildDevice(this, index, this.DevicePath, handle)); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
47 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
48 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
49 return devices; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
50 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
51 } |
21 | 52 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
53 internal static UsbDevice BuildDevice(UsbDevice parent, uint portCount, string devicePath) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
54 using (SafeFileHandle handle = OpenHandle(devicePath)) return BuildDevice(parent, portCount, devicePath, handle); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
55 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
56 internal static UsbDevice BuildDevice(UsbDevice parent, uint portCount, string devicePath, SafeFileHandle handle) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
57 USB_NODE_CONNECTION_INFORMATION_EX nodeConnection; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
58 if (!GetNodeConnectionInformation(handle, portCount, out nodeConnection)) throw new Win32Exception(Marshal.GetLastWin32Error()); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
59 UsbDevice device = null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
60 if (nodeConnection.ConnectionStatus != USB_CONNECTION_STATUS.DeviceConnected) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
61 device = new UsbDevice(parent, nodeConnection, portCount, devicePath); |
21 | 62 } else if (nodeConnection.DeviceDescriptor.bDeviceClass == UsbDeviceClass.HubDevice) { |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
63 String nodeName = GetNodeConnectionName(handle, portCount); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
64 device = new UsbHub(parent, nodeConnection, @"\\?\" + nodeName, portCount, false); |
21 | 65 } else { |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
66 device = new UsbDevice(parent, nodeConnection, portCount, devicePath); |
21 | 67 } |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
68 device.NodeConnectionInfo = nodeConnection; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
69 return device; |
21 | 70 } |
71 } | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
72 } |