Originaler Kinesis-Controller

Was tun, wenn man Schaltdrähte lieber nicht direkt auf die Platine lötet?

Stellenmarkt
  1. SAP Job - SAP IS-U Berater Job (m/w/x)
    über duerenhoff GmbH, Heidelberg
  2. Applikationsverantwortlicher für IT-Fachverfahren (m/w/d)
    operational services GmbH & Co. KG, Nürnberg
Detailsuche

Die am wenigsten invasive Methode besteht darin, den FPC-Steckverbinder anzuschließen und während der Messung Tastköpfe an die Kontakte zu halten:

  • Der Teensy 4.0 mit dem KinT-Controller und einem Laptop verbunden (Bild: Michael Stapelberg)
  • Alle GPIO-Pins angeschlossen (Bild: Michael Stapelberg)
  • Verwendung des SparkFun Logic Level Converter (bidirektional) (Bild: Michael Stapelberg)
  • Schaltdrähte auf der Platine (Bild: Michael Stapelberg)
  • Wenig invasiv: die Tastköpfe an die Kontakte halten (Bild: Michael Stapelberg)
Wenig invasiv: die Tastköpfe an die Kontakte halten (Bild: Michael Stapelberg)

QMK-Eingabelatenz

Nun, da die Messhardware eingerichtet ist, widmen wir uns dem Code. In den folgenden Abschnitten bespreche ich verschiedene Faktoren, die die Eingabelatenz beeinflussen können.

Eager-Entprellung

Wenn eine Taste gedrückt wird, erzeugt sie kein sauberes Signal, sondern schaltet sich wellenartig mehrfach ein und aus. Das Beseitigen dieser ungewollten Signale nennt sich Entprellung oder auch Debouncing. Jede Tastaturfirmware macht das.

Golem Karrierewelt
  1. Deep-Dive Kubernetes – Observability, Monitoring & Alerting: virtueller Ein-Tages-Workshop
    10.11.2022, Virtuell
  2. Deep Dive: Data Governance Fundamentals: virtueller Ein-Tages-Workshop
    30.11.2022, Virtuell
Weitere IT-Trainings

In der Dokumentation von QMK zur Entprellungs-API werden die Unterschiede zwischen den verschiedenen Entprellungsansätzen gut verständlich dargestellt.

Der Standard-Entprellungsalgorithmus sym_defer_g von QMK ist vorsichtig gewählt. Ich kenne die Kriterien nicht genau, die festlegen, ob Tasten unter Rauschen leiden und daher den sym_defer_g-Algorithmus benötigen. Aber ich weiß, dass Schalter mit Dioden, wie sie in der Kinesis Advantage verwendet werden, kein Rauschen haben und daher auch die anderen Entprellungsalgorithmen geeignet sind.

Der Standard-Entprellungsalgorithmus sym_defer_g ist zwar robust, verursacht aber auch eine zusätzliche Eingabelatenz von 5 ms:


% benchstat screenlog-kint36.0
name                 time/op
KeypressToLEDReport  7.61ms ± 8%

Um die Eingabelatenz zu verringern, benötigen wir einen eifrigen eager-Algorithmus. Ich habe mich für den Entprellungsalgorithmus sym_eager_pk entschieden und ihn zu meiner Datei keyboards/kinesis/kint36/rules.mk hinzugefügt:


DEBOUNCE_TYPE = sym_eager_pk

Jetzt sind die zusätzlichen 5 ms weg:


% benchstat screenlog-kint36-eager.0
name                 time/op
KeypressToLEDReport  2.12ms ±16%

Ein Beispiel-Change findet sich hier.

Schnelleres USB-Abtastintervall

Der USB-Host (Computer) unterteilt Zeit in Segmente fester Länge, die Frames genannt werden:

  • USB Full Speed (USB 1.0) verwendet Frames mit einer Dauer von jeweils 1 ms.
  • USB High Speed (USB 2.0) führt Microframes ein, die 125 μs betragen.

Jedes USB-Gerät gibt in seinem Gerätedeskriptor an, wie häufig das Gerät abgefragt werden soll (in Frames). Die schnellste Abtastrate für USB 1.0 beträgt 1 Frame, das heißt, das Gerät kann Daten nach höchstens 1 ms senden. Ähnlich verhält es sich bei USB 2.0: Hier beträgt die Abfragerate 1 Microframe, das heißt Daten werden alle 125 μs gesendet.

Eine schnellere Abtastrate bedeutet natürlich auch, dass Ressourcen auf dem USB-Bus belegt werden, die dann für andere Geräte nicht mehr zur Verfügung stehen. Bei größeren USB-Hubs kann das bedeuten, dass weniger Geräte gleichzeitig verwendet werden können. Die Einzelheiten dieser Einschränkung hängen aber auch von einer Reihe anderer Faktoren ab. Zusätzlich zur Abtastrate spielen die maximale Paketgröße und die Anzahl der Endpunkte eine Rolle.

Ich spreche hier allerdings nur von der gleichzeitigen Gerätenutzung, nicht von der Beanspruchung der Bandbreite: Die Geschwindigkeit der Bulk Transfers von USB-Massenspeichergeräten wird in meinen Tests nicht beeinträchtigt. Ich erreiche mit und ohne Kint41-USB-2.0-High-Speed-Controller mit bInterval=1 etwa 37 MiB/s.

Selbst wenn ich zwei Kint41-Controller gleichzeitig anschließe, bleiben immer noch genug Ressourcen übrig, um eine Logitech-C920-Webkamera mit höchster Auflösung und größtem Format (das heißt mit maximaler Beanspruchung der Bandbreite) einzusetzen. Zum Vergleich: Wenn ich statt meiner zwei kint41-Controller nur einen LPC-Link2-Debug-Tester von NXP anschließe, reduziert die Logitech C920 ihre Auflösung.

