我正在尝试了解Linux平台驱动程序。我从以下教程中选择了一个驱动程序:
http://linuxseekernel.blogspot.com/2014/05/platform-device-driver-practical.html
这是一个基本的平台驱动程序。我编译了它并加载了模块。它加载正常,但它的探测功能永远不会执行。只要设备ID和驱动程序ID匹配,就会有很多文档说,然后调用探测函数。好吧,我有以下驱动程序:
#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);
我的设备树中也有以下条目:
twl12xx: twl12xx@2 {
compatible = "twl12xx";
};
我觉得我必须遗漏某些东西或错误地定义我的设备树。
答案 0 :(得分:1)
无论你读到什么都是正确的;驱动程序和设备ID都应该匹配。
您刚刚创建了驱动程序的骨架,并且您正在使用设备树。所以它看起来很好。但是你错过了代码中的of_match_table
条目;这对于设备ID匹配(与从设备树传递的字符串相同)和驱动程序探测调用非常重要。
所以添加以下更改代码:
#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,
};
答案 1 :(得分:0)
我有类似的问题。探针功能也无法打印任何东西。在我的情况下的原因是:在我的Linux中,我已经准备好了绑定到设备的驱动程序。当我取消绑定此驱动程序时,探测功能成功运行。
(注意,取消绑定:
cd /sys/bus/platform/drivers/<driver_name>
echo "device_name" > unbind
)