我的笔记本电脑在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()
跳过平台设备创建。这就是为什么它没有表示为平台设备,因此不能通过平台总线枚举。
除此之外,ACPI规范告诉我们以下内容:PNP0A05通用容器设备。其设置完全由其 ACPI 资源信息控制的设备,否则不需要特定于设备或总线的驱动程序支持。这最初称为通用 ISA 总线设备。此 ID 应仅用于不生成供子设备使用的资源的容器。PNP0A05设备的_CRS对象声明的任何系统资源都必须由容器本身使用。