Keychron M6 8K mouse misbehaving on KM switch

KVM Model:

USW-KM314, 4-Port KM Switch with USB 3.2 Gen 1 Mouse Roaming Function

USB Interface (5-gigabit or 10-gigbit):

5-gigabit


Problem:

Keychron M6 8K mouse doesn’t move at all when plugged into the any of the 3 console ports, with the wireless dongle or wired USB. When plugged into the 1 non-console non-roaming port, it works, but obviously I lose roaming.

Other Notes:

Mouse works fine otherwise, wireless or wired directly on 2 different apple silicon Macs.

Are you using any software with the mouse? Hid is driverless by nature so any driver software could mess with it. The KVM is very strictly HID with a lot of composite devices being incompatible. I.e. a basic dell mouse would work

No software, just took it out of the box and plugged it into the KM first thing. I did check after with Keychron Launcher that the latest 1.0.2 firmware was already on my mouse.

Other mice wireless dongles work no problem, Logitech and Glorious. A keychron Q10 Max keyboard works no problem in the same KM.

@Level1_Amber are you able to share any updates on this?

Hmmm. I don’t think I have a solution to this. Some mice are just not going to be compatible. If it reads as a composite device instead of just a HID mouse there’s a good chance it’s just not going to work. Feel free to place a ticket if you’d like to inquire about a return.

Have you had any reports about this device working to address the composite-device problem, by flashing HID remapper onto it?

I did check and the mouse shows up as 5 separate USB devices in MacOS.

Hmmm no I’m not familiar with this at all.

@wendell will this work?

Since the M6 works normally when connected directly to both Macs, I’d suspect a compatibility issue with the KM314’s mouse-roaming/console ports rather than the mouse itself. I’d check for a firmware update for the KM switch and test the mouse at a lower polling rate, such as 1KHz, since 8KHz mice can sometimes behave unexpectedly through USB hubs or KVMs.

lmk results of this

Polling rate of 1K or 500 makes no difference, just tried.

I’m not sure why it would, TBH, since the polling rate change doesn’t make the mouse a normal USB-HID device and deactivate the other 4 USB devices from it.

Hm, try using 1k and also having your pc forget the USB:

This is the command in MacOS and its output to show you the 5 USB devices that show up when the mouse is plugged into the non-roaming port of the KM.

