Forum: Projekte & Code SPI Treiber für Linux auf ARM


von Flush (Gast)


Lesenswert?

Hallo!

Hab gerade eine Aufgabe bekommen die mir gar nicht liegt.
Hatte bisher noch nie was mit Linux zu tun und muss jetzt einen 
SPI-Treiber für einen ARM-Prozessor schreiben.
Habe mir schon einige Sachen durchgelesen, nur schlau wurde ich bisher 
nicht daraus. Gibt es irgendeine dummy-Anleitung um einen SPI-Treiber zu 
schreiben?

Danke für Hilfe.

Gruß
Flush

von Flush (Gast)


Lesenswert?

Mit Quellcode gebe ich mich natürlich auch zufrieden ... ;)

von Claude S. (claudeschwarz)


Lesenswert?

Was für ein ARM (Type und Hersteller)? Nur der Kernel Treiber , oder 
auch ein dazughöriges Userspace Programm? Oder meinst Du einen Treiber 
für z.b. einen Touch Controller der per SPI mit dem Host plaudert? Falls 
Du einen Atmel,Xscale,Freescale,Cirrus oder Samsung ARM einsetzt mach 
doch einfach das Häckchen in der Kernel Config beim SPI an!?
Übrigens ist dies die Codesammlung , allgemeine Fragen gehören eher in 
ein anderes Forum.

von Piwi (Gast)


Lesenswert?

Ich habe das gleiche Problem...

Muss auch einen SPI Treiber schreiben, um mit einem RFID Transceiver zu 
kommuniziren.
Ich nutze einen AT91RM9200 mit einem 2.6.21.7 Kernel...

Als ich den Kernel kompilierte, habe ich das Häckchen gesetzt.
Habe mknod /dev/spi0 c 153 0 ausgeführt.
Normalerweise kann man anschließend read, write, open, ioctl, close 
nutzen oder?
Klappt bei mir leider nicht...

Wenn ich den AT91RM9200 SPI Driver (legacy)unter Character DEvices in 
der Kernelkonfiguration ankreuze, dann kann ich über SPI senden, jedoch 
nicht den  Chip Select ändern?

Hat jemand einen Plan!!!

von Claude S. (claudeschwarz)


Angehängte Dateien:

Lesenswert?

Hast Du in deiner Board Config 
(arch/arm/mach-at91/board-deinboardname.c) im SPI Init Struct die Chip 
Select Leitungen zugewiesen? Wichtig ist auch das Du dort für das Device 
ein "spidev" anlegst um aus dem Userspace auf den SPI sprechen zu 
können. Danach sollte eigntlich open(),close(),read() und write() 
problemlos laufen.

Ich würde aber den Weg über eine Platform Device mit dazugehörigen 
Platform Driver wählen, ist auf jedenfall eine bessere Lösung als über 
das spidev zu sprechen (Man kann z.b. keine Interrupt Handler mit dem 
spidev nutzen).

Hab Dir mal einen (sehr hässlichen und unaufgeräumten!!) Treiber von mir 
angehängt.  Der Treiber legt ein spi device und ein platform device 
(framebuffer)an.
Um den Treiber(SPI Device/Platform Device) zu nutzen muss im Board 
Config / SPI Init Struct das Device "et028002" registriert werden. Der 
Platform Treiber (Platform Driver) wird ebenfalls über den Namen 
"et028002" , allerdings im Platform Device Struct , registriert.

Kann Dir das Buch ISBN 0132396556 empfehlen. Wird auch SPI abgehandelt.

Ach , und nochwas was mich sehr viel Zeit gekostet hat aber 
wahrscheinlich bei Dir nicht zutrifft , da Du wahrscheinlich keine 
xKiloBytes über den SPI in einem Rutsch schieben willst: Die AT91 PDC 
kann maximal 0xFFFE Bytes an einem Stück übertragen, 0xFFFF macht nur 
Müll.

von Janusz P. (piwi)


Lesenswert?

Habe in den letzten Tagen den 2.6.26 Kernel kompiliert und setze auch 
das SPI-Master Framework ein.
Nun weiß ich wie es geht...
Bin auf das gleiche Ergebnis wie du gekommen.
Trotzdem vielen Dank für deine Mühe.

SChönen Gruß
Piwi

von Julian (Gast)


Lesenswert?

Hallo Piwi,

wie funktioniert das SPI-Master-Framework mit Version 2.6.26?
Kannst du bitte kurz umreißen, wie du vorgegangen bist?

Dank und Gruß
Julian

von Torsten (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.