我正在尝试使用 ACPI SSDT 在 Odroid H3+/Ubuntu 22.04 上注册 I2C gpio 扩展器 (PCF8575),以便稍后我可以轻松地将每个 GPIO 分配为 led,并使用好听的名称来切换引脚。我有以下 SSDT 表:
DefinitionBlock ("gpio-expander.aml", "SSDT", 1, "Vendor", "Accel", 0x00000004)
{
External (\_SB.PC00.I2C0, DeviceObj)
Scope (\_SB.PC00.I2C0)
{
Device (PCF0)
{
Name (_CID, "PRP0001")
Name (_DDN, "GPIO-Expander")
Name (_ADR, 0x0020)
Name (_DSD, Package ()
{
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package ()
{
Package () { "compatible", Package() { "nxp,pcf8575" } },
}
})
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0x0F)
}
Name (_CRS, ResourceTemplate()
{
I2cSerialBusV2 (
0x20,
ControllerInitiated,
100000,
AddressingMode7Bit,
"\\_SB.PC00.I2C0",
0x00
)
})
}
}
}
(使用 GRUB 或 acpi_configfs 加载 - 效果相同), /sys 中的正确位置出现节点,但我不知道,原因内核没有分配任何驱动程序。如果我使用echo "pcf8575 0x20" > ../new_device
正确分配的驱动程序添加设备,那么它也应该使用 ACPI 分配它
我尝试了不同的变化:有或没有_ADR
,_CRS
有方法或没有方法。
答案1
嗯,答案很简单。 Linux 内核 5.15 的片段(在本问题中使用):
#ifdef CONFIG_OF
static const struct of_device_id pcf857x_of_table[] = {
{ .compatible = "nxp,pcf8574" },
{ .compatible = "nxp,pcf8574a" },
{ .compatible = "nxp,pca8574" },
{ .compatible = "nxp,pca9670" },
{ .compatible = "nxp,pca9672" },
{ .compatible = "nxp,pca9674" },
{ .compatible = "nxp,pcf8575" },
{ .compatible = "nxp,pca8575" },
{ .compatible = "nxp,pca9671" },
{ .compatible = "nxp,pca9673" },
{ .compatible = "nxp,pca9675" },
{ .compatible = "maxim,max7328" },
{ .compatible = "maxim,max7329" },
{ }
};
MODULE_DEVICE_TABLE(of, pcf857x_of_table);
#endif
ID 表受到保护,CONFIG_OF
这意味着该驱动程序尚无法使用 ACPI 表进行枚举。该保护措施在内核 6.3 中被删除,并且需要进行一些更改才能提供此类功能。
我建议这个问题的作者(我)使用更新的内核或不同的 GPIO 扩展器。