Reputation: 163
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
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):
Header | Receiver Slot | ID | Const/Magic Number | Target Channel | Padding | Padding |
---|---|---|---|---|---|---|
0x10 | 0x01 | 0x09 | 0x1c | 0x00 | 0x00 | 0x00 |
Header | Receiver Slot | ID | Const/Magic Number | Target Channel | Padding | Padding |
---|---|---|---|---|---|---|
0x10 | 0x02 | 0x0c | 0x1c | 0x00 | 0x00 | 0x00 |
Some notes:
Hope that helps! :)
Upvotes: 2
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
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