UWP/C# - Issue with AQS and USB Devices
Asked Answered
S

3

2

I have an issue with a UWP app that I am trying to write. I am connecting to a custom embedded USB Bulk device that I have programmed (it is actually an out of the box example from Cypress Semiconductor). I am using the WinUSB.sys driver using the embedded MS OS string in the device to allow the device to be used with out having to write a custom INF file to call the WinUSB.sys driver.

In my code, I am using the UsbDevice.GetDeviceSelector method to return an AQS that can then be passed into DeviceInformation.FindAllAsync to begin communicating with the device in my app. I have confirmed that the device shows up in the device manager without any issues, and I have checked in the registry to ensure that it has an Interface GUID. I have a screenshot from USBViewer to show the configuration of the device. This method for finding and connecting with USB devices is from this MSDN example found here.

When I use the UsbDevice.GetDeviceSelector method, it returns a GUID that is not associated with this device. The GUID that it returns is actually associated with Lumia Phones (DEE824EF-729B-4A0E-9C14-B7117D33A817). Because of this, it does not find my device connected to the system.

To troubleshoot, I have both called the DeviceInformation.FindAllAsync with out any arguments to see if my device is listed, and it does find the device (amongst over 1000 other devices that have been connected ever to my machine). I then wrote a custom AQS string without the help of the GetDeviceSelector method, starting with just the GUID. Doing this returned 27 devices, but when I tried to add the VID and PID to this AQS string, nothing returned.

I have also made sure that the device that I want to use is listed in the app manifest by its appropriate VID and PID as this is required for a device with a Custom Class of 0xFF. I have used the Custom USB UWP device example and it can find the device, though it uses a completely different method with a device picker, which I will go to if needed, but this is not my desire as it makes that part of the app not as clean of a solution.

I have posted this question over in the MSDN forums here with more information, but I have not gotten a lot of engagement there. Any help would be appreciated. I know that I must be missing something simple.

Adam

private async void button_Click(object sender, RoutedEventArgs e) 
{
  //UInt32 vid = 0x04B4;
  //UInt32 pid = 0x00F0;

  UInt32 vid = uint.Parse(textBox1.Text, System.Globalization.NumberStyles.HexNumber);
  UInt32 pid = UInt32.Parse(textBox2.Text, System.Globalization.NumberStyles.HexNumber);
  Guid winusbInterfaceGuid = new Guid("a5dcbf10-6530-11d2-901f-00c04fb951ed");
  //string aqs = UsbDevice.GetDeviceSelector(vid, pid);
  string aqs = UsbDevice.GetDeviceSelector(winusbInterfaceGuid);



  var myDevices = await DeviceInformation.FindAllAsync(aqs, null);
  //var myDevices = await DeviceInformation.FindAllAsync();

  var myDevicesCount = myDevices.Count;

  if (myDevicesCount >= 1) 
  {
    textBlock2.Text = "Device Found";
  } else 
  {
    textBlock2.Text = "Searching";
    await Task.Delay(1000);
    textBlock2.Text = "looking for device";
  }
}
Septal answered 1/12, 2016 at 2:18 Comment(4)
Sorry that I could not add more than 2 links. I had two pictures to upload, but I was limited as a new user.Septal
Please try the newest CustomUsbDeviceAccess sample. It doesn't use a complete different method, it just use ` var osrFx2Selector = UsbDevice.GetDeviceSelector(OsrFx2.DeviceVid, OsrFx2.DevicePid);` for creating aqs. And then invoke a CreateWatcher method. Please compare your aqs with the official sample.Vilipend
As you said official sample can work well, means there is already a solution for you.Please check it and compare what's different with you.Vilipend
@Sunteen-MSFT I just checked the newest version, and it does not seem to work. I need to go and see if I have a local copy of the old version of the app to see if it still works. I even tried to change my VID/PID to match one of the VID/PIDs that was associated with the Mutt devices with no luck.Septal
G
0

just dropped you a mail asking about progress (I think, had to guess your mail address), but now it seems I found a solution myself. Please see my answer on UWP app cannot find/connect to USB device

In short, you have to create an inf for installing the winusb driver. I have no clue why, but that did the trick for me (and someone else, see Cannot create UsbDevice from DeviceInformation.Id)

Glassworker answered 12/12, 2016 at 10:27 Comment(1)
Wow, sorry, I thought that I would get a mail notification to replies to this thread, but I did not. I will take a look at what you posted. I did not get the email that you sent. You can find me on Twitter under the handle Aeroengineer1. I can send you a PM from there.Septal
L
0

