微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > Lens Driver如何兼容

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 兼容为例

  1. <font face="宋体" size="4">mt6573_devs.c
  2. staticstructplatform_deviceactuator_dev={
  3. .name="lens_actuator",
  4. .id=-1,
  5. };
  6. staticstructplatform_deviceactuator_dev0={
  7. .name="lens_actuator0",
  8. .id=-1,
  9. };
  10. __initintmt657X_board_init(void)
  11. {
  12. ...
  13. #if1//defined(CONFIG_ACTUATOR)
  14. retval=platform_device_register(&actuator_dev);
  15. if(retval!=0){
  16. returnretval;
  17. }
  18. #endif
  19. #if1//defined(CONFIG_ACTUATOR)
  20. retval=platform_device_register(&actuator_dev0);
  21. if(retval!=0){
  22. returnretval;
  23. }
  24. #endif
  25. ...
  26. }
  27. ov5640af.c
  28. inlinestaticintRegister_OV5640AF_CharDrv(void)
  29. {
  30. ....
  31. actuator_class=class_create(THIS_MODULE,"actuatordrv0");
  32. ....
  33. }
  34. staticstructplatform_driverg_stOV5640AF_Driver={
  35. .probe=OV5640AF_probe,
  36. .remove=OV5640AF_remove,
  37. .suspend=OV5640AF_suspend,
  38. .resume=OV5640AF_resume,
  39. .driver={
  40. .name="lens_actuator0",
  41. .owner=THIS_MODULE,
  42. }
  43. };</font>

复制代码

同时需要保证两颗AF的I2C注册时的writeID不同,否则会造成第二颗lens的I2Cprobe不会跑到
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
修改后如下

  1. <font face="宋体" size="4">//添加了一部分代码, 注意字符串变化
  2. //
  3. /*=======================================================================*/
  4. /* Lens actuator */
  5. /*=======================================================================*/
  6. static struct platform_device actuator_dev = {
  7. .name = "lens_actuator",
  8. .id = -1,
  9. };
  10. static struct platform_device actuator_dev1 = {
  11. .name = "lens_actuator1",
  12. .id = -1,
  13. };
  14. //
  15. //=======================================================================
  16. // Lens motor
  17. //=======================================================================
  18. #if 1 //defined(CONFIG_ACTUATOR)
  19. retval = platform_device_register(&actuator_dev);
  20. if (retval != 0){
  21. return retval;
  22. }
  23. retval = platform_device_register(&actuator_dev1);
  24. if (retval != 0){
  25. return retval;
  26. }
  27. #endif</font>

复制代码

2:修改文件 alps\mediatek\custom\common\kernel\lens\ov8825af\ov8825af.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

  1. <font face="宋体" size="4">actuator_class = class_create(THIS_MODULE, "actuatordrv1"); // actuatordrv --> actuatordrv1</font>

复制代码

d):修改函数 OV8825AF_i2c_probe

  1. <font face="宋体" size="4">/* Kirby: add new-style driver { */
  2. g_pstOV8825AF_I2Cclient = client;
  3. g_pstOV8825AF_I2Cclient->addr = OV8825AF_VCM_WRITE_ID; // add
  4. g_pstOV8825AF_I2Cclient->addr = g_pstOV8825AF_I2Cclient->addr >> 1; //打开代码
  5. //Register char driver
  6. i4RetValue = Register_OV8825AF_CharDrv();</font>

复制代码

e): g_stOV8825AF_Driver 变量的修改

  1. <font face="宋体" size="4">// platform structure
  2. static struct platform_driver g_stOV8825AF_Driver = {
  3. .probe= OV8825AF_probe,
  4. .remove= OV8825AF_remove,
  5. .suspend= OV8825AF_suspend,
  6. .resume= OV8825AF_resume,
  7. .driver= {
  8. .name= "lens_actuator1", // 这儿把 “lens_actuator” 改成 “lens_actuator1”,这里需要保持和文件mt_devs.c增加的 name一致
  9. .owner= THIS_MODULE,
  10. }
  11. };</font>

复制代码

MT6595 MT6595 MT6732/52 等平台及之后的平台
把mt_devs.c中实现的内容放入到了lens driver 中,所以不涉及到mt_devs.c文件

  1. <font face="宋体" size="4">static struct platform_device g_stAF_device = {
  2. .name = PLATFORM_DRIVER_NAME,
  3. .id = 0,
  4. .dev = {}
  5. };
  6. static int __init FM50AF_i2C_init(void)
  7. {
  8. i2c_register_board_info(LENS_I2C_BUSNUM, &kd_lens_dev, 1);
  9. if(platform_device_register(&g_stAF_device)){
  10. LOG_INF("failed to register AF driver\n");
  11. return -ENODEV;
  12. }
  13. if(platform_driver_register(&g_stAF_Driver)){
  14. LOG_INF("Failed to register AF driver\n");
  15. return -ENODEV;
  16. }
  17. return 0;
  18. }</font>

复制代码

谢谢分享好资料

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top