2017-06-06 1 views
0

J'essaie de développer mon premier pilote Linux, mais j'ai rencontré un problème de blocage en utilisant l'API kobj_to_dev pour obtenir une référence "struct device *" à partir d'un "struct kobject *" passé en tant que paramètre à un événement "show" de l'attribut ar/o.Le module de pilote Linux "kobj_to_dev" ne fonctionne pas

je mieux expliquer le scénario décrivant seulement quelques-unes des instructions que je vous ai écrit tomber dans le problème ci-dessus:

  • struct statique kobj_attribute myOption_attr = __ATTR_RO (myoption)

  • attribut static struct * my_attrs [] = {& myOption_attr.attr, NULL}

  • struct statique attribute_group my_attr_group = {.attrs =} my_attrs

  • dispositif de struct * MyDev = device_create (... Certains paramètres ...)

  • struct kobject * myKObj = kobject_create_and_add ("MySettings", & myDev-> kobj)

  • sysfs_create_group (myKObj, & my_attr_group)

  • statique ssize_t pinNumber_show ( struct kobject * kobj, struct kobj_attribute * attr, char * buf ) { struct device * kobjDev = kobj_to_dev (kobj);

    pr_info ( "attendu:% p - décès:% p% d:% d \ n"., MyDev, kobjDev, MAJOR (kobjDev-> DEVT) MINOR (kobjDev-> DEVT) ) }

Après avoir installé le module pilote je reçois avec succès le fichier virtuel/sys/class/mydev/MySettings/myoption. Lorsque j'exécute, alors la commande "cat/sys/class/monDev/mySettings/myOption" dans le répertoire /var/log/kern.log me donne une valeur de pointeurs différente pour myDev et kobjDev, et les nombres majeur et mineur sont 0.

Quelqu'un pourrait-il me diriger vers ce que j'ai raté?

Merci beaucoup!

Répondre

0

J'ai trouvé la solution moi-même, je devais changer

kobj_to_dev(kobj) 

à

kobj_to_dev(kobj->parent) 

Merci quand même! :)