热门内容

公众号"MAKE1"

获取行业最新资讯

请扫码添加

专业客服企业微信

Cts fail项 testMultiCameraRelease

简介

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__,

 

4
 条评论
相关内容推荐