我知道驱动程序和设备必须具有相同的名称,并且我已确保我已完成此操作。然而,当modprobe'我的驱动程序时,即使我在init函数中完成了许多printk,也没有任何反应。
当modprobing时,我得到:
root@localhost:~# dmesg --clear
root@localhost:~# modprobe mcp3202
root@localhost:~# dmesg
[ 41.828678] kobject: 'mcp3202' (bf03968c): kobject_add_internal: parent: 'module', set: 'module'
[ 41.828747] kobject: 'holders' (ded9d980): kobject_add_internal: parent: 'mcp3202', set: '<NULL>'
[ 41.828890] kobject: 'notes' (dd1947c0): kobject_add_internal: parent: 'mcp3202', set: '<NULL>'
[ 41.829028] kobject: 'mcp3202' (bf03968c): kobject_uevent_env
[ 41.829053] kobject: 'mcp3202' (bf03968c): fill_kobj_path: path = '/module/mcp3202'
root@localhost:~#
没有printk出现。
我的设备和驱动程序结构是:
static struct platform_device mcp3202_device = {
.name = "mcp3202",
.id = 0,
.num_resources = 0,
};
static strict of_device_id mcp3202_id[] = {
{ .compatible = "microchip,mcp3202", },
{ }
};
MODULE_DEVICE_TABLE(of,mcp3202_id);
static struct platform_driver mcp3202_driver = {
.driver = {
.name = "mcp3202",
.owner = THIS_MODULE,
.of_match_table = mcp3202_id,
},
.probe = mcp3202_probe,
.remove = mcp3202_remove,
};
module_init(mcp3202_init);
module_exit(mcp3202_exit);
...最后,我的初始化函数(部分)......
static int __init mcp3202_init(void)
{
int init_result;
struct device *dev;
printk(KERN_WARNING "mcp3202: reg driver\n");
.
.
.
}
我的理解是只要名称匹配(dev / drv),无论此设备的.dts中定义了什么,都将调用mcp3202_init。
任何人都有任何我失踪的线索吗?
谢谢!
答案 0 :(得分:0)
@Bryan,内核make系统没有错误。您正在使用的Makefile中的错误,请尝试使用Makefile编译mcp3202驱动程序并进行反馈。
有两种方法可以解决此问题,
1)将模块名称更改为mcp3202_mod.o,如下所示,Makefile将是,
obj-$(CONFIG_MCP3202) += mcp3202_mod.o
mcp3202_mod-objs := mcp3202.o mcp3202_pru.o
(or)
2)将源文件mcp3202.c更改为mcp3202_<meaningful-name>.c
,Makefile将是,
obj-$(CONFIG_MCP3202) += mcp3202.o
mcp3202-objs := mcp3202_<name_provided>.o mcp3202_pru.o
模块名称和源文件名称不应相同,如果是,则<module_name.mod.c>
中不会出现初始化信息,也不会被调用。另请查看以下链接,
Building a kernel module from several source files which one of them has the same name as the module