如何解决如何将我的平台驱动程序绑定到 ACPI 容器设备
我的笔记本电脑在 SSDT 表中有以下 SuperIO 设备:
DefinitionBlock ("","SSDT",1,"VENDORx","TABLEx",0x00001000)
{
Device (\_SB.PC00.LPCB.SIO0)
{
Name (_HID,EisaId ("PNP0A05") /* Generic Container Device */)
Name (_UID,"SD28301")
}
ACPI 容器驱动程序声明了此 ID,但我在 /sys/bus/container/* 中看到没有与此设备关联的驱动程序。
我想编写一个平台驱动程序来连接这个设备。我的驱动程序代码中有以下内容:
static const struct acpi_device_id sio_device_ids[] = {
{ "PNP0A05",0},{ "",0}
};
MODULE_DEVICE_TABLE(acpi,sio_device_ids);
调用 platform_driver_register()
时,我的驱动程序未绑定到 SIO 设备。为了查看内核是否甚至尝试匹配 acpi_device_id
条目,我将内核代码中的 PNP0A05 更改为 MHF1234(自定义 _HID)。然后我插入了一个 SSDT,其设备的 _HID 与内核驱动程序中的 acpi_device_id
相同:Name (_HID,EisaId ("MHF1234")
。现在,在插入我的驱动程序时,探测函数被调用,因此我的驱动程序与 ACPI 设备匹配。
问题:如何将我的驱动程序与 PNP0A05 设备匹配?我看到 ACPI 容器驱动程序已经检测到并将其添加到 /sys 但没有绑定到它的驱动程序。任何调试提示将不胜感激。
解决方法
设备正在由 drivers/acpi/container.c 下的代码创建。但是,它现在纯粹是 ACPI 设备。 ACPI 的平台设备由 acpi_create_platform_device()
创建,它应该由 acpi_bus_attach()
调用(通过 acpi_default_enumeration()
,因为它没有被父级枚举)。但是,成功时 container_device_attach()
返回正数,即 1,并且 acpi_bus_attach()
由于 the conditional 跳过平台设备创建。这就是为什么它没有被表示为平台设备,因此可能无法通过平台总线枚举。
除此之外,ACPI 规范告诉我们以下内容:PNP0A05 通用容器设备。其设置完全由其 ACPI 资源信息控制的设备,否则不需要特定于设备或总线的驱动程序支持。这最初被称为通用 ISA 总线设备。此 ID 应仅用于不生产供子设备使用的资源的容器。 PNP0A05 设备的 _CRS 对象声明的任何系统资源都必须由容器本身消耗。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。