====== How to fix Standby Problem ======
==== Problem: ====
Eine geteilte Tastatur funktioniert nicht mehr, nachdem der Rechner im Ruhezustand / Standby etc. war. Nachdem sie aus- und wieder eingesteckt wurde, funktioniert sie wieder.
=== *Vermutete* Ursache: ===
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.
==== Lösung: ====
Bei mir hat Folgendes geholfen:
=== Achtung ===
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.
=== 1. Einen Pin benutzen, um die Seite zu erkennen ===
Zunächst habe ich den Mikrocontrollern eine andere Möglichkeit gegeben, zu erkennen ob sie die rechte oder linke Hälfte sind.
* Dazu habe ich Pin C6 der linken Hälfte mit +5V verbunden; und Pin C6 der rechten Hälfte mit GND.
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.)
=== 2. Diesen Pin nicht nur für Handedness, sondern auch für "Connectedness" benutzen ===
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.
=== Alternative Lösungsideen ===
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 [[https://docs.qmk.fm/#/feature_split_keyboard?id=teensy-boards|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.