2017-03-08 1 views
1

J'essaie d'en savoir plus sur les pilotes de plate-forme Linux. J'ai pris un pilote dans le tutoriel suivant:Fixation d'un périphérique avec le pilote de périphérique

http://linuxseekernel.blogspot.com/2014/05/platform-device-driver-practical.html

Il est un pilote de plate-forme de base. Je l'ai compilé et chargé le module. Il se charge bien, cependant, sa fonction de sonde n'est jamais exécutée. Il y a beaucoup de documentation qui a été dite tant que l'ID des périphériques et l'ID des pilotes correspondent, la fonction de sonde est appelée. Eh bien, j'ai le pilote suivant:

#include <linux/module.h> 
#include <linux/kernel.h> 
//for platform drivers.... 
#include <linux/platform_device.h> 
#define DRIVER_NAME "twl12xx" 

MODULE_LICENSE("GPL"); 

/**************/ 
static int sample_drv_probe(struct platform_device *pdev){ 
    printk(KERN_ALERT "twl12xx: Probed\n"); 
    return 0; 
} 
static int sample_drv_remove(struct platform_device *pdev){ 
    printk(KERN_ALERT "twl12xx: Removing twl12xx\n"); 
    return 0; 
} 

static const struct platform_device_id twl12xx_id_table[] = { 
    { "twl12xx", 0}, 
    {} 
}; 
MODULE_DEVICE_TABLE(platform, twl12xx_id_table); 

static struct platform_driver sample_pldriver = { 
    .probe   = sample_drv_probe, 
    .remove   = sample_drv_remove, 
    .driver = { 
      .name = DRIVER_NAME, 
    }, 
}; 
/**************/ 

int ourinitmodule(void) 
{ 
    printk(KERN_ALERT "\n Welcome to twl12xx driver.... \n"); 

    /* Registering with Kernel */ 
    platform_driver_register(&sample_pldriver); 

    return 0; 
} 

void ourcleanupmodule(void) 
{ 
    printk(KERN_ALERT "\n Thanks....Exiting twl12xx driver... \n"); 

    /* Unregistering from Kernel */ 
    platform_driver_unregister(&sample_pldriver); 

    return; 
} 

module_init(ourinitmodule); 
module_exit(ourcleanupmodule); 

J'ai aussi l'entrée suivante dans mon arbre de l'appareil:

twl12xx: [email protected] { 
    compatible = "twl12xx"; 
}; 

Je me sens comme je dois manquer quelque chose ou de définir correctement mon arbre périphérique.

+0

Vous utilisez un guide qui n'est pas destiné à l'arbre de l'appareil ou Open Firmware; l'auteur est probablement x86-centric. Votre pilote, tel qu'il est écrit, n'est pas prêt pour DT, par ex. il n'inclut pas ** linux/of.h **, et n'a pas de 'struct of_device_id' avec la chaîne compatible. Il existe de nombreux pilotes de plate-forme dans le noyau à utiliser comme exemples. Voir aussi http://stackoverflow.com/questions/26840267/driver-code-in-kernel-module-doesnt-execute/26855205#26855205 – sawdust

+0

Copie possible de [Le code du pilote dans le module du noyau ne s'exécute pas?] (Http: //stackoverflow.com/questions/26840267/driver-code-in-kernel-module-doesnt-execute) – sawdust

+0

@sawdust, il n'y a plus de code x86-centric et je souhaite être un peu moins centré sur le DT, le Le guide peut être périmé. De nos jours, les propriétés de périphérique unifiées parmi les autres fonctionnalités permet d'écrire les pilotes sans tenir compte de qui est le fournisseur de ressources. Donc, ne blâmez pas l'architecture, blâmez les développeurs, qui font du code XYZ-centric. – 0andriy

Répondre

0

Tout ce que vous avez lu est correct; l'ID du pilote et de l'appareil doivent correspondre.

Vous venez de créer le squelette du pilote et vous utilisez l'arborescence des périphériques. Donc ça a l'air bien. Mais il vous manque l'entrée of_match_table dans votre code; ce qui est très important pour la correspondance de l'ID de périphérique (même chaîne que celle que vous avez transmise depuis l'arborescence des périphériques) et l'appel de la sonde de pilote.

ajouter que les modifications ci-dessous votre code:

#ifdef CONFIG_OF 
static const struct of_device_id twl12xx_dt_ids[] = { 
.compatible = "ti,twl12xx", 
{} 
}; 
MODULE_DEVICE_TABLE(of, twl12xx_dt_ids); 
#endif 

static struct platform_driver sample_pldriver = { 
.probe   = sample_drv_probe, 
.remove   = sample_drv_remove, 
.driver = { 
     .name = DRIVER_NAME, 
     .of_match_table = of_match_ptr(twl12xx_dt_ids), 
}, 
.id_table = twl12xx_id_table, 
}; 
0

J'ai eu le même problème. La fonction de sonde n'a pas non plus pu imprimer quoi que ce soit. La raison dans mon cas était: Dans mon linux j'avais pilote prêt qui a été lié à l'appareil. Quand j'ai déconnecté ce pilote, la fonction de sonde a fonctionné avec succès.

(Note, délier:

cd /sys/bus/platform/drivers/<driver_name> 
    echo "device_name" > unbind 

)