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.