当前位置:   article > 正文

MT8766 Android13 Camera GC02M1驱动获取sensor_id流程_gc02m1 msm8953

gc02m1 msm8953

个人学习总结记录,有错误望指正

在配置这个驱动的过程中,设备名称和ID配置无误的前提下,我们能成功加载进GC02M1的驱动文件,但是获取sensor_id异常,从后往前进行一个添加log排查,自己梳理一遍

1、进入初始化后调用sensor_func结构体,进行一个初始化配置

  1. UINT32 GC02M1MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc)
  2. {
  3. /* To Do : Check Sensor status here */
  4. if (pfFunc != NULL)
  5. {
  6. printk("GC02M1MIPI_RAW_SensorInit\n");
  7. *pfFunc = &sensor_func;
  8. }
  9. return ERROR_NONE;
  10. }
  11. static struct SENSOR_FUNCTION_STRUCT sensor_func = {
  12. open,
  13. get_info,
  14. get_resolution,
  15. feature_control, //在这里获取sensor id
  16. control,
  17. close
  18. };

2、查看这个 feature_control() 函数

  1. static kal_uint32 feature_control(MSDK_SENSOR_FEATURE_ENUM feature_id,
  2. UINT8 *feature_para, UINT32 *feature_para_len)
  3. {
  4. ...
  5. UINT32 *feature_return_para_32 = (UINT32 *)feature_para;
  6. //通过这个switch选择,匹配成功后,调用get_imgsensor_id()函数,去获取id
  7. switch (feature_id) {
  8. ...
  9. case SENSOR_FEATURE_CHECK_SENSOR_ID:
  10. get_imgsensor_id(feature_return_para_32);
  11. break;
  12. ...
  13. }
  14. }

