Tagebuch der Frustration über tragbares WLAN (1) ---Neonlicht

Einführung

Durch das Flashen des Debain-Systems auf dem tragbaren WIFI des Qualcomm 410-Chips verfügen wir bereits über einen Mini-ARM64-Einplatinencomputer mit 4G-Funktion. Jetzt können wir eine Sekundärentwicklung auf Basis dieser Plattform durchführen.

Der Vorteil von tragbarem WLAN ist der niedrige Preis und die ähnliche Leistung wie Raspberry Pi Zero2 und Raspberry Pi 3b.

Die Hardwarekonfiguration ist wie folgt:

  • msm8916 Master Cortex-A53 * 4 auf 0,9 GHz
  • 512 MB Arbeitsspeicher + 4 GB Speicher evtl
  • WCN3620 & WCN3680b
  • pm8916 PMIC
  • USB-Schnittstelle

Die IO-Definition des Peripheriegeräts lautet wie folgt:

Modell rote LED grüne LED blaue LED Taste
ufi001b/c gpio22 gpio21 gpio20 gpio37

1. Neonlichter

Ich möchte hauptsächlich lernen, wie Linux zugrunde liegende Hardwaregeräte steuert, indem es LED-Leuchten aufleuchtet.

1.1 Beleuchtung

Das tragbare WLAN verfügt über drei LED-Leuchten. Der Autor von Openstick legt die Standardeinstellung auf Blau fest, um den Status der WLAN-Verbindung anzuzeigen, und auf Rot, um anzuzeigen, ob das System noch normal läuft.

  • Sie können das Verhalten von led throughecho <behavior> > /sys/class/led/<name>/trigger ändern .
    Die verfügbaren Verhaltensweisen sind:

    root@openstick:/sys/class/leds/green:internet# cat trigger 
    [none] usb-gadget usb-host rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer heartbeat cpu cpu0 cpu1 cpu2 cpu3 default-on panic mmc0 bluetooth-power hci0-power rfkill0 phy0rx phy0tx phy0assoc phy0radio rfkill1
    

Sie können sehen, dass das Triggerattribut des Geräts green:internet [none] und das Triggerereignis none ist, was bedeutet, dass das Licht ausgeschaltet wird.

  • Grüne LED auf konstanten Zustand setzen

    root@openstick:/sys/class/leds/green:internet# echo default-on > trigger
    

    Bild-20230517190959899

  • Das Verhalten der grünen LED wird als aktiver Zustand des USB-Gerätemodus definiert

    root@openstick:/sys/class/leds/green:internet# echo usb-gadget > trigger
    

Nach dem Schreiben dieser Zeichenfolge wird das LED-Verhalten sofort wirksam und fällt nach einem Neustart aus. Nach Abschluss der Konfiguration blinkt die grüne LED bei jeder Datenübertragung auf der USB-Schnittstelle.

