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 #defines 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 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.

workshop/tastatur_bauen_standby_problem.txt · Zuletzt geändert: 05.12.2021 10:17 von ebrnd
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 4.0 International
Recent changes RSS feed Driven by DokuWiki