【问题标题】:writing an acpi driver in Linux在 Linux 中编写一个 acpi 驱动程序
【发布时间】:2018-03-01 18:22:29
【问题描述】:

我需要编写一个使用 acpi 方法与硬件设备通信的内核模块。

此时我只想加载驱动程序并枚举总线上的设备。

我在网上找到了一个相当古老但合理的例子,下面是基本大纲。我几乎是逐字逐句更改名称的示例,我使用 acpidump 查找 dsdt 表获取正确的设备 ID 等。

驱动程序加载正常,但没有调用我的添加函数。我怀疑我在注册后错过了刺激扫描总线的步骤。该示例假定驱动程序在引导时加载。有没有办法在注册总线后请求对其进行扫描,以便添加任何连接到已注册总线的设备?理解我的怀疑可能是错误的,所以如果我的假设是错误的,请纠正我。

以下是出处:

static int viking_acpi_add(struct acpi_device *device);
static int viking_acpi_remove(struct acpi_device *device);
static void viking_acpi_notify(struct acpi_device *adev, u32 event);

static const struct acpi_device_id nv_device_ids[] = {
    { "ACPI0012", 0},
    { "", 0},
};
MODULE_DEVICE_TABLE(acpi, nv_device_ids);

static struct acpi_driver nv_acpi_driver = {
    .name =         "NV NVDR",
    .class =        "NV",
    .ids =          nv_device_ids,
    .ops =          {
                            .add =          nv_acpi_add,
                            .remove =       nv_acpi_remove,
                            .notify =       nv_acpi_notify,
                    },
.owner =    THIS_MODULE,
};

//static struct acpi_device acpi_dev;

static int nv_acpi_add(struct acpi_device *device)
{
    printk("NV: acpi bus add\n");
    return 0;
}

static int nv_remove(struct acpi_device *device)
{
    printk("NV: acpi bus remove\n");
    return 0;
}

static void nv_acpi_notify(struct acpi_device *adev, u32 event)
{
    device_lock(&adev->dev);
    printk("notification detected\n");
    device_unlock(&adev->dev);
}

static int __init nv_init(void)
{
    int result = 0;

    result = acpi_bus_register_driver(&nvt_driver);
    if (result < 0) {
        printk("Error registering driver\n");
        return -ENODEV;
    }

    return 0;
}

static void __exit nv_exit(void)
{
    acpi_bus_unregister_driver(&nv_driver);
}

module_init(nv_init);
module_exit(nv_exit);

【问题讨论】:

    标签: linux-kernel linux-device-driver acpi


    【解决方案1】:

    事实证明,为我使用的 acpi 设备 ID 注册了另一个 acpi 总线驱动程序,因此内核没有调用我的 add 例程。当我使用不同的内核运行它时,我的 add 例程被按预期调用。

    【讨论】:

    • 所以,这意味着在“非工作”内核中你不需要做任何事情。或者您更愿意找到并破解现有的驱动程序。
    • 我不确定我是否理解该声明。内核工作正常。我没有“破解”任何东西。在通用驱动程序可能不具备所有必需功能的情况下,需要为特定硬件编写自定义驱动程序并不罕见。这是我第一个使用调用 acpi 驱动程序的驱动程序,我不知道不能将多个驱动程序注册到同一个设备 ID。一旦我意识到这一点,我就可以继续使用早期的内核。
    • 这就是我的观点:如果驱动程序存在但不能完全满足您的目的,则无需创建自定义驱动程序。只需破解现有的。也可能是您正在做的事情通常通过另一种方式解决。
    • 很公平,感谢您的评论。根据我注册驱动程序的经验,通常会将驱动程序添加到链表或其他机制中。这支持分层设备架构(过滤器驱动程序等)。我的假设有误,我想澄清为什么我写的驱动程序没有被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2020-01-24
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多