C语言 如何正确探测平台设备?

bis0qfac  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在尝试创建一个平台驱动程序,我有以下代码
模块

// SPDX-License-Identifier: GPL-2.0

#include <linux/module.h>
#include <linux/init.h>
#include <linux/pm.h>
#include <linux/of_device.h>
#include <linux/fb.h>

static int simple_probe(struct platform_device *pdev)
{
    printk(KERN_ERR "SIMPLE: %s\n", "Probing");
    return 0;
}

const struct of_device_id simple_of_match[] = {
    {
        .compatible = "example,simple",
    },
    { /*End of List*/ },
};

struct platform_driver simple_driver = { 
    .probe = simple_probe,
    .driver = { 
        .name = "simple",
        .owner = THIS_MODULE,
        .of_match_table = simple_of_match 
    }
};

static int __init init(void)
{
    if (platform_driver_register(&simple_driver)) {
        printk(KERN_ERR "SIMPLE: %s\n", "Registerered");
    } else {
        printk(KERN_ERR "SIMPLE: %s\n", "Failed");
    }
    return 0;
}

static void __exit deinit(void)
{
    platform_driver_unregister(&simple_driver);
}

module_init(init);
module_exit(deinit);

MODULE_DESCRIPTION("Simple Platform driver");
MODULE_AUTHOR("Bret Joseph Antonio <[email protected]>");
MODULE_LICENSE("GPL");

我的设备树似乎没有运行覆盖,因此设备状态正常。它仍然没有运行探测回调。
设备树

/dts-v1/;

/ {
    simple@0 {
        compatible = "example,simple";
        pinctrl-names = "lcm_rst_out1_gpio", "lcm_rst_out0_gpio";
        pinctrl-0 = <&PHANDLE1>;
        pinctrl-1 = <&PHANDLE2>;
        status = "okay";
    };
};

我希望内核注册我的驱动程序,然后运行探测功能,但代码

if (platform_driver_register(&simple_driver) == 0) {
        printk(KERN_ERR "SIMPLE: %s\n", "Registered");
    } else {
        printk(KERN_ERR "SIMPLE: %s\n", "Failed");
    }

返回[ 0.178889] SIMPLE: Registered,但探测函数保持沉默。探针功能依赖于什么?当它在设备树中找到节点时,不应该运行探测器吗?

6l7fqoea

6l7fqoea1#

您需要使用MODULE_DEVICE_TABLE(of, simple_of_match);语句将struct of_device_id simple_of_match[] * 导出 * 到of(开放固件)子系统。这将在构建时为模块创建所需的alias条目。
令人欣慰的是,主线中的其他内核驱动程序已经为同样的遗漏打了补丁,例如。[PATCH] mtd: nand: tango: Export OF device ID table as module aliases[PATCH] pwm: samsung: Use MODULE_DEVICE_TABLE() to include OF modalias
后一个补丁提到:
如果.驱动程序构建为模块,则不会填充modalias信息,因此不会自动加载模块。使用MODESIGN_DEVICE_TABLE()宏导出OF设备ID,以便模块包含该信息。
这意味着如果你的驱动总是一个内置模块而不是一个嵌入式模块,那么你就不需要MODULE_DEVICE_TABLE(of, simple_of_match);语句。
内核代码的约定是尽可能将所有符号声明为static。您的代码在这方面不一致,即。struct of_device_id simple_of_match[]struct platform_driver simple_driver是全局的。
补丁形式的建议编辑:

- const struct of_device_id simple_of_match[] = {
+ static struct of_device_id simple_of_match[] = {
    {
        .compatible = "example,simple",
    },
    { /*End of List*/ },
  };

+ MODULE_DEVICE_TABLE(of, simple_of_match);

- struct platform_driver simple_driver = { 
+ static struct platform_driver simple_driver = { 
     .probe = simple_probe,
     .driver = { 
         .name = "simple",
         .owner = THIS_MODULE,
         .of_match_table = simple_of_match 
     }
  };

相关问题