1.2 Befehlsanalyse

 root@openstick:/sys/class/leds/green:internet# echo usb-gadget > trigger
  • /sys: sysfs ist ein virtuelles Dateisystem, das Gerätetreiber und Hardwareinformationen in Linux-Systemen anzeigen und steuern kann. Über sysfs können Sie Informationen zu den im System geladenen Treibern erhalten, einschließlich Dateisystemen, Eingabegeräten, seriellen Anschlüssen, Ethernet usw. Wir können die zugrunde liegende Hardware steuern, indem wir virtuelle Gerätedateien im Verzeichnis /sys lesen und schreiben.
  • class– Ein Abschnitt im sysfs-Verzeichnis, der alle Klassen enthält, die zum Implementieren des Gerätemodells im Treiber verwendet werden.
  • leds– Der Name der Geräteklasse, die zur Steuerung und zum Zugriff auf die LED-Gruppen des Systems verwendet wird.
  • green:internet- Der Name des Geräts, der die spezifische LED angibt, die Sie verwenden möchten.
  • trigger – Geräteeigenschaft, die den LED-Trigger darstellt. Ermöglicht das Ändern des LED-Arbeitsmodus (z. B. Dauerlicht, Blinken usw.). Zu den gebräuchlichen Auslösewerten gehören none (Dauerlicht), timer (Blinken), heartbeat (Herzschlag und andere Rhythmen), Verschiedene LED-Geräte unterstützen unterschiedliche Auslöser. Mit dem Befehl cat können Sie diese Datei lesen, um zu sehen, welche Trigger das LED-Gerät unterstützt. LEDs haben viele weitere häufig verwendete Eigenschaften, wie z
    • brightness- LED-Helligkeit, Wert ist eine Ganzzahl zwischen 0 und 255.
    • max_brightness – Maximaler Helligkeitswert der LED. Mit dem Befehl cat können Sie diese Datei lesen, um den maximalen Helligkeitswert der LED zu ermitteln.
    • delay_on und delay_off – LED-spezifische Eigenschaften, die zum Festlegen des Blinkeffekts verwendet werden. delay_on stellt die Zeitspanne dar, die die LED an ist, delay_off stellt die Zeitdauer dar, die die LED aus ist.
  • >-Umleitungssymbol, das die Ausgabe des vorherigen Befehls (Standardausgabestream stdout) in die danach angegebene Datei schreibt. Das heißt, USB-Gadget-Zeichen in die Trigger-Gerätedatei schreiben.

Zusammenfassend ist die Methode zur Steuerung zugrunde liegender Geräte über das virtuelle Dateisystem sysfs wie folgt:

#  写数据到设备
$/sys/class/设备组/设备名称# echo 属性值 > 属性名称
#  从设备读数据
$/sys/class/设备组/设备名称# cat  属性名称

1.3 Hardware-Steuerungsmethode

Zusätzlich zusysfs können wir die zugrunde liegende Hardware auch auf folgende Weise steuern:

  1. Steuerregister – Direkter Zugriff auf die Register, die Hardwaregeräte steuern, durch die Verwendung geeigneter Treiber und einer einfachen Programmiersprache wie C oder Assembler. Dies erfordert ein Verständnis der Registeradresse des Hardwaregeräts sowie der spezifischen Funktionen und Verwendung des Registers.
  2. E/A-Ports – Greifen Sie auf die E/A-Ports von Hardwaregeräten zu und steuern Sie diese mithilfe geeigneter Treiber und einer einfachen Programmiersprache (z. B. C oder Assembler). Dazu müssen die Adresse des I/O-Ports des Hardwaregeräts und die spezifischen Ein- und Ausgabemethoden bekannt sein.
  3. Gerätedateien – Einige Geräte können als Dateien behandelt werden und bieten zur Steuerung eine den Dateioperationen ähnliche Schnittstelle. Greifen Sie beispielsweise über die Gerätedatei/dev/ttyS0 auf das serielle Gerät zu. Dazu ist es erforderlich, dass Sie wissen, wie Sie auf Gerätedateien zugreifen und wie Sie das Gerät konkret verwenden.

Diese Methoden erfordern alleKenntnisse über die spezifischen Implementierungsdetails des Hardwaregeräts und erfordern daher ein hohes Maß an Fähigkeiten zur Steuerung der Hardware. Wenn Sie Hardware einfacher steuern möchten, sollten Sie die Verwendung eines universellen Hardware-Steuerungsframeworks oder einer Bibliothek auf hoher Ebene in Betracht ziehen. Diese Frameworks und Bibliotheken verbergen im Allgemeinen die Implementierungsdetails der zugrunde liegenden Hardwaresteuerung und bieten benutzerfreundliche und plattformübergreifende High-Level-Schnittstellen, sodass Sie die Hardware einfacher steuern können.

