未调用Linux DevFreq驱动程序中的探测器

未调用Linux DevFreq驱动程序中的探测器,linux,linux-kernel,Linux,Linux Kernel,我正在尝试为Linux上的外设设置一个devfreq驱动程序。驱动程序的init方法如下所示: static struct platform_driver zynq_csortfreq_driver = { .probe = zynq_csortfreq_probe, .driver = { .name = "ZYNQ_CSORT_DEVFREQ", .owner = THIS_MODULE, }, }; static i

我正在尝试为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);

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

为了调用
probe
函数,必须从机器文件或通过设备树添加设备。这通常通过机器文件中的
platform\u device\u register()
platform\u add\u devices()
完成。或者,将\u platform\u populate()的
用于设备树模型,但代码不直接使用它。包含有关Linux内核版本的信息。似乎您的Linux使用了。中的文档将提供一些关于使用设备树激活此板驱动程序的有用信息

dtsi
文件需要如下内容:

 soc {
     zyncfreq@addr {
          compatible="xxxx"
          /* Other platform data */
这将为您的机器定义设备。我建议您首先修改机器文件
init\u machine
条目,并使用
platform\u device\u 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”文件。听起来像是一个内核大师的增值机会