3、继续跟这个 get_imgsensor_id() 函数的参数来源

  1. static kal_uint32 get_imgsensor_id(UINT32 *sensor_id)
  2. {
  3. kal_uint8 i = 0;
  4. kal_uint8 retry = 2;
  5. //打印结果:gc02m1 get_imgsensor_id,0x0
  6. printk("gc02m1 %s,0x%x\n ",__func__,*sensor_id);
  7. /*
  8. 循环遍历这个iic列表
  9. static struct imgsensor_info_struct imgsensor_info = {
  10. .i2c_addr_table = {0x6e, 0x20, 0xff},
  11. .i2c_speed = 400,
  12. };
  13. */
  14. while (imgsensor_info.i2c_addr_table[i] != 0xff) {
  15. spin_lock(&imgsensor_drv_lock);
  16. imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i];
  17. printk("gc02m1 imgsensor i2c_write_id : 0x%x", imgsensor.i2c_write_id);
  18. spin_unlock(&imgsensor_drv_lock);
  19. do {
  20. /*
  21. 通过这个函数,返回sensor id
  22. 打印结果:gc02m1 return_sensor_id : 0x0
  23. 在这里没有获取到正确的id
  24. */
  25. *sensor_id = return_sensor_id();
  26. printk("gc02m1 return_sensor_id : 0x%x" , *sensor_id);
  27. if (*sensor_id == imgsensor_info.sensor_id) {
  28. printk("GC02M1(YH&YJ&YK&YC) i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id, *sensor_id);
  29. return ERROR_NONE;
  30. }
  31. printk("Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id, *sensor_id);
  32. retry--;
  33. } while (retry > 0);
  34. i++;
  35. retry = 2;
  36. }
  37. /*
  38. 这里ID不一致
  39. 打印log为:gc02m1 sensor_id : 0x0 imgsensor_info.sensor_id : 0x2e0
  40. */
  41. if (*sensor_id != imgsensor_info.sensor_id) {
  42. /* if Sensor ID is not correct, Must set *sensor_id to 0xFFFFFFFF */
  43. printk("gc02m1 sensor_id : 0x%x imgsensor_info.sensor_id : 0x%x\n",*sensor_id,imgsensor_info.sensor_id);
  44. *sensor_id = 0xFFFFFFFF;
  45. return ERROR_SENSOR_CONNECT_FAIL;
  46. }
  47. return ERROR_NONE;
  48. }

4、继续跟进 return_sensor_id() 函数

  1. static kal_uint32 return_sensor_id(void)
  2. {
  3. return ((read_cmos_sensor(0xf0) << 8) | read_cmos_sensor(0xf1));
  4. }
  1. static kal_uint16 read_cmos_sensor(kal_uint32 addr)
  2. {
  3. kal_uint16 get_byte = 0;
  4. char pu_send_cmd[1] = {(char)(addr & 0xff)};
  5. //这里通过这个函数,读取iic里面信息,来往get_byte里面写值
  6. iReadRegI2C(pu_send_cmd, 1, (u8 *)&get_byte, 1, imgsensor.i2c_write_id);
  7. printk("gc02m1 get_byte : %d\n",get_byte);
  8. return get_byte;
  9. }

关于iReadRegI2C函数,在文件eeprom_i2c_custom_driver.c中

文件位置:

/mtk8766/alps/s0_vnd/kernel-4.19/drivers/misc/mediatek/cam_cal/src/mt6761/eeprom_i2c_custom_driver.c

5、在kernel层的 imgsensor.c 中,判断是否存在该sensor id

  1. static inline int imgsensor_check_is_alive(struct IMGSENSOR_SENSOR *psensor)
  2. {
  3. ...
  4. IMGSENSOR_PROFILE_INIT(&psensor_inst->profile_time);
  5. //摄像头上电
  6. err = imgsensor_hw_power(&pgimgsensor->hw,
  7. psensor,
  8. psensor_inst->psensor_name,
  9. IMGSENSOR_HW_POWER_STATUS_ON);
  10. if (err == IMGSENSOR_RETURN_SUCCESS)
  11. imgsensor_sensor_feature_control(
  12. psensor,
  13. SENSOR_FEATURE_CHECK_SENSOR_ID,
  14. (MUINT8 *)&sensorID,
  15. &retLen);
  16. /*
  17. 这里判断sensorid是否存在,如果存在,那么久将其打印出来
  18. 这里打印log信息为:gc02m1 Fail to get sensor ID ffffffff
  19. */
  20. if (sensorID == 0 || sensorID == 0xFFFFFFFF) {
  21. printk("gc02m1 Fail to get sensor ID %x\n", sensorID);
  22. err = ERROR_SENSOR_CONNECT_FAIL;
  23. } else {
  24. printk("gc02m1 and s5k5e8yx Sensor found ID = 0x%x\n", sensorID);
  25. err = ERROR_NONE;
  26. }
  27. if (err != ERROR_NONE)
  28. printk("gc02m1 ERROR: No imgsensor alive\n");
  29. //下电
  30. imgsensor_hw_power(&pgimgsensor->hw,
  31. psensor,
  32. psensor_inst->psensor_name,
  33. IMGSENSOR_HW_POWER_STATUS_OFF);
  34. ...
  35. }

原因排查:iic不通

检查上电时序

内容无误,但是ID配置错误!修改后获取sensor_id正常,前置正常开启

  1. #if defined(GC02M1_MIPI_RAW)
  2. {
  3. - SENSOR_DRVNAME_GC02M1MIPI_RAW,
  4. + SENSOR_DRVNAME_GC02M1_MIPI_RAW,
  5. {
  6. {PDN, Vol_Low, 0},
  7. {RST, Vol_Low, 0},
  8. {AVDD, Vol_2800, 2},
  9. {DOVDD, Vol_1800, 2},
  10. {DVDD, Vol_1800, 2},
  11. {SensorMCLK, Vol_High, 1},
  12. {PDN, Vol_High, 2},
  13. {RST, Vol_High, 10}
  14. },
  15. },
  16. #endif

也希望大家在排查的时候,先确保这些基础信息正常!

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/711725
推荐阅读
相关标签
  

闽ICP备14008679号