4

我正在尝试为 Linux 上的外围设备设置 devfreq 驱动程序。我的驱动程序的初始化方法如下所示:

  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) 似乎从未被调用过。我已经读过,为了使探测调用正常工作,驱动程序的 .name 值必须与设备的名称匹配 - 我在哪里可以找到设备的名称?

4

2 回答 2

7

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

dtsi文件需要类似的东西,

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

这将为您的机器定义设备。我建议您首先修改您的机器文件init_machine条目并使用platform_device_register()将您的驱动程序与设备相关联。然后,如果您愿意,您可以稍后尝试使设备树机制工作。

如果您可以查看这个已关闭的问题,如果Linux设备模型文档不完全清楚,我的回答可能会有所帮助。但是,我认为对于您的情况,Linux文档就足够了。

于 2013-04-28T15:40:00.760 回答
-1

解决了:

问题出在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 构建系统中。听起来像是内核专家工作的增值机会......

于 2015-11-25T18:41:03.573 回答