logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

polling_rate.py (2833B)


  1. #!/usr/bin/env python3
  2. import usb
  3. USB_INTERFACE_CLASS_HID = 0x03
  4. def usb_device_spec(spec):
  5. major = spec >> 8
  6. minor = (spec >> 4) & 0xF
  7. return f"{major}.{minor}"
  8. def usb_device_speed(speed):
  9. if speed == 1:
  10. return "Low-speed"
  11. elif speed == 2:
  12. return "Full-speed"
  13. elif speed == 3:
  14. return "High-speed"
  15. elif speed == 4:
  16. return "SuperSpeed"
  17. elif speed == 5:
  18. return "SuperSpeed+"
  19. return "Speed unknown"
  20. def usb_hid_interface_subclass(subclass):
  21. if subclass == 0x00:
  22. return "None"
  23. elif subclass == 0x01:
  24. return "Boot"
  25. else:
  26. return f"Unknown (0x{subclass:02X})"
  27. def usb_hid_interface_protocol(subclass, protocol):
  28. if subclass == 0x00 and protocol == 0x00:
  29. return "None"
  30. elif subclass == 0x01:
  31. if protocol == 0x00:
  32. return "None"
  33. elif protocol == 0x01:
  34. return "Keyboard"
  35. elif protocol == 0x02:
  36. return "Mouse"
  37. return f"Unknown (0x{protocol:02X})"
  38. def usb_interface_polling_rate(speed, interval):
  39. if speed >= 3:
  40. return f"{interval * 125} μs ({8000 // interval} Hz)"
  41. else:
  42. return f"{interval} ms ({1000 // interval} Hz)"
  43. if __name__ == '__main__':
  44. devices = usb.core.find(find_all=True)
  45. for device in devices:
  46. try:
  47. configuration = device.get_active_configuration()
  48. except NotImplementedError:
  49. continue
  50. hid_interfaces = []
  51. for interface in configuration.interfaces():
  52. if interface.bInterfaceClass == USB_INTERFACE_CLASS_HID:
  53. hid_interfaces.append(interface)
  54. if len(hid_interfaces) > 0:
  55. print(f"{device.manufacturer} {device.product} ({device.idVendor:04X}:{device.idProduct:04X}:{device.bcdDevice:04X}), {usb_device_spec(device.bcdUSB)} {usb_device_speed(device.speed)}")
  56. for interface in hid_interfaces:
  57. print(f"└─ HID Interface {interface.bInterfaceNumber}")
  58. subclass = interface.bInterfaceSubClass
  59. protocol = interface.bInterfaceProtocol
  60. print(f" ├─ Subclass: {usb_hid_interface_subclass(subclass)}")
  61. print(f" ├─ Protocol: {usb_hid_interface_protocol(subclass, protocol)}")
  62. for endpoint in interface.endpoints():
  63. endpoint_address = endpoint.bEndpointAddress & 0xF
  64. endpoint_direction = "IN" if endpoint.bEndpointAddress & 0x80 else "OUT"
  65. print(f" └─ Endpoint {endpoint_address} {endpoint_direction}")
  66. print(f" ├─ Endpoint Size: {endpoint.wMaxPacketSize} bytes")
  67. print(f" └─ Polling Rate: {usb_interface_polling_rate(device.speed, endpoint.bInterval)}")