Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam.
Zastanawiam się czy ktoś próbował skonfigurować czwarty przycisk tytułowej myszy w debianie (lub innej dystrybucji). Sama mysz działa bez zarzutu, jednak producent w dziwny sposób załatwił sprawę obsługę przycisku.
Postaram się przybliżyć całe zagadnienie. Mysz jest bezprzewodowa więc do komputera podłączamy mini odbiornik usb, który jest w systemie wykrywany jako para urządzeń hid: klawiatura i mysz.
dmesg: [ 574.941008] input: A4TECH USB Device as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/input/input11 [ 574.941984] generic-usb 0003:09DA:054F.0007: input,hiddev0,hidraw2: USB HID v1.11 Keyboard [A4TECH USB Device] on usb-0000:00:1d.0-1.2/input0 [ 574.943164] input: A4TECH USB Device as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/input/input12 [ 574.943589] generic-usb 0003:09DA:054F.0008: input,hidraw3: USB HID v1.11 Mouse [A4TECH USB Device] on usb-0000:00:1d.0-1.2/input1 lsusb: Bus 002 Device 006: ID 09da:054f A4 Tech Co., Ltd
Mysz ma 3 przyciski (dwa standard + scroll) i jeden dodatkowy który w systemach Windows można konfigurować przy pomocy aplikacji 'sterownika'. Wciśnięcie przycisku bez owego sterownika w systemach MS skutkuje wysłaniem kombinacji "ctrl+rwww.win2.cn/g9" (zgaduję, że to wywołanie leci z tej nieistniejącej klawiatury). Powoduje to włączenie przeglądarki/zakładki www z adresem www.win2.cn/g9 , gdzie można znaleźć program dzięki któremu skonfigurujemy mysz. Sęk w tym, że wciśnięcie tego przycisku w linuksie skutkuje wysłaniem tej samej kombinacji klawiszy do systemu co jest tutaj bezużyteczne bo nie znajdziemy na tamtej stronie nic pod linuksa.
Macie jakąś radę, da się to jakoś obejść/ustawić żeby móc wykorzystać dodatkowy przycisk?
Druga sprawa, jak wyłączyć w systemie tą nadmiarową 'klawiaturę'?
Jej obecność utrudnia pisanie i testowanie softu. Przykład: python/pygame wykrywa tą 'klawiaturę' jako joystick przez co miesza zgłaszając nieistniejący kontroler.
Ostatnio edytowany przez lewd (2012-02-08 00:26:06)
Offline
Wyłączyć się nie da, bo to jednak jest w pełni sprawne urządzenie. Co więcej mógłbyś chcieć nią grać.
Skoro w linuksie odbierasz sygnał od tej klawiatury to powinno też dać się przypisać coś do tego.
Więc z racji iż jest to klawiatura to pod Xsem winno "xev" go jakoś wychwicić, jak to wygląda?
Opcjonalnie możesz dorzucić "lsusb -v" dla tego urządzenia "lsusb -vd 09da:054f"
Jeśli jest tam:
Report Descriptors:
** UNAVAILABLE **
Więc najciekawszej informacji nie ma...
Więc trzeba odbindować to urządzenie by uzyskać te informacje (niemalże programowo odłączyć je od komputera, tak więc nie działa [cieszyć się że to nie główna klawiatura])
dmesg | grep "input: A4TECH USB Device" # stąd łowi się te numerki z ech poniżej echo "2-1.2:1.0" > /sys/bus/usb/drivers/usbhid/unbind echo "2-1.2:1.1" > /sys/bus/usb/drivers/usbhid/unbind lsusb -vd 09da:054f echo "2-1.2:1.0" > /sys/bus/usb/drivers/usbhid/bind echo "2-1.2:1.1" > /sys/bus/usb/drivers/usbhid/bind
Widzę że moduł kernela "hid a4tech" nie zawiera nic dla Twojej myszy, więc tego można w ogóle nie brać pod uwagę (chyba żeby zasadzić tam jakiegoś haka, który zamieni ten sygnał z myszy na coś normalnego)
Kluczowe pytanie: ten przycisk ma działać:
a) pod konsolą
b) pod Xsem
c) pod konsolą i pod Xsem
d) nie chce tego przycisku
Offline
Witam.
Dzięki za odpowiedź i wskazówki.
Zacznę od odpowiedzi na kluczowe pytanie:
Wystarczy żeby przycisk działał w Xach. Jeśli jednak ma to się wiązać z obecnością tej przykrej klawiatury to wolę ją (i tym samym przycisk w myszy) całkowicie wyłączyć, bo zauważyłem że odbindowanie jej pomaga w kwestii domniemanego joysticka. Jeśli nie będzie innej rady to czy istnieje elegancki/debianowy sposób na nie bindowanie tej klawiatury podczas uruchamiania systemu czy pozostaje rc.local?
Wracając do tego co jak gdzie i kiedy:
standardowo xev po wciśnięciu dodatkowego przycisku myszy zwraca serie KeyPress/KeyRelease dla ciągu, o którym pisałem w poprzednim poście (ctrl + rwww...), a lsusb zgłasza wspomniany przez Ciebie "** UNAVAILABLE **" dla klawiatury i dla myszy
Po odbindowaniu rzekomej klawiatury xev milczy kiedy wciskam czwarty przycisk myszy.
Wklejam jeszcze lsusb po odbindowaniu klawy i myszy.
lsusb -vd 09da:054f Bus 002 Device 007: ID 09da:054f A4 Tech Co., Ltd Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x09da A4 Tech Co., Ltd idProduct 0x054f bcdDevice 1.02 iManufacturer 1 A4TECH iProduct 2 USB Device iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 59 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 1 Boot Interface Subclass bInterfaceProtocol 1 Keyboard iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 132 Report Descriptor: (length is 132) Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x06 ] 6 Keyboard Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x01 ] 1 Item(Global): Usage Page, data= [ 0x07 ] 7 Keyboard Item(Local ): Usage Minimum, data= [ 0xe0 ] 224 Control Left Item(Local ): Usage Maximum, data= [ 0xe7 ] 231 GUI Right Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0x08 ] 8 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x05 ] 5 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Usage Page, data= [ 0x08 ] 8 LEDs Item(Local ): Usage Minimum, data= [ 0x01 ] 1 NumLock Item(Local ): Usage Maximum, data= [ 0x05 ] 5 Kana Item(Main ): Output, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x03 ] 3 Item(Main ): Output, data= [ 0x01 ] 1 Constant Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Report Count, data= [ 0x0a ] 10 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xa4 0x00 ] 164 Item(Global): Usage Page, data= [ 0x07 ] 7 Keyboard Item(Local ): Usage Minimum, data= [ 0x00 ] 0 No Event Item(Local ): Usage Maximum, data= [ 0xa4 0x00 ] 164 ExSel Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x80 ] 128 System Control Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x02 ] 2 Item(Local ): Usage Minimum, data= [ 0x00 ] 0 Undefined Item(Local ): Usage Maximum, data= [ 0xb7 ] 183 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0xb7 0x00 ] 183 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x0c ] 12 Consumer Item(Local ): Usage, data= [ 0x01 ] 1 Consumer Control Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x03 ] 3 Item(Local ): Usage Minimum, data= [ 0x00 ] 0 Unassigned Item(Local ): Usage Maximum, data= [ 0x3c 0x02 ] 572 AC Format Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x3c 0x02 ] 572 Item(Global): Report Size, data= [ 0x10 ] 16 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x00 ] 0 Data Array Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0xa0 0xff ] 65440 (null) Item(Local ): Usage, data= [ 0xa5 ] 165 (null) Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x04 ] 4 Item(Local ): Usage, data= [ 0xa6 ] 166 (null) Item(Global): Logical Minimum, data= [ 0x80 ] 128 Item(Global): Logical Maximum, data= [ 0x7f ] 127 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x08 ] 8 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x000c 1x 12 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 1 Boot Interface Subclass bInterfaceProtocol 2 Mouse iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 87 Report Descriptor: (length is 87) Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x02 ] 2 Mouse Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Local ): Usage, data= [ 0x01 ] 1 Pointer Item(Main ): Collection, data= [ 0x00 ] 0 Physical Item(Global): Usage Page, data= [ 0x09 ] 9 Buttons Item(Local ): Usage Minimum, data= [ 0x01 ] 1 Button 1 (Primary) Item(Local ): Usage Maximum, data= [ 0x10 ] 16 (null) Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0x10 ] 16 Item(Main ): Input, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x30 ] 48 Direction-X Item(Local ): Usage, data= [ 0x31 ] 49 Direction-Y Item(Global): Logical Minimum, data= [ 0x01 0x80 ] 32769 Item(Global): Logical Maximum, data= [ 0xff 0x7f ] 32767 Item(Global): Report Size, data= [ 0x10 ] 16 Item(Global): Report Count, data= [ 0x02 ] 2 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage, data= [ 0x38 ] 56 Wheel Item(Global): Logical Minimum, data= [ 0x81 ] 129 Item(Global): Logical Maximum, data= [ 0x7f ] 127 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0x0c ] 12 Consumer Item(Local ): Usage, data= [ 0x38 0x02 ] 568 AC Pan Item(Global): Logical Minimum, data= [ 0x81 ] 129 Item(Global): Logical Maximum, data= [ 0x7f ] 127 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Item(Global): Usage Page, data= [ 0x0c ] 12 Consumer Item(Local ): Usage, data= [ 0x00 ] 0 Unassigned Item(Global): Logical Minimum, data= [ 0x80 ] 128 Item(Global): Logical Maximum, data= [ 0x7f ] 127 Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x08 ] 8 Item(Main ): Feature, data= [ 0xc0 ] 192 Data Array Absolute No_Wrap Linear Preferred_State Null_State Volatile Bitfield Item(Main ): End Collection, data=none Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 1 Device Status: 0x0002 (Bus Powered) Remote Wakeup Enabled
Offline
To może nie będziemy kombinować:
xmodmap -e "keycode 198 = f"
Z czego 198 to "keycode" do odczytania z "xev", a "f" to po prostu "f". Mapowanie klawiatury można podpatrzeć tu:
xmodmap -pk # albo -pke
xmodmap odpalać w odpalonej już sesji X (skrypty startowe użytkownika?)
PS. Jak do myszy to może XF86Copy lub XF86Paste (paste to chyba zazwyczaj przycisk rolki)?
Co do eleganckiego sposobu. Ja nie wiem czy te numerki z USB czasem się nie zmieniają jakoś. Być może będzie trzeba użyć finda i grepa. Ale chyba skrypty startowe to jedynie miejsce na taką operację.
Hmmm... Chcesz mieć klawiaturę w myszy, ale nie chcesz jej mieć... hmm... A gdyby zabrać jej prawa użytkownika?
PS 2. Cóż... Od dziś możesz mówić że masz bezprzewodową klawiaturę... Z aż jednym przyciskiem... (he he... ona ma jeszcze chyba wskaźnik NumLocka :))
Ostatnio edytowany przez NIC (2012-02-08 14:20:54)
Offline
Zaciąłem się wcześniej pisząc "ctrl + rwww"... chodziło oczywiście o kombinację "win + rwww..." (win + r w systemach MS przywołuje okno 'uruchom')
Mapowaniem niestety nic tu nie wskóram bo po wciśnięciu przycisku na myszy dzieje się coś takiego:
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312671, (522,-102), root:(1393,344),
state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312677, (522,-102), root:(1393,344),
state 0x40, keycode 27 (keysym 0x72, r), same_screen YES,
XLookupString gives 1 bytes: (72) "r"
XmbLookupString gives 1 bytes: (72) "r"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312683, (522,-102), root:(1393,344),
state 0x40, keycode 27 (keysym 0x72, r), same_screen YES,
XLookupString gives 1 bytes: (72) "r"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312689, (522,-102), root:(1393,344),
state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312754, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XmbLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312763, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312772, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XmbLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312780, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312790, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XmbLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312798, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312807, (522,-102), root:(1393,344),
state 0x0, keycode 60 (keysym 0x2e, period), same_screen YES,
XLookupString gives 1 bytes: (2e) "."
XmbLookupString gives 1 bytes: (2e) "."
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312816, (522,-102), root:(1393,344),
state 0x0, keycode 60 (keysym 0x2e, period), same_screen YES,
XLookupString gives 1 bytes: (2e) "."
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312826, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XmbLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312835, (522,-102), root:(1393,344),
state 0x0, keycode 25 (keysym 0x77, w), same_screen YES,
XLookupString gives 1 bytes: (77) "w"
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312843, (522,-102), root:(1393,344),
state 0x0, keycode 31 (keysym 0x69, i), same_screen YES,
XLookupString gives 1 bytes: (69) "i"
XmbLookupString gives 1 bytes: (69) "i"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312853, (522,-102), root:(1393,344),
state 0x0, keycode 31 (keysym 0x69, i), same_screen YES,
XLookupString gives 1 bytes: (69) "i"
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312861, (522,-102), root:(1393,344),
state 0x0, keycode 57 (keysym 0x6e, n), same_screen YES,
XLookupString gives 1 bytes: (6e) "n"
XmbLookupString gives 1 bytes: (6e) "n"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x4600001,
root 0x15a, subw 0x0, time 57312870, (522,-102), root:(1393,344),
state 0x0, keycode 57 (keysym 0x6e, n), same_screen YES,
XLookupString gives 1 bytes: (6e) "n"
XFilterEvent returns: False
...
...
...
i tak do końca sekwencji potrzebnej żeby powstało: (win + r)www.win2.cn/g9
Czyli dla przycisku w myszy nie ma osobnego keycode, tylko leci standardowa wiązanka z puli klawiatury. Pozostaje mi wyłączyć to na stałe bo niepotrzebne zamieszanie powoduje jako kontroler, który w dodatku jest kiepsko skalibrowany. Jeśli kiedyś ktoś z was zauważy, że pojazd, postać lub kursor w waszej grze czy programie porusza się bez waszego udziału - to być może ukryta klawiaturę masz w receiverze : )
Może kiedyś w wolnej chwili skrobnę mejla do producenta z zapytaniem co z tym fantem zrobić ale nie liczę na odpowiedz inna niż: jest to produkt dla systemów z rodziny Windows.
Dzięki za pomoc NIC.
Offline
Tak swoją drogą... Jeśli masz otwarty edytor tekstowy i naciśniesz ten przycisk to powinien ten tekst z przycisku pojawić się w edytorze :)
Czyli w sterowniku o A4Tech powinniśmy przechwycić tą całą sekwencję i zamienić na jakiś jeden konkretny keycode, tak? Mógłbym się w to zabawić, ale czy tak byłoby dobrze i Linus by się na to skusił? Bo to już takie jakby ingerowanie w sprzęt...
Nie masz czasem VirtualBoksa z Windowsem? Można by podpatrzeć komunikację. Być może owy sterownik do jednego przycisku wysyła coś do tej-klawiatury i ta zaczyna normalnie działać (może ustawia LED NumLocka lub LED Kanę)
Offline
Tak swoją drogą... Jeśli masz otwarty edytor tekstowy i naciśniesz ten przycisk to powinien ten tekst z przycisku pojawić się w edytorze :)
W edytorze, konsoli, polach edycji na www itp. Niestety ma to swoje złe strony, np. Blender niemal do każdego pojedyńczego klawisza ma przypisaną jakąś akcję i takie niepożądane 'makro' jest w stanie zmienić wiele rzeczy w projekcie nad, którym się pracuje.
Mam wirtualkę z Windowsem. Jeśli powiesz mi jak, to zbiorę odpowiednie dane. Ewentualnie sesja teamviewer/vnc też wchodzi w grę.
Offline
He he... Czyli naciskasz przez przypadek przycisk na myszce i z ręcznie robionej kuli robi Ci się kręgosłup :)
Ale do rzeczy: cała sztuczka polega na tym by mieć:
ls /dev/usbmon*
Jeśli tego nie ma to potrzeba moduły kernela jeśli się nie mylę (będziemy myśleć później, mam nadzieję że to jest)
Numerki oznaczają BUS number, który można zobaczyć dzięki "lsusb". Ważne by odpiąć (tzn. byle danych nie słały) zbędne urządzenia i samej myszy nie ruszać (trudne zadanie), by logi nie były zaśmiecone zbędnymi śmieciami.
Kolejny problem to taki że logi należałoby zebrać Wiresharkiem, który przez bibliotekę "libpcap", uruchomiony z roota (idziemy na łatwiznę) powinien wylistować te interfejsy USBmon na liście. Stąd wysnijować i podesłać plik *.pcap i już jakoś sobie to zdeszyfruję :)
Procedura:
1. Odłączyć odbiornik myszy z USB.
2. Włączyć Wiresharka do zbierania po USB. (CTRL+E ?)
3. Wsadzić odbiornik do USB.
4. Kliknąć: LEWY, LEWY, LEWY, PRAWY, PRAWY, PRAWY, PRZYCISK_TESTOWANY, PRZYCISK_TESTOWANY, , PRAWY, PRAWY, PRAWY, LEWY, LEWY, LEWY.
5. Włączyć maszynę wirtualną, która ma już ten sterownik zainstalowany.
6. Ponowić operację jak w punkcie 4.
7. Wyłączyć logowanie Wiresharka (CTRL+E ?)
Najważniejsze jest by... Nie ruszać tą myszą :) Bo zaspami to logi.
Nikt nie broni mieć drugiej myszy; by nie na tym samym USB bus.
Troszkę pracy przy tym jest, ale powinno ładnie przechwycić komunikację pod Windows. To pozwoli na dopisanie sterownika do jądra (w końcu to jeden przycisk, dużej filozofii tu być nie może).
PS. Wireshark oczywiście na Linuksie odpalany.
Pomocne linki:
http://www.wireshark.org/download.html
https://www.virtualbox.org/wiki/Downloads
http://download.virtualbox.org/virtualbox/4.1.8/Ora … .vbox-extpack (by mieć USB z Linuksa w maszynie; w szczególności trzeba wybrać ową mysz by się zbindowała w maszynie)
Ostatnio edytowany przez NIC (2012-02-10 12:18:00)
Offline
Niestety sterownik w wirtualce nie wykrywa urządzenia. Zainstalowałem extension pack do VirtualBoxa i uruchamiłem maszynę z włączonym kontrolerem USB 2.0 ale niestety bez zmian.
Offline
A pod inną nazwą nie ma jej czasem na liście wykrytych? Zobacz na obrazki tu:
http://www.amigib.cal24.pl/2010/03/19/jak-uruchomic-usb-w-virtualbox/ (na tym pierwszym widać ładnie że widzi są [choć na obrazku USB akurat jest zdeaktywowane]) [checkbox obok wpisu musi być zaznaczony]
Grupa "vboxusers" jest prawdopodobnie wymagana, więc sprawdź czy w niej jesteś (jeśli nie to po dodaniu zrób restart; z praktyki wiem, że trzeba też wszystkie sesje terminala zrestartować by virtualbox uruchomił się z tą grupą - czyli reset jest najefektywniejszą opcją)
A jak z innymi urządzeniami USB. Są?
Offline
Dodanie do grupy pomogło.
Plik z tym co udało się przechwycić: http://ompldr.org/vY3FvNw
Offline
Hmm... Pasjonująca lektura.
Zidentyfikowałem dodatkowy strumień z myszy (fizycznej), który podawany jest w strumieniu pseudoklawiatury, ale jest to dodatkowy strumień. Być może właśnie od jest rozpoznawany jako joystick w grze. Mógłbyś sprawdzić czy w grze jesteś w stanie przypisać: LEWY, PRAWY i ten nasz TESTOWY_PRZYCISK? Bo z tego strumienia wynika że w tym strumieniu zawsze obecne są właśnie te trzy przyciski, a zatem mamy Twój przycisk, 50% prac wykonane.
Do wyjaśnienia pozostaje kwestia jak wyłączyć ten ciąg ze zwykłej klawiatury. Windows to zrobił. Niestety w logach nie ma przy tym większych różnic... Poza:
1) Windows wysyła trzy identyczne SET REPORTy po sobie
2) Windows przy inicjacji urządzenia wysyła całą chmarę GET DESCRIPTORów, które są "Unknown", stąd są podejrzane, ale są to GETy więc raczej nie to zmienia stan urządzenia...
3) Windows co każdy przycisk myszy spamuje biedną myszkę GET DESCRIPTOrem, który zawsze jest taki sam (w punkcie drugim są to różne wartości)
Obstawiam więc a).
Możesz wypróbować to:
gcc hid-example.c -o h && ./h /dev/hidraw3
/* * Hidraw Userspace Example * * Copyright (c) 2010 Alan Ott <alan@signal11.us> * Copyright (c) 2010 Signal 11 Software * * The code may be used by anyone for any purpose, * and can serve as a starting point for developing * applications using hidraw. */ /* Linux */ #include <linux/types.h> #include <linux/input.h> #include <linux/hidraw.h> /* * Ugly hack to work around failing compilation on systems that don't * yet populate new version of hidraw.h to userspace. * * If you need this, please have your distro update the kernel headers. */ #ifndef HIDIOCSFEATURE #define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) #define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) #endif /* Unix */ #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> /* C */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> const char *bus_str(int bus); int main(int argc, char **argv) { int fd; int i, res, desc_size = 0; char buf[256]; struct hidraw_report_descriptor rpt_desc; struct hidraw_devinfo info; /* Open the Device with non-blocking reads. In real life, don't use a hard coded path; use libudev instead. */ // "/dev/hidraw0" fd = open(argv[1], O_RDWR|O_NONBLOCK); if (fd < 0) { perror("Unable to open device"); return 1; } memset(&rpt_desc, 0x0, sizeof(rpt_desc)); memset(&info, 0x0, sizeof(info)); memset(buf, 0x0, sizeof(buf)); /* Get Report Descriptor Size */ res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size); if (res < 0) perror("HIDIOCGRDESCSIZE"); else printf("Report Descriptor Size: %d\n", desc_size); /* Get Report Descriptor */ rpt_desc.size = desc_size; res = ioctl(fd, HIDIOCGRDESC, &rpt_desc); if (res < 0) { perror("HIDIOCGRDESC"); } else { printf("Report Descriptor:\n"); for (i = 0; i < rpt_desc.size; i++) printf("%hhx ", rpt_desc.value[i]); puts("\n"); } /* Get Raw Name */ res = ioctl(fd, HIDIOCGRAWNAME(256), buf); if (res < 0) perror("HIDIOCGRAWNAME"); else printf("Raw Name: %s\n", buf); /* Get Physical Location */ res = ioctl(fd, HIDIOCGRAWPHYS(256), buf); if (res < 0) perror("HIDIOCGRAWPHYS"); else printf("Raw Phys: %s\n", buf); /* Get Raw Info */ res = ioctl(fd, HIDIOCGRAWINFO, &info); if (res < 0) { perror("HIDIOCGRAWINFO"); } else { printf("Raw Info:\n"); printf("\tbustype: %d (%s)\n", info.bustype, bus_str(info.bustype)); printf("\tvendor: 0x%04hx\n", info.vendor); printf("\tproduct: 0x%04hx\n", info.product); } /* Send a Report to the Device */ buf[0] = 0x01; /* Report Number */ buf[1] = 0x00; res = write(fd, buf, 2); if (res < 0) { printf("Error: %d\n", errno); perror("write"); } else { printf("write() wrote %d bytes\n", res); } /* Get a report from the device */ res = read(fd, buf, 16); if (res < 0) { perror("read"); } else { printf("read() read %d bytes:\n\t", res); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } buf[0] = 0x01; /* Report Number */ buf[1] = 0x00; res = write(fd, buf, 2); if (res < 0) { printf("Error: %d\n", errno); perror("write"); } else { printf("write() wrote %d bytes\n", res); } /* Get a report from the device */ res = read(fd, buf, 16); if (res < 0) { perror("read"); } else { printf("read() read %d bytes:\n\t", res); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } buf[0] = 0x01; /* Report Number */ buf[1] = 0x00; res = write(fd, buf, 2); if (res < 0) { printf("Error: %d\n", errno); perror("write"); } else { printf("write() wrote %d bytes\n", res); } /* Get a report from the device */ res = read(fd, buf, 16); if (res < 0) { perror("read"); } else { printf("read() read %d bytes:\n\t", res); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } close(fd); return 0; } const char * bus_str(int bus) { switch (bus) { case BUS_USB: return "USB"; break; case BUS_HIL: return "HIL"; break; case BUS_BLUETOOTH: return "Bluetooth"; break; case BUS_VIRTUAL: return "Virtual"; break; default: return "Other"; break; } }
Gdzie "hidraw3" zastąp swoimi. Tym razem grzecznie przeleć przez wszystkie "ls /dev/hidraw*" (zasady tworzenia tych urządzeń są już niejasne dla mnie; chyba dynamicznie)
Tym razem tylko pod Linuksem bez zbierania logów:
0. wireshark
1. używasz xev by zobaczyć czy nasz ulubiony combos leci. Ma lecieć.
2. hidraw (ten programik)
3. i sprawdzasz czy teraz też leci. Dobrze będzie jak nie poleci. Ale osobiście widzę że to nie działa (co prawda zwraca success, ale sam wireshark nie rozpoznaje tej opcji, więc istnieje cień podejrzenia że nie zadziała; ale ramki idą poprawne w każdym bądź razie)
4. zrzuć log
Dzięki za ten pierwszy log. Nieomalże perfekcyjny :) Drugi też tak zrób :) (nie ruszać myszy :))
PS. Z tego co widzę... To Linux lepiej obsługuje to urządzenie niż Windows. Windows tam czarną magię wali, a na Linuksie jest czysto i schludnie.
Offline
Po krótkiej przerwie jestem z powrotem.
Log: http://www.sendspace.com/file/or0ppe
i jeszcze to co wypluwał skompilowany kod:
# ./h /dev/hidraw2 Report Descriptor Size: 87 Report Descriptor: 5 1 9 2 a1 1 9 1 a1 0 5 9 19 1 29 10 15 0 25 1 75 1 95 10 81 2 5 1 9 30 9 31 16 1 80 26 ff 7f 75 10 95 2 81 6 9 38 15 81 25 7f 75 8 95 1 81 6 5 c a 38 2 15 81 25 7f 75 8 95 1 81 6 c0 5 c 9 0 15 80 25 7f 75 8 95 8 b1 c0 c0 Raw Name: A4TECH USB Device Raw Phys: usb-0000:00:1d.0-1.2/input1 Raw Info: bustype: 3 (USB) vendor: 0x09da product: 0x054f write() wrote 2 bytes read: Resource temporarily unavailable write() wrote 2 bytes read: Resource temporarily unavailable write() wrote 2 bytes read: Resource temporarily unavailable # ./h /dev/hidraw3 Report Descriptor Size: 132 Report Descriptor: 5 1 9 6 a1 1 85 1 5 7 19 e0 29 e7 15 0 25 1 75 1 95 8 81 2 95 5 75 1 5 8 19 1 29 5 91 2 95 1 75 3 91 1 95 a 75 8 15 0 26 a4 0 5 7 19 0 2a a4 0 81 0 c0 5 1 9 80 a1 1 85 2 19 0 29 b7 15 0 26 b7 0 95 1 75 8 81 0 c0 5 c 9 1 a1 1 85 3 19 0 2a 3c 2 15 0 26 3c 2 75 10 95 1 81 0 c0 6 a0 ff 9 a5 a1 1 85 4 9 a6 15 80 25 7f 75 8 95 8 81 2 c0 Raw Name: A4TECH USB Device Raw Phys: usb-0000:00:1d.0-1.2/input0 Raw Info: bustype: 3 (USB) vendor: 0x09da product: 0x054f write() wrote 2 bytes read: Resource temporarily unavailable write() wrote 2 bytes read: Resource temporarily unavailable write() wrote 2 bytes read: Resource temporarily unavailable
scenariusz był taki:
wireshark
xev
mouse button X (sypało tym co zawsze)
hidraw2
mouse button X (sypało tym co zawsze)
hidraw3
mouse button X (sypało tym co zawsze)
zrzut loga
(odpuściłem hidraw0 i 1, bo to fizyczna klawiatura z przyciskami multimedialnym)
Offline
Super.
Z tym że coś tu się nie zgadza:
1. Wireshark # OK
2. 10s później naciskasz przyciskX i leci nasza combo-sekwencja # OK
3. 24 sekundy później jest użyty programik na "hidraw2" # OK
4. NIC # źle!
5. 2 sekundy później jest użyty programik na "hidraw3" # OK
6. 10 sekund później naciskasz przyciskX i leci nasza combo-sekwencja # OK/chyba...
Ad 4. Ale Ty pisałeś że sypało... Ale ja nic nie mam...
Może 2 sekundy są niewystarczające by ta mysz zdążyła ruszyć lub jest błąd w Wiresharku (a raczej w bibliotece do zbierania logów "libpcap")
Możesz ponowić operację ale tym razem po każdym hidrawie odczekać 10 sekund po czym kliknąć LEWY, PRZYCISK_X, PRAWY - ułatwi stwierdzenie co jest grane jeśli jakiś logów mi zabraknie znów.
A tak w ogóle - to dobry znak że logi znikają, bo taki jest cel, ale zniknęło za dużo, a ponoć zadziałało (a ma nie być tego combo tylko)
PS 1. Dobrze że opuszczasz zbędne hidrawy :)
PS 2. To co wypluwa ten programik jest mało ważne generalnie, grunt że chyba działa, jednakże te linki zaczynające się od "Raw " pozwalają stwierdzić czy właściwy hidraw atakujemy :)
A teraz bardzo ważne pytanie: jako użytkownik myszy z czwartym przyciskiem... co byś chciał by on robił? Może ustawić go jako "F13" (na klawiaturze takiego nie ma więc można ująć że jest to wolny przycisk do przypisania), a może jakaś konkretna funkcja (Jakieś "Paste"?).
Plan wojny o przycisk:
1. Wyłączyć combo (tak czy owak trzeba to zrobić...)
2. Rozszerzyć sterownik kernela A4Tech o Twoją mysz i przeforwardować owy przycisk jak normalny przycisk klawiatury (ewentualnie myszy).
A może to zły pomysł i wystarczy załadować moduł joysticka do kernela:
In the kernel configuration stage, you need to turn on USB Human Interface Device (HID) support in USB support and Joystick support in Input core support.
I powinny być urządzenia joysticka:
ls /dev/input/js*
# wskazówki z dokumentacji Linuksa które może pomogę naprowadzić Cię gdzieś
modprobe joydev
jstest /dev/js0 # inna ścieżka?
jstest /dev/input/js0
# http://en.gentoo-wiki.com/wiki/Joystick
# http://packages.debian.org/sid/jstest-gtk
Offline
Oczywiście, że jest joy w systemie i to nie byle jaki: 57 przycisków i 37 osi : ) Jednak żaden przycisk ani oś nie reagują na wciśnięcie klawisza myszy a do tego niemal wszystkie osie zgłaszają maksymalny wychył w jedna stronę (-32767), co z pewnością może powodować problemy w grach.
Zanim przygotuje kolejnego loga wyjaśnij mi tylko czy mam w jakiś sposób 'czyścić' efekt tego kodu do hidraw (przeładować jakiś moduł czy ewentualnie restart)?
Offline
Nie, myślę że nie. Dopóki przy pierwszym naciśnięciu leci to combo. (ma lecieć, jak nie to wtedy już faktycznie jakiś restart [odpiąć/wpiąć myszojoyturę :)])
To coś nie tak z tym joystrickiem... A że tak spytam, owy przechył w bok możesz przypisać w systemie jak normalny skrót klawiaturowy? (bida w domu u mnie, nic nie ma w sobie joysticka, to i nie wiem :))
PS. Jak w dmesgu rozpoznaje ten joystick?
Offline
Czy da się ten przechył jakoś przypisać nie wiem, ale skoro nie da się zmienić (przynajmniej na obecna chwilę) stanu tego przechyłu to byłby z tego wiecznie wciśnięty przycisk.
Co do tego jak bym chciał ten ten przycisk wykorzystać, jak najbardziej może być opcja F13 : )
Log: http://www.sendspace.com/file/e6dr2c
scenariusz taki sam jak poprzednio ze zmiana XMB na LMB XMB RMB
dmesg zgłasza tylko to:
[53843.211243] usb 2-1.2: new full-speed USB device number 7 using ehci_hcd [53843.305101] usb 2-1.2: New USB device found, idVendor=09da, idProduct=054f [53843.305107] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [53843.305112] usb 2-1.2: Product: USB Device [53843.305115] usb 2-1.2: Manufacturer: A4TECH [53843.307242] input: A4TECH USB Device as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/input/input13 [53843.308062] generic-usb 0003:09DA:054F.0009: input,hiddev0,hidraw2: USB HID v1.11 Keyboard [A4TECH USB Device] on usb-0000:00:1d.0-1.2/input0 [53843.309250] input: A4TECH USB Device as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/input/input14 [53843.309812] generic-usb 0003:09DA:054F.000A: input,hidraw3: USB HID v1.11 Mouse [A4TECH USB Device] on usb-0000:00:1d.0-1.2/input1
Jeśli Ci to pomoże to zawsze jeszcze można pohardkorzyć z usbip ; )
PS. dmesg nie zgłaszał w jawny sposób joya ale:
# ls -l /dev/input/by-id/ | grep js* lrwxrwxrwx 1 root root 6 lut 17 13:05 usb-A4TECH_USB_Device-kbd -> ../js0 # ls -l /dev/input/by-path/ | grep js* lrwxrwxrwx 1 root root 6 lut 17 13:05 pci-0000:00:1d.0-usb-0:1.2:1.0-kbd -> ../js0
Ostatnio edytowany przez lewd (2012-02-17 13:20:39)
Offline