类似的方法可以用于一个简单的sensor driver 用来支持多个sensor.比如Galaxycore SoC驱动,对于每个sensor, 有一个 gc_product_info 结构体,它包含了产品id号和对应的全部的寄存器配置表格。在驱动的probe中,将探测到的sensor id和id tables里的匹配,匹配上了,相应的product_info里的寄存器表就会被调用,用于初始化sensor.
1)他的参数i2c_device_id已经由i2c子系统match函数确定,所以对应的product_info就被确定,哪个camera sensor已经被确定, 很多寄存器的表格将被确定;
2)从v4l2_subdev得到gc_device的platform_data, platform_data 里有对应的power控制的相关函数,
gc_device的platform_data也是在probe包含的函数里由client->dev.platform_data赋值的,
client->dev.platform_data 在i2c-core.c里由info->platform_data得到,
i2c_info->platform_data由platform_camera.c里camera_device_table里的devs_id的get_platform_data得到;
3)v4l2_set_subdevdata()设置了sd->dev_priv,这样从subdev也就可以得到i2c_client;
4)于是对sensor上电后,读出id, (这个相关函数和信息由i2c_client 得到)看是否与i2c_device_id的id(这个是由该驱动的id tables得到)匹配,匹配的话将完成注册。
Example:
struct gc_product_mapping product_mappings[] = {
{ GC2155_ID, &gc2155_product_info },
{ GC0310_ID, &gc0310_product_info },
};
struct gc_product_mapping {
int gc_id;
struct gc_product_info *product_info;
};