Noch offen: Würde die Angabe mehrerer alternativer Einstellungen in unserem USB-Gerätedeskriptor den Ressourcenverbrauch dynamisch verringern? Unsere Tastatur könnte etwa eine alternative Einstellung mit bInterval=1 und eine mit bInterval=10 anbieten. Um das konfigurierte Intervall anzuzeigen, stellt der Linux-Kernel eine Debug-Pseudodatei zur Verfügung:


% sudo cat /sys/kernel/debug/usb/devices

[...]
T:  Bus=01 Lev=02 Prnt=09 Port=02 Cnt=02 Dev#= 53 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1209 ProdID=345c Rev= 0.01
S:  Manufacturer="https://github.com/stapelberg"
S:  Product="kinT (kint41)"
C:* #Ifs= 3 Cfg#= 1 Atr=a0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=01 Driver=usbhid
E:  Ad=81(I) Atr=03(Int.) MxPS=   8 Ivl=125us
I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=82(I) Atr=03(Int.) MxPS=  32 Ivl=125us
I:* If#= 2 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=83(I) Atr=03(Int.) MxPS=  32 Ivl=125us
E:  Ad=04(O) Atr=03(Int.) MxPS=  32 Ivl=125us
[...]

Alternativ kann man den USB-Gerätedeskriptor zum Beispiel mit sudo lsusb -v -d 1209:345c anzeigen lassen und die bInterval-Einstellung selbst interpretieren. Die obige Ausgabe zeigt den besten Fall: ein USB-2.0-High-Speed-Gerät (Spd=480) mit bInterval=1 im Gerätedeskriptor (Iv=125us).

Der originale Kinesis-Advantage-2-Tastaturcontroller (KB600) verwendet zwar USB 2.0, jedoch im Full-Speed-Modus (Spd=12), und ist daher nicht schneller als USB 1.1. Außerdem ist hier bInterval=10 angegeben, was einem Abfrageintervall von 10 ms entspricht (Ivl=10ms):


T:  Bus=01 Lev=02 Prnt=09 Port=02 Cnt=02 Dev#= 52 Spd=12   MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=29ea ProdID=0102 Rev= 1.00
S:  Manufacturer=Kinesis
S:  Product=Advantage2 Keyboard
C:* #Ifs= 3 Cfg#= 1 Atr=a0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid
E:  Ad=83(I) Atr=03(Int.) MxPS=   8 Ivl=10ms
I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=01 Driver=usbhid
E:  Ad=84(I) Atr=03(Int.) MxPS=   8 Ivl=2ms
I:* If#= 2 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=85(I) Atr=03(Int.) MxPS=   8 Ivl=2ms

Meine Empfehlung:

  • Bei USB 1.1 Full Speed sollte unbedingt bInterval=1 angegeben werden. Mir sind keine Nachteile bekannt.
  • Auch bei USB 2.0 High Speed ist bInterval=1 meiner Meinung nach eine gute Wahl, allerdings bin ich mir hier nicht ganz so sicher. Wenn Probleme auftreten, dann reduziert auf bInterval=3 und schickt mir eine Nachricht.

Einzelheiten zur Messung siehe Anhang B: USB-Abtastintervall (Geräteseite). Ein Beispiel-Change ist hier.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Kint36, Kint41: GPIOSchnellerer Matrixscan 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10.  


Aktuell auf der Startseite von Golem.de
Core-i-13000
Intel präsentiert Raptor Lake mit bis zu 5,8 GHz

Auf der Innovation hat Intel die 13. Core Generation vorgestellt. Kernzahl, Takt und Effizienz sollen deutlich steigen.

Core-i-13000: Intel präsentiert Raptor Lake mit bis zu 5,8 GHz
Artikel
  1. Ukrainekrieg: Meta stoppt ausgefeilte russische Desinformationskampagne
    Ukrainekrieg
    Meta stoppt ausgefeilte russische Desinformationskampagne

    Gefakte Webseiten deutscher Medien machen Stimmung gegen die Russland-Sanktionen. Die falschen Artikel wurden über soziale Medien verbreitet.

  2. Star Wars: Lego bringt großes Set der Razor Crest aus The Mandalorian
    Star Wars
    Lego bringt großes Set der Razor Crest aus The Mandalorian

    Aus fast 6.200 Teilen besteht das große Lego-Set der Razor Crest. Sie ist teuer, nicht aber für ein Star-Wars-Set.

  3. Creative Commons, Pixabay, Unsplash: Rechtliche Fallstricke bei Gratis-Stockfotos
    Creative Commons, Pixabay, Unsplash
    Rechtliche Fallstricke bei Gratis-Stockfotos

    Pixabay, Unsplash, CC ermöglichen eine gebührenfreie Nutzung kreativer Werke. Vorsicht ist dennoch geboten: vor Abmahnmaschen, falschen Quellenangaben, unklarer Rechtslage.
    Eine Analyse von Florian Zandt

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • AMD Ryzen 7000 jetzt bestellbar • CyberWeek: PC-Tower, Cooling & Co. • Günstig wie nie: Asus RX 6700 XT 539€, Acer 31,5" 4K 144 Hz 899€, MSI RTX 3090 1.159€ • AMD Ryzen 7 5800X 287,99€ • Xbox Wireless Controller 49,99€ • MindStar (Gigabyte RTX 3060 Ti 522€) [Werbung]
    •  /