Cts fail项 testMultiCameraRelease
问题:
11-22 10:46:15 I/RemoteAndroidTest: Running am instrument -w -r -e class android.hardware.cts.CameraTest#testMultiCameraRelease com.android.cts.hardware/android.test.InstrumentationCtsTestRunner on tcl-tcl_p689l-bc59c8c9
11-22 10:46:46 I/bc59c8c9: android.hardware.cts.CameraTest#testMultiCameraRelease FAIL
junit.framework.AssertionFailedError: testMultiCameraRelease: Second camera preview timed out on frame 51!
at android.hardware.cts.CameraTest.testMultiCameraRelease(CameraTest.java:2134)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.access$000(InstrumentationTestCase.java:36)
at android.test.InstrumentationTestCase$2.run(InstrumentationTestCase.java:189)
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1719)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5095)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
分析:
该问题是由于前后摄像头共用一路电压(AVDD)引起的,这路电压都是由外部LDO提供,而在测试该项CTS是要求同时打开前后摄像头,所以在打开了后摄像头后再去打开前摄像头时再去拉AVDD,就会造成后摄像头的这路电压(AVDD)有一个高低高的波动,这时就会造成后摄像头出现强行停止,而CTS软件检测到后摄像头中途被关闭,这时就会出现CTS测不过的现象。
处理办法:
方法1:在打开任意一个摄像头后(如:前摄像头或后摄像头)要求这路(AVDD)电压一直保持高,在退出摄像头时也是一样,要求保持高电平输出。
方法2:修改主板,要求前后摄像头的AVDD电压分别单独供电,这时就不会出现这个现象。
方法3:在上下电的控制端对外部LDO的状态(即LDO的使能脚)进行控制,具体控制流程如下:
上电时: 当后摄像头(或前摄像头)打开时,这时LDO的EN脚为高,如果这时再去打开前摄像头(或后摄像头)我们就可以通过LDO的EN脚去判断之前是否有摄像头打开,如果有在当前的情况下我们就不去操作这LDO,因为这时这个LDO是处于打开状态,AVDD是有输出的。
下电时:下电和上电差不多,都需要去检测当前摄像头打开的状态,不过这时我们需要创建一个全局变量(如:flage)来保存摄像头打开的状态,首先将这个变量赋值为0(即:flage = 0),然后在每打开一颗摄像头时我们就将flage加1,在下电的时候就可以通过flage的值来判断打开摄像头的个数,如果flage为1,我们可以直接将LDO的EN脚拉低;如果为2,就不用去处理LDO的状态,让其保持为高,但这时需要将flage减1。
其修改方法如下:
目录:src/LINUX/android/kernel/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c
#include <mach/gpiomux.h>
+#include <linux/gpio.h>
#include "msm_camera_dt_util.h"
#include "msm_camera_io_util.h"
#include "msm_camera_i2c_mux.h"
@@ -26,6 +27,7 @@
#define CDBG(fmt, args...) do { } while (0)
#endif
+int flage = 0;//young.yang add
int msm_camera_fill_vreg_params(struct camera_vreg_t *cam_vreg,
int num_vreg, struct msm_sensor_power_setting *power_setting,
uint16_t power_setting_size)
@@ -1154,11 +1156,27 @@ int msm_camera_power_up(struct msm_camera_power_ctrl_t *ctrl,
CDBG("%s:%d gpio set val %dn", __func__, __LINE__,
ctrl->gpio_conf->gpio_num_info->gpio_num
[power_setting->seq_val]);
- gpio_set_value_cansleep(
- ctrl->gpio_conf->gpio_num_info->gpio_num
- [power_setting->seq_val],
- power_setting->config_val);
- break;
+ /*young.yang add began*/
+ if(ctrl->gpio_conf->gpio_num_info->gpio_num[power_setting->seq_val] == 1020){
+ if(gpio_get_value(1020) == 0){
+ gpio_set_value_cansleep(
+ ctrl->gpio_conf->gpio_num_info->gpio_num
+ [power_setting->seq_val],
+ power_setting->config_val);
+ flage++;
+ break;
+ }else{
+ flage++;
+ break;
+ }
+ }else{
+ gpio_set_value_cansleep(
+ ctrl->gpio_conf->gpio_num_info->gpio_num
+ [power_setting->seq_val],
+ power_setting->config_val);
+ break;
+ }
+ /*young.yang add end*/
case SENSOR_VREG:
if (power_setting->seq_val >= CAM_VREG_MAX) {
pr_err("%s vreg index %d >= max %dn", __func__,
@@ -1329,11 +1347,26 @@ int msm_camera_power_down(struct msm_camera_power_ctrl_t *ctrl,
if (!ctrl->gpio_conf->gpio_num_info->valid
[pd->seq_val])
continue;
- gpio_set_value_cansleep(
- ctrl->gpio_conf->gpio_num_info->gpio_num
- [pd->seq_val],
- pd->config_val);
- break;
+ /*young.yang add began*/
+ if(ctrl->gpio_conf->gpio_num_info->gpio_num[pd->seq_val] == 1020){
+ flage--;
+ if(flage == 0){
+ gpio_set_value_cansleep(
+ ctrl->gpio_conf->gpio_num_info->gpio_num
+ [pd->seq_val],
+ pd->config_val);
+ break;
+ }else{
+ break;
+ }
+ }else{
+ gpio_set_value_cansleep(
+ ctrl->gpio_conf->gpio_num_info->gpio_num
+ [pd->seq_val],
+ pd->config_val);
+ break;
+ }
+ /*young.yang add end*/
case SENSOR_VREG:
if (pd->seq_val >= CAM_VREG_MAX) {
pr_err("%s vreg index %d >= max %dn", __func__,