【发布时间】:2021-01-14 21:55:30
【问题描述】:
我正在使用 Q7 模块 (x86) 并尝试在 Linux 上使用 ACPI SSDT 覆盖配置我们的外围设备。但我与它斗争。我想我误解了 ACPI 的一些核心概念。
问题
CPU -> I2C -> PCA9575 GPIO Expander -> virtual,mdio-gpio -> Ethernet Phy
什么有效
DefinitionBlock ("abc.asl", "SSDT", 2, "test", "HAL", 2)
{
External (\_SB_.PCI0.D01D, DeviceObj)
Scope (\_SB.PCI0.D01D)
{
Device (ABC0)
{
Name (_HID, "PRP0001") // must be PRP0001 that linux searches for compatible driver
Name (_CRS, ResourceTemplate () {
I2cSerialBusV2 (
0x20, // SlaveAddress : I2C Address
ControllerInitiated, // SlaveMode : ControllerInitiated
100000, // ConnectionSpeed : max Bus Speed for this device
AddressingMode7Bit, // AddressingMode : Adress Mode
"\\_SB.PCI0.D01D", // ResourceSource : I2C host controller
0x00, // ResourceSourceIndex : must be 0
ResourceConsumer, // ResourceUsage : must be ResourceConsumer
, // DescriptorName : optional name for integer value which is an offset to a buffer field...
Exclusive // Shared : Shared or Exclusive
,) // VendorData : optional field
})
Name (_DSD, Package() {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package (2) { "compatible", "nxp,pca9575" },
Package () { "gpio-line-names", Package ()
{ "LED_Red",
"",
"MDC",
"MDIO",
}
},
},
ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
Package () {
Package () { "led-red", "LED0" },
Package () { "mdc-gpios", "MDC0" },
Package () { "mdio-gpios", "MDIO" },
}
})
Name (LED0, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"gpio-hog", 1},
Package () {"gpios", Package () {0, 1}},
Package () {"output-low", 1},
}
})
... <placeholder for virtual,mdio-gpiocode here> ...
}
}
}
它识别 PCA9575 GPIO 扩展器并将其注册为 Linux 中的 gpiochip。 LED 固定为低且“被占用”。看来这部分也不是全错。
什么不起作用
我将此代码插入占位符
Device (MD00)
{
Name (_HID, "PRP0001") // must be PRP0001 that linux searches for compatible driver
Name (_DSD, Package() {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package (2) { "compatible", "virtual,mdio-gpio" },
Package () {"gpios", Package () {^MDC0, 2, 0,
^MDIO, 3, 0,}},
}
})
}
但是当我尝试通过 configfs 加载此文件时,我可以在 dmesg 中看到一条错误消息,指出 _CRS 字段中已定义资源的兼容字段丢失。但我什至没有定义 _CRS 字段。
我也不确定我的 GPIO 是否定义正确。我无法使用Package () {"gpios", Package () {0, 1}}, 命令设置拉模式。
我问自己,GPIO 扩展器端口是否应该在 MDO 设备中再次定义为 GgioIo 结构?
Name (_CRS, ResourceTemplate () {
GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionNone,
"\\_SB.PCI0.D01D.ABC0", 0, ResourceConsumer) {2}
GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionNone,
"\\_SB.PCI0.D01D.ABC0", 0, ResourceConsumer) {3}
})
它似乎也不起作用,我很困惑。我不确定我是否正确使用了 GPIO PCA9575 驱动程序。我可以在哪里配置 ACPI 中的拉动偏差?驱动程序从of_ 加载配置,但我不知道在 ACPI 中的何处定义它。我希望这里有人有想法。
【问题讨论】:
-
我稍后会找时间回复你。同时查看 meta-ACPI 项目github.com/westeri/meta-acpi/tree/master/recipes-bsp/… 中的示例。还要检查内核文档kernel.org/doc/html/latest/firmware-guide/acpi/…。