I2C 장치용 x86 ACPI SSDT

I2C 장치용 x86 ACPI SSDT

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_deviceACPI를 사용하여 할당해야 합니다.

나는 다양한 변형을 시도했습니다. 를 사용하거나 사용하지 않고 _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 확장기를 사용하는 것이 좋습니다.

관련 정보