探索Linux DevFreq驱动程序不被调用

我正在尝试在Linux上为外设设置一个devfreq驱动程序。 我的驱动程序的init方法如下所示:

static struct platform_driver zynq_csortfreq_driver = { .probe = zynq_csortfreq_probe, .driver = { .name = "ZYNQ_CSORT_DEVFREQ", .owner = THIS_MODULE, }, }; static int __init zynq_csortfreq_init(void) { return platform_driver_register(&zynq_csortfreq_driver); } late_initcall(zynq_csortfreq_init); 

然而,我的驱动程序中的探测function(zynq_csortfreq_probe)似乎从未被调用过。 我已经读过,为了使探测器调用正常工作,驱动程序的.name值必须与设备的名称匹配 – 在哪里可以find设备的名称?

为了调用probe功能,您必须从机器文件或设备树中添加设备 。 这通常是通过机器文件中的 platform_device_register()platform_add_devices()来完成的。 或者, of_platform_populate()用于设备树模型,但代码不直接使用。 平台设备文档包含有关您的Linux内核版本的信息。 看来你的Linux使用设备树模型 。 在cpufree devicetree中的文档将有一些有用的信息激活你的驱动程序设备树的这个主板。

dtsi文件需要类似的东西,

  soc { zyncfreq@addr { compatible="xxxx" /* Other platform data */ 

哪个将为您的机器定义设备 。 我建议你首先修改你的机器文件init_machine然后使用platform_device_register()把你的驱动和设备关联起来。 然后你可以稍后尝试让设备树机制工作,如果你想。

如果你可以查看这个封闭的问题 ,如果Linux设备模型文档不完全清楚,我的答案可能会有所帮助。 不过,我认为你的情况下, Linux文档就足够了。

解决了:

问题在于makefile系统。 必须创建“虚拟”目标文件,并将两个“真实”文件合并到“虚拟”目标文件中。

那么,新的makefile:

 # # Makefile for the mcp3202 driver. # obj-$(CONFIG_MCP3202) := mcp3202.o mcp3202-objs := mcp3202_core.o mcp3202_pru.o 

原来的“mcp3202.c”被重命名为“mcp3202_core.c”。 所列出的“mcp3202.o”不需要相应的.c文件,因为它是由make系统通过结合mcp3202_core.o和mcp3202_pru.o而“空虚的”创建的。

不是很优雅,但解释了为什么有很多“_core.c”文件穿过KERNEL构建系统。 听起来像一个内核大师工作的增值机会…