我正在尝试让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。
任何帮助将不胜感激。你可能猜到,我是设备驱动程序的新手。我是在正确的轨道上,还是完全离开?
感谢。