返回

Linux 内核 I2C 设备探测延迟:深入剖析和常见问题解答

Linux

Linux 内核中的 I2C 设备探测延迟

在 Linux 内核中,i2c 设备和 i2c 适配器的探测顺序非常重要。了解其运作方式对于避免 I2C 子系统出现潜在问题至关重要。

I2C 设备与 I2C 适配器之间的关系

I2C 设备需要由 i2c 适配器创建,否则无法对其进行探测。适配器充当设备和主控制器之间的桥梁,处理数据传输和地址仲裁。

问题:优先级冲突

然而,i2c 客户端设备和 i2c 适配器的探测优先级相同。这意味着可能会出现以下问题:

  • 如果适配器尚未创建,则无法探测 i2c 客户端设备。
  • 如果 i2c 客户端设备尚未探测,则无法创建 i2c 适配器。

解决方案:设备探测延迟

为了解决这个问题,Linux 内核引入了称为 "device probing deferral" 的技术。当需要探测 i2c 客户端设备时,内核会检查相应的 i2c 适配器是否存在。如果适配器不存在,内核会将设备的探测推迟,直到适配器创建为止。

设备探测延迟步骤

设备探测延迟的步骤如下:

  1. 当需要探测 i2c 客户端设备时,内核会检查相应的 i2c 适配器是否存在。
  2. 如果适配器不存在,内核会将设备的探测推迟,直到适配器创建为止。
  3. 当适配器创建后,内核会重新启动设备的探测过程。

示例代码

以下示例代码展示了设备探测延迟的实际实现:

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 设备。