public void ResetDevice() { LibUsbRequest req = new LibUsbRequest(); req.Timeout = UsbConstants.DEFAULT_TIMEOUT; DeviceIoControl(LibUsbIoCtl.RESET_DEVICE, ref req); }
unsafe int PipeTransfer(Byte epnum, Boolean write, Boolean isochronous, Byte[] buffer, int offset, int length, int packetsize) { if (offset < 0 || length < 0 || offset + length > buffer.Length) { throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length"); } LibUsbRequest req = new LibUsbRequest(); req.Endpoint.ID = epnum; req.Endpoint.PacketSize = packetsize; req.Timeout = UsbConstants.DEFAULT_TIMEOUT; if (write) { int cltCode = isochronous ? LibUsbIoCtl.ISOCHRONOUS_WRITE : LibUsbIoCtl.INTERRUPT_OR_BULK_WRITE; int transfered = 0; while (length > 0) { int ret = DeviceIoControl(cltCode, ref req, buffer, offset, length); if (ret <= 0) { throw new System.IO.EndOfStreamException(); } length -= ret; offset += ret; transfered += ret; } return(transfered); } else { int cltCode = isochronous ? LibUsbIoCtl.ISOCHRONOUS_READ : LibUsbIoCtl.INTERRUPT_OR_BULK_READ; return(DeviceIoControl(cltCode, ref req, buffer, offset, length)); } }
public void ReleaseInterface(int interfaceID) { LibUsbRequest req = new LibUsbRequest(); req.Iface.ID = interfaceID; req.Timeout = UsbConstants.DEFAULT_TIMEOUT; DeviceIoControl(LibUsbIoCtl.RELEASE_INTERFACE, ref req); }
unsafe int DeviceIoControl(int code, [In] ref LibUsbRequest request, Byte[] outbuffer, int outoffset, int outsize) { Byte[] bytes = new Byte[LibUsbRequest.Size]; fixed(Byte *ptr = bytes) * (LibUsbRequest *)ptr = request; return(DeviceIoControl(code, bytes, outbuffer, outoffset, outsize)); }
public override void PipeAbort(byte pipeID) { LibUsbRequest req = new LibUsbRequest(); req.Endpoint.ID = pipeID; req.Timeout = UsbConstants.DEFAULT_TIMEOUT; DeviceIoControl(LibUsbIoCtl.ABORT_ENDPOINT, ref req); }
public void SetAltInterface(int interfaceID, int alternateID) { LibUsbRequest req = new LibUsbRequest(); req.Iface.ID = interfaceID; req.Iface.AlternateID = alternateID; req.Timeout = UsbConstants.DEFAULT_TIMEOUT; DeviceIoControl(LibUsbIoCtl.SET_INTERFACE, ref req); }
public unsafe override int GetDescriptor(byte descriptorType, byte index, short langId, 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"); } LibUsbRequest req = new LibUsbRequest(); req.Descriptor.Index = index; req.Descriptor.LangID = langId; req.Descriptor.Recipient = (byte)UsbEndpointDirection.EndpointIn & 0x1F; req.Descriptor.Type = descriptorType; req.Timeout = UsbConstants.DEFAULT_TIMEOUT; return(DeviceIoControl(LibUsbIoCtl.GET_DESCRIPTOR, ref req, buffer, offset, length)); }
void DeviceIoControl(int code, [In] ref LibUsbRequest request) { DeviceIoControl(code, ref request, null, 0, 0); }
void PrepareControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, int length, ref LibUsbRequest req, out int code) { code = LibUsbIoCtl.CONTROL_TRANSFER; req.Timeout = UsbConstants.DEFAULT_TIMEOUT; req.Control.RequestType = (Byte)requestType; req.Control.Request = request; req.Control.Value = (ushort)value; req.Control.Index = (ushort)index; req.Control.Length = (ushort)length; switch ((UsbControlRequestType)((int)requestType & (0x03 << 5))) { case UsbControlRequestType.TypeStandard: switch ((UsbStandardRequest)request) { case UsbStandardRequest.GetStatus: req.Status.Recipient = (int)requestType & 0x1F; req.Status.Index = index; code = LibUsbIoCtl.GET_STATUS; break; case UsbStandardRequest.ClearFeature: req.Feature.Recipient = (int)requestType & 0x1F; req.Feature.ID = value; req.Feature.Index = index; code = LibUsbIoCtl.CLEAR_FEATURE; break; case UsbStandardRequest.SetFeature: req.Feature.Recipient = (int)requestType & 0x1F; req.Feature.ID = value; req.Feature.Index = index; code = LibUsbIoCtl.SET_FEATURE; break; case UsbStandardRequest.GetDescriptor: req.Descriptor.Recipient = (int)requestType & 0x1F; req.Descriptor.Type = (value >> 8) & 0xFF; req.Descriptor.Index = value & 0xFF; req.Descriptor.LangID = index; code = LibUsbIoCtl.GET_DESCRIPTOR; break; case UsbStandardRequest.SetDescriptor: req.Descriptor.Recipient = (int)requestType & 0x1F; req.Descriptor.Type = (value >> 8) & 0xFF; req.Descriptor.Index = value & 0xFF; req.Descriptor.LangID = index; code = LibUsbIoCtl.SET_DESCRIPTOR; break; case UsbStandardRequest.GetConfiguration: code = LibUsbIoCtl.GET_CONFIGURATION; break; case UsbStandardRequest.SetConfiguration: req.Config.ID = value; code = LibUsbIoCtl.SET_CONFIGURATION; break; case UsbStandardRequest.GetInterface: req.Iface.ID = index; code = LibUsbIoCtl.GET_INTERFACE; break; case UsbStandardRequest.SetInterface: req.Iface.ID = index; req.Iface.AlternateID = value; code = LibUsbIoCtl.SET_INTERFACE; break; default: throw new ArgumentException(String.Format("Invalid request: 0x{0:X8}", request)); } break; case UsbControlRequestType.TypeVendor: case UsbControlRequestType.TypeClass: req.Vendor.Type = ((byte)requestType >> 5) & 0x03; req.Vendor.Recipient = (int)requestType & 0x1F; req.Vendor.Request = (int)request; req.Vendor.ID = value; req.Vendor.Index = index; code = ((byte)requestType & 0x80) != 0 ? LibUsbIoCtl.VENDOR_READ : LibUsbIoCtl.VENDOR_WRITE; break; case UsbControlRequestType.TypeReserved: default: throw new ArgumentException(String.Format("Invalid or unsupported request type: 0x{0:X8}", requestType)); } }