Forum: Mikrocontroller und Digitale Elektronik ARM SPI Slave @ Linux überhaupt möglich?


von Nico (prinzenrolle)


Lesenswert?

Hallo,
ich habe mal wieder eine Frage:
Ist der SPI Slave Modus unter Linux (mit dem AT91SAM9G45) überhaupt 
möglich.
Ich habe gelesen (irc) das der spi slave modus unter linux nicht einfach 
zu implementieren ist, stimmt das?

Ich habe inzwischen es hinbekommen rootfs und einen Kernel selbst zu 
kompilieren.

Jetzt muss ich einen Treiber/Programm schreiben welches auf die SPI 
Schnittstelle zugreift. Ich habe mal nachgeschaut mit dmesg
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffa4000 (irq 14)
SPI wird wohl geladen.

Nur wie und wo fängt man nun an?

Ich habe leider gar keine Ahnung und google hilft nicht wirklich.
Ein howto, tutorial, beschreibung, link, etc wäre sehr hilfreich.

Vielen dank

von Imon (Gast)


Lesenswert?

Nico B. schrieb:
> Hallo,
> ich habe mal wieder eine Frage:
> Ist der SPI Slave Modus unter Linux (mit dem AT91SAM9G45) überhaupt
> möglich.
> Ich habe gelesen (irc) das der spi slave modus unter linux nicht einfach
> zu implementieren ist, stimmt das?
Das ist richtig das Linux SPI Framework geht davon aus das Linux der SPI 
Master ist, SPI Slave da müsstest du erstmal ein wenig Kernel Hacken 
damit das geht. Wobei bei der At91 Serie geht das SPI über einen DMA 
Kanal im Kernel, siehe driver/spi/atmel_spi.c, da sollte also eine ganze 
menge aufwand auf dich zu kommen, so das die Stark vereinfachte Antwort 
im augenblick am besten Lautet Linux kann nur SPI Master sein.

>
> Ich habe inzwischen es hinbekommen rootfs und einen Kernel selbst zu
> kompilieren.

Schön damit hast du ja fast ein fertiges system.

>
> Jetzt muss ich einen Treiber/Programm schreiben welches auf die SPI
> Schnittstelle zugreift. Ich habe mal nachgeschaut mit dmesg
> atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffa4000 (irq 14)
> SPI wird wohl geladen.
>
> Nur wie und wo fängt man nun an?
 hier gibt es zwei Möglichkeiten, entweder du schriebst ein 
Kerneltreiber,
 wenn du dich dazu entschließt würde ich mich an anfang von einen 
ähnlichen Treiber inspirieren lassen. Zum Beispiel wenn dein SPI Geräte 
ein Touchscreen wäre würde ich einfach unter driver/input/touchscreen 
nachsehen ob es da schon ein SPI Touchscreen gibt und mich hier dran 
Orientieren.
Oder aber du Kompilierst dein board mit SPIDEV Support, dann sollte dein 
udev die nodes  /dev/spi* anlegen und du kannst dies "Datein" einfach 
Öffnen und mit read /write und ein paar ioctls SPI spielen, das wird 
unter
Documentation/spi/spidev erklärt.

Egal für was du dich entscheidest ganz wichtig ist auf Jedenfalls das du 
in deiner board Configuration das SPI device anlegst, ich gehe davon aus 
das du das Amtel EK Bord benutzt wenn nicht, musst du denn Datei Namen 
anpassen.

in der Datei arch/arm/mach-at91/board-sam9m10g45ek.c ist die folgende 
struct.
1
/*
2
 * SPI devices.
3
 */
4
static struct spi_board_info ek_spi_devices[] = {
5
        {       /* DataFlash chip */
6
                .modalias       = "mtd_dataflash",
7
                .chip_select    = 0,
8
                .max_speed_hz   = 15 * 1000 * 1000,
9
                .bus_num        = 0,
10
        },
11
};

die musst du erweitern, für spidev zum Beispiel so:
1
/*
2
 * SPI devices.
3
 */
4
static struct spi_board_info ek_spi_devices[] = {
5
        {       /* DataFlash chip */
6
                .modalias       = "mtd_dataflash",
7
                .chip_select    = 0,
8
                .max_speed_hz   = 15 * 1000 * 1000,
9
                .bus_num        = 0,
10
        },
11
        {
12
                .modalias       = "spidev",
13
                .chip_select    = 1,
14
                .max_speed_hz   = 15 * 1000 * 1000,
15
                .bus_num        = 0,
16
                .controller_data = (void*) AT91_PIN_PA22, /* Set CS to PA22 */
17
        },
18
19
};
 den CS Chip ggf an dein Device anpassen!, Solltest du dich für ein
 Kerneltreiber etnscheiden, ist das fast das gleiche im Idealfall musst 