Zu den beliebten High-Level-Hardwaresteuerungs-Frameworks oder -Bibliotheken gehören:

  1. WiringPi (für Raspberry Pi)
  2. RPi.GPIO (Raspberry Pi Python-Bibliothek)
  3. Adafruit-GPIO (generische Python-GPIO-Bibliothek)
  4. libusb (allgemeine USB-Gerätesteuerungsbibliothek)
  5. PyUSB (generische Python-USB-Bibliothek)

Mithilfe dieser Frameworks oder Bibliotheken können Sie die Hardware mit übergeordnetem Code (normalerweise Python oder anderen benutzerfreundlichen Skriptsprachen) steuern und müssen sich aufgrund dieser Bibliotheken nicht mit den Implementierungsdetails der Hardwaresteuerung befassen Verstecke sie bereits im Hintergrund. Es ist zu beachten, dass der Vorteil der Verwendung dieser Bibliotheken in der Einfachheit und Benutzerfreundlichkeit liegt, sie jedoch möglicherweise einigeLeistungs- und Anpassbarkeitseinschränkungen mit sich bringen. Wenn Sie ein Experte für erweiterte Hardwaresteuerung sind oder bestimmte Funktionen benötigen, müssen Sie möglicherweise ein tieferes Verständnis der zugrunde liegenden Hardwaresteuerungen erlangen und die Steuerungslogik dann selbst implementieren.

1.4 Low-Level-Implementierung: Gerätebaum und Treiber

Bild-20230517023046610

Um zu verstehen, wie das Betriebssystem die LED von der untersten Ebene aus steuert, müssen wir zunächst den Treiber und (Gerätebaum) 2 Konzepte:Gerätebaum

  • Treiber: Es handelt sich eigentlich um ein Modul des Kernels, das zur Steuerung und Verwaltung von Hardwaregeräten verwendet wird. Wenn ein Hardwaregerät an den Computer angeschlossen wird, lädt der Kernel den entsprechenden Treiber basierend auf seinen Hardwareinformationen. Der Treiber kann auf die Register des Hardwaregeräts zugreifen, um den Betrieb des Geräts zu steuern, z. B. den Gerätestatus zu lesen und zu schreiben, Daten zu senden und zu empfangen, die Stromversorgung des Geräts zu steuern usw. Andere stellen auch eine Brücke zwischen dem Betriebssystem und der Hardware her, sodass Anwendungen mit Hardwaregeräten interagieren können. Treiber ermöglichen Anwendungen den Zugriff auf Hardwaregeräte. Der Treiber richtet eine Hardware-Abstraktionsschicht ein, die der Anwendung eine einheitliche Benutzeroberfläche oder API bereitstellt. ermöglicht Benutzern den Zugriff auf die Funktionen oder Vorgänge bestimmter Hardwaregeräte.

  • Gerätebaum: In Kernel 3.0 und späteren Versionen wird die Gerätebaummethode verwendet, um den GerätetreiberGeräten. Wenn der Kernel startet, durchsucht er die Gerätebaumdatei nach Knoten, die den Hardwaregeräten im aktuellen System entsprechen, und lädt dann den entsprechenden Treiber zur Steuerung des Geräts. Dieser Prozess kann durch Device Tree Binding erreicht werden. Der Treiber muss die detaillierten Informationen des von ihm gesteuerten Hardwaregeräts kennen, einschließlich der Geräteregister, Interrupt-Routing, Timing und anderer Informationen. Diese Informationen können in der Gerätebaumdatei definiert werden. Daher müssen Sie beim Schreiben eines Treibers die entsprechende Gerätebaumbindung schreiben und den entsprechenden Treiber gemäß den Bindungsspezifikationen schreiben.

    Gerätebaumdateien sind normalerweise Binärdateien oder Quellcodedateien, die vom Systemanbieter bereitgestellt werden. Während der Entwicklung werden sie auch entsprechend den spezifischen Anforderungen geschrieben oder geändert. Über die Gerätebaumdatei kann der Kernel die Hardware identifizieren und den entsprechenden Gerätetreiber laden.

