Joystick with keyboard, mouse and joystick endpoints disconnects after 3-4 seconds

From: Jan Mikkelsen <janm_at_transactionware.com>
Date: Tue, 18 Jan 2022 15:21:25 UTC
Hi,

When attaching an APEM VM Desktop joystick, https://www.apem.com/int/vm-desktop-93.html, to a 12.2 system, I get this sequence of events:

ugen0.10: <CH Products VM Desktop> at usbus0
uhid0 numa-domain 0 on uhub2
uhid0: <VM Joystick Interface> on usbus0
uhid1 numa-domain 0 on uhub2
uhid1: <VM Keyboard Interface> on usbus0
uhid2 numa-domain 0 on uhub2
uhid2: <VM Mouse Interface> on usbus0
ugen0.10: <CH Products VM Desktop> at usbus0 (disconnected)
uhid0: at uhub2, port 5, addr 19 (disconnected)
uhid0: detached
uhid1: at uhub2, port 5, addr 19 (disconnected)
uhid1: detached
uhid2: at uhub2, port 5, addr 19 (disconnected)
uhid2: detached

The disconnection happens about 3-4 seconds after the attachment completes.

The device has three endpoints: A mouse, a keyboard and a joystick. I have added quirks to have ums and ukbd ignore the device, so that uhid attaches. I believe that mouse and keyboard endpoints on the same device are not currently supported.

The output from “usbconfig dump_all_desc” is shown below.

Any ideas on where to look to resolve this?

Thanks,

Jan M.


ugen0.10: <CH Products VM Desktop> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (500mA)

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0200 
  bDeviceClass = 0x0000  <Probed by interface class>
  bDeviceSubClass = 0x0000 
  bDeviceProtocol = 0x0000 
  bMaxPacketSize0 = 0x0008 
  idVendor = 0x068e 
  idProduct = 0x0064 
  bcdDevice = 0x0200 
  iManufacturer = 0x0001  <CH Products>
  iProduct = 0x0002  <VM Desktop>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001 

 Configuration index 0

    bLength = 0x0009 
    bDescriptorType = 0x0002 
    wTotalLength = 0x005b 
    bNumInterfaces = 0x0003 
    bConfigurationValue = 0x0001 
    iConfiguration = 0x0000  <no string>
    bmAttributes = 0x0080 
    bMaxPower = 0x00fa 

    Interface 0
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0000 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0002 
      bInterfaceClass = 0x0003  <HID device>
      bInterfaceSubClass = 0x0000 
      bInterfaceProtocol = 0x0000 
      iInterface = 0x0005  <VM Joystick Interface>

      Additional Descriptor

      bLength = 0x09
      bDescriptorType = 0x21
      bDescriptorSubType = 0x11
       RAW dump: 
       0x00 | 0x09, 0x21, 0x11, 0x01, 0x21, 0x01, 0x22, 0x4b, 
       0x08 | 0x00

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0082  <IN>
        bmAttributes = 0x0003  <INTERRUPT>
        wMaxPacketSize = 0x0040 
        bInterval = 0x000a 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 1
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0001  <OUT>
        bmAttributes = 0x0003  <INTERRUPT>
        wMaxPacketSize = 0x0040 
        bInterval = 0x000a 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 


    Interface 1
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0001 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0001 
      bInterfaceClass = 0x0003  <HID device>
      bInterfaceSubClass = 0x0000 
      bInterfaceProtocol = 0x0000 
      iInterface = 0x0004  <VM Keyboard Interface>

      Additional Descriptor

      bLength = 0x09
      bDescriptorType = 0x21
      bDescriptorSubType = 0x11
       RAW dump: 
       0x00 | 0x09, 0x21, 0x11, 0x01, 0x21, 0x01, 0x22, 0x3f, 
       0x08 | 0x00

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0083  <IN>
        bmAttributes = 0x0003  <INTERRUPT>
        wMaxPacketSize = 0x0008 
        bInterval = 0x000a 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 


    Interface 2
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0002 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0001 
      bInterfaceClass = 0x0003  <HID device>
      bInterfaceSubClass = 0x0000 
      bInterfaceProtocol = 0x0000 
      iInterface = 0x0003  <VM Mouse Interface>

      Additional Descriptor

      bLength = 0x09
      bDescriptorType = 0x21
      bDescriptorSubType = 0x11
       RAW dump: 
       0x00 | 0x09, 0x21, 0x11, 0x01, 0x21, 0x01, 0x22, 0x34, 
       0x08 | 0x00

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0084  <IN>
        bmAttributes = 0x0003  <INTERRUPT>
        wMaxPacketSize = 0x0008 
        bInterval = 0x000a 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000