【发布时间】:2016-12-27 03:54:07
【问题描述】:
我的i2c clock-frequency 值来自 BIOS。
我提取了DSDT和i2c clock-frequency字段如下:
Device (I2C1)
{
Name (_ADR, 0x00160001) // _ADR: Address
Name (_DDN, "Intel(R) I2C Controller #1") // _DDN: DOS Device Name
Name (_UID, 0x02) // _UID: Unique ID
Name (LINK, "\\_SB.PCI0.I2C1")
Name (RBUF, ResourceTemplate ()
{
})
Name (_DSD, Package (0x02)
{
Buffer (0x10)
{
/* 0000 */ 0x14, 0xD8, 0xFF, 0xDA, 0xBA, 0x6E, 0x8C, 0x4D,
/* 0008 */ 0x8A, 0x91, 0xBC, 0x9B, 0xBF, 0x4A, 0xA3, 0x01
},
Package (0x01)
{
Package (0x02)
{
"clock-frequency",
IC1S
}
}
})
但没有提及不同模式(如 400k、1M 等)的 i2c 时钟频率值。这些值在哪里定义?它是如何从 BIOS 传递到驱动程序的?
【问题讨论】:
-
模式仅由连接到主机的 slave 设备定义。这就是为什么上面的_DSD 感觉不对的原因。否则,I2C 时钟被定义为连接的最慢设备。在此处查看一些详细信息spinics.net/lists/linux-i2c/msg24857.html
-
我有一种强烈的感觉,这些
i2c-clock-frequency值已在 BIOS 源代码中定义。因为我们在BIOS中有选项可以选择Standard Mode (100k)、Fast Mode (400k)、Fast Plus (1M)和High Speed (3.4M),所以这些值应该在 BIOS 源代码中的某处匹配。内核 APIdevice_property_read_u32(&pdev->dev, "clock-frequency", &dev->clk_freq);与ACPI中的"clock-frequency"propname字段匹配,并从ACPI对象中获取i2c-clock-frequency值。 -
等等,我们是在谈论现有的 BIOS 吗?!
-
顺便说一句,这个,即
clock-frequency属性,在设备树中被广泛使用。对于 ACPI,根本不需要定义它,因为我已经解释过了。在 ACPI 中,I2cSerialBus()定义了某个从设备的速度。 -
是的,市场上的现有 BIOS!我知道这些值目前在 BIOS 源代码中为
defined。就DT的实现而言,这是有道理的。不知道他们为什么在现有 BIOS 中hard-code?不能动手!
标签: linux-kernel linux-device-driver acpi