Sama5d3 schneller ADC

Ich verwende Ubuntu 14.04 und den Compiler arm-linux-gnueabihf-gcc, um Projekte für das erklärte Board sama5d3 zu kompilieren, und verwende minicom und zmodem, um den kompilierten Quellcode von der Ubuntu-Maschine auf das Entwicklungsboard zu übertragen. Das sama5-Board wird mit Poky geliefert, dem Yocto-Linux-Referenz-Build. Mein Endziel ist es, auf Register für die ADC- und SPI-Geräte zuzugreifen und diese zu lesen.

Ich habe das Datenblatt hier gut gelesen , auf Seite 1664, es beschreibt das ADC Channel Status Register; am Speicherplatz 0xF8018018. Linux liefert offensichtlich einen Segmentierungsfehler, wenn ich versuche, den Wert dort abzurufen. Ein ausführliches Tutorial zur Verwendung von mmap für Memory Mapped IO wäre auch cool, da ich gehört habe, dass dies eine Alternative sein könnte.

Der Grund dafür ist, dass ich den ADC mit 100 ksamples / sec lesen kann. Der Zugriff auf Speicheradressen aus dem Benutzerbereich ist wahrscheinlich nicht möglich. Wenn dies der Fall ist, wäre ich sehr dankbar, wenn Sie mir mitteilen würden, wie. Wenn nicht, würde ich gerne wissen, wie ich eine Bare-Metal-Anwendung erstellen würde, mit der ich dies tun könnte. Atmel hat ein GNU-Softwarepaket, das ADC-Treiber für den Compiler arm-none-eabi-gcc enthält. Wie würde ich vorgehen, um dies einzurichten, um Programme auf diesem Board zu kompilieren und auszuführen?

Um das alles zusammenzufassen:

Ich habe:

  • Ein Desktop mit Ubuntu 14.04

  • das sama5d3-xplained Entwicklungsboard

Die Fragen sind:

  • Ist es trotzdem möglich, mit Geschwindigkeiten >= 100 ksamples/sec auf den ADC zuzugreifen

  • Gibt es überhaupt einen Zugriff auf die Register von einem Speicherplatz (wie dem ADC-Kanalstatusregister am Speicherplatz 0xF8018018) aus dem Benutzerbereich?

  • Wie würde ich bei der Entwicklung einer Bare-Metal-Anwendung vorgehen, wenn die Antwort auf die obige Frage nein lautet.

Vielen Dank für Ihre Hilfe und Zeit.

Hilft das Folgende, es klingt ähnlich wie das, wonach Sie suchen, und hat ein gutes mmap-Beispiel: stackoverflow.com/questions/12827948/…

Antworten (1)

Sie könnten den Linux-AT91-ADC-Gerätetreiber verwenden , aber dieser wird wahrscheinlich nicht Ihren Geschwindigkeitsanforderungen entsprechen (siehe auch Verwendung des AT91-ADC-Treibers ).

Eine andere Lösung könnte darin bestehen, die DMA-Übertragung für die ADC-Register in einen Benutzerraumspeicher zu untersuchen. Dies könnte auch schnell genug sein, um 100 ksps zu erfüllen. Ich habe so etwas noch nicht gemacht, aber ein Blick darauf könnte sich lohnen: Dynamic DMA Mapping Guide .

Das hilft leider nicht :/; Ich bin ziemlich davon überzeugt, dass der einfachste Weg darin besteht, mmap zu verwenden, um das Peripheriegerät abzubilden. irgendwelche Ideen, wie man das macht?