1

我正在尝试让 I2C 总线驱动程序为我的嵌入式产品工作。

驱动程序目前在总线 0 上工作正常,但对总线 1 不工作。

我看到有一个名为 i2c-product.c 的文件(我已将芯片 i2c 控制器的名称替换为“产品”),我相信这是控制器的驱动程序。

它有一个功能product_i2c_probe(struct platform_device *pd)。我看到这是在 platform_driver 结构中分配给 .probe 成员的回调。我猜内核调用它来设置驱动程序。说得通。

product_i2c_probe(struct platform_device *pd)函数内部有以下几行来设置适配器:

drv_data->adapter.dev.parent = &pd->dev;
drv_data->adapter.algo = &product_i2c_algo;
drv_data->adapter.owner = THIS_MODULE;
drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
drv_data->adapter.timeout = msecs_to_jiffies(pdata->timeout);
drv_data->adapter.nr = pd->id;

通过探索 i2c-core.c 和 i2c-dev.c 中的代码,似乎适配器的 nr 成员需要包含总线 ID,因为这是从设备节点获取次要的内容。注意我还使用 mknod 命令为两条总线创建了节点。所以我有一个设备 /dev/i2c-0 和 /dev/i2c-1。

稍后在该product_i2c_probe(struct platform_device *pd)函数中,它使用 .将适配器添加到设备中i2c_add_numbered_adapter(&drv_data->adapter)

在文件末尾,我看到它注册了设备:

static int __init
product_i2c_init(void)
{
    return platform_driver_register(&product_i2c_driver);
}

最后

module_init(product_i2c_init);

所以我的问题是,谁调用了 probe() 函数并传递了 platform_device *pd。很明显,该对象的 pd->id 值成为该行中适配器的总线 ID:

drv_data->adapter.nr = pd->id;

某处有配置文件吗?我到处搜索,但找不到它,包括 menuconfig。

任何帮助将不胜感激。正如您可能猜到的那样,我是设备驱动程序的新手。我是在正确的轨道上,还是完全偏离了轨道?

谢谢。

4

0 回答 0