中断处理程序未注册

时间:2017-03-27 08:28:54

标签: linux-device-driver

我在dragonboard410c上工作,它具有以这种方式注册的内核模块wcn36xx:

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);

我想编写自己的内核模块,它也注册到同一个设备,我有代码:

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,
};

在init函数中,我注册了我的驱动程序:

int err = platform_driver_register(&my_driver);

但我的探测功能未被调用。 我的模块在启动时自动加载,并调用init函数。

我在内核代码外部的目录中构建我的模块,并将lab2_interrupt.ko放在与wcn36xx.ko相同的目录中的板上:

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

1 个答案:

答案 0 :(得分:1)

我想这是因为相应的平台设备已经在原始wcn36xx_driver平台驱动程序中注册。

你应该在内核版本中禁用它,或者如果它是作为模块构建的,你可以在加载modprobe -r wcn36xx驱动程序之前用lab2_interrupt卸载它,或者你甚至可以将它完全黑名单通过向/etc/modprobe.d/blacklist

添加这样一行来阻止它首先加载
blacklist wcn36xx