In Linux, wie Sie device_create innerhalb einer bestehenden Klasse?
Hinweis: Liste ich dieses problem, wie es heute ist, ich bin nicht Gegensatz zur änderung der Implementierung (verschieben der Erstellung der Klasse zu einem gemeinsamen Bereich, zum Beispiel), wenn es macht die Dinge einfacher... ich bin nur nicht sicher, wie es zu tun. :Ende Hinweis
Habe ich zwei linux-kernel-Modulen und-ich bin versucht, zu aktualisieren /sys-Einträge für Sie. Auf der Suche rund um bei google und anderen Quellen, die ich gesehen habe viel code, entlang der Linien von:
static dev_t MyDev;
static struct class *c1;
static int __init start_func(void)
{
...
MyDev = MKDEV(nMajor, MINOR_VERSION);
register_chrdev_region(MyDev, 1, MODULE_NAME);
c1 = class_create(THIS_MODULE, "chardrv");
device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
....
Und ich habe festgestellt, meine erste Modul dieser code funktioniert, und dass es korrekt erstellt eine:
/sys/class/chardrv/<MODULE_NAME>
Eintrag. Was ich wissen möchte ist, wie man ein Gerät in eine vorhandene Klasse. In anderen Worten, eines meiner Module hat dieses neue chardrv Klasse, jetzt will ich meine anderen Modul in der Lage sein, auch die Anmeldung seiner Geräte unter der selben Klasse.
Kann ich nicht nennen class_create() wieder (im zweiten Modul), denn das "chardrv" - Klasse ist bereits vorhanden...
So kann ich eine Prüfung durchführen, um zu sehen, ob /sys/class/chardrv existiert, und dies kann helfen, mich zu entscheiden, wenn muss ich anrufen class_create() oder nicht, das ist nicht ein problem. Können einige pseudo-code in hier zu klären:
if ( path "/sys/class/chardrv" does not exist)
new_class = class_create("chardrv")
else
new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
So wie in diesem Beispiel, wenn meine Klasse ist bereits vorhanden, und ich möchte nur hinzufügen mein neues Gerät in es von einem zweiten Modul ich nehme an, ich muss eine Klasse erstellen die Struktur und irgendwie füllt Sie mit den richtigen "chardrv class" - Attribute dann rufen Sie device_create wie vor, aber ich bin mir nicht sicher, wie das zu tun.
InformationsquelleAutor Mike | 2012-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
device_create
Funktion mit der gleichen Klasse, übergeben Sie einen Zeiger auf die gleiche Klasse.Da, den Sie anrufen möchten
device_create
in einem anderen Modul als dem, in dem Sie erstellen Sie die Klasse, die Sie benötigen, exportieren Sie das symbol für die Zeiger auf die Klasse. Sie können dieEXPORT_SYMBOL
makro dazu.Beispiel:
module1.c:
"Modul2".c
Hinweis: Sie einfügen müssen module1 vor "Modul2", da die Klasse Zeiger definiert wird, exportiert und in module1.
Sollte erstellen Sie die Verzeichnisse, die Sie erwarten:
/sys/class/chardrv/mod1_dev
/sys/class/chardrv/mod2_dev
Durch die Art und Weise, wenn Sie eine
Invalid parameters
Fehler, wenn Sie versuchen, laden Sie das zweite Modul, müssen Sie möglicherweise fügen Sie einKBUILD_EXTRA_SYMBOLS
- Zeile zu Ihrem Makefile.InformationsquelleAutor Vilhelm Gray
Folgen Ihrem Beispiel-code, Sie würde einfach anrufen
device_create()
wieder, vorbei an der gleichen Klasse, z.B.:Sollten Sie definitiv nicht brauchen, um den Pfad zu überprüfen, um zu bestimmen, ob die Klasse erstellt wurde. Sie schaffen es in Ihrem code, so einfach testen für
c1 == NULL
oder verwenden Sie ein flag, wenn Sie müssen.class_create()
in beiden Orten. Aber wenn ich diese Methode nicht aufrufen, wie kann ich Zugang zu meiner chardrv Klasse benötigt für parameter 1device_create()
. Noch einmal: Modul 1 Anrufeclass_create()/device_create()
. Modul 2 einfach aufrufen möchtedevice_create()
, erfordert aber eine Klasse Referenz.So müssen Sie zum hinzufügen einer API zum abrufen der Klasse. Die einfachste Möglichkeit ist, dass Sie in den kernel-proper (kein Modul) und die Module aufrufen.
Und ich bin gut, die Umsetzung ist flexibel. Allerdings bin ich mir noch nicht sicher, wie. Wenn ich Anrufe
class_create()
parameter1 istTHIS_MODULE
. Verschieben der Schaffung der Klasse der kernel die richtige, ich gehe davon ausTHIS_MODULE
nicht mehr funktionieren. Die def des class_create Funktion sagt P1: "Inhaber: Zeiger auf das Modul, ist dieser struct class". Dies bedeutet, der Eigentümer muss ein Modul.Ich meine, diese höflich, Sie denken über die Dinge. Versuchen Sie es einfach und sehen 🙂 - was Sie finden, ist, dass die kernel-header-Dateien, die das richtige tun mit
THIS_MODULE
wenn Sie Ihren code nicht in ein Modul.Ich habe den Absturz auf den Aufruf der Geräte-erstellen zweimal. Hier ist meine Frage-link - jede Idee - stackoverflow.com/questions/23085691/...
InformationsquelleAutor mpe
Erstellen Sie einfach die Klasse in die Modul-init-Funktion in Ihrem ersten Modul, export - global - Klasse symbol mit EXPORT_SYMBOL und nutzen es aus das andere Modul.
Da der Besitzer der Klasse ist Ihre erste Modul, jedes mal, wenn Sie ein Gerät hinzufügen, dass die Klasse das erste Modul der Referenz-Zähler wird erhöht: Sie können nicht entfernen Sie es, während jemand anderes es.
InformationsquelleAutor Gabor Jozsef Wacha
Linux-kernel wird nicht zulassen, zu tun. Dies ist die FEHLERMELDUNG, die Sie erhalten.
InformationsquelleAutor duslabo