Eine geteilte Tastatur funktioniert nicht mehr, nachdem der Rechner im Ruhezustand / Standby etc. war. Nachdem sie aus- und wieder eingesteckt wurde, funktioniert sie wieder.
Der Teensy hat keine Vbus-Detection, sondern erkennt nur daran, dass die USB-Verbindung aktiv ist, ob er mit dem PC verbunden ist (SPLIT_USB_DETECT
). Das klappt nicht, wenn der PC nicht an ist. Und aus mir unerfindlichen Gründen klappt es halt auch nicht, wenn der PC wieder eingeschaltet wurde, und die Tastatur geht nicht mehr.
Bei mir hat Folgendes geholfen:
Dieser Ansatz erfordert Änderungen im QMK selbst. Macht ihn also in einem eigenen QMK-Checkout, der nicht benutzt werden soll, um Firmware für andere Tastaturen zu bauen. Durch die Änderung an der split_util.c
ist es danach nicht mehr möglich, Firmware für Tastaturen, die nicht SPLIT_HAND_PIN
, SPLIT_MATRIX_GRID
oder EE_HANDS
benutzen, in diesem QMK-Ordner zu bauen.
Es ist auch möglich, die hier beschriebene Änderung durch Präprozessor-Anweisungen „transparent“ zu machen, so dass sie nur greift, wenn wir Firmware für unsere eigene Tastatur bauen (und über einen git-Branch so einzubauen, dass weiterhin Updates des QMK-Quellcodes vom QMK-Repository möglich sind). Da ich aber sowieso für jede Tastatur einen eigenen Checkout benutze, habe ich das hier nicht beschrieben.
Zunächst habe ich den Mikrocontrollern eine andere Möglichkeit gegeben, zu erkennen ob sie die rechte oder linke Hälfte sind.
In der config.h
habe ich dann die Zeile #define MASTER_RIGHT
auskommentiert und #define SPLIT_HAND_PIN C6
hinzugefügt:
#define USE_I2C //#define MASTER_RIGHT // Right hand has the USB connection to the PC #define SPLIT_USB_DETECT // Teensy boards lack Vbus detection -> Listen for active USB connection to determine hand. #define SPLIT_HAND_PIN C6
(Die Zeile mit SPLIT_USB_DETECT
ist eigentlich auch nicht mehr nötig, kann also auch auskommentiert / gelöscht werden. Sie schadet aber auch nicht.)
Das allein reicht nicht. Nach dem Standby wird zwar über den Pin die rechts/links-Erkennung gemacht, aber nicht die „USB/kein-USB“-Erkennung.
In der Datei quantum/split_common/split_util.c
finden wir die Funktion usbIsActive(void)
in Zeile 60. Die wird genutzt, um zu prüfen ob die Hälfte gerade mit dem PC verbunden ist. Wir kommentieren die komplette Funktion (inklusive dem #if defined(SPLIT_USB_DETECT)
und dem #endif
) aus, und ersetzen sie durch:
static bool usbIsActive(void) { return !is_keyboard_left(); }
Dadurch wird die Erkennung, ob eine USB-Verbindung vorhanden ist, umgangen, und nur geprüft, ob die Hälfte nicht-links ist (wenn eure USB-Verbindung an der linken Hälfte ist, dann muss das !
weggelassen werden).
Wenn wir die is_keyboard_left(void)
-Funktion weiter unten in der Datei anschauen, sehen wir, dass sie durch die ganzen Präprozessor-Anweisungen und das #define SPLIT_HAND_PIN C6
in der config.h
zusammenfällt zu:
__attribute__((weak)) bool is_keyboard_left(void) { setPinInput(C6); return readPin(C6); }
Also wird nun erkannt, ob es sich um die rechte/linke Hälfte handelt, indem unser Pin C6 ausgelesen wird. Und durch unsere Änderung oben wird auch erkannt, ob wir mit dem PC reden (können sollten), indem ebenfalls Pin C6 gelesen wird. Bei meiner Tastatur hat das das Problem gelöst.
Zusatzinfo: Wenn wir uns in ansehen, was die Funktion is_keyboard_left
tut, wenn keins der #define
s gesetzt ist, oder nur MASTER_RIGHT
, wird klar, warum dieser QMK-Checkout nicht mehr für eine Tastatur mit „normaler“ Handedness-Detection (ohne SPLIT_HAND_PIN
, SPLIT_MATRIX_GRID
oder EE_HANDS
) benutzt werden kann: Die Funktionen is_keyboard_left
und isUsbActive
würden sich gegenseitig aufrufen, und keine würde jemals bei einem return
ankommen.
Es müsste auch möglich sein, über SPLIT_MATRIX_GRID
oder EE_HANDS
(plus Änderung an der split_utils.c
) zum gleichen Ergebnis zu kommen. Das habe ich nicht getestet, weil meine Tastatur keine Stelle in der Matrix mehr frei hat, bzw. ich auch nicht herausfinden wollte, wie ich das EEPROM des Teensy beschreiben kann.
Auch der hier beschriebene Teensy-Vbus-Mod sollte (ohne Änderung an der split_utils.c
) funktionieren - es muss nur in der config.h
das #define SPLIT_USB_DETECT
gelöscht werden). Das habe ich auch nicht getestet, weil ich keine passende Schottky-Diode zur Hand habe.