Linux 内核 I2C 设备探测延迟:深入剖析和常见问题解答
2024-03-18 13:34:59
Linux 内核中的 I2C 设备探测延迟
在 Linux 内核中,i2c 设备和 i2c 适配器的探测顺序非常重要。了解其运作方式对于避免 I2C 子系统出现潜在问题至关重要。
I2C 设备与 I2C 适配器之间的关系
I2C 设备需要由 i2c 适配器创建,否则无法对其进行探测。适配器充当设备和主控制器之间的桥梁,处理数据传输和地址仲裁。
问题:优先级冲突
然而,i2c 客户端设备和 i2c 适配器的探测优先级相同。这意味着可能会出现以下问题:
- 如果适配器尚未创建,则无法探测 i2c 客户端设备。
- 如果 i2c 客户端设备尚未探测,则无法创建 i2c 适配器。
解决方案:设备探测延迟
为了解决这个问题,Linux 内核引入了称为 "device probing deferral" 的技术。当需要探测 i2c 客户端设备时,内核会检查相应的 i2c 适配器是否存在。如果适配器不存在,内核会将设备的探测推迟,直到适配器创建为止。
设备探测延迟步骤
设备探测延迟的步骤如下:
- 当需要探测 i2c 客户端设备时,内核会检查相应的 i2c 适配器是否存在。
- 如果适配器不存在,内核会将设备的探测推迟,直到适配器创建为止。
- 当适配器创建后,内核会重新启动设备的探测过程。
示例代码
以下示例代码展示了设备探测延迟的实际实现:
static int i2c_client_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct i2c_adapter *adapter = client->adapter;
/* Check if the adapter exists. */
if (!adapter) {
/* The adapter does not exist. Defer the probe. */
dev_err(&client->dev, "Adapter not found. Deferring probe.\n");
return -EPROBE_DEFER;
}
/* The adapter exists. Proceed with the probe. */
return i2c_client_probe_default(client, id);
}
在上面的代码中,i2c_client_probe()
函数会检查 i2c 客户端设备的适配器是否存在。如果适配器不存在,函数会将设备的探测推迟,直到适配器创建为止。如果适配器存在,函数会继续执行设备的默认探测过程。
结论
通过使用设备探测延迟技术,Linux 内核确保了 i2c 设备只会在相应的适配器创建后才会被探测。这防止了因适配器和设备探测优先级冲突而导致的问题,并确保了 I2C 子系统的正确操作。
常见问题解答
1. 为什么 i2c 设备探测的优先级与 i2c 适配器相同?
这允许同时探测设备和适配器,从而提高效率。
2. 设备探测延迟如何解决冲突?
它推迟了需要适配器存在才能探测的设备的探测,直到适配器创建为止。
3. 设备探测延迟会影响性能吗?
通常不会,因为大多数设备探测都是在引导过程中进行的。
4. 如何知道适配器何时创建?
内核会在适配器创建后发出通知,触发设备探测重新启动。
5. 设备探测延迟是否仅适用于 i2c 设备?
否,它还用于其他设备类型,例如 USB 设备。