Technologia Unifying to bardzo dobry pomysł firmy Logitech, która postanowiła ujednolicić odbiornik USB dla swoich urządzeń bezprzewodowych. Sprowadza się to do tego, że posiadając jedno lub więcej urządzeń (maksymalnie sześć) wykorzystujących tą technologię, nie musimy posiadać do nich osobnych odbiorników - oszczędzając tym samym porty USB. Jest to bardzo rozsądne i wygodne rozwiązanie, bowiem sam odbiornik jest miniaturowy, o którym bardzo szybko zapominamy, szczególnie jeśli wykorzystujemy do codziennej pracy laptopa.
Parowanie urządzeń zgodnych odbiornikiem Unifying

Chcąc mieć możliwość korzystania z jednego odbiornika przy więcej niż jednym urządzeniu, należy najpierw takie urządzenie sparować z odbiornikiem za pomocą specjalnego oprogramowania, dostarczonego przez producenta - niestety, jak to w naszym życiu bywa, o Linuksie zapomniano. Można to zrobić "na około" parując nowe urządzenie pod Windowsem (np. w wirtualnej maszynie lub zwykłej instalacji). My tego nie lubimy i poszukamy szybszego rozwiązania.
Jądro Linux 3.2 częściowo rozwiązuje problem
Przede wszystkim możemy poczekać na wydanie jądra w wersji 3.2, gdzie dodano pełną obsługę odbiorników Unifying (drivers/hid/hid-logitech-dj).
Device Drivers -> HID Devices -> Special HID Drivers

