Lens Driver如何兼容
时间:10-02
整理:3721RD
点击:
当ProjectConfig.mk 配置文件中同时配置二颗Lens Driver(皆非sensordrive)的时候,会出现其中一颗的driver无法注册的情况
log:<3>[0.746620]Errorriver'lens_actuator'isalreadyregistered,aborting...
<4>[0.747487]failedtoregisterOV5640AFdriver
这个情况下需要解决这二颗Lens Driver兼容的问题
MT6573、MT6575、MT6577解决方案
以 ov5640af 和 fm50af 兼容为例
Eg:FM50af的writeid是0x18,OV5640AF是由sensor控制lens,所以writeid其实就是ov5640的sensorid,这边OV5640AFprobe时add的I2Cdriver只要和FM50AF的writeid不一样,就不会有问题。因为实际ov5640af读写register时都是调用的OV5640_read_cmos_sensor和OV5640_write_cmos_sensor.

如果两颗lens的writeid确实相同,那么注册时请将一颗lens的writeid修改,而在实际读写register使用时再使用真正的writeid
MT6589、MT6582平台解决方案
以 ov8825af 和 fm50af 兼容为例,兼容时保持 fm50afdriver不变,修改ov8825af lens driver
1:需要修改文件 alps\mediatek\platform\$platform$\kernel\core\mt_dev.c
修改后如下
修改以下几点
a):static struct i2c_board_info __initdata kd_lens_dev={ I2C_BOARD_INFO("OV8825AF", 0x19)}; //0x18 --> 0x19
b):#define OV8825AF_VCM_WRITE_ID 0x6c // 改成正确的i2c write id,如果是内置的vcm ic,写成ov8825 sensor的write id,如果是外置的
vcm ic,按VCM ic的datasheet 写
c):修改函数 Register_OV8825AF_CharDrv
把mt_devs.c中实现的内容放入到了lens driver 中,所以不涉及到mt_devs.c文件
log:<3>[0.746620]Errorriver'lens_actuator'isalreadyregistered,aborting...
<4>[0.747487]failedtoregisterOV5640AFdriver
这个情况下需要解决这二颗Lens Driver兼容的问题
MT6573、MT6575、MT6577解决方案
以 ov5640af 和 fm50af 兼容为例
- <font face="宋体" size="4">mt6573_devs.c
- staticstructplatform_deviceactuator_dev={
- .name="lens_actuator",
- .id=-1,
- };
- staticstructplatform_deviceactuator_dev0={
- .name="lens_actuator0",
- .id=-1,
- };
- __initintmt657X_board_init(void)
- {
- ...
- #if1//defined(CONFIG_ACTUATOR)
- retval=platform_device_register(&actuator_dev);
- if(retval!=0){
- returnretval;
- }
- #endif
- #if1//defined(CONFIG_ACTUATOR)
- retval=platform_device_register(&actuator_dev0);
- if(retval!=0){
- returnretval;
- }
- #endif
- ...
- }
- ov5640af.c
- inlinestaticintRegister_OV5640AF_CharDrv(void)
- {
- ....
- actuator_class=class_create(THIS_MODULE,"actuatordrv0");
- ....
- }
- staticstructplatform_driverg_stOV5640AF_Driver={
- .probe=OV5640AF_probe,
- .remove=OV5640AF_remove,
- .suspend=OV5640AF_suspend,
- .resume=OV5640AF_resume,
- .driver={
- .name="lens_actuator0",
- .owner=THIS_MODULE,
- }
- };</font>
Eg:FM50af的writeid是0x18,OV5640AF是由sensor控制lens,所以writeid其实就是ov5640的sensorid,这边OV5640AFprobe时add的I2Cdriver只要和FM50AF的writeid不一样,就不会有问题。因为实际ov5640af读写register时都是调用的OV5640_read_cmos_sensor和OV5640_write_cmos_sensor.

如果两颗lens的writeid确实相同,那么注册时请将一颗lens的writeid修改,而在实际读写register使用时再使用真正的writeid
MT6589、MT6582平台解决方案
以 ov8825af 和 fm50af 兼容为例,兼容时保持 fm50afdriver不变,修改ov8825af lens driver
1:需要修改文件 alps\mediatek\platform\$platform$\kernel\core\mt_dev.c
修改后如下
- <font face="宋体" size="4">//添加了一部分代码, 注意字符串变化
- //
- /*=======================================================================*/
- /* Lens actuator */
- /*=======================================================================*/
- static struct platform_device actuator_dev = {
- .name = "lens_actuator",
- .id = -1,
- };
- static struct platform_device actuator_dev1 = {
- .name = "lens_actuator1",
- .id = -1,
- };
- //
- //=======================================================================
- // Lens motor
- //=======================================================================
- #if 1 //defined(CONFIG_ACTUATOR)
- retval = platform_device_register(&actuator_dev);
- if (retval != 0){
- return retval;
- }
- retval = platform_device_register(&actuator_dev1);
- if (retval != 0){
- return retval;
- }
- #endif</font>
修改以下几点
a):static struct i2c_board_info __initdata kd_lens_dev={ I2C_BOARD_INFO("OV8825AF", 0x19)}; //0x18 --> 0x19
b):#define OV8825AF_VCM_WRITE_ID 0x6c // 改成正确的i2c write id,如果是内置的vcm ic,写成ov8825 sensor的write id,如果是外置的
vcm ic,按VCM ic的datasheet 写
c):修改函数 Register_OV8825AF_CharDrv
- <font face="宋体" size="4">actuator_class = class_create(THIS_MODULE, "actuatordrv1"); // actuatordrv --> actuatordrv1</font>
- <font face="宋体" size="4">/* Kirby: add new-style driver { */
- g_pstOV8825AF_I2Cclient = client;
- g_pstOV8825AF_I2Cclient->addr = OV8825AF_VCM_WRITE_ID; // add
- g_pstOV8825AF_I2Cclient->addr = g_pstOV8825AF_I2Cclient->addr >> 1; //打开代码
- //Register char driver
- i4RetValue = Register_OV8825AF_CharDrv();</font>
- <font face="宋体" size="4">// platform structure
- static struct platform_driver g_stOV8825AF_Driver = {
- .probe= OV8825AF_probe,
- .remove= OV8825AF_remove,
- .suspend= OV8825AF_suspend,
- .resume= OV8825AF_resume,
- .driver= {
- .name= "lens_actuator1", // 这儿把 “lens_actuator” 改成 “lens_actuator1”,这里需要保持和文件mt_devs.c增加的 name一致
- .owner= THIS_MODULE,
- }
- };</font>
把mt_devs.c中实现的内容放入到了lens driver 中,所以不涉及到mt_devs.c文件
- <font face="宋体" size="4">static struct platform_device g_stAF_device = {
- .name = PLATFORM_DRIVER_NAME,
- .id = 0,
- .dev = {}
- };
- static int __init FM50AF_i2C_init(void)
- {
- i2c_register_board_info(LENS_I2C_BUSNUM, &kd_lens_dev, 1);
- if(platform_device_register(&g_stAF_device)){
- LOG_INF("failed to register AF driver\n");
- return -ENODEV;
- }
- if(platform_driver_register(&g_stAF_Driver)){
- LOG_INF("Failed to register AF driver\n");
- return -ENODEV;
- }
- return 0;
- }</font>
谢谢分享好资料
