在Linux中编写acpi驱动程序

时间:2018-03-01 18:22:30

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

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

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

我在线找到了一个相当古老但合理的例子,下面是基本概要。我几乎只是简单地改变名称,我使用acpidump来查找dsdt表获取正确的设备ID等。

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

以下是来源:

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);

1 个答案:

答案 0 :(得分:0)

Well it turns out that another acpi bus driver was registered for the acpi device ID I was using and the kernel did not call my add routine as a consequence. When I ran it with a different kernel, my add routine was called as expected.