du
 dann nur denn modalias tauschen.

>
> Ich habe leider gar keine Ahnung und google hilft nicht wirklich.
> Ein howto, tutorial, Beschreibung, link, etc wäre sehr hilfreich.

das Buch Linux Device Drivers ist sehr zu empfehlen, allernativ, hilft 
es bei denn anderen zu schauen was die gemacht haben, alles unter 
arch/arm/mach-at91, kannst du ohne große mühe bei dir auch nutzten, bei 
arch/arm/* hast du meistens auch nicht viel zu ändern und alles 
außerhalb von arch, sollte sowie so Plattform unabhängig sein.

ansonsten sei dir das Verzeichnis Dokumentation ans Herz gelegt, hier 
versuchen die Kernelhacker, das zu Dokumentieren was sie machen, 
außerdem die Webseite http://kernelnewbies.org/, weiter das Buch Linux 
Treiberentwicklung und die Artikelserie Kern-Technik des Linux Magazin 
welche zum teil im Netz Online zu lesen ist.

von Link zu (Gast)


Lesenswert?

Imon schrieb:
> weiter das Buch Linux
> Treiberentwicklung und die Artikelserie Kern-Technik des Linux Magazin
> welche zum teil im Netz Online zu lesen ist.
Meinst du das [1] hier? Da ist die Auflage 1 online und die Auflage 2 
gibt es nur als Buch zu kaufen. Für einen Überblick sollte die 
Online-Version locker reichen.

[1] https://ezs.kr.hsnr.de//TreiberBuch/html//

von Imon (Gast)


Lesenswert?

Link zu schrieb:
> Meinst du das [1] hier? Da ist die Auflage 1 online und die Auflage 2
> gibt es nur als Buch zu kaufen. Für einen Überblick sollte die
> Online-Version locker reichen.

genau das meinte ich

von Nico (prinzenrolle)


Lesenswert?

Imon schrieb:
> Das ist richtig das Linux SPI Framework geht davon aus das Linux der SPI
> Master ist, SPI Slave da müsstest du erstmal ein wenig Kernel Hacken
> damit das geht. Wobei bei der At91 Serie geht das SPI über einen DMA
> Kanal im Kernel, siehe driver/spi/atmel_spi.c, da sollte also eine ganze
> menge aufwand auf dich zu kommen, so das die Stark vereinfachte Antwort
> im augenblick am besten Lautet Linux kann nur SPI Master sein.

Das ist natürlich schlecht für mich,
es soll ein vorhandenes System ersetzt werden,
und da ist der Mikrocontroller eben der SPI-Slave.
Ich habe mal google bemüht aber nichts brauchbares gefunden.
:(
Muss die Kommunikation über das "SPI Framework" gehen.
Der Controller macht über die SPI Schnittstelle nicht sehr viel...
- Daten empfangen
- "auswerten"
- Ready Signal setzen
- Antwort senden.
- Ready Signal wegnehmen

vielen dank für den link und die tolle Antwort!

von Imon (Gast)


Lesenswert?

Nico B. schrieb:
> Muss die Kommunikation über das "SPI Framework" gehen.
> Der Controller macht über die SPI Schnittstelle nicht sehr viel...
> - Daten empfangen
> - "auswerten"
> - Ready Signal setzen
> - Antwort senden.
> - Ready Signal wegnehmen

mh vielleicht neben denn SPI Framework eine Misc Device schreiben, das 
die PINS der SPI Anbindung als GPIOS hat ein paar Ringpuffer und so denn 
SPI Slave realisieren. Sicher ist du wirst  ein Teil der Aufgaben im 
Kernel Abhandeln müssen. Auch wenn du über die GPIOS ein Bitbang machst 
wo drauf es Wohl Hinauslaufen wird.

Ich denke du brauchst ein chardevice Treiber, vielleicht als miscdevice 
die Schnittstelle ist nicht sonderlich Kompliziert. In diesen Treiber 
hast du einen sende und empfängt Ringpuffer.
wenn nun der SPI Master denn CS setz dann löst das ein Interrupt in denn 
Treiber aus, dieser Speichert die Daten in sein Empfangs Ringpuffer.

Dein Programm was die Daten auswertet wartet mit einen read  darauf das 
die Daten anliegen (read blockiert im Allgemeinen bis die gewünschte 
anzahl daten da ist) . Später kannst du noch Poll Implementieren, um zu 
sehen ob Daten da sind und ggf ein Timeout zu behandeln.

Dann wertet dein Programm die Daten aus, und schreibt die Daten mit 
write in denn Sende buffer. Der Kerneltreiber erkennt das du senden 
willst und setzt das "Ready Signal" Bis der SPI Master alle Daten aus 
denn Sende Buffer gelesen hat.

Ich denke mit denn Infos aus Linux Device Drivers müsste das machbar 
sein.
Der Kernel wird zwar nicht wissen das es hier um SPI geht und keine 
Ahnung wie schnell das geht, aber es wäre eine Lösung.

von Link zu (Gast)


Lesenswert?

Imon schrieb:
> Ich denke mit denn Infos aus Linux Device Drivers müsste das machbar
> sein.
Gibt es auch online:
http://lwn.net/Kernel/LDD3/
http://www.oreilly.de/german/freebooks/linuxdrive2ger/book1.html
http://books.google.de/books?id=M7RHMACEkg4C&dq=Linux+Device+Drivers&printsec=frontcover&source=bn&hl=de&ei=M3VZTL6FIuSIONv2kesI&sa=X&oi=book_result&ct=result&resnum=5&ved=0CDEQ6AEwBA#v=onepage&q&f=false
Für den Einstieg reicht die Online-Version, aber für später würde ich 
ein/das Buch kaufen...
Wobei das deutsche (zweite Auflage) wohl etwas sehr alt ist...

von Imon (Gast)


Lesenswert?

Link zu schrieb:
>> Ich denke mit denn Infos aus Linux Device Drivers müsste das machbar
>> sein.
> Gibt es auch online:
> http://lwn.net/Kernel/LDD3/
> http://www.oreilly.de/german/freebooks/linuxdrive2...
> http://books.google.de/books?id=M7RHMACEkg4C&dq=Li...
> Für den Einstieg reicht die Online-Version, aber für später würde ich
> ein/das Buch kaufen...
> Wobei das deutsche (zweite Auflage) wohl etwas sehr alt ist...

stimmt, das kannst du wirklich nur noch im Spezialfall aus der Sammlung 
der alten Ehrwürdigen Bücher nehmen, hier wird der 2.4 Kernel 
abgehandelt,
sicher hat der einfluss auf denn Aktuellen Kernel, aber sich daraus zu 
bedienen hat kein wert, denn vieles ist halt doch ein anders geworden 
über die Zeit, so das ein Anfänger hiermit sicher keine Freude hat, und 
der Prozessor des Orginal Poster hat auch kein 2.4 Kernel. Also vergiss 
die Version an besten wieder damit hast du bei ein 2.6 Kernel nur Frust 
und kaum Support durch die Community

von Torsten K. (Gast)


Lesenswert?

Hallo Leute,

ich weiß der Thread ist jetzt schon ein paar Tage ohne Posts aber 
vielleicht kann mir jemand weiter helfen. Ich stehe vor der gleichen 
Aufgabe wie Nico B., ich muss meinen ARM9G20 unter Linux als SPI Slave 
betreiben, dabei ist es wichtig das DMA als Empfangspuffer verwendet 
wird. Hat da jemand schon Erfahrung oder Interesse mit mir zusammen an 
einer Lösung zu arbeiten?

Viele Grüße,
Torsten K.

von Nico B. (Gast)


Lesenswert?

Hallo,
ich habe die Hardware gewechselt von Atmel nach Freescale.

Die Problematik besteht aber auch unter dem Freescale,
also ich wäre dabei ;)

Gruß

von Imon (Gast)


Lesenswert?

Nico B. schrieb:
> ich habe die Hardware gewechselt von Atmel nach Freescale.

das ist aber schlecht für Torsten K. da er SPI Slave mit DMA wünscht,
ich kann mir ja noch vorstellen das man ein treiber Schreiben kann der
G20/G45/M10 unter einen Hut bringt Wahrscheinlich sogar AT91 insgesamt,
aber aber Freescale und ATMEL via DMA ? bin ich mit Verlaub etwas 
pessimistisch das Ihr dort viele Synergien findet.

von Philipp F. (nerdture)


Lesenswert?

Hi, habe dasselbe Problem:
Würde gerne den pico-SAM9G45 
(http://arm.mini-box.com/index.php?title=Main_Page) als SPI slave 
betreiben.

Gibt es dort inzwischen einen Treiber?

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.