Mercurial > hg > ucis.core
comparison USBLib/Communication/LibUsb1/LibUsb1Device.cs @ 21:dcfec2be27c9
Added USBLib
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Mon, 15 Apr 2013 01:04:59 +0200 |
parents | |
children | 053cc617af54 |
comparison
equal
deleted
inserted
replaced
20:c873e3dd73fe | 21:dcfec2be27c9 |
---|---|
1 using System; | |
2 | |
3 namespace UCIS.USBLib.Communication.LibUsb1 { | |
4 public unsafe class LibUsb1Device : UsbInterface, IUsbDevice { | |
5 libusb_device Device; | |
6 libusb_device_handle Handle; | |
7 //Boolean KernelDriverWasAttached = false; | |
8 public IUsbDeviceRegistry Registry { get; private set; } | |
9 internal LibUsb1Device(libusb_device device, LibUsb1Registry registry) { | |
10 this.Device = device; | |
11 this.Registry = registry; | |
12 int ret = libusb1.libusb_open(Device, out Handle); | |
13 if (ret != 0) throw new Exception("libusb_open returned " + ret.ToString()); | |
14 } | |
15 | |
16 public override void Close() { | |
17 if (Handle != null) Handle.Close(); | |
18 } | |
19 | |
20 public override int BulkWrite(byte endpoint, byte[] buffer, int offset, int length) { | |
21 return BulkTransfer(endpoint, buffer, offset, length); | |
22 } | |
23 public override int BulkRead(byte endpoint, byte[] buffer, int offset, int length) { | |
24 return BulkTransfer(endpoint, buffer, offset, length); | |
25 } | |
26 private int BulkTransfer(byte endpoint, byte[] buffer, int offset, int length) { | |
27 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length"); | |
28 if (length == 0) return 0; | |
29 fixed (Byte* b = buffer) { | |
30 int ret = libusb1.libusb_bulk_transfer(Handle, endpoint, b + offset, length, out length, 0); | |
31 if (ret < 0) throw new Exception("libusb_bulk_transfer returned " + ret.ToString()); | |
32 } | |
33 return length; | |
34 } | |
35 | |
36 public override int InterruptWrite(byte endpoint, byte[] buffer, int offset, int length) { | |
37 return InterruptTransfer(endpoint, buffer, offset, length); | |
38 } | |
39 public override int InterruptRead(byte endpoint, byte[] buffer, int offset, int length) { | |
40 return InterruptTransfer(endpoint, buffer, offset, length); | |
41 } | |
42 private int InterruptTransfer(byte endpoint, byte[] buffer, int offset, int length) { | |
43 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length"); | |
44 if (length == 0) return 0; | |
45 fixed (Byte* b = buffer) { | |
46 int ret = libusb1.libusb_interrupt_transfer(Handle, endpoint, b + offset, length, out length, 0); | |
47 if (ret < 0) throw new Exception("libusb_interrupt_transfer returned " + ret.ToString()); | |
48 } | |
49 return length; | |
50 } | |
51 | |
52 public override int ControlWrite(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { | |
53 return ControlTransfer(requestType, request, value, index, buffer, offset, length); | |
54 } | |
55 public override int ControlRead(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { | |
56 return ControlTransfer(requestType, request, value, index, buffer, offset, length); | |
57 } | |
58 private int ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { | |
59 if (buffer == null) buffer = new Byte[0]; | |
60 if (offset < 0 || length < 0 || length > ushort.MaxValue || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length"); | |
61 fixed (Byte* b = buffer) { | |
62 int ret = libusb1.libusb_control_transfer(Handle, (Byte)requestType, request, (ushort)value, (ushort)index, b + offset, (ushort)length, 0); | |
63 if (ret < 0) throw new Exception("libusb_control_transfer returned " + ret.ToString()); | |
64 return ret; | |
65 } | |
66 } | |
67 | |
68 public override byte Configuration { | |
69 get { return base.Configuration; } | |
70 set { | |
71 if (value == base.Configuration) return; | |
72 for (int i = 0; i < 16; i++) libusb1.libusb_detach_kernel_driver(Handle, i); | |
73 int ret = libusb1.libusb_set_configuration(Handle, value); | |
74 if (ret != 0) throw new Exception("libusb_set_configuration returned " + ret.ToString()); | |
75 } | |
76 } | |
77 public void ClaimInterface(int interfaceID) { | |
78 int ret = libusb1.libusb_detach_kernel_driver(Handle, interfaceID); | |
79 ret = libusb1.libusb_claim_interface(Handle, interfaceID); | |
80 if (ret != 0) throw new Exception("libusb_claim_interface returned " + ret.ToString()); | |
81 } | |
82 public void ReleaseInterface(int interfaceID) { | |
83 int ret = libusb1.libusb_release_interface(Handle, interfaceID); | |
84 if (ret != 0) throw new Exception("libusb_release_interface returned " + ret.ToString()); | |
85 ret = libusb1.libusb_attach_kernel_driver(Handle, interfaceID); | |
86 } | |
87 public void ResetDevice() { | |
88 int ret = libusb1.libusb_reset_device(Handle); | |
89 if (ret != 0) throw new Exception("libusb_reset_device returned " + ret.ToString()); | |
90 } | |
91 } | |
92 } |