ioreg -r -n "Keychron M6 8K" -l -w0 | grep -E '"(USB Product Name|idVendor|idProduct|bDeviceClass|bInterfaceNumber|bInterfaceClass|bInterfaceSubClass|bInterfaceProtocol)"'
  |   "idProduct" = 53321
  |   "bDeviceClass" = 0
  |   "USB Product Name" = "Keychron M6 8K"
  |   "idVendor" = 13364
  |     "bDeviceClass" = 0
  | |   "bInterfaceProtocol" = 2
  | |   "idProduct" = 53321
  | |   "USB Product Name" = "Keychron M6 8K"
  | |   "bInterfaceClass" = 3
  | |   "bInterfaceSubClass" = 1
  | |   "bInterfaceNumber" = 0
  | |   "idVendor" = 13364
  |   |   "IOMatchedPersonality" = {"IOClass"="AppleUserHIDDevice","CFBundleIdentifier"="com.apple.AppleUserHIDDrivers","IOProviderClass"="IOUSBHostInterface","IOUserServerCDHash"="802766ab6c29c911b8780673ed6c603f5a41da4f","IOProbeScore"=1,"bInterfaceSubClass"=1,"IOUserServerName"="com.apple.driverkit.AppleUserHIDDrivers","HIDDefaultBehavior"="","kOSBundleDextUniqueIdentifier"=<b796d15d9354eae826f370c78da5a69a0107352f2c064353231d0efec890df26>,"CFBundleIdentifierKernel"="com.apple.iokit.IOHIDFamily","IOUserServerOneProcess"=Yes,"bInterfaceClass"=3,"IOUserClass"="AppleUserUSBHostHIDDevice"}
  |   |   "bInterfaceSubClass" = 1
  |   |   "bInterfaceClass" = 3
  | |   "bInterfaceProtocol" = 1
  | |   "idProduct" = 53321
  | |   "USB Product Name" = "Keychron M6 8K"
  | |   "bInterfaceClass" = 3
  | |   "bInterfaceSubClass" = 1
  | |   "bInterfaceNumber" = 1
  | |   "idVendor" = 13364
  |   |   "bInterfaceProtocol" = 1
  |   |   "IOMatchedPersonality" = {"IOClass"="AppleUserHIDDevice","CFBundleIdentifier"="com.apple.AppleUserHIDDrivers","IOProviderClass"="IOUSBHostInterface","IOUserServerCDHash"="802766ab6c29c911b8780673ed6c603f5a41da4f","IOProbeScore"=1,"bInterfaceSubClass"=1,"IOUserServerName"="com.apple.driverkit.AppleUserHIDDrivers","HIDDefaultBehavior"="","kOSBundleDextUniqueIdentifier"=<b796d15d9354eae826f370c78da5a69a0107352f2c064353231d0efec890df26>,"bInterfaceProtocol"=1,"CFBundleIdentifierKernel"="com.apple.iokit.IOHIDFamily","IOUserServerOneProcess"=Yes,"bInterfaceClass"=3,"IOUserClass"="AppleUserUSBHostHIDDevice"}
  |   |   "bInterfaceSubClass" = 1
  |   |   "bInterfaceClass" = 3
  | |   "bInterfaceProtocol" = 0
  | |   "idProduct" = 53321
  | |   "USB Product Name" = "Keychron M6 8K"
  | |   "bInterfaceClass" = 3
  | |   "bInterfaceSubClass" = 0
  | |   "bInterfaceNumber" = 2
  | |   "idVendor" = 13364
  |   |   "IOMatchedPersonality" = {"IOClass"="AppleUserHIDDevice","CFBundleIdentifier"="com.apple.AppleUserHIDDrivers","IOProviderClass"="IOUSBHostInterface","IOUserServerCDHash"="802766ab6c29c911b8780673ed6c603f5a41da4f","IOProbeScore"=1,"bInterfaceSubClass"=0,"IOUserServerName"="com.apple.driverkit.AppleUserHIDDrivers","HIDDefaultBehavior"="","kOSBundleDextUniqueIdentifier"=<b796d15d9354eae826f370c78da5a69a0107352f2c064353231d0efec890df26>,"CFBundleIdentifierKernel"="com.apple.iokit.IOHIDFamily","IOUserServerOneProcess"=Yes,"bInterfaceClass"=3,"IOUserClass"="AppleUserUSBHostHIDDevice"}
  |   |   "bInterfaceSubClass" = 0
  |   |   "bInterfaceClass" = 3
  | |   "bInterfaceProtocol" = 0
  | |   "idProduct" = 53321
  | |   "USB Product Name" = "Keychron M6 8K"
  | |   "bInterfaceClass" = 3
  | |   "bInterfaceSubClass" = 0
  | |   "bInterfaceNumber" = 3
  | |   "idVendor" = 13364
  |   |   "IOMatchedPersonality" = {"IOClass"="AppleUserHIDDevice","CFBundleIdentifier"="com.apple.AppleUserHIDDrivers","IOProviderClass"="IOUSBHostInterface","IOUserServerCDHash"="802766ab6c29c911b8780673ed6c603f5a41da4f","IOProbeScore"=1,"bInterfaceSubClass"=0,"IOUserServerName"="com.apple.driverkit.AppleUserHIDDrivers","HIDDefaultBehavior"="","kOSBundleDextUniqueIdentifier"=<b796d15d9354eae826f370c78da5a69a0107352f2c064353231d0efec890df26>,"CFBundleIdentifierKernel"="com.apple.iokit.IOHIDFamily","IOUserServerOneProcess"=Yes,"bInterfaceClass"=3,"IOUserClass"="AppleUserUSBHostHIDDevice"}
  |   |   "bInterfaceSubClass" = 0
  |   |   "bInterfaceClass" = 3
  | |   "bInterfaceProtocol" = 0
  | |   "idProduct" = 53321
  | |   "USB Product Name" = "Keychron M6 8K"
  | |   "bInterfaceClass" = 3
  | |   "bInterfaceSubClass" = 0
  | |   "bInterfaceNumber" = 4
  | |   "idVendor" = 13364
  |   |   "IOMatchedPersonality" = {"IOClass"="AppleUserHIDDevice","CFBundleIdentifier"="com.apple.AppleUserHIDDrivers","IOProviderClass"="IOUSBHostInterface","IOUserServerCDHash"="802766ab6c29c911b8780673ed6c603f5a41da4f","IOProbeScore"=1,"bInterfaceSubClass"=0,"IOUserServerName"="com.apple.driverkit.AppleUserHIDDrivers","HIDDefaultBehavior"="","kOSBundleDextUniqueIdentifier"=<b796d15d9354eae826f370c78da5a69a0107352f2c064353231d0efec890df26>,"CFBundleIdentifierKernel"="com.apple.iokit.IOHIDFamily","IOUserServerOneProcess"=Yes,"bInterfaceClass"=3,"IOUserClass"="AppleUserUSBHostHIDDevice"}
  |   |   "bInterfaceSubClass" = 0
  |   |   "bInterfaceClass" = 3

@wendell anything we’re missing on getting it to work, or is this mouse incompatible?

So if you flash a custom firmware on it that is 4khz but just the one hid device, and the hid device has to be one of the first 4 slots in the composite device, it should work for mouse roam.

The mouse will work fine in not-mouse-roam mode via the other usb ports since its a more complex hid device, but it’s too far of a bridge to cross to ask the micro in the kvm to be able to understand this device and translate between it and the absolute co-ordinate system needed for mouse roaming to actually work.

I’m pretty sure an LLM could customize the firmware with the key things: normal hid mouse protocol, first 4 slots in the composite device, turn as much other stuff off as possible to simplify the mouse.

IIRC I tested up to 4khz when we were first working on these and 4khz should work fine however if you have a device that is 250hz or 500hz and one device that is 8k that can be problematic. Ideally all the devices are the same polling rate or within 25% of each other for the polling rate.

Thank you for providing more detail. Since there is no custom firmware available yet, will this work as an inbetween? Adafruit Feather RP2040 with USB Type A Host