2017-06-21 9 views
1

Mein Freund und ich versuchen, einen Gerätetreiber für ein virtuelles Gerät (lesen Sie: nicht PCI oder USB) für eine erweiterte Betriebssystemklasse zu schreiben. Wir benutzen Ubuntu 16.04. Unsere Aufgabe besteht darin, die IOCTL in unserem Treiber aufzurufen und ihr einen Quellpuffer voller RGB-Werte (ein Array von ganzen Zahlen), einen leeren Zielpuffer und eine Länge zu geben. Wir rufen den DMA-Controller auf, um den Inhalt des Quellpuffers in den Zielpuffer zu übertragen, und wenden dann eine lineare Transformation auf die Werte im Zielpuffer an.Ist es möglich, Speicher-zu-Speicher-DMA-Übertragungen unter Linux durchzuführen? Wenn ja, welche Funktion ruft den DMA auf, um eine Übertragung zu beginnen?

Wir haben erfolgreich die Transformationen ohne DMA getan und wir haben erfolgreich einen DMA-Kanal zu unserem Gerät zugeordnet. Das Problem, das wir haben, ist, dass wir keine Funktion irgendwo finden können, die das Initiieren einer Übertragung unter Verwendung der DMA beschreibt. Wir möchten, dass es nach der Fertigstellung einen Interrupt auslöst (der Fahrer sollte nicht warten, bis der Transfer beendet ist).

Um klar zu sein mit dem, was wir bitten, wir möchten nur wissen, wo wir Definitionen für Funktionen beschreibt diesen Prozess finden. Wir fragen nicht nach Code oder einer genauen Methode, um diese Aufgabe zu erledigen. Wir würden einfach gerne wissen, welche Funktionen verwendet werden können und/oder welche Header-Datei, um sie zu finden. Wir haben durch linux/dma-mapping.h scheinbar ad nauseam geschaut. Wir haben LDD3 auch eine Weile betrachtet, aber es scheint gründlich durch den Prozess der Einrichtung der DMA zu gehen, ohne viel Information darüber zu geben, welche Funktionen verwendet werden sollten, um die DMA-Übertragung tatsächlich zu beginnen.

Antwort

1

Es gibt "DMA-Engine" APIs in der letzten Linux-Kernel lokale DMA-Maschinen zu unterstützen Lage, Speicher-zu-Speicher-Kopier in drivers/dma Verzeichnis, überprüfen, wie sie umgesetzt werden:

http://elixir.free-electrons.com/linux/latest/source/drivers/dma/Kconfig

menuconfig DMADEVICES 
bool "DMA Engine support" 
depends on HAS_DMA 
help 
    DMA engines can do asynchronous data transfers without 
    involving the host CPU. Currently, this framework can be 
    used to offload memory copies in the network stack and 
    RAID operations in the MD driver. This menu only presents 
    DMA Device drivers supported by the configured arch, it may 
    be empty in some cases. 

DMA Engines ist in mehreren Hardware-Plattformen, aber nicht in jedem PC oder Server oder SoC implementiert. Überprüfen Sie Optionen in der Kconfig wie INTEL_IDMA64 "Intel integrierte DMA .. Intel Skylake PCH", INTEL_IOATDMA "Intel (R) I/OAT DMA-Engine in aktuellen Intel Xeon-Chipsätzen."

Andere Option ist die Verwendung einer Virtualisierungsplattform wie qemu und die Implementierung einer eigenen Geräteemulation (https://stackoverflow.com/a/44612957 edu device und simple driver, http://wiki.qemu.org/Features/QOM).

Wenn Sie fragen, wie Interrupt-Handler zu registrieren, uns sagen, was Ihr (virtueller) ist Bus, wie Sie Ihr (virtuelles) Gerät angeschlossen ist (und wie Sie das virtuelle Gerät tun implementieren). Und qemu's "edu" pci.c driver has some examples for PCI-compatible interrupts: request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major).

Verwandte Themen