Welcher Treiber ist für die Headset-Tasten auf meinem Tablet zuständig?

Ich habe mir vor kurzem ein Lenovo Tab3 710F Tablet ( Produktseite ) gekauft und versuche die Musikwiedergabe extern mit einer kleinen elektronischen Schaltung zu steuern.

Die Idee ist, das gleiche Verhalten wie die Tasten zu reproduzieren, die man auf einem externen Headset finden kann, das in den Mini-Klinkenanschluss gesteckt wird.

Es gibt eine Seite in der Android-Dokumentation, die diese Schnittstelle spezifiziert: 3,5-mm-Headset: Zubehörspezifikation . Kurz gesagt, jede Taste sollte mit einem Widerstand mit einem bestimmten Wert in Reihe geschaltet werden, damit das Android-Gerät erkennen kann, welche Taste gedrückt wurde, und die entsprechende Aktion auslösen kann.

Das Problem ist, dass mein Tablet nicht wirklich gemäß dieser Spezifikation reagiert (z. B. Taste B löst den nächsten Song aus, anstatt vol +). Außerdem scheint die Verkabelung dieses Tablets zwischen GND und MIC vertauscht zu sein. Ich habe versucht, das Tablet zu öffnen, um das Audio- oder Headset-Erkennungs-IC-Modell zu finden, aber ohne Glück, da alles versiegelt ist.

Daher dachte ich, dass ich vielleicht einige Informationen von "Software" erhalten könnte: Wie kann ich wissen, welcher Treiber Tastenaktionen verarbeitet?

Die Idee wäre dann, sich den Quellcode (verfügbar auf der Lenovo-Website) anzusehen, um die verschiedenen im Treiber codierten Fähigkeiten zu finden, und vielleicht sogar eine IC-Referenz, die mir helfen würde, das IC-Datenblatt für weitere Informationen zu finden.

Antworten (1)

OK Leute, ich bin ein bisschen überrascht, dass ich keine Antwort bekommen habe, aber ich denke, das liegt daran, dass es eher eine Stackoverflow-Frage war ...

Wie auch immer, ich habe meine Forschung fortgesetzt und die Antwort selbst gefunden, insbesondere dank dieses PDF, das ausführlich " Die Android-Eingabearchitektur " beschreibt.

Das PDF liefert alle Details, aber im Grunde registriert jeder Treiber input_devices beim Linux-Kernel und es wird eine Gerätedatei für jedes Ereignis unter /dev/input/eventXX erstellt. Dann gibt es einen Android-Mechanismus, um diese Ereignisse an die Anwendungen weiterzuleiten, aber darum geht es hier nicht.

Man kann den Befehl verwenden getevent, um weitere Informationen zu diesen Ereignissen zu erhalten ( siehe auch Android-Dokumentation ):

  • getevent -libietet eine Liste der registrierten Eingabegeräte mit den möglichen Ereignissen für jedes Gerät
  • getevent -lpdruckt eine neue Zeile für jedes empfangene Ereignis (das -lFlag zeigt die Ereignistypen und -namen im Klartext und nicht in Zahlen)

So finden wir zum Beispiel im Fall meines Lenovo-Tablets Folgendes:

add device 6: /dev/input/event1
  bus:      0019
  vendor    0000
  product   0000
  version   0000
  name:     "ACCDET"
  location: ""
  id:       ""
  version:  1.0.1
  events:
    KEY (0001): KEY_VOLUMEDOWN        KEY_VOLUMEUP          KEY_HANGEUL
  KEY_NEXTSONG
                KEY_PLAYPAUSE         KEY_PREVIOUSSONG      KEY_STOPCD
  KEY_SEND
  input props:
    <none>

HINWEIS: Dies ist nur ein Auszug aus der vollständigen Ausgabe, beschränkt auf die Erkennung der Headset-Tasten.

Daher scheint die Handhabung der Headset-Tasten von einer "ACCDET"-Komponente durchgeführt zu werden. Jetzt habe ich immer noch nicht den "formellen" Weg gefunden, um zu wissen, welcher Treiber dieses Ereignis registriert, aber durch die Verwendung der Schlüsselwörter ACCDET und KEY_XX in einer Quellcodesuche konnte ich die entsprechende Quelldatei (accdet.c) finden. , die die anderen Informationen enthielt, nach denen ich suchte (nämlich die Spannungsschwellenwerte für jede Tastenerkennung).

Abschließend sei noch erwähnt, dass man mit dem sendeventsBefehl Ereignisse simulieren kann. Um beispielsweise das Drücken (und Loslassen) der Play/Pause-Taste zu simulieren, würde man Folgendes verwenden:

sendevent /dev/input/event1 1 164 1; \
sendevent /dev/input/event1 1 164 0; \
sendevent /dev/input/event1 0 0 0

Hoffe es kann jemand anderem helfen...