我在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 /
答案 0 :(得分:1)
我想这是因为相应的平台设备已经在原始wcn36xx_driver
平台驱动程序中注册。
你应该在内核版本中禁用它,或者如果它是作为模块构建的,你可以在加载modprobe -r wcn36xx
驱动程序之前用lab2_interrupt
卸载它,或者你甚至可以将它完全黑名单通过向/etc/modprobe.d/blacklist
blacklist wcn36xx