mmap und Zugang zu den GPIO-config-Register in einem ARM-Prozessor
Im kämpfen, um Sie zu Lesen(und zu schreiben), HW-Register von Linux-user-space. Das Ziel ist, zu konfigurieren, die für die GPIO-pins und in der Lage sein zu setzen, und Lesen Sie diese pins.
Gemäß der Spezifikation für den Prozessor(imx27 von Freescale) die physische Adresse für die register-bank controlling GPIO dies ist 0x10015000
Meine Vermutung war, dass ich verwenden könnte, so etwas wie dieses:
unsigned long *gpio;
fd = open("/dev/mem", O_RDWR);
gpio = (unsigned long *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x10015000);
Ich jetzt voraussichtlich in der Lage sein zu Lesen und setzen der Daten zu den Registern im Prozessor. Das problem ist, dass es egal ist, welche Stelle ich Lesen, ich bekomme immer 0.
Beispielsweise registrieren Sie sich in der körperlichen Lage 0x10015220 enthält ein register zeigt, welche pins sind bei uns als GPIO. Der Standardwert 0xFFFFFFFF. Das Lesen dieses Registers wird erwartet, dass ich etwas anderes als 0:
printf("PTC_GIUS: 0x%08lX\n", gpio[0x220]);
gibt PTC_GIUS: 0x00000000
.
Wohin gehe ich falsch ?
- Wenn gpio ist 0x10015000 ist vom Typ unsigned long *, int[0x220] nicht Lesen, was Sie denken, es ist, wahrscheinlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
mmap
auf/dev/mem
funktionieren sollte. Haben Sie versucht, Ihren code ausführen als root? Vielleicht etwas Sicherheit verhindert, dass Ihr Programm den Zugriff auf den Adressraum. Auch stellen Sie sicher, dass Sie bestanden haben die richtige physikalische Adresse des GPIO-Raum.Die Methode, die Sie verwendet haben, funktioniert auf meinem Cortex-A8-ARM-board mit linux ohne Probleme.
Wenn Sie nicht bekommen kann es arbeiten gibt es nicht viel Sie tun können, außer das Auffinden oder schreiben einer device-Treiber für die gpio (schreiben ist nicht , dass schwer, btw.).
Mit ein bisschen Glück jemand schon gemacht für Sie. Macht einen Knoten mit dem Namen
/dev/gpio
existiert im Dateisystem? Wenn ja, haben Sie schon einen Treiber.Einer google-Suche auf
/dev/gpio
wird Ihnen alle details auf, wie es zu benutzen. Möglicherweise finden Sie auch die Quelle für eine einfache gpio-Treiber, die Sie ändern können, um Ihre Bedürfnisse anzupassen.Auch, wenn du mit einem kernel source code aus dem Jahr 2009 und auf die sollten Sie öffnen
/dev/mem
mit derO_SYNC
- flag, wenn Sie möchten, dass Ihre memory access werden nicht gecached.Wenn Sie mit einer aktuellen version des Linux-Kernels kann es sein, sperren Sie den Zugriff auf die
/dev/mem
Gerät. Benutzer-Modus-Zugriff auf das Gerät ist veraltet und gefährlich. Es wird hauptsächlich für die Benutzer-Modus-Zugriff auf video-Speicher innerhalb von X. In embedded-Projekten, es kann nützlich sein, um Zugriff auf memory-mapped hardware (wie GPIO).Überprüfen Sie Ihren Kernel kompilieren die flags für
CONFIG_STRICT_DEVMEM
oder anderen flags, die den Zugang zu/dev/mem
. Es könnte sein, versehentlich sperren Sie den Zugriff auf diesen Speicherbereich.Jedoch, dass Nils erwähnt, die beste Lösung zu finden, ist ein gpio-Modul für die iMX27 oder schreiben Sie Ihre eigenen.
/dev/mem
. Was sind die alternativen, wenn wir vermeiden sollten/dev/mem
im userland?