我现在要做一个GSensor的驱动,由于不同批次产品换了料,所以虽然都是GSensor但是它们的从地址不一样,而且系统配置时也只能加载一个GSensor驱动。
我的GSensor的代码过程简略如下:
首先是 __init xxgsensor_init(void), 在这里面调用 i2c_register_board_info(0, &i2c_xxgsensor, 1) 和 platform_driver_register(&xx_gsensor_driver),其中i2c_xxgsenor 和 xx_gsensor_driver 如下:
static struct i2c_board_info __initdata i2c_xxgsensor = { .type = "xxgsensor", .addr = 0x18 };
static struct platform_driver xx_gsensor_driver = {
.probe = xx_probe,
.remove = xx_remove,
.driver = {
.name = "gsensor",
}
};
在执行 platform_driver_register(&xx_gsensor_driver) 的过程中就会调用 xx_probe(struct platform_device *pdev) ,然后在 xx_probe 中调用 i2c_add_driver(&xx_i2c_driver),xx_i2c_driver是一个strcut i2c_driver。
在执行 i2c_add_driver 的过程中会调用 xx_i2c_driver中填写的probe函数:static int xx_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id),在这里面会完成一些GSensor的初始化工作。
现在问题来了:上面的函数过程只能适用于准确知道设备i2c从地址(这里是0x18)的情况,但是我现在的情况如开头所说,不能在代码中确定设备地址,我在网上(http://huhb.github.com/blog/2012/09/18/01-I2CSubsystem/)搜索到有这样一个函数:
struct i2c_client *
i2c_new_probed_device(struct i2c_adapter *adap,
struct i2c_board_info *info,
unsigned short const *addr_list,
int (*probe)(struct i2c_adapter *, unsigned short addr))
它可以按地址列表检测i2c设备是否存在并生成i2c_client。
我的疑问是,应该在哪里怎样正确使用这个函数,或者有何更好的办法解决我的问题?
------解决方案--------------------
你的问题应该是不知道I2C从设备地址的情况下,如何获取正确的I2C从设备地址吧?
1)如果你说的函数可以检测到你的I2C设备并能获取地址,那么肯定是要在你的设备链挂接之前进行调用.
2)I2C规范中好像支持一个广播命令,主设备发此指令从设备解析此命令并传回自己的地址,这要看从设备是否支持?你可以看看你的芯片资料看是否支持,同时查查I2C规范了解一下具体的命令格式.