2018-05-12 kinx: keyboard hackinggpn_2018).pdf · teensy 3.6: nxp mk66fx1m0vmd18 (2) nxp hat ein...
TRANSCRIPT
![Page 1: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/1.jpg)
kinX: keyboard hacking
Michael Stapelberg2018-05-12
![Page 2: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/2.jpg)
Inhalt
● eigener keyboard controller
● eigener USB hub
● input latency Messungen
![Page 3: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/3.jpg)
Eigener controller: Motivation
● Kinesis Advantage-Nutzer seit 2008
● Super Tastatur! Aber:
○ braune Cherry MX
○ stuck modifier Bug
![Page 4: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/4.jpg)
linear tactile clicky
soft
medium
stiff
![Page 5: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/5.jpg)
Kinesis mit eigenen Tasten
![Page 6: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/6.jpg)
Tastatur-Matrix
image source: http://blog.komar.be/how-to-make-a-keyboard-the-matrix/
![Page 7: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/7.jpg)
Kinesis Tasten brauchen Dioden
● Cherry MX1A-E1DW mit Diode
● Schwierig zu bekommen! (nicht in großen Shops)
○ samples von Cherry
○ Gruppenbestellung im deskthority-Forum
○ selbst Dioden in jede Taste einbauen
![Page 8: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/8.jpg)
Stuck modifier-Bug
● Shift drücken, a drücken, a loslassen, Shift loslassen
○ Tastatur verwirft “Shift loslassen”
→ Shift bleibt gedrückt
○ betrifft auch andere Modifier (Caps Lock)
● laut Foren weiß Kinesis von dem Problem
![Page 9: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/9.jpg)
Stuck modifier-Bug (2)
● tech support schickt mir ein “firmware update”
● d.h. ein neuer Microcontroller per Post!
● Shift seltener betroffen, Caps Lock immer noch :-(
○ wichtig wenn man das NEO layout nutzt
![Page 10: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/10.jpg)
Eigener keyboard controller
● humblehacker blog posts
○ super reverse-engineering (ältere Kinesis)○ eigene Firmware, ohne stuck modifier-Bug
● ich habe das Projekt 2013 nachgebaut
![Page 11: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/11.jpg)
Eigener keyboard controller (2)
![Page 12: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/12.jpg)
Eigener keyboard controller (3)
● vorsichtig vorgehen:
Teensy++ mit humblehacker-Firmware nutzen
● hat für 4 Jahre gut funktioniert
![Page 13: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/13.jpg)
input latency
● Leute schreiben über input latency
○ super Artikel: Pavel Fatins “typing with pleasure”
● Was ist die input latency meiner Tastatur?
● Was kann ich ändern? Wie weit kann ich gehen?
![Page 14: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/14.jpg)
Quellen von input latencyTastendruck
matrix scandebouncing
USB poll
![Page 15: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/15.jpg)
humblehacker-Firmware input latency
● scannt die Matrix nach jedem USB poll (?)
● debouncing: wartet bis zu 8 Zyklen hintereinander
● standardmäßig 10ms USB polling interval
○ auf 1ms reduziert
![Page 16: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/16.jpg)
humblehacker-Firmware input latency (2)
● Verbesserungsversuch des debouncing scheitert
● Offenbar muss ich mehr über das Thema lernen
○ also bauen wir eine Firmware von Grund auf!
● mit einem neueren Teensy
○ das Design wird dann nicht so schnell obsolet
![Page 17: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/17.jpg)
Einwurf: Teensy (von PJRC)
Teensy++ (16 MHz)Atmel AVR
Teensy 3.6 (180 MHz)NXP ARM Cortex M4
![Page 18: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/18.jpg)
Bauen wir einen keyboard controller!
![Page 19: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/19.jpg)
Bauen wir einen keyboard controller! (2)
● Schaltplan und Layout aufräumen:
○ Kinesis PCB Namensschema nutzen
○ Platzierungsprobleme beheben (Loch)
○ keyboard-Matrix umlegen: von humblehacker auf
ein bequemeres Layout
![Page 20: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/20.jpg)
Bauen wir einen keyboard controller! (3)
![Page 21: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/21.jpg)
Bare metal-Firmware
● fast von grund auf-Firmware
○ nutzt gcc-arm-none-eabi, libnewlib-arm-none-eabi
○ teensy3 linker script wiederverwendet
○ eigener startup, USB, keyboard code
● bare metal damit nichts dazwischenfunkt
![Page 22: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/22.jpg)
firmware: scanning (bis zu 0.1ms delay)
● Teensy 3.6 auf 180 MHz betreiben
● scan() in einer Schleife (nicht nur bei USB poll)
● alle Spalten mit einem Speicherzugriff lesen
○ daher alle an einen GPIO port verkabelt
![Page 23: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/23.jpg)
firmware: debouncing
image source: https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-buttons-part-ii/
![Page 24: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/24.jpg)
debounce: langsame scan rate (> 5ms)
image source: https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-buttons-part-ii/
![Page 25: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/25.jpg)
debounce: langsame scan rate: worst case
image source: https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-buttons-part-ii/
![Page 26: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/26.jpg)
debounce: 5ms warten (→ 5ms delay)
image source: https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-buttons-part-ii/
![Page 27: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/27.jpg)
debounce: trigger, dann warten (→ 0ms)
image source: https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-buttons-part-ii/
![Page 28: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/28.jpg)
debounce: Taste drücken
image source: https://hackaday.com/2015/12/10/embed-with-elliot-debounce-your-noisy-buttons-part-ii/
![Page 29: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/29.jpg)
firmware: Fazit
● ≤0.1ms scan latency
● 0ms debounce latency
● ≤1ms USB poll latency
● → input latency bewegt sich in [0ms, 1.1ms]
● Können wir das weiter reduzieren?
![Page 30: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/30.jpg)
USB
Version Geschwindigkeit micro frame
USB 1.x Full Speed (FS): 12 Mbit/s 1ms
USB 2.0 High Speed (HS): 480 Mbit/s 125μs
USB 3.0 SuperSpeed (SS): 5.0 Gbit/s interrupts
… … …
![Page 31: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/31.jpg)
Teensy 3.6: NXP MK66FX1M0VMD18
● 2 USB ports: USBFS (full speed), USBHS (high speed)
● komplett separate Software stacks
○ HS nutzt neue IP, alte für Kompatibilität präsent
● Teensy nutzt USBFS, HS port optional für host mode
○ Software noch in Kinderschuhen
![Page 32: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/32.jpg)
Teensy 3.6: NXP MK66FX1M0VMD18 (2)
● NXP hat ein SDK mit Beispielen, inklusive USBHS
● Beispiele funktionieren nicht direkt auf dem Teensy:
○ falsche clock config (12 statt 16 MHz crystal)
○ Problem mit dem seriellen setup code
● USBHS hat bei mir nicht auf dem Teensy geklappt :-/
![Page 33: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/33.jpg)
Teensy 3.6: NXP MK66FX1M0VMD18 (3)
● μTasker firmware läuft auf dem Teensy, nutzt USBHS
● aber recht schwergewichtig (Betriebssystem)
○ üblicherweise wohl schon okay,
aber wir wollten möglichst bare metal bleiben
![Page 34: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/34.jpg)
Teensy 3.6: USBHS port
● USBHS Port ist optional auf dem Teensy
○ man braucht ein Breakout board
○ …aber in der Tastatur ist nicht genug Platz :-(
![Page 35: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/35.jpg)
Bauen wir noch einen keyboard controller!
● NXP μc nutzen statt gesockelten Teensy
● Teensy bootloader chip für eigene Projekte
○ gleicher Programmier-mechanismus
○ minimale Änderungen zwischen Hardware revs!
![Page 36: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/36.jpg)
Bauen wir noch einen keyboard controller!
![Page 37: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/37.jpg)
Entwicklungs-umgebung
● links: usb2serial
● rechts: rebootor
![Page 38: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/38.jpg)
Firmware (k66f)
● basiert auf NXP KSDK
USBHS läuft auf meiner Hardware
→ müssen uns nicht mehr um bare metal kümmern
● implementiert mit der MCUXpresso IDE
Erleichtert den Start, aber sonst nicht besonders gut
![Page 39: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/39.jpg)
Firmware (k66f): Fazit
● ≤0.1ms scan latency
● 0ms debounce latency
● ≤0.125ms USB poll latency
● → input latency bewegt sich in [0ms, 0.225ms]
![Page 40: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/40.jpg)
Was haben wir gelernt?
● NXP μc Doku eher spärlich
bei ARM μc wohl leider normal :-/
● statt mit Teensy mit devboard anfangen (FRDM-K66F)
→ JTAG debugging
→ Hersteller-Beispiele funktionieren direkt
![Page 41: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/41.jpg)
Inhalt
● eigener keyboard controller
● eigener USB hub
● input latency Messungen
![Page 42: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/42.jpg)
Eigener hub: Motivation
● der controller braucht 2 Kabel
● hub nutzt proprietäre Stecker
konvertiert USB nach PS/2!
● hub nutzt nur USB 1.1
und manche Geräte gehen nicht?
![Page 43: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/43.jpg)
Bauen wir einen USB hub!
● kein freies USB hub Design im Netz gefunden
● USB hub chips von 5 Herstellern verglichen
→ USB2 statt USB3 hat höhere Erfolgschancen
→ Cypress HX2VL hat die beste Doku
![Page 44: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/44.jpg)
Bauen wir einen USB hub!
![Page 45: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/45.jpg)
USB hub: Stromversorgung
● erste revision: bus-powered (eigentlich korrekt!)
● geht mit logitech receiver, yubikey
Festplatte und USB-Stick weigern sich:
kernel: usb 1-14.4.4: rejected 1
configuration due to insufficient
available bus power
![Page 46: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/46.jpg)
USB hub: Stromversorgung (2)
● aber die Geräte gehen an anderen USB hubs?!
● alle gekauften Hubs behaupten, self-powered zu sein!
→ umgeht power calculation im Kernel
→ self-powered lässt 500mA über alle Ports zu
(bus-powered: 100mA pro Port)
![Page 47: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/47.jpg)
USB hub: EEPROM
● zum Konfigurieren von MaxPower (unnötig)
(und manufacturer, product und serial)
● programmierbar durch „blaster“-Programm
nur für Windows, schwer zu installieren
Linux-Version für Cypress USB3, nicht die älteren USB2
![Page 48: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/48.jpg)
USB hub: EEPROM (2)dev, _ := usb.OpenDeviceWithVIDPID(0x04b4, 0x6570)
eepromRequest := 14
wIndex := 0 // [0, 63] for 128 bytes of EEPROM
dev.Control(gousb.RequestTypeVendor|0x80,
eepromRequest, 0, wIndex, make([]byte, 2))
![Page 49: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/49.jpg)
USB hub: Stromversorgung (3)
● vorgeben, dass wir self-powered sind
→ USB-Stick funktioniert zuverlässig
→ HDD geht (wenn sie erstes/einziges Gerät ist)
![Page 50: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/50.jpg)
Inhalt
● eigener keyboard controller
● eigener USB hub
● input latency Messungen
![Page 51: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/51.jpg)
Messgerät
● FRDM-K66F eval board
(≈ 60 USD)
● Mess-Firmware
(fast wie keyboard FW)
SW3
USBHigh Speed
Debug
![Page 52: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/52.jpg)
Messmethode (Gerät)
SW3 drücken:Caps Lock
USB poll:≈125 μs
processinglatency
USB txn:≈125 μs
HID report:Caps Lock
![Page 53: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/53.jpg)
Messmethode (host)
● baseline messen:
USB host controller
Linux kernel (usb, input)
input event API (evdev)
● ohne X11/Wayland
![Page 54: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/54.jpg)
processing latency
● wireshark usbmon
(ohne USB poll/txn)
● processing latency:
im Mittel ≈ 152 μs
(Ubuntu 17.10)
![Page 55: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/55.jpg)
Emacs processing latency
● Emacs latency:
im Mittel ≈ 278 μs
(Ubuntu 17.10)
(Emacs 25.2.2)
(excludes baseline)
![Page 56: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/56.jpg)
Ende-zu-Ende input latency
→ total ≈ 655 μs
+ output latency ≥ [0, 16ms] (at 60 Hz)
Schritt latency
matrix scan ≈ 100 μs
USB poll ≈ 125 μs
Linux ≈ 152 μs
Emacs ≈ 278 μs
![Page 57: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/57.jpg)
Das latency-Spiel
● wie sehr nehmen Menschen input latency wahr?
● Spiel stellt zusätzliche Latenz in der Tastatur ein,
du sagst ob du Latenz wahrnimmst
● höhere Levels haben niedrigere Zusatz-Latenz
![Page 58: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/58.jpg)
Das latency-Spiel (2)
● 17 Spieler auf dem 34C3
● bester Spieler konnte 15ms zuverlässig unterscheiden
● einige Spieler konnten 75ms nicht unterscheiden
![Page 59: 2018-05-12 kinX: keyboard hackingGPN_2018).pdf · Teensy 3.6: NXP MK66FX1M0VMD18 (2) NXP hat ein SDK mit Beispielen, inklusive USBHS Beispiele funktionieren nicht direkt auf dem Teensy:](https://reader033.vdocuments.site/reader033/viewer/2022060605/605a58a9f953ea662375ad4c/html5/thumbnails/59.jpg)
Fazit
● Ich hab jetzt eine sehr schnelle Tastatur
● Ich hab viel gelernt über PCB design,
ARM μc, USB, HID, …
● Moderne Computer haben niedrige processing latency
nutze gute Peripherie