Keybow and Windows 7 : device drivers are not installing

Hello.

I’ve got a newly built Keybow which appears to be working in general (boots, runs the demo colours through the keys, responds to the request for USB enumeration…) but the W’7 drivers are not being installed (so the poor Keybow’s button presses are being ignored by the PC). I’m using the keybow-firmware-0.0.4.zip downloaded from GitHub (and also tried earlier releases with the same results).

The Windows “Driver Software Installation” dialogue box lists five entries:

  • “USB Composite Device”
  • “Linux USB Ethernet/RNDIS Gadget #2
  • “Gadget Serial (COM49)”
  • “MIDI function”
  • “Keybow”
    but only the first and last of these are ticked “ready to use” (and as you can see from the COM port number I’ve had many a gadget plugged into this PC before now!).

An odd thing is that there isn’t any HID device showing up, even though the dump from running USBView under Windows does seem to list a HID interface descriptor (and gadget_hid.c is creating one).

Hopefully, I have just missed something obvious, like a keybow.inf file tucked away somewhere; failing that, if someone has a list of the driver files that are expected to be used then I could try some Device Manager brutality.

I have copied the USBView report to the bottom of this message; it is rather long but hopefully it’ll help (is there a way to upload something like this as an attachment?). I’ll have to dig about for an HDMI monitor to have a look at things from the PiZero’s side.

Anyone else got the Keybow going with W’7 or am I the last dinosaur here?

[Port3] : USB Composite Device

Device Power State: PowerDeviceD0

   ---===>Device Information<===---

English product name: “Keybow”

ConnectionStatus:
Current Config Value: 0x01 -> Device Bus Speed: High
Device Address: 0x01
Open Pipes: 7

      ===>Device Descriptor<===

bLength: 0x12
bDescriptorType: 0x01
bcdUSB: 0x0200
bDeviceClass: 0x00
*!*ERROR: device class should be Multi-interface Function 0xEF
When IAD descriptor is used
bDeviceSubClass: 0x00
*!*ERROR: device SubClass should be USB Common Sub Class 2
When IAD descriptor is used
bDeviceProtocol: 0x00
*!*ERROR: device Protocol should be USB IAD Protocol 1
When IAD descriptor is used
bMaxPacketSize0: 0x40 = (64) Bytes
idVendor: 0x1D6B = The Linux Foundation
idProduct: 0x0104
bcdDevice: 0x0001
iManufacturer: 0x01
English (United States) “Pimoroni”
iProduct: 0x02
English (United States) “Keybow”
iSerialNumber: 0x03
English (United States) “0123456789”
bNumConfigurations: 0x01

      ---===>Open Pipes<===---

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x82 -> Direction: IN - EndpointID: 2
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x000A = 1 transactions per microframe, 0x0A max bytes
bInterval: 0x09

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x01 -> Direction: OUT - EndpointID: 1
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0010 = 1 transactions per microframe, 0x10 max bytes
bInterval: 0x04

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x02 -> Direction: OUT - EndpointID: 2
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0010 = 1 transactions per microframe, 0x10 max bytes
bInterval: 0x04

      ===>Endpoint Descriptor<===

bLength: 0x09
bDescriptorType: 0x05
bEndpointAddress: 0x03 -> Direction: OUT - EndpointID: 3
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
wInterval: 0x0000
bSyncAddress: 0x00

      ===>Endpoint Descriptor<===

bLength: 0x09
bDescriptorType: 0x05
bEndpointAddress: 0x84 -> Direction: IN - EndpointID: 4
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
wInterval: 0x0000
bSyncAddress: 0x00

   ---===>Full Configuration Descriptor<===---

      ===>Configuration Descriptor<===

bLength: 0x09
bDescriptorType: 0x02
wTotalLength: 0x00CA -> Validated
bNumInterfaces: 0x05
bConfigurationValue: 0x01
iConfiguration: 0x04
English (United States) “1xHID”
bmAttributes: 0x80 -> Bus Powered
MaxPower: 0xFA = 500 mA

      ===>OTG Descriptor<===

bLength: 0x03
bDescriptorType: 0x09
bmAttributes: 0x03 -> SRP and HNP support

      ===>IAD Descriptor<===

bLength: 0x08
bDescriptorType: 0x0B
bFirstInterface: 0x00
bInterfaceCount: 0x02
bFunctionClass: 0x02 -> This is Communications (CDC Control) USB Device Interface Class
bFunctionSubClass: 0x02
bFunctionProtocol: 0x01
iFunction: 0x07
English (United States) “CDC Serial”

      ===>Interface Descriptor<===

bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x00
bAlternateSetting: 0x00
bNumEndpoints: 0x01
bInterfaceClass: 0x02 -> This is Communications (CDC Control) USB Device Interface Class
bInterfaceSubClass: 0x02
bInterfaceProtocol: 0x01
iInterface: 0x05
English (United States) “CDC Abstract Control Model (ACM)”
-> This is a Communications (CDC Control) USB Device Interface Class

      ===>Descriptor Hex Dump<===

bLength: 0x05
bDescriptorType: 0x24
05 24 00 10 01
-> This is a Communications (CDC Control) USB Device Interface Class

      ===>Descriptor Hex Dump<===

bLength: 0x05
bDescriptorType: 0x24
05 24 01 00 01
-> This is a Communications (CDC Control) USB Device Interface Class

      ===>Descriptor Hex Dump<===

bLength: 0x04
bDescriptorType: 0x24
04 24 02 02
-> This is a Communications (CDC Control) USB Device Interface Class

      ===>Descriptor Hex Dump<===

bLength: 0x05
bDescriptorType: 0x24
05 24 06 00 01

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x82 -> Direction: IN - EndpointID: 2
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x000A = 1 transactions per microframe, 0x0A max bytes
bInterval: 0x09

      ===>Interface Descriptor<===

bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x01
bAlternateSetting: 0x00
bNumEndpoints: 0x02
bInterfaceClass: 0x0A -> This is a CDC Data USB Device Interface Class
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x00
iInterface: 0x06
English (United States) “CDC ACM Data”

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x01 -> Direction: OUT - EndpointID: 1
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
bInterval: 0x00

      ===>Interface Descriptor<===

bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x02
bAlternateSetting: 0x00
bNumEndpoints: 0x02
bInterfaceClass: 0x03 -> HID Interface Class
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x01
iInterface: 0x09
English (United States) “HID Interface”

      ===>HID Descriptor<===

bLength: 0x09
bDescriptorType: 0x21
bcdHID: 0x0101
bCountryCode: 0x00
bNumDescriptors: 0x01
bDescriptorType: 0x22 (Report Descriptor)
wDescriptorLength: 0x006A

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0010 = 1 transactions per microframe, 0x10 max bytes
bInterval: 0x04

      ===>Endpoint Descriptor<===

bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x02 -> Direction: OUT - EndpointID: 2
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0010 = 1 transactions per microframe, 0x10 max bytes
bInterval: 0x04

      ===>Interface Descriptor<===

bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x03
bAlternateSetting: 0x00
bNumEndpoints: 0x00
bInterfaceClass: 0x01 -> Audio Interface Class
bInterfaceSubClass: 0x01 -> Audio Control Interface SubClass
bInterfaceProtocol: 0x00
iInterface: 0x0B
English (United States) “MIDI function”

      ===>Audio Control Interface Header Descriptor<===

bLength: 0x09
bDescriptorType: 0x24
bDescriptorSubtype: 0x01
bcdADC: 0x0100
wTotalLength: 0x0009
bInCollection: 0x01
baInterfaceNr[1]: 0x04

      ===>Interface Descriptor<===

bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x04
bAlternateSetting: 0x00
bNumEndpoints: 0x02
bInterfaceClass: 0x01 -> Audio Interface Class
bInterfaceSubClass: 0x03 -> MIDI Streaming Interface SubClass
bInterfaceProtocol: 0x00
iInterface: 0x00

      ===>Descriptor Hex Dump<===

bLength: 0x07
bDescriptorType: 0x24
07 24 01 00 01 25 00

      ===>Descriptor Hex Dump<===

bLength: 0x06
bDescriptorType: 0x24
06 24 02 02 01 00

      ===>Descriptor Hex Dump<===

bLength: 0x09
bDescriptorType: 0x24
09 24 03 01 02 01 01 01 00

      ===>Descriptor Hex Dump<===

bLength: 0x06
bDescriptorType: 0x24
06 24 02 01 03 00

      ===>Descriptor Hex Dump<===

bLength: 0x09
bDescriptorType: 0x24
09 24 03 02 04 01 03 01 00

      ===>Endpoint Descriptor<===

bLength: 0x09
bDescriptorType: 0x05
bEndpointAddress: 0x03 -> Direction: OUT - EndpointID: 3
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
wInterval: 0x0000
bSyncAddress: 0x00

      ===>Descriptor Hex Dump<===

bLength: 0x05
bDescriptorType: 0x25
05 25 01 01 03

      ===>Endpoint Descriptor<===

bLength: 0x09
bDescriptorType: 0x05
bEndpointAddress: 0x84 -> Direction: IN - EndpointID: 4
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0200 = 0x200 max bytes
wInterval: 0x0000
bSyncAddress: 0x00

      ===>Descriptor Hex Dump<===

bLength: 0x05
bDescriptorType: 0x25
05 25 01 01 02