2017-01-24 5 views
1

(Ich bin wirklich nicht sicher, welche Tags so Entschuldigungen im Voraus zu beantragen, wenn ich die falschen gewählt haben.)Lesen/Schreiben SPI Geräte

Ich hoffe, dass dies nicht eine zu dumme Frage, aber ich bin wirklich hier verloren.

Ein Kunde lieh mir eine Atmel SAMA5D2 Xplained board with Linux4SAM um mit zu spielen. Ich versuche, die SPI-Schnittstelle zu verbinden, aber ich habe keine Ahnung, wo ich anfangen soll.

Um klar zu sein, habe ich ähnliche Boards (nicht diese bestimmte) Bare-Metal verwendet. Ich habe auch schon viele Jahre Linux benutzt und vor ein paar Jahren ein paar einfache Gerätetreiber geschrieben. Und trotzdem bin ich verloren.

dmesg | grep spi gibt mir die folgende Ausgabe:

[ 1.840000] atmel_spi f8000000.spi: version: 0x311 
[ 1.840000] atmel_spi f8000000.spi: Using dma0chan0 (tx) and dma0chan1 (rx) for DMA transfers 
[ 1.850000] atmel_spi f8000000.spi: Using FIFO (16 data) 
[ 1.860000] atmel_spi f8000000.spi: Atmel SPI Controller at 0xf8000000 (irq 32) 
[ 1.860000] m25p80 spi32766.0: at25df321a (4096 Kbytes) 

Daraus schließe ich, dass ein Treiber geladen ist und dass es so konfiguriert ist, DMA zu verwenden. Dennoch sucht in /dev/ es gibt nichts, das wie ein SPI-Gerät aussieht (ich erwarte etwas wie /dev/spidev oder /dev/spi32766.0 oder ähnliches zu finden.)

Bedeutet dies, dass es keine tatsächlichen Gerätetreiber geladen? Muss ich einen schreiben, um den SPI zu verwenden?

Wenn ich mir die Makefile in the Linux4SAM source tree anschaue, sehe ich um Zeile 1171, dass der Kernel das Laden von Modulen nicht unterstützt. Bedeutet das, dass ich den Kernel neu kompilieren muss, um meinen neuen Treiber einzuschließen? Dies scheint ein dummer Ansatz zu sein; Warum sollte ich eine Linux-Distribution bereitstellen, wenn ich damit nicht auf die Hardware zugreifen kann?

Was fehlt mir hier? (Ich fühle mich ziemlich dumm ...)

EDIT Um klar zu sein: ich die externe SPI-Schnittstelle zugreifen wollen, die auf einem externen Gerät verbunden werden. Ich denke, das m25p80 ist ein interner Flash-Speicher; Ich bin nicht daran interessiert, dort zu lesen/schreiben.

+2

https://www.kernel.org/doc/Documentation/spi/spidev und Sie müssen spidev in Kernel-Konfiguration und Ressourcen-Provider wie Device Tree aktivieren. – 0andriy

+0

* "Wenn ich mir das Makefile anschaue ... unterstützt der Kernel das Laden von Modulen nicht." * - Sie finden keine Konfigurationsdetails im Makefile. * "Ich denke, das m25p80 ist ein interner Flash-Speicher" * - Falsch, das ist externer Blitz, der durch SPI verbunden ist. Lernkern ** Dokumentation/spi/spi-Zusammenfassung **. SPI-Geräte (Slave-Geräte) verfügen normalerweise über Geräteknotennamen, die von ihrer Funktionalität abgeleitet sind, und nicht von der verwendeten Schnittstelle. Spidev ist die Ausnahme, da es sich um einen Userspace-Kludon handelt. – sawdust

+0

@ 0andriy: spidev ist in der Kernel-Konfiguration aktiviert.Ich kann das Modul (modprobe) laden, aber kein neues Gerät erscheint. Ich hatte nicht gedacht, etwas im Device Tree angeben zu müssen ... Ich bin neu auf Linux auf solchen Plattformen. – Ludo

Antwort

0

@ 0andriy brachte mich auf den richtigen Weg. Ich musste der Device Tree eine SPI-Ressource hinzufügen und den Device Tree Blob auf die Karte flashen. (Da ich Device-Trees überhaupt nicht kannte, ist diese Information wirklich schwer zu finden ...).

Ich habe jetzt eine /dev/spidev32765.0. Ich habe diese auf den Gerätebaum:

 spi1: [email protected] { 
      pinctrl-names = "default"; 
      pinctrl-0 = <&pinctrl_spi1_default>; 
      status = "okay"; 

      [email protected] { 
       compatible = "linux,spidev"; 
       spi-max-frequency = <83000000>; 
       reg = <0>; 
      }; 
     }; 

     [email protected] { 
      pinctrl_spi1_default: spi1_default { 
       pinmux = <PIN_PD25__SPI1_SPCK>, 
        <PIN_PD26__SPI1_MOSI>, 
        <PIN_PD27__SPI1_MISO>, 
        <PIN_PD28__SPI1_NPCS0>; 
       bias-disable; 
      }; 
     }; 

Obwohl ich, dass die [email protected] Zugabe lesen nicht wirklich das Richtige zu tun (ich in der Tat in dmesg Ausgang „spidev spi32765.0 sehen: Buggy DT: spidev Stellung direkt in DT ").

Nun, wenn ich spidev_test ausführen, funktioniert es immer noch nicht (es Timeout), aber ich denke, das ist für eine andere Frage.