
Ich arbeite mit einer ARM-Maschine, die einen Summer an GPIO-Pin 102 angeschlossen hat. Auf der Maschine läuft Linux 2.6, daher haben wir eine Sysfs-Schnittstelle zu den Pins in /sys/class/gpio. Als ich zum ersten Mal versuchte, den Summer zum Laufen zu bringen, habe ich etwas wie das Folgende ausprobiert:
# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value
Zu meinem Entsetzen machte die Maschine keinen Ton. Als ich jedoch den Quellcode für den für WinCE geschriebenen Summertreiber überprüfte, bemerkte ich, dass der GPIO-Multiplexer in einen bestimmten Modus eingestellt werden sollte. Ich kenne mich außerhalb der Softwarewelt nicht so gut aus, daher bin ich mir immer noch nicht ganz sicher, was das bedeutet. Da ich jedoch den Quellcode für die Version von U-Boot erhalten hatte, die zum Booten von Linux auf der Maschine verwendet wurde, konnte ich ihn bearbeiten, um den GPIO-Bankmodus einzustellen, indem ich diese Codezeile zur Header-Datei der Karte hinzufügte ( u-boot/board/somecompany/someboard/someboard.h
):
MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));
Ich habe den Bootloader neu kompiliert, ihn kopiert, die Maschine neu gestartet und meinen obigen Test erneut ausgeführt, und es hat funktioniert! Ich dachte, ich hätte meine Aufgabe erledigt. Ich wurde jedoch darüber informiert, dass meine Vorgehensweise möglicherweise nicht sicher war, da die GPIO-Bank möglicherweise für andere Treiber verwendet wird. Wenn ich debugfs mounte und überprüfe /sys/kernel/debug/gpio
, scheint es, als würden andere GPIO-Pins in der GPIO-Bank für Treiber verwendet.
Ich habe dann einen anderen Ansatz ausprobiert – da der Piepton vor allem beim Booten wichtig ist, habe ich beschlossen, dem Bootloader Code hinzuzufügen, der einen Piepton ausgibt:
MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));
if(!gpio_request(102, "buzzer")){
gpio_direction_output(102, 1);
udelay (500000);
gpio_direction_output(102, 0);
}
MUX_VAL(CP(CCDC_DATA3), (IEN | PTD | DIS | M0));
Dies funktioniert, da der Bootloader ein Single-Thread ist und sich daher nicht um die GPIO-Bank streiten muss. Die letzte Zeile setzt den GPIO-Bank-Mux-Modus auf die zuvor im Code festgelegte Einstellung zurück.
Dies piept erfolgreich während der Ausführung des Bootloaders und stört meines Wissens nach keine Treiber, da die GPIO-Bank in den erforderlichen Zustand zurückversetzt wird. Es ist jedoch nicht so nützlich, wie ich es gerne hätte, da der Piepton während der Bootloader-Sequenz nicht unbedingt anzeigt, dass der vollständige Bootvorgang erfolgreich war. Stattdessen wäre es viel schöner, wenn ich von Linux aus auf den Summer zugreifen könnte, um einen erfolgreichen Bootvorgang oder andere Ereignisse anzuzeigen. Ich habe jedoch kein Glück bei der Suche nach Dokumentation zum Einstellen eines GPIO-Bank-Mux-Modus in Linux. Meine Frage lautet daher wie folgt:
Gibt es eine Möglichkeit, den Mux-Modus einer GPIO-Bank vom Kernelbereich aus einzustellen?