Daniel
Daniel

Reputation: 163

Send output to a device to change channel in Logitech mouse/keyboard

I have Logitech mouse and keyboard supporting switching between multiple devices. The feature I am missing is to simultaneously switch mouse AND keboard by running a command or a shortcut.

I would like to ask if it is possible to send an output to a mouse and keyboard to change it's channel? If so, could you guide me how to do that?

I have no experience in USB HID, but I used busdog tool to sniff output and I found that following code is send every time I press a key to change channel from the first to the second one.

Code:

10 03 41 04 71 8a 40

Afterwards I tried to use commandline tool called hidapitester to send the code to a keyboard hoping that it will change it's channel. Unfortunately without result.

$ hidapitester --vidpid 046D/C52B --list

046D/C52B: Logitech - USB Receiver
046D/C52B: Logitech - USB Receiver
046D/C52B: Logitech - USB Receiver
046D/C52B: Logitech - USB Receiver

Opening device, vid/pid: 0x046D/0xC52B
Closing device


$ hidapitester --vidpid 046D/C52B --open --length 7 --send-output 0x10 0x03 0x41 0x04 0x71 0x8a 0x40 --read-input

Opening device, vid/pid: 0x046D/0xC52B
Writing output report of 7-bytes...wrote -1 bytes:
 10 00 00 00 00 00 00
Reading 7-byte input report 0, 250 msec timeout...read -1 bytes:
Closing device

Update:

Below I am adding trace log after I press a key switching from first to second channel:

Id  Type                        Time        Length  Hex
24  In  (USB URB Function: 9)   0.000000    20      11 03 08 20 00 d2 01 00 00 00 00 00 00 00 00 00 00 00 00 00
29  R                           0.000377    20      11 03 08 20 00 d2 01 00 00 00 00 00 00 00 00 00 00 00 00 00
24  In  (USB URB Function: 9)   0.291648    7       10 03 41 04 71 8a 40
28  R                           0.000449    7       10 03 41 04 71 8a 40

Upvotes: 4

Views: 3651

Answers (2)

JL7
JL7

Reputation: 41

Thanks for this helpful post! Building on @Andy Blackman's post above:

I managed to get this working for my setup and wanted to post my findings in case it helps someone else with a similar setup:

Keyboard: Logitech Ergo K860

Mouse: Logitech MX Vertical

My use case is switching both my keyboard and mouse between two systems using a script. Both systems have a logitech unifying receiver which I seemed to have better luck with instead of bluetooth.


Here are the commands I used:

On my secondary system, I have a script to switch to my first system. The script runs the following commands: Swap to Channel 1 of Logitech Ergo K860 Keyboard: ./hidapitester --vidpid 046D:C52B --usage 0x0001 --usagePage 0xFF00 --open --length 7 --send-output "0x10,0x01,0x09,0x1c,0x00,0x00,0x00"

Swap to Channel 1 of MX Vertical Mouse: ./hidapitester --vidpid 046D:C52B --usage 0x0001 --usagePage 0xFF00 --open --length 7 --send-output "0x10,0x02,0x0c,0x1c,0x00,0x00,0x00"

Then on my first system, I have a script to switch to the secondary one: Swap to Channel 2 of Logitech Ergo K860 Keyboard: ./hidapitester --vidpid 046D:C52B --usage 0x0001 --usagePage 0xFF00 --open --length 7 --send-output "0x10,0x01,0x09,0x1c,0x01,0x00,0x00"

Swap to Channel 2 of MX Vertical Mouse: ./hidapitester --vidpid 046D:C52B --usage 0x0001 --usagePage 0xFF00 --open --length 7 --send-output "0x10,0x02,0x0c,0x1c,0x01,0x00,0x00"


Here's a rough breakdown of the anatomy of the --send-output part of the command (note the examples below are switching to channel 1):

Logitech Ergo K860

Header Receiver Slot ID Const/Magic Number Target Channel Padding Padding
0x10 0x01 0x09 0x1c 0x00 0x00 0x00

MX Vertical

Header Receiver Slot ID Const/Magic Number Target Channel Padding Padding
0x10 0x02 0x0c 0x1c 0x00 0x00 0x00

Some notes:

  • Receiver Slot: 1-based index that corresponds to the devices paired to the logitech unifying receiver. This will vary depending on your setup. Downloading logitech's unifying software might help if you need to check this. Or you could try brute forcing it since there are only a max of 6 devices that can be paired to a unifying reciever.
  • ID: Finding this was the time-consuming part for me. I think this varies depending on the model/type of the logitech device. I found this through trial and error by monitoring usb traffic. Note that the ID for the keyboard and mouse were different in my case.
  • Target Channel: 0-based index that corresponds to the channel you want the logitech device to be swapped to.
  • Const/Magic Number: Disclaimer: I'm not entirely sure what decides this part of the message, but for my case it was 0x1c.

Hope that helps! :)

Upvotes: 2

Andy Blackman
Andy Blackman

Reputation: 1315

The codes you captured are the result of switching (not actually the command to switch) - you need to use different codes to make it switch - as follows (Credit to @davidschreiber):

10 [device index] 08 10 [channel index] 00 00 00
  • First item must be 10
  • [Device Index] is 1-based - and depends on the order your devices were registered (so trial and error is needed)
  • 08 and 10 can actually vary in a wide range - I use 09 and 11 and that also seems to work!
  • [Channel Index] is 0-based - and relates directly to 1,2,3 on the Keyboard/Mouse

Additionally (certainly on windows) you need to specify the usage and usagePage parameters in hidapitester.

So this works for me - switching my Mouse (Device #1 = 0x01) onto Channel 3 (0x02)

hidapitester.exe --vidpid 046D:C52B --usage 1 --usagePage 0xFF00 --open --length 7 --send-output 0x10,0x01,0x09,0x11,0x02,0x00,0x00

You can find loads more amazingly useful info here: https://github.com/Logitech/logi_craft_sdk/issues/28

Upvotes: 4

Related Questions