2017-03-27 1 views
0

Je travaille sur dragonboard410c qui a le module noyau wcn36xx qui enregistre ainsi:gestionnaire d'interruption non enregistré

static const struct of_device_id wcn36xx_of_match[] = { 
    { .compatible = "qcom,wcnss-wlan" }, 
    {} 
}; 
MODULE_DEVICE_TABLE(of, wcn36xx_of_match); 

static struct platform_driver wcn36xx_driver = { 
    .probe  = wcn36xx_probe, 
    .remove  = wcn36xx_remove, 
    .driver   = { 
     .name = "wcn36xx", 
     .of_match_table = wcn36xx_of_match, 
    }, 
}; 
module_platform_driver(wcn36xx_driver); 

Je veux écrire mon propre module de noyau qui enregistre également le même appareil, je le code:

static const struct of_device_id my_interrupt_of_match[] = { 
    { .compatible = "qcom,wcnss-wlan" }, 
    {} 
}; 
MODULE_DEVICE_TABLE(of, lab2_interrupt_of_match); 
static struct platform_driver my_driver = { 
    .driver= { 
    .name = "my_interrupt", 
    .of_match_table = my_interrupt_of_match, 
    }, 
    .probe = my_probe, 
    .remove = my_remove, 
}; 

Dans la fonction init enregistrer mon pilote:

int err = platform_driver_register(&my_driver);

Mais ma fonction de sonde n'est pas appelée. mon module est automatiquement chargé au démarrage et la fonction init est appelée.

Je construis mon module dans un répertoire externe au code du noyau et je mis lab2_interrupt.ko sur la carte dans le même répertoire que wcn36xx.ko:

/lib/modules/4.4.23-linaro-lt -qcom/kernel/drivers/net/sans fil/ath/wcn36xx/

Répondre

1

Je suppose que c'est parce que le périphérique de plate-forme correspondant est déjà enregistré avec le pilote de plate-forme wcn36xx_driver d'origine. Vous devez soit le désactiver dans la construction de votre noyau, ou s'il est construit comme un module, vous pouvez le décharger avec modprobe -r wcn36xx avant de charger votre pilote lab2_interrupt, ou vous pouvez même le blacklister complètement pour l'empêcher d'être chargé dans le première place en ajoutant une telle ligne à /etc/modprobe.d/blacklist

blacklist wcn36xx 
+0

cela fonctionne comme vous avez écrit. Lorsque wcn36xx n'est pas enregistré, alors mon module est capable de s'enregistrer et sa fonction de sonde est appelée. Est-il toujours possible d'enregistrer un seul pilote pour un périphérique? – dafnahaktana

+1

@dafnahaktana Vous pouvez enregistrer plus d'un pilote pour un périphérique, mais un seul "gagnera". Il est possible de remplacer le pilote pour un périphérique de plate-forme, puis de le dissocier et de le re-tester. Voir https://www.redhat.com/archives/libvir-list/2014-April/msg00382.html –