The Guid DEE824EF-729B-4A0E-9C14-B7117D33A817 is actually the standard WinUSB Guid. I don't think it has anything to do with Lumia Phones. I don't know why it is not documented anywhere. I think that the Guid a5dcbf10-6530-11d2-901f-00c04fb951ed you specified is actually a red herring. I mistakenly used that as well, but it just led me down the garden path. It shows up USB interfaces, but I can't connect to them.

You might want to try this class https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Usb.Net.UWP/UWPUsbDevice.cs .

Here is how it gets the device:

    public async Task<IEnumerable<DeviceDefinition>> GetConnectedDeviceDefinitions(uint? vendorId, uint? productId)
    {
        var aqsFilter = "System.Devices.InterfaceClassGuid:=\"{DEE824EF-729B-4A0E-9C14-B7117D33A817}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND " + $" System.DeviceInterface.WinUsb.UsbVendorId:={vendorId.Value} AND System.DeviceInterface.WinUsb.UsbProductId:={productId.Value}";

        var deviceInformationCollection = await wde.DeviceInformation.FindAllAsync(aqsFilter).AsTask();

        //TODO: return the vid/pid if we can get it from the properties. Also read/write buffer size

        var deviceIds = deviceInformationCollection.Select(d => new DeviceDefinition { DeviceId = d.Id, DeviceType = DeviceType.Usb }).ToList();
        return deviceIds;
    }

This sample connects to a device and I think you'll be able to connect to the device in the same way:

        private static async Task InitializeTrezor()
        {
            //Register the factory for creating Usb devices. This only needs to be done once.
            UWPUsbDeviceFactory.Register();

            //Register the factory for creating Usb devices. This only needs to be done once.
            UWPHidDeviceFactory.Register();

            //Note: other custom device types could be added here

            //Define the types of devices to search for. This particular device can be connected to via USB, or Hid
            var deviceDefinitions = new List<DeviceDefinition>
            {
                new DeviceDefinition{ DeviceType= DeviceType.Hid, VendorId= 0x534C, ProductId=0x0001, Label="Trezor One Firmware 1.6.x" },
                new DeviceDefinition{ DeviceType= DeviceType.Usb, VendorId= 0x1209, ProductId=0x53C1, ReadBufferSize=64, WriteBufferSize=64, Label="Trezor One Firmware 1.7.x" },
                new DeviceDefinition{ DeviceType= DeviceType.Usb, VendorId= 0x1209, ProductId=0x53C0, ReadBufferSize=64, WriteBufferSize=64, Label="Model T" }
            };

            //Get the first available device and connect to it
            var devices = await DeviceManager.Current.GetDevices(deviceDefinitions);
            var trezorDevice = devices.FirstOrDefault();
            await trezorDevice.InitializeAsync();

            //Create a buffer with 3 bytes (initialize)
            var buffer = new byte[64];
            buffer[0] = 0x3f;
            buffer[1] = 0x23;
            buffer[2] = 0x23;

            //Write the data to the device
            await trezorDevice.WriteAsync(buffer);

            //Read the response
            var readBuffer = await trezorDevice.ReadAsync();
      }

If you connect to the device in this way, you'll get Windows classic, and Android support for free with Device.Net (https://github.com/MelbourneDeveloper/Device.Net)

Lintwhite answered 28/12, 2018 at 6:7 Comment(2)
Not much by way of documentation, but there is this - learn.microsoft.com/en-us/uwp/api/windows.devices.usb.usbdevice. All it has is an example "device instance path" which includes the DEE824EF-729B-4A0E-9C14-B7117D33A817 GUID.Fewness
Also interesting, that while I can see the DEE824EF-729B-4A0E-9C14-B7117D33A817 when I connect with USB debugging enabled in Developer options; I cannot see it when USB debugging is disabled. In both cases I do see A5DCBF10-6530-11D2-901F-00C04FB951ED.Fewness
V
0

With Device.net's DeviceManager.Current.GetDevices(deviceDefinitions) using .NET 5 I can't find any device connected to my win10, which can be easily selected by ManagementObjectSearcher:

public List<ManagementBaseObject> GetLogicalDevices()
{
   List<ManagementBaseObject> devices = new List<ManagementBaseObject>();
   ManagementObjectCollection collection;
   ManagementObjectSearcher seacher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM CIM_LogicalDevice");
   collection = seacher.Get();

   foreach (var device in collection)
   {
       devices.Add(device);
   }

   return devices;
}
Vo answered 29/1, 2021 at 5:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.