Nota: Sto elencando questo problema come è oggi, sono non contrario a cambiare l'implementazione (spostando la creazione della classe in un'area comune per esempio) se rende le cose più facili ... Non sono sicuro di come farlo. : End NoteIn Linux, come usi device_create all'interno di una classe esistente?
Ho due moduli del kernel linux e sto cercando di aggiornare le voci/sys per loro. Cercando in giro su google e da altre fonti, ho visto un sacco di codice lungo le linee di:
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);
....
E ho verificato per il mio primo modulo di questo codice funziona, e che crea correttamente un:
/sys/class/chardrv/<MODULE_NAME>
ingresso. Quello che mi piacerebbe sapere è come si crea un dispositivo in una classe esistente. In altre parole, uno dei miei moduli ha creato questa nuova classe Chardrv, ora voglio che anche il mio altro modulo possa registrare i suoi dispositivi nella stessa classe.
non posso chiamare class_create() di nuovo (nel secondo modulo), perché quella classe "chardrv" esiste già ...
Così posso eseguire un controllo per vedere se/sys/class/chardrv esiste, e questo può aiutarmi a decidere se devo chiamare class_create() o no, non è un problema. Consente di mettere un po 'pseudo codice qui per chiarire:
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, ...)
Così come da questo esempio, se la mia classe esiste già, e voglio solo aggiungere il mio nuovo dispositivo in esso da un secondo modulo Presumo che ho bisogno per creare una struttura di classe e in qualche modo popolarla con gli attributi di "classe chardrv", quindi chiamare device_create come prima, ma non sono sicuro di come farlo.
Non sono sicuro che tu sia chiaro quando sto cercando di farlo qui ... almeno quell'errore non ha senso per la mia domanda. Voglio creare una classe "chardrv" per esempio, quindi avere un modulo del kernel registrare un dispositivo in esso. Dì "dispositivo1". Quindi un secondo modulo del kernel registrerà un secondo dispositivo nella stessa classe "dispositivo2". Quindi ora l'esecuzione di un comando di lista su/sys/class/chardrv mostrerà entrambi i dispositivi. Stai dicendo che non c'è modo di farlo in Linux? Non mi sembra giusto ... – Mike