public static void Refresh() { WMIDeviceInfo = null; Device = null; DeviceWrapper = null; foreach (UsbDeviceInfo info in CreateUsbControllerDeviceInfos(GetUsbDevices())) { if (info.DeviceID.StartsWith($"USB\\VID_{VID}&PID_{PID}")) { WMIDeviceInfo = info; var patternMatch = new KLST_PATTERN_MATCH { ClassGUID = WMIDeviceInfo.ClassGuid }; var deviceList = new LstK(0, ref patternMatch); deviceList.MoveNext(out KLST_DEVINFO_HANDLE deviceInfo); Device = new UsbK(deviceInfo); Device.SetAltInterface(0, false, 0); DeviceWrapper = new UsbKWrapper(Device); break; } } }
public static void Scan() { WMIDeviceInfo = null; Device = null; DeviceWrapper = null; foreach (UsbDeviceInfo info in AllUsbDevices) { if (info.DeviceID.StartsWith($"USB\\VID_{VID}&PID_{PID}")) { WMIDeviceInfo = info; if (!LibusbKInstalled) { MessageBoxResult result = MessageBox.Show("You have plugged in your console, but it lacks the libusbK driver. Want to install it? (You cannot inject anything until this is done)", "", MessageBoxButton.YesNo); if (result == MessageBoxResult.Yes) { InstallDriver(); } WMIDeviceInfo = AllUsbDevices.First(x => x.DeviceID == WMIDeviceInfo.DeviceID); // we need to refresh the info } if (LibusbKInstalled) { var patternMatch = new KLST_PATTERN_MATCH { ClassGUID = WMIDeviceInfo.ClassGuid }; var deviceList = new LstK(0, ref patternMatch); deviceList.MoveNext(out KLST_DEVINFO_HANDLE deviceInfo); Device = new UsbK(deviceInfo); Device.SetAltInterface(0, false, 0); DeviceWrapper = new UsbKWrapper(Device); } break; } } }
// When device is (re)connected, enumerate endpoints and set policy. // Returns null on success or error message. private string ConfigureDevice(KLST_DEVINFO_HANDLE deviceInfo, bool checkForAccessory = false) { IsWriting = false; IsReading = false; if (State != ComponentState.Unresponsive || checkForAccessory || DriverAPI == null) { // libusbK class contructors can throw exceptions; For instance, if the device is // using the WinUsb driver and already in-use by another application. // This could happen if this App was previsouly aborted. try { if (DriverAPI != null) { DriverClose(); } DriverAPI = new UsbK(deviceInfo); } catch (Exception e) { DriverAPI = null; return("Unable to initialize device:" + e.Message); } } try { DriverAPI.ResetDevice(); } catch (Exception e) { return("Unable to reset device:" + e.Message); } // Find Pipe And Interface. byte interfaceIndex = 0; bool hasRead = false, hasWrite = false; USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; WINUSB_PIPE_INFORMATION PipeInfo; while (DriverAPI.SelectInterface(interfaceIndex, true)) { byte altSettingNumber = 0; while (DriverAPI.QueryInterfaceSettings(altSettingNumber, out InterfaceDescriptor)) { if (AltInterfaceId == -1 || AltInterfaceId == altSettingNumber) { byte pipeIndex = 0; while (DriverAPI.QueryPipe(altSettingNumber, pipeIndex++, out PipeInfo)) { if (PipeInfo.MaximumPacketSize > 0) { if (!hasRead && ((PipeInfo.PipeId == ReadPipeId) || ((((ReadPipeId & 0xF) == 0) || (ReadPipeId == 0xff)) && ((ReadPipeId & 0x80) == (PipeInfo.PipeId & 0x80)))) ) { ReadPipeId = PipeInfo.PipeId; hasRead = true; } if (!hasWrite && ((PipeInfo.PipeId == WritePipeId) || ((((WritePipeId & 0xF) == 0) || (WritePipeId == 0x7f)) && ((WritePipeId & 0x80) == (PipeInfo.PipeId & 0x80)))) ) { WritePipeId = PipeInfo.PipeId; hasWrite = true; if (TransferBufferSize == -1) { TransferBufferSize = PipeInfo.MaximumPacketSize; } } if (hasRead && hasWrite) { goto FindInterfaceDone; } } PipeInfo.PipeId = 0; } } altSettingNumber++; } interfaceIndex++; } FindInterfaceDone: if (!hasRead && !hasWrite) { return("Unable to open i/o pipes:R=" + hasRead + ",W=" + hasWrite + "."); } ReadPipeId |= 0x80; WritePipeId &= 0x7f; if (TransferBufferSize == -1) { TransferBufferSize = 64; } #if false // TODO: should test this. // Set interface alt setting. if (!DriverAPI.SetAltInterface(InterfaceDescriptor.bInterfaceNumber, false, InterfaceDescriptor.bAlternateSetting)) { return("Unable to set Alt Interface"); } #endif bool isAccessory = UsbLinkAccessory.IsAccessory(deviceInfo.Common.Vid, deviceInfo.Common.Pid); // Set configuration for accessory. if (isAccessory) { int configNum = 0; if (GetConfiguration(out configNum)) { if (configNum != 1) { if (!SetConfiguration(1)) { return("Unable to set configuration"); } } } } // In most cases, the pipe timeout policy should be set before using synchronous I/O. // By default, sync transfers wait infinitely for a transfer to complete. // Set the pipe timeout policy to 0 for infinite timeout. int[] pipeTimeoutMS = new[] { 0 }; int[] autoClearStall = new[] { 1 }; DriverAPI.SetPipePolicy(ReadPipeId, (int)PipePolicyType.PIPE_TRANSFER_TIMEOUT, Marshal.SizeOf(typeof(int)), pipeTimeoutMS); DriverAPI.SetPipePolicy(ReadPipeId, (int)PipePolicyType.AUTO_CLEAR_STALL, Marshal.SizeOf(typeof(int)), autoClearStall); DriverAPI.SetPipePolicy(WritePipeId, (int)PipePolicyType.PIPE_TRANSFER_TIMEOUT, Marshal.SizeOf(typeof(int)), pipeTimeoutMS); DriverAPI.SetPipePolicy(WritePipeId, (int)PipePolicyType.AUTO_CLEAR_STALL, Marshal.SizeOf(typeof(int)), autoClearStall); /* * int[] useRawIO = new[] { 1 }; * mUsb.SetPipePolicy(mReadPipeId, (int)PipePolicyType.RAW_IO, * Marshal.SizeOf(typeof(int)), useRawIO); */ // Next, check if it's an accessory. if (checkForAccessory && !isAccessory && UsbLinkAccessory.TryOpeningAccessory(this)) { return("Switching to accessory mode."); } // Finally, check if it's an FTDI device. IsFTDI = FTDIHandler.IsFtdiDevice(this); if (IsFTDI) { if (!FTDIHandler.ConfigureFTDI(this)) { return("Unable to configure FTDI device."); } } return(null); }
public bool ConfigureDevice(out WINUSB_PIPE_INFORMATION pipeInfo, out UsbK usb, out USB_INTERFACE_DESCRIPTOR interfaceDescriptor) { bool success; Console.WriteLine("Finding usb device by VID/PID.. ({0:X4}h / {1:X4}h)", Vid, Pid); // Use a patttern match to include only matching devices. // NOTE: You can use the '*' and '?' chars as wildcards for all chars or a single char (respectively). KLST_PATTERN_MATCH patternMatch = new KLST_PATTERN_MATCH(); if (MI != -1) { patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}&MI_{2:X2}*", Vid, Pid, MI); } else { patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}*", Vid, Pid); } LstK deviceList = new LstK(KLST_FLAG.NONE, ref patternMatch); KLST_DEVINFO_HANDLE deviceInfo; interfaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); pipeInfo = new WINUSB_PIPE_INFORMATION(); usb = null; // Iterate the devices looking for a matching alt-interface and endpoint id. while (deviceList.MoveNext(out deviceInfo)) { // libusbK class contructors can throw exceptions; For instance, if the device is // using the WinUsb driver and already in-use by another application. Console.WriteLine("Opening usb device.."); usb = new UsbK(deviceInfo); Console.WriteLine("Finding interface and endpoint by PipeId.."); success = FindPipeAndInterface(usb, out interfaceDescriptor, out pipeInfo); if (success) { break; } Console.WriteLine("PipeId {0:X2}h not found on this device.", PipeId); usb.Free(); usb = null; } if (ReferenceEquals(usb, null)) { Console.WriteLine("Usb device not found: {0}", patternMatch.DeviceID); success = false; goto Done; } MI = interfaceDescriptor.bInterfaceNumber; AltInterfaceId = interfaceDescriptor.bAlternateSetting; PipeId = pipeInfo.PipeId; // Set interface alt setting. Console.WriteLine("Setting interface #{0} to bAlternateSetting #{1}..", interfaceDescriptor.bInterfaceNumber, interfaceDescriptor.bAlternateSetting); success = usb.SetAltInterface(interfaceDescriptor.bInterfaceNumber, false, interfaceDescriptor.bAlternateSetting); if (!success) { Console.WriteLine("SetAltInterface failed. ErrorCode={0:X8}h", Marshal.GetLastWin32Error()); Console.WriteLine(interfaceDescriptor.ToString()); } Done: deviceList.Free(); return(success); }
public bool ConfigureDevice(out WINUSB_PIPE_INFORMATION pipeInfo, out UsbK usb, out USB_INTERFACE_DESCRIPTOR interfaceDescriptor) { bool success; Console.WriteLine("Finding usb device by VID/PID.. ({0:X4}h / {1:X4}h)", Vid, Pid); // Use a patttern match to include only matching devices. // NOTE: You can use the '*' and '?' chars as wildcards for all chars or a single char (respectively). KLST_PATTERN_MATCH patternMatch = new KLST_PATTERN_MATCH(); if (MI != -1) patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}&MI_{2:X2}*", Vid, Pid, MI); else patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}*", Vid, Pid); LstK deviceList = new LstK(KLST_FLAG.NONE, ref patternMatch); KLST_DEVINFO_HANDLE deviceInfo; interfaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); pipeInfo = new WINUSB_PIPE_INFORMATION(); usb = null; // Iterate the devices looking for a matching alt-interface and endpoint id. while (deviceList.MoveNext(out deviceInfo)) { // libusbK class contructors can throw exceptions; For instance, if the device is // using the WinUsb driver and already in-use by another application. Console.WriteLine("Opening usb device.."); usb = new UsbK(deviceInfo); Console.WriteLine("Finding interface and endpoint by PipeId.."); success = FindPipeAndInterface(usb, out interfaceDescriptor, out pipeInfo); if (success) break; Console.WriteLine("PipeId {0:X2}h not found on this device.", PipeId); usb.Free(); usb = null; } if (ReferenceEquals(usb, null)) { Console.WriteLine("Usb device not found: {0}", patternMatch.DeviceID); success = false; goto Done; } MI = interfaceDescriptor.bInterfaceNumber; AltInterfaceId = interfaceDescriptor.bAlternateSetting; PipeId = pipeInfo.PipeId; // Set interface alt setting. Console.WriteLine("Setting interface #{0} to bAlternateSetting #{1}..", interfaceDescriptor.bInterfaceNumber, interfaceDescriptor.bAlternateSetting); success = usb.SetAltInterface(interfaceDescriptor.bInterfaceNumber, false, interfaceDescriptor.bAlternateSetting); if (!success) { Console.WriteLine("SetAltInterface failed. ErrorCode={0:X8}h", Marshal.GetLastWin32Error()); Console.WriteLine(interfaceDescriptor.ToString()); } Done: deviceList.Free(); return success; }