Beispiel #1
0
        public void ResetDevice()
        {
            LibUsbRequest req = new LibUsbRequest();

            req.Timeout = UsbConstants.DEFAULT_TIMEOUT;
            DeviceIoControl(LibUsbIoCtl.RESET_DEVICE, ref req);
        }
Beispiel #2
0
        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));
            }
        }
Beispiel #3
0
        public void ReleaseInterface(int interfaceID)
        {
            LibUsbRequest req = new LibUsbRequest();

            req.Iface.ID = interfaceID;
            req.Timeout  = UsbConstants.DEFAULT_TIMEOUT;
            DeviceIoControl(LibUsbIoCtl.RELEASE_INTERFACE, ref req);
        }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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));
        }
Beispiel #8
0
 void DeviceIoControl(int code, [In] ref LibUsbRequest request)
 {
     DeviceIoControl(code, ref request, null, 0, 0);
 }
Beispiel #9
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));
            }
        }