由于您拥有支持 ACPI 的平台,因此最好的方法是提供给定设备的 ASL 摘录。
由于适用于 IoT 的 Intel Galileo 平台,Atmel 24 系列 EEPROM 拥有自己的 ACPI ID,摘录很简单:
DefinitionBlock ("at24.aml", "SSDT", 5, "", "AT24", 1)
{
External (_SB_.PCI0.I2C2, DeviceObj)
Scope (\_SB.PCI0.I2C2)
{
Device (EEP0) {
Name (_HID, "INT3499")
Name (_DDN, "Atmel AT24 compatible EEPROM")
Name (_CRS, ResourceTemplate () {
I2cSerialBusV2 (
0x0057, // I2C Slave Address
ControllerInitiated,
400000, // Bus speed
AddressingMode7Bit,
"\\_SB.PCI0.I2C2", // Link to ACPI I2C host controller
0
)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"size", 1024},
Package () {"pagesize", 32},
}
})
}
}
}
Note, the size property is being added in a pending patch series (patches add eeprom "size" property and add support to fetch eeprom device property "size").
请注意,目前硬编码的地址宽度为 8 位。如果您需要 16 位,则需要创建与上面提到的类似的补丁。
对于 LTC2990 功率监视器,您需要以下摘录:
DefinitionBlock ("ltc2990.aml", "SSDT", 5, "", "PMON", 1)
{
External (\_SB_.PCI0.I2C2, DeviceObj)
Scope (\_SB.PCI0.I2C2)
{
Device (PMON)
{
Name (_HID, "PRP0001")
Name (_DDN, "Linear Technology LTC2990 power monitor")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x4c, // Bus address
ControllerInitiated, // Don't care
400000, // Fast mode (400 kHz)
AddressingMode7Bit, // 7-bit addressing
"\\_SB.PCI0.I2C2", // I2C host controller
0 // Must be 0
)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "lltc,ltc2990"},
}
})
}
}
}
请注意,不幸的是驱动程序中没有兼容的字符串,因此,需要添加它,例如在这里完成.
在上面的例子中\\_SB.PCI0.I2C2
是 I2C 主控制器的绝对路径。
如何应用这些文件:
mkdir -p kernel/firmware/acpi
- 将文件保存在中提到的名称下
DefinitionBlock()
该文件夹中的宏
- 创建未压缩的 cpio 存档并将原始 initrd 连接到顶部:
find kernel | cpio -H newc --create > /boot/instrumented_initrd
cat /boot/initrd >> /boot/instrumented_initrd
更多详细信息请参阅SSDT 叠加.
其他示例和背后想法的描述可以在meta-acpi GitHub 页面,这里复制了一些材料。