Пример #1
0
		public void SendRequest (ref IOUSBDeviceRequest request)
		{
			ThrowIfDisposed ();
			var result = Interface.DeviceRequest (InterfaceRef, ref request);
			IOObject.ThrowIfError (result);
		}
Пример #2
0
		public Task<int> SendRequestAsync (IOUSBDeviceRequest request)
		{
			ThrowIfDisposed ();
			var completionSource = new TaskCompletionSource<int> ();
			GCHandle callbackHandle = new GCHandle ();
			IOAsyncCallback1 callback = (refCon, callbackResult, arg0) => {
				callbackHandle.Free ();
				if (callbackResult == IOReturn.Success)
					completionSource.TrySetResult ((int)arg0);
				else
					completionSource.TrySetException (callbackResult.ToNSErrorException ());
			};
			callbackHandle = GCHandle.Alloc (callback, GCHandleType.Pinned);
			var result = Interface.DeviceRequestAsync (InterfaceRef, request, callback, IntPtr.Zero);
			IOObject.ThrowIfError (result);
			return completionSource.Task;
		}
Пример #3
0
		char[] GetStringDescriptor (byte index, int language)
		{
			// based on http://oroboro.com/usb-serial-number-osx/
			const int maxUsbStringLength = 255;
			var buffer = Marshal.AllocHGlobal (maxUsbStringLength);
			try {
				var request = new IOUSBDeviceRequest () {
					Direction = EndpointDirection.In,
					DeviceRequestType = DeviceRequestType.Standard,
					Recipient = DeviceRequestRecipient.Device,
					RequestType = RequestType.GetDescriptor,
					Value = (ushort)((byte)DescriptorType.String << 8 | index),
					Index = (ushort)language,
					DataLength = maxUsbStringLength,
					Data = buffer
				};
				var result = Interface.DeviceRequest (InterfaceRef, ref request);
				ThrowIfError (result);
				var header = (IOUSBDescriptorHeader)Marshal.PtrToStructure (buffer, typeof(IOUSBDescriptorHeader));
				var dataLength = (header.Length - 1) / 2;
				var data = new char[dataLength];
				Marshal.Copy (buffer + 2, data, 0, dataLength);
				return data;
			} finally {
				Marshal.FreeHGlobal (buffer);
			}
		}