logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Przejściówka USB do PC: modyfikacja zdarzeń klawiszy bez utraty funkcji klawiatury

prokopcio 19 Wrz 2025 21:15 855 20
  • #1 21694996
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Potrzebuję urządzenia "przejściówki USB" przez którą chcę podłączyć klawiaturę do PC.
    Zadanie przejściówki to modyfikacja lub/i generowanie zdarzeń klawiszy ( Press / Release ) na podstawie analizy rzeczywiście wciskanych.
    Nie może to być emulator klawiatury z podłączoną klawiaturą ponieważ KAŻDA/DOWOLNA klawiatura powinna być widziana w systemie identycznie jakby była podłączona bezpośrednio.
    czyli może być nadal zarządzana przez oprogramowanie producenta , aktualizowana, sterowanie podświetlanie czy inne bajery.

    To co ja chcę uzyskać to np. jeśli na klawiaturze wcisnę X to do PC dotrze "hello" ( wciśnięto h, Puszczono h, Wciśnięto e, puszczono e.... ) a po zwolnieniu X wyśle w taki sposób " world".

    Nie wiem jak się do tego zabrać inaczej niż przez emulację klawiatury co pozbawia zaawansowaną komunikację PC->Klawiatura.

    Jakieś pomysły ?
    Na gotowych platformach bym zaczął.
    Próbowałem ProxyUsb na płytce BBB z linuxem ale poza modyfikacją klawiszy nie potrafiłęm generować "własnych zdarzeń" , jedynie modyfikować te lecące z klawiatury do PC.

    Mogę też zlecić.
  • #2 21695095
    megao
    Poziom 25  
    Posty: 690
    Pomógł: 66
    Ocena: 90
    prokopcio napisał:
    To co ja chcę uzyskać to np. jeśli na klawiaturze wcisnę X to do PC dotrze "hello" ( wciśnięto h, Puszczono h, Wciśnięto e, puszczono e.... ) a po zwolnieniu X wyśle w taki sposób " world".

    Może wystarczy aplikacja AutoHotkey? Prostym skryptem zrealizujesz tego typu procedury.
  • #3 21695180
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    >>21695095
    Niestety to musi być sprzęt a nie soft ponieważ będzie używane również z urządzeniami innymi niż PC.
  • #4 21695465
    andrzejlisek
    Poziom 32  
    Posty: 3637
    Pomógł: 82
    Ocena: 705
    Nie wiem, czy na USB to da się zrobić na podobnej zasadzie, ale na PS/2 najprawdopodobniej tak bez większego trudu:

    Najpierw taka przejściówka i dowolna klawiatura PS/2
    https://www.mediaexpert.pl/komputery-i-tablet...m?gad_source=1&gad_campaignid=21498584075
    https://www.mediaexpert.pl/komputery-i-tablet...m?gad_source=1&gad_campaignid=21498584075

    Twoje urządzenie (może oczywiście wykorzystywać Arduino, czy nawet Raspberry Pi) powinno działać, ze ono tylko podsłuchuje, co dzieje się na linii, albo ewentualnie z jednej strony odczytuje sygnał i z drugiej strony wypuszcza go tak, jak jest. Siłą rzeczy, będzie tylko milisekundowe opóźnienie, ale na 99% nie będzie to miało żadnego wpływu. W ten sposób zrealizujesz założenie "to nie może być emulator, musi bezpośrednio przenosić sygnały". Twoje urządzenie, na podstawie odebranych sygnałów, wykryje naciśnięcie pewnych kombinacji i wyemituje sygnał odpowiadający temu, co ma się zadziać, czyli symulacja naciśnięć klawiszy "w odpowiedzi" na daną kombinację.

    Być może ten pomysł da się przenieść na USB?
  • #5 21695578
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38673
    Pomógł: 3162
    Ocena: 6426
    Komunikacja USB jest dwukierunkowa, to nie takie proste jak w PS/2 (choć formalnie tam też jest dwukierunkowa), gdzie łapiesz sobie ramki i albo je powtarzasz, albo modyfikujesz. Ramki sa transmitowane dużo szybciej i wątpię aby programowo jakiś mału UC za tym nadążył. Raczej jesteś skazany na sprzętowa obsługę USB.
  • #6 21695864
    oscil1
    Poziom 23  
    Posty: 615
    Pomógł: 48
    Ocena: 168
    tzok napisał:
    Ramki sa transmitowane dużo szybciej i wątpię aby programowo jakiś mału UC za tym nadążył.

    Bez problemu (taki który potrafi osbłużyć i USB Host i device)
    tzok napisał:
    Raczej jesteś skazany na sprzętowa obsługę USB

    W 21 wieku bierzesz jakiegoś STM32 z obsługą 2 USB i robisz to bez większych problemów.

    Piwerszy USB jako host - to tego podłaczasz klawiaturę
    Drugi USB jako device i tem będzie udawał klawiaturę.

    Piszesz obsługę i jesteś w domu :)
  • #7 21695961
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    >>21695864 taką emulację zrobiłęm bezproblemowo, problem w tym, że przykładowo oprogramowanie producenta klawiatury któe nią zarządza ( nie mówimy o najprostszych klawiaturach ale takimi z regulacją "stopnia nacisku" i innymi makrami etc. ) traci możliwość komunikacji z nią, bo próbuje się komunikować z naszym emulatorem.
    więc np update firmware klawiatury rzeczywistej czy inne funkcje nie przejdą nawet jeśli "podszyjesz się pod vid/pid i nazwą" pod rzeczywiście podłączaną klawiaturę. nie napiszesz obsługi wszytkich klawiatur jakie mogą byćpodłaczone.
    to musi być "czysta przelotka USB" a my "tylko" ingerujemy w pakiety hid tam lecące. to też mi się udało ale niestety tylko podmienić taki pakiet w locie czyli jak naciśnięto Q to potrafię podmienić na W, ale wygenerowanie własnych graniczy z cudem (czytaj - nie udało mi się tego wykonać ).
  • #8 21696059
    oscil1
    Poziom 23  
    Posty: 615
    Pomógł: 48
    Ocena: 168
    prokopcio napisał:
    ingerujemy w pakiety hid tam lecące. to też mi się udało ale niestety tylko podmienić taki pakiet w locie

    jakaś ściema - bo pakiet z klawatury dostajesz jak się zapytasz - driver usb robi za Ciebie w określonych interwałach - z reguły 10ms.

    Jak MPU z interface host dostanie pakiet hid to nastepnie musisz przekształciś to w zestaw pakietów hid (bo to będzie naprzykład przesany string) które wyślesz jak host (czyli Host) poprosi o pakiet. Jak nie zdązysz przkształcić to po prostu DEVICE interface zNACK uje mu to.

    Aby sobie uprościć życie proponuję nauczyć się stosowania RTOS (co Ci bardzo ułątwi synchronizacje pomiedzy zadaniami)
  • #9 21696103
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38673
    Pomógł: 3162
    Ocena: 6426
    oscil1 napisał:
    Piwerszy USB jako host - to tego podłaczasz klawiaturę
    Drugi USB jako device i tem będzie udawał klawiaturę.

    Piszesz obsługę i jesteś w domu
    Tylko, z tego co rozumiem Autor nie chce aby uC był hostem USB, on ma modyfikować ramki w locie, ale sam nie ma być urządzeniem USB. Innymi słowy chce obsługiwać tylko warstwę fizyczną (PHY) USB, a modyfikacje zawartości ramek robić na zasadzie bit-bang.
  • #10 21696211
    oscil1
    Poziom 23  
    Posty: 615
    Pomógł: 48
    Ocena: 168
    tzok napisał:
    on ma modyfikować ramki w locie, ale sam nie ma być urządzeniem USB


    Ale tego nie da się zrobić i jest jakś bzdura:
    1. bo do przesłania zestawu znaków potrzebujesz wiele ramek. - czyli odbierasz jedną nadajesz wiele
    2. Bitbanging w locie - tylko aby zmodygikować ramkę (musisz ja odebrać, zidentyfikować, zmodyfikować, policzyć CRC itd a pożnie wysłac bitbang to nie do udzwigniecia na żadnym MPU - 12MHZ - da ci pewnie z GHz niezbędnego zegara.

    Takie coś to tylko FPGA - albo moje rozwiązanie.
  • #11 21696225
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38673
    Pomógł: 3162
    Ocena: 6426
    oscil1 napisał:
    Bitbanging w locie - tylko aby zmodygikować ramkę (musisz ja odebrać, zidentyfikować, zmodyfikować, policzyć CRC itd a pożnie wysłac bitbang to nie do udzwigniecia na żadnym MPU - 12MHZ - da ci pewnie z GHz niezbędnego zegara.

    Takie coś to tylko FPGA - albo moje rozwiązanie.
    To przecież dokładnie to napisałem...
  • #12 21697117
    __Grzegorz__
    Poziom 30  
    Posty: 1408
    Pomógł: 196
    Ocena: 231
    oscil1 napisał:
    tzok napisał:
    on ma modyfikować ramki w locie, ale sam nie ma być urządzeniem USB


    Ale tego nie da się zrobić i jest jakś bzdura:
    1. bo do przesłania zestawu znaków potrzebujesz wiele ramek. - czyli odbierasz jedną nadajesz wiele
    ...


    Tutaj wszystko zależy od tego jaki deskryptor HID posiada urządzenie docelowe.

    To w nim jest między innymi opisana zdolność urządzenia do przesłania iluś tam JEDNOCZEŚNIE naciśniętych klawiszy.

    Typowo tych klawiszy jest 6, i można jednym raportem HID przesłać do hosta całe sekwencje znaków.

    Sterowniki HID zarówno pod Win jak i pod Linux ładnie odczytują kolejne znaki z raportu HID.

    Przykładowy zrzut komendą usbhid-dump mojej klawiatury logitech K120:

    
    001:002:000:DESCRIPTOR         1758538539.314029
     05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
     75 01 95 08 81 02 95 01 75 08 81 01 95 05 75 01
     05 08 19 01 29 05 91 02 95 01 75 03 91 01 95 06
     75 08 15 00 26 FF 00 05 07 19 00 2A FF 00 81 00
     C0
    


    Fragment deskryptora HID klawiatury Logitech pokazujący strukturę danych wejściowych

    Przejściówka USB do PC: modyfikacja zdarzeń klawiszy bez utraty funkcji klawiatury

    TLDR: typowa klawiatura w jednym raporcie HID o niezmiennej długości jest w stanie wysłać 6 kodów wciśniętych klawiszy.
  • #13 21697532
    oscil1
    Poziom 23  
    Posty: 615
    Pomógł: 48
    Ocena: 168
    __Grzegorz__ napisał:
    Typowo tych klawiszy jest 6, i można jednym raportem HID przesłać do hosta całe sekwencje znaków.


    Nie można. Host (Windows/Linux) porownuje kolejne raporty HID i z roznic generuje KEY_DOWN (0->1) i KEY_UP (1->0).
    Jesli w jednym raporcie podasz H,E,L,L,O naraz, system zobaczy 5 jednoczesnych wcisniec; kolejnosc nie jest gwarantowana, wiec wynik wpisu moze byc losowy.
    Zeby niezawodnie wpisac "hello", wysylaj raporty sekwencyjnie: h down, h up, e down, e up, l down, l up, l down, l up, o down, o up.
    Shift (dla wielkich liter/symboli) ustaw w tym samym raporcie co przejscie 0->1 danego klawisza.

    Tak mówi standard USB i jak ktoś projektuje urządzenie to musi się do niego stosowac
  • #14 21697642
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    jakoś ogarnąłem z pomocą GPT wklikiwanie do proxy tego co potrzebuję ale problem leży gdzie indziej.

    niestety proxy usb na bbb to nie jest 1:1 most tylko "klonowanie" przez emulację urządzenia podłączonego do bbb (klawiatury przykłądowo).
    pc widzi tak jakby była podłączona rzeczywista klawiatura ( lub inne urządzenie ) jednak po dwóch stronach mostu sąosobne stosy usb i oddzielnie zadrządzana transmisja a nie jak przelotka 1:1 i mimo klonowania przesyłąnych danych to nie współpracuje dobrze z driverami producenta, które potrafią zarządzać klawiaturą jak podświetlanie, stopień nacisku , makra czy firmware upgrade.

    to bariera nie do przeskoczenia to są dwa oddzielne bloki a nie połączenie 1:1 "jak przelotka":. BBB po prostu "podszywa się pod podłączone urządzenie za nim" klonując wszytko ale są to jednak dwa osobne połączenia.
  • #15 21697722
    oscil1
    Poziom 23  
    Posty: 615
    Pomógł: 48
    Ocena: 168
    prokopcio napisał:
    to bariera nie do przeskoczenia to są dwa oddzielne bloki a nie połączenie 1:1 "jak przelotka"

    Całkowicie do "przeskoczenia". Po prostu musisz tylko przechwytywac interusujące Cię raporty HID - wszystko inne puszczac tak jak jest. Ale tego nie zrobisz na BBB.
  • #16 21697726
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    >>21697722 dokłądnie tak zrobiłem na BBB ale tak jak wspomniałem to są dwa oddzielne stosy USB, więc nie 1:1 i mimo, że oprogramowanie poprawnie wykrywa i nawet coś tam się stara komunikować nieudolnie to niestety większość funkcji zawiesza lub straszenie zamula pc-keyboard (ENDORFY)
  • #17 21697752
    oscil1
    Poziom 23  
    Posty: 615
    Pomógł: 48
    Ocena: 168
    prokopcio napisał:
    dokłądnie tak zrobiłem na BBB

    Tego nie zrobisz na BBB o ile nie przerobisz stosu USB (a to są drivery kernelowe). Nie sądzę abyś to zrobił przy pomocy GPT
  • #18 21697949
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    tak, zdaję sobie z tego sprawę, że GPT nie zrobi za ciebie roboty. Jednak to świetne narzędzie wspamagające.
    Zatem na jakim sprzęcie byś to zrobił i jaką ścieżką byś szedł ?
    jeśli jesteś zainteresowany jako zlecenie to napisz PW w celu ustalenia szczegółów.
  • #19 21706823
    rufek90
    Poziom 25  
    Posty: 463
    Pomógł: 106
    Ocena: 58
    Jeśli rozważasz budowę customowej klawiatury to jest to całkiem popularne wśród klawiaturowych geeków, przykład pierwszy z brzegu: https://www.youtube.com/watch?v=7UXsD7nSfDY wtedy robisz z nią co chcesz. Jest gotowy soft który obsługuje komunikację, temat rzeka :)
  • #20 21707946
    bart-projects
    Poziom 30  
    Posty: 834
    Pomógł: 198
    Ocena: 258
    Ciekawe czy tu koła na nowo się nie odkrywa. Firma FTDI ma ogrom rozwiązań dla USB i pewnie jakiś scalak zrobiłby sprzętowo to co Autor tematu potrzebuje po jakiejś konfiguracji. Wystarczy przeszukać. Sam używałem VDRIVE, to jest USB host to SPI (obsługuje pendrive`y).
    Może warto poświęcić chwilę na research czy może da się to zrobić na gotowcu niż dłubać kod "od nowa".
    Może jest tych firm więcej. Po prostu tę znam.

Podsumowanie tematu

✨ Temat dotyczy stworzenia sprzętowej przejściówki USB do PC, która umożliwi modyfikację i generowanie zdarzeń klawiszy (press/release) na podstawie rzeczywistych naciśnięć klawiatury, bez utraty pełnej funkcjonalności oryginalnego urządzenia, w tym komunikacji dwukierunkowej z oprogramowaniem producenta (np. sterowanie podświetleniem, makra, aktualizacje firmware). Rozwiązanie nie może być emulacją klawiatury, gdyż powoduje to utratę zaawansowanej komunikacji i funkcji. Dyskusja wskazuje, że realizacja takiego urządzenia na USB jest skomplikowana ze względu na dwukierunkową, szybką transmisję i konieczność obsługi protokołu HID w czasie rzeczywistym. Propozycje obejmują użycie mikrokontrolerów STM32 z dwoma portami USB (host i device) do przechwytywania i modyfikacji raportów HID, jednak problemem jest zachowanie transparentności i pełnej kompatybilności z oryginalnym firmware klawiatury. Próby z platformą BeagleBone Black (BBB) i ProxyUSB nie dały efektu 1:1, ponieważ stosy USB po obu stronach są oddzielne, co uniemożliwia pełną transparentność i powoduje problemy z oprogramowaniem producenta. Wskazano, że modyfikacja ramek USB na poziomie bitowym (bit-bang) jest praktycznie niemożliwa do wykonania na typowych mikrokontrolerach i wymagałaby FPGA. Dyskusja zawiera także informacje o ograniczeniach standardu USB HID, gdzie do wysłania sekwencji znaków należy generować kolejne raporty z pojedynczymi zdarzeniami klawiszy, a nie jednoczesne naciśnięcia. Zaproponowano również poszukiwanie gotowych rozwiązań sprzętowych u firm takich jak FTDI oraz projekty open source typu raw-gadget i usb-proxy, które mogą stanowić punkt wyjścia do dalszych prac.
Wygenerowane przez model językowy.
REKLAMA