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
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.
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//
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
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!
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.
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...
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
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.
Hallo, ich habe die Hardware gewechselt von Atmel nach Freescale. Die Problematik besteht aber auch unter dem Freescale, also ich wäre dabei ;) Gruß
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.