Ich verwende PCI-e-Port auf Freescale MPC8308-Prozessor (die auf PowerPC-Architektur basiert) und ich habe einige Probleme, wenn Sie versuchen, es zu verwenden. Der Endpunkt PCI-e-Gerät verfügt über Speicherplatz von 256 MB. Mit dem Paket "pciutils" kann ich den Konfigurationsbereich des Endpunktgeräts einfach lesen und schreiben.PCI-e Speicherplatz Zugriff mit mmap
Nach dem Schreiben von korrekten Werten in Konfigurationsregistern und dem Abrufen der Berechtigung zum Zugriff auf den Speicherbereich; Ich versuchte Speicherraum zuzugreifen, indem „mmap()“ Funktion in C verwenden und verwendet, um die Deskriptor-Datei befindet sich auf:
„/sys/devices/pci0000:00/0000:00:00.0/resource0“
Das war genau 256 MB (entspricht Speicherplatz des Endpunkt-Geräts), so scheint es, dass ich den richtigen Pfad für den Dateideskriptor verwende. Hier können Sie meinen Code mit „mmap()“ wie erwähnt in https://github.com/billfarrow/pcimem finden:
https://github.com/billfarrow/pcimem/blob/master/pcimem.c
Aber leider, wenn ich versuche, um Speicherplatz zu verwenden, indem Sie zurück Adresse von „mmap()“ mit der Funktion; Ich kann die schreibgeschützten Register des Endpunktgeräts nicht richtig lesen. Wenn ich Adressen lese, die größer als "0x7FFFFFC" sind, startet der MPC8308 neu. Unter Berücksichtigung der obigen Situation, vermisse ich irgendwelche Schritte zur Initialisierung der PCI-e-Schnittstelle? Sollte ich irgendetwas im Linux-Kernel-Image oder U-Boot-Code ändern? Gibt es etwas anderes für die Verwendung von PowerPC PCI-e mit mmap()? Haben Sie einen Beispielcode, mit dem ich PCI-e-Speicherplatz lesen kann?
Dank
256 MB Speicherplatz für einen Endpunkt scheint zu groß zu sein. Auf meinem Prozessor (i.MX6) kann ich keinen Endpunkt größer als 16MB haben. Haben Sie einen Init-Fehler beim Booten von Linux für PCIe? Was ist Ihr PCIe-Speichergerät? Ist es ein FPGA? – FabienM
ja es schien mir auch zu viel, aber ich habe keinen Fehler beim Booten von Linux und es hat 256 MB Speicher für das Gerät gewidmet, wie ich in/proc/iomem sehen kann. Das Endpunktgerät ist kein FPGA. Es ist ein ASIC mit PCI-e-Schnittstelle. –
Eine andere Route besteht darin, die physikalische Adresse des Geräts und sein Limit zu finden und in/dev/mem abzubilden. (Ehrlich gesagt kann nicht garantieren, dass dies funktioniert. Ich bin gespannt, ob es tut.) – ruthafjord