2013-04-20 9 views
5

ottenere puntatore per la classe di dispositivi (struct class) esistenti nel modulo del kernel Linuxottenere puntatore per la classe di dispositivi (classe struct) esistenti nel modulo del kernel Linux

Ciao a tutti!

Sto tentando di registrare un dispositivo in una classe di dispositivo esistente, ma non riesco a ottenere il puntatore su una classe esistente. La versione del kernel è Linux 3.3.6. posso creare una classe in un modulo, ottenere il puntatore ad esso e quindi utilizzarlo per registrare il dispositivo con:

*cl = class_create(THIS_MODULE, className); 
dev_ret = device_create(*cl, NULL, *dev, NULL, driverName); 

Tuttavia ho bisogno di registrare un altro dispositivo nella stessa classe con un altro modulo, ma non potevo trovare un modo per ottenere il puntatore a una classe esistente. E non riesco a creare nuovamente la classe nell'altro modulo, poiché poiché la classe esiste già class_create restituisce NULL e non il puntatore alla classe richiesta da device_create. ho trovato in:

http://lwn.net/Articles/102500/

una funzione che restituisce un puntatore a una classe con il suo nome:

struct class * class_find(char * name) 

Tuttavia quando provo a compilare la funzione di compilazione dice che non esiste. Ho pensato che questa funzione fosse esportata dal kernel (il mio modulo ha licenza GPL) ma sembra che non lo sia. Forse ho bisogno di includere qualche intestazione?

Ho provato a riscrivere questa funzione poiché il suo codice è un elenco nel link sopra. Ma quando cerco di iterare class_subsys con:

list_for_each_entry(this_class, &class_subsys.kset.list, subsys.kset.kobj.entry) 

ora simbolo class_subsys non viene trovato. Ancora una volta ho pensato che fosse esportato nel kernel.

Non sono sicuro di ciò che manca. Qualche colpo di testa? Sto facendo nel modo sbagliato? C'è un'altra funzione per farlo?

Suppongo che se potessi attraversare sysfs dall'inizio potrei ottenere un puntatore a una classe esistente. Ma non ho trovato anche come iniziare a percorrere sysfs. Tutte le funzioni che ho visto richiedono un puntatore a kobject o kset per iniziare il movimento. Ma non ho alcun puntatore nemmeno alla radice di sysfs o agli oggetti del kernel, quindi non posso iniziare ad attraversare l'albero per ottenere un puntatore di classe.

Qualcuno può indicarmi la direzione giusta per favore?

+1

Il collegamento a cui si fa riferimento descrive una patch che non è mai stata inserita nel kernel di Linux - motivo per cui non si è in grado di chiamare 'class_find'. Ecco la discussione LKML pertinente: https://lkml.org/lkml/2004/9/16/83. –

+0

ciao, hai sollevato questo problema? Ho bloccato anche questo problema. – xianyu1337

risposta