用于多个总线的Linux设备驱动程序

时间:2013-10-10 16:06:02

标签: linux linux-kernel linux-device-driver embedded-linux i2c

我正在尝试让I2C总线驱动程序适用于我的嵌入式产品。

该驱动程序目前正在为0号总线正常工作,但它不适用于总线1.

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

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

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。

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

感谢。

0 个答案:

没有答案