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拡張子を使用することをお勧めします。