Moduł ten dodaje jedynie poprawną obsługę już sparowanych urządzeń i rozwiązuje problem podłączenia dwóch urządzeń tego samego typu, na przykład dwóch klawiatur. Moduł ten potrafi zatem rozdzielić dwie lub więcej klawiatur na wydzielone węzły /input/dev.
W starszych wersjach jądra <3.2 wszystkie klawiatury i myszy korzystające z tej technologii widoczne są jako pojedyncza warstwa HID - nie ma więc możliwości rozdzielenia jednej klawiatury np. do wprowadzania danych, a na drugiej do gier (np. w konfiguracjach typu Home Theater PC).
Zobaczmy co nam powie dmesg:
usb 5-1: new full-speed USB device number 2 using uhci_hcd
usb 5-1: New USB device found, idVendor=046d, idProduct=c52b
usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 5-1: Product: USB Receiver
usb 5-1: Manufacturer: Logitech
logitech-djreceiver 0003:046D:C52B.0003: hiddev0,hidraw0: USB HID v1.11 Device [Logitech USB Receiver] on usb-0000:00:1d.0-1/input2
input: Logitech Unifying Device. Wireless PID:1017 as /devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.2/0003:046D:C52B.0003/input/input10
logitech-djdevice 0003:046D:C52B.0004: input,hidraw1: USB HID v1.11 Mouse [Logitech Unifying Device. Wireless PID:1017] on usb-0000:00:1d.0-1:1
Jak widzimy, zostało określone jedno urządzenie, które w moim przypadku stanowi mysz Logitech Anywhere MX. Nie odnaleziono klawiatury Wireless Illuminated Keyboard K800, ponieważ nie zostało ono jeszcze sparowane z odbiornikiem pochodzącym z zestawu z myszką.
Parowanie nowych urządzeń pod Linuksem?
No dobrze, a jak sparować nowe urządzenia? Przecież nie będziemy sprzęgali do tego zadania Windowsa! W tym celu możemy posłużyć się programem pairing-tool.c autostwa Benjamina Tissoiresa:
/*
* Copyright 2011 Benjamin Tissoires <benjamin.tissoi...@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/input.h>
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#define USB_VENDOR_ID_LOGITECH (__u32)0x046d
#define USB_DEVICE_ID_UNIFYING_RECEIVER (__s16)0xc52b
#define USB_DEVICE_ID_UNIFYING_RECEIVER_2 (__s16)0xc532
int main(int argc, char **argv)
{
int fd;
int res;
struct hidraw_devinfo info;
char magic_sequence[] = {0x10, 0xFF, 0x80, 0xB2, 0x01, 0x00, 0x00};
if (argc == 1) {
errno = EINVAL;
perror("No hidraw device given");
return 1;
}
/* Open the Device with non-blocking reads. */
fd = open(argv[1], O_RDWR|O_NONBLOCK);
if (fd < 0) {
perror("Unable to open device");
return 1;
}
/* Get Raw Info */
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("error while getting info from device");
} else {
if (info.bustype != BUS_USB ||
info.vendor != USB_VENDOR_ID_LOGITECH ||
(info.product != USB_DEVICE_ID_UNIFYING_RECEIVER &&
info.product != USB_DEVICE_ID_UNIFYING_RECEIVER_2)) {
errno = EPERM;
perror("The given device is not a Logitech "
"Unifying Receiver");
return 1;
}
}
/* Send the magic sequence to the Device */
res = write(fd, magic_sequence, sizeof(magic_sequence));
if (res < 0) {
perror("write");
} else if (res == sizeof(magic_sequence)) {
printf("The receiver is ready to pair a new device.\n"
"Switch your device on to pair it.\n");
} else {
errno = ENOMEM;
printf("write: %d were written instead of %ld.\n", res
,
sizeof(magic_sequence));
perror("write");
}
close(fd);
return 0;
}
Wystarczy skompilować i uruchomić gotowy program, wskazując odpowiednią ścieżkę urządzenia hidraw:
bash-4.1# gcc -o pairing_tool pairing_tool.c
bash-4.1# ./pairing_tool /dev/hidraw2
The receiver is ready to pair a new device.
Switch your device on to pair it.
Odbiornik jest teraz gotowy do sparowania z nowym urządzeniem, które należy teraz włączyć. I tyle :) Rzućmy jeszcze raz okiem na wynik dmesg:
usb 5-1: new full-speed USB device number 2 using uhci_hcd
usb 5-1: New USB device found, idVendor=046d, idProduct=c52b
usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 5-1: Product: USB Receiver
usb 5-1: Manufacturer: Logitech
logitech-djreceiver 0003:046D:C52B.0003: hiddev0,hidraw0: USB HID v1.11 Device [Logitech USB Receiver] on usb-0000:00:1d.0-1/input2
input: Logitech Unifying Device. Wireless PID:1017 as /devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.2/0003:046D:C52B.0003/input/input10
logitech-djdevice 0003:046D:C52B.0004: input,hidraw1: USB HID v1.11 Mouse [Logitech Unifying Device. Wireless PID:1017] on usb-0000:00:1d.0-1:1
input: Logitech Unifying Device. Wireless PID:2010 as /devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.2/0003:046D:C52B.0003/input/input11
logitech-djdevice 0003:046D:C52B.0005: input,hidraw2: USB HID v1.11 Keyboard [Logitech Unifying Device. Wireless PID:2010] on usb-0000:00:1d.0-1:2
Jeszcze dla pewności wyniki polecenia xinput:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=13 [slave pointer (2)]
⎜ ↳ Logitech Unifying Device. Wireless PID:2010 id=11 [slave pointer (2)]
⎜ ↳ Logitech Unifying Device. Wireless PID:1017 id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
Co jeszcze?
Oczywiście, aby sparować nowe urządzenia nie potrzebujemy jądra 3.2. Program doskonale działa również z starszymi jego wersjami, gdyż służy jedynie do przygotowania odbiornika do parowania z nowym urządzeniem. Posiadanie wersji jądra 3.2 wiąże się jedynie z udogodnieniami, gdybyśmy chcieli posiadać więcej niż jedną klawiaturę lub myszkę z naciskiem na ich rozróżnienie w systemie.
Program nie pozwala jednak na usunięcie urządzenia z odbiornika. Ale to w sumie mało istotne, gdyż taka funkcja powinna zostać niedługo dopisana.
Skomentuj
Polski typograficzny układ klawiatury
tron / 06 lut 2012 / 12:53
około 2 godzin temu.
Ja dla swoich prywatnych celów chcę zrobić układ, w którym "sz", "cz", "rz" będą miały daszki, podobnie jak w języku ...