Einfach ausgedrückt beschreibt die Gerätebaumdatei die Hardwaregeräte und ihre Attribute in einem System, und der Treiber implementiert diese Steuerung und Betrieb von Hardwaregeräten. Ihre Rolle ist unten zusammengefasst.

  • Treiber: Stellt eine Reihe von Betriebssystemaufrufen und Schnittstellen bereit, sodassAnwendungen mit Hardwaregeräten interagieren können, um die Anwendungsentwicklung zu erleichtern.

  • Gerätebaum: Der Gerätebaum drückt die Hardwarestruktur in Form einer Textbeschreibung aus, hat nichts mit der Plattform zu tun und erleichtert die Hardware-Transplantation und -Wartung. Es kann eine konsistente Schnittstelle für verschiedene Hardwareplattformen bereitstellen und die Entwicklung von Treibern vereinfachen.

Da sich im Root-Dateisystem des tragbaren WLAN kein Linux-Quellcode befindet, müssen Sie wahrscheinlich das boot.img-Image entpacken, wenn Sie den Quellcode des Gerätebaums und des Treibers sehen möchten. Es war zu kompliziert und ich habe mich nicht weiter damit befasst.

1,5 Neonlichter

Machen Sie etwas Interessantes. Das tragbare WLAN verfügt über drei LED-Leuchten: Rot, Grün und Blau. Obwohl die Helligkeit der Lichter nicht gesteuert werden kann, sollten Sie dennoch in der Lage sein, Gelb (Rot + Grün), Magenta (Rot + Blau) und Cyan zu kombinieren (grün + blau). ), mischen (grün + blau + rot) 4 Farben. Schreiben wir ein Shell-Skript, um die LED zwischen diesen Farben wechseln zu lassen.

for i in $(seq 1 20)
do
  echo none > /sys/class/leds/green:internet/trigger
  echo none > /sys/class/leds/blue:wifi/trigger
  echo none > /sys/class/leds/red:os/trigger

  echo 1 > /sys/class/leds/green:internet/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/green:internet/brightness

  echo 1 > /sys/class/leds/blue:wifi/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/blue:wifi/brightness

  echo 1 > /sys/class/leds/red:os/brightness
  sleep 0.25
  
  echo 1 > /sys/class/leds/green:internet/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/red:os/brightness
  

  echo 1 > /sys/class/leds/blue:wifi/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/green:internet/brightness

  echo 1 > /sys/class/leds/red:os/brightness
  sleep 0.25
  
  echo 1 > /sys/class/leds/green:internet/brightness
  sleep 0.25
  echo 0 > /sys/class/leds/green:internet/brightness
  echo 0 > /sys/class/leds/red:os/brightness
  echo 0 > /sys/class/leds/blue:wifi/brightness  
done

echo none > /sys/class/leds/green:internet/trigger
echo none > /sys/class/leds/blue:wifi/trigger
echo none > /sys/class/leds/red:os/trigger

echo 0 > /sys/class/leds/green:internet/brightness
echo 0 > /sys/class/leds/blue:wifi/brightness
echo 0 > /sys/class/leds/red:os/brightness

In diesem Shell-Skript verwenden wir for, um es 20 Mal in einer Schleife mit einem Intervall von jeweils 0,25 Sekunden auszuführen. Das letzte Skript wird 35 Sekunden lang ausgeführt. Zum Schluss schalten wir den Blinkmodus aller Lichter wieder aus und steuern mit echo 0 das Ausschalten aller Lichter. Dadurch wird sichergestellt, dass im Endzustand des Skripts keine Lichter blinken. Die Reihenfolge des Blinkens ist: Grün – Blau – Rot – Gelb – Cyan – Magenta – Gemischt .

Bild-20230517190903634

Supongo que te gusta

Origin blog.csdn.net/weixin_41099712/article/details/130836998
Recomendado
Clasificación