Camera兼容引起的打开失败问题

平台:展讯SC7730

Camera IC:前GC0329后GC0328

近日,在解决项目BUG的过程中,测试部门有报:在进入Camera的时候,第一次第二次点击Camera图标都是打开失败(无法连接的相机),第三次就可以正常打开了。

解决思路:

1、首先是硬件主板电路存在问题,给Camera上电电压不对,但经过示波器测量,发现供给电压(AVDD,IOVDD,DVDD)都是正确的,主板没有问题。

2、怀疑Camera 没有焊好,重新焊接,此问题还是会复现,说明不是焊接问题。

3、得出结论:问题出自软件的可能性最大。

软件解决思路:

1、首先打log,查看log,看是否能读到Camera的ID,来判断主板是否给Camera上电成功。通过log,看到能正确读到Camera的ID。

  说明Camera需要的几个电压(AVDD,IOVDD,DVDD)都正确配置,之前用示波器测量电压也再次说明主板供电没问题。

2、是不是兼容出现问题。其它IC引起了GC0328+GC0329的不能正常打开。在sensor_cfg.c里,先临时把兼容的其它IC去掉,后Camera只保留GC0328前只保留  GC0329,经验证发现,此种方法是有效的,不存在前2次打不开Camera问题。

3、问题就出在了兼容上,问题还是集中在上电函数上,因为尽管电压设置正确,但影响Camera打开的还有PWN和RESET这个两个引脚。而这两个引脚恰恰在上电函  数中进行配置。

4、首先怀疑PWN设置不对,尝试在Camera打开之前,先把PWN拉高,在sensor_drv_k.c的probe函数里,在申请MAIN
Camera和SUB Camera的PWN的GPIO  时,顺便把PWN拉高,发现此种方法没有作用。

5、回到IC的上电函数,去排查兼容GC0328的前一个IC
GC0308的上电函数,POWEROFF的代码,在PWN的设置上没有问题。兼容GC0329的前一个IC
GC0309  的上电函数,POWEROFF的代码,在PWN的设置上也没有问题。

6、期间还尝试了加大上电的延时,看Camera的上电timing等,PWN的设置确实没有什么问题。

7、这时就开始怀疑Reset引脚,经对比发现GC038和GC0328的对reset引脚的配置函数不一样:

  GC0328:

Sensor_SetResetLevel((BOOLEAN)!reset_level);

 GC0308:

Sensor_Reset(reset_level);    

继续跟踪这两个函数:

第一个Reset函数:sensor_drv_u.c定义:


BOOLEAN Sensor_SetResetLevel(BOOLEAN plus_level)
{
if (-1 ==_Sensor_Device_ResetLevel((uint32_t)plus_level))
return SENSOR_FAIL;

return SENSOR_SUCCESS;
}


LOCAL int _Sensor_Device_ResetLevel(uint32_t level)
{
int ret = SENSOR_SUCCESS;
SENSOR_DRV_CHECK_ZERO(s_p_sensor_cxt);

ret = xioctl(s_p_sensor_cxt->fd_sensor, SENSOR_IO_RST_LEVEL, &level);
if (0 != ret)
{
CMR_LOGE("_Sensor_Device_Reset failed, level = %d, ret=%d \n", level, ret);
ret = -1;
}

return ret;
}

最后通过ioctl进入kernel:sensor_drv_k.c


    case SENSOR_IO_RST_LEVEL:
{
uint32_t level;
ret = copy_from_user(&level, (uint32_t *) arg, sizeof(uint32_t));
if (0 == ret)
ret = _sensor_k_set_rst_level(level);
}
break;


LOCAL int _sensor_k_set_rst_level(uint32_t plus_level)
{
SENSOR_PRINT("sensor set rst lvl: lvl %d, rst pin %d \n", plus_level, GPIO_SENSOR_RESET);

gpio_direction_output(GPIO_SENSOR_RESET, plus_level);
gpio_set_value(GPIO_SENSOR_RESET, plus_level);

return SENSOR_K_SUCCESS;
}

而第二个reset函数:


void Sensor_Reset(uint32_t level)
{
int err = 0xff;
uint32_t rst_val[2];
SENSOR_IOCTL_FUNC_PTR reset_func;

CMR_LOGI("in.\n");
SENSOR_DRV_CHECK_ZERO_VOID(s_p_sensor_cxt);

if (PNULL == s_p_sensor_cxt->sensor_info_ptr) {
CMR_LOGE("Sensor_SetI2CClock: No sensor info \n");
return;
}

reset_func = s_p_sensor_cxt->sensor_info_ptr->ioctl_func_tab_ptr->reset;

if (PNULL != reset_func) {
reset_func(level);
} else {
rst_val[0] = level;
rst_val[1] = s_p_sensor_cxt->sensor_info_ptr->reset_pulse_width;
if (rst_val[1] < SENSOR_RESET_PULSE_WIDTH_DEFAULT) {
rst_val[1] = SENSOR_RESET_PULSE_WIDTH_DEFAULT;
} else if (rst_val[1] > SENSOR_RESET_PULSE_WIDTH_MAX) {
rst_val[1] = SENSOR_RESET_PULSE_WIDTH_MAX;
}
_Sensor_Device_Reset(rst_val);
}
CMR_LOGI("OK out.\n");
}


LOCAL int _Sensor_Device_Reset(uint32_t *reset_val)
{
int ret = SENSOR_SUCCESS;
SENSOR_DRV_CHECK_ZERO(s_p_sensor_cxt);

CMR_LOGI("level %d, width %d",reset_val[0],reset_val[1]);

ret = xioctl(s_p_sensor_cxt->fd_sensor, SENSOR_IO_RST, reset_val);
if (ret) {
ret = -1;
}

return ret;
}


    case SENSOR_IO_RST:
{
uint32_t rst_val[2];
ret = copy_from_user(rst_val, (uint32_t *) arg, 2*sizeof(uint32_t));
if (0 == ret)
ret = _sensor_k_reset(rst_val[0], rst_val[1]);
}
break;


LOCAL int _sensor_k_reset(uint32_t level, uint32_t width)
{
SENSOR_PRINT("SENSOR:_sensor_k_reset, reset_val=%d camera:%d (0:main 1:sub)\n",level, _sensor_K_get_curId());

switch (_sensor_K_get_curId()) {
case SENSOR_MAIN:
{
gpio_direction_output(GPIO_SENSOR_RESET, level);
gpio_set_value(GPIO_SENSOR_RESET, level);
SLEEP_MS(width);
gpio_set_value(GPIO_SENSOR_RESET, !level);
mdelay(1);
break;
}
case SENSOR_SUB:
{
gpio_direction_output(GPIO_SUB_SENSOR_RESET, level);
gpio_set_value(GPIO_SUB_SENSOR_RESET, level);
SLEEP_MS(width);
gpio_set_value(GPIO_SUB_SENSOR_RESET, !level);
mdelay(1);
break;
}
default:
break;
}

return SENSOR_K_SUCCESS;
}

Sensor_SetResetLevel((BOOLEAN)!reset_level); //就是把reset 设置成想要的高或低

Sensor_Reset(reset_level);    //反而把reset 设置成相反的高低位了

问题就是出在

Sensor_Reset(reset_level);    

然后把GC0308和GC0329的上电函数里的 (同时检查其它IC GC5004, OV5648都有此问题)

Sensor_Reset(reset_level);    

换成

Sensor_SetResetLevel(reset_level);

就解决了此BUG。

时间: 2024-10-08 08:16:31

Camera兼容引起的打开失败问题的相关文章

webdriver打开失败方法---chrome与chromedrvier版本对应关系

在运行selenium脚本时,有时突然会碰到提示webdriver打开失败,这个时候极大可能是 Chrome浏览器更新了,与你之前的chromedriver版本出现不兼容,导致selenium调用不了 谷歌浏览器,这个时候就需要升级chromedriver,升级完即可. 查看一下自己的chrome版本和对应的chromedriver版本是否对应; 学习更多可以加QQ群:610845268

windows10下安装Microsoft Visual Studio 2013.4 Community enu中文语言包出错,提示“”程序兼容模式已打开.请将其关闭”的解决方法

原来win8系统用着有点慢,就选择重新安装系统,安装了win10预览版,感觉确实很不一样,呵呵.在安装了vs2013社区版后,默认是英文版的,因为英文不太好,需要安装简体中文语言包,但是安装时一直报“程序兼容模式已打开,请将其关闭然后重新运行安装程序”, 在使用兼容win8模式安装后仍然提示这个,郁闷了好几天,后来在网上找到一个解决办法,记录如下: 使用命令提示符打开vs_langpack.exe,在后面添加 /Uninstall,类似这样D:\tools\vslang>vs_langpack.

探讨:打开失败的套接字需要进行关闭吗?

场景说明:最有可能出现打开套接字失败的原因是系统中的套接字由于程序糟糕的设计已经全部使用完毕,没有任何的套接字可以分派,此时关闭一个打开的套接字亦是枉然. 探讨:打开失败的套接字需要进行关闭吗?

VMware报错“原因: 未能锁定文件”,打开失败

原文:http://jingyan.baidu.com/article/425e69e6bf64dbbe15fc16fe.html VMware打开复制的虚拟机,报错"原因: 未能锁定文件",打开失败,可能的原因是复制虚拟机时,被复制的虚拟机未关机或未挂起或未正常关闭,磁盘锁文件未自动删除,下次启动虚拟机时就会弹出上面的那个错误. Vmware为了防止有多虚拟机共用一个虚拟磁盘造成数据的丢失和性能的削弱,每次启动Vmware时会给虚拟磁盘加一个磁盘锁(后缀为.lck的那个文件),对虚拟

HDFS源码文件过大,IDEA打开失败解决方法

问题现象:hadoop 3.1.0源码文件ClientNamenodeProtocolProtos大小4M+,IDEA打开时加载失败,ClientNamenodeProtocolPB报错找不到类. -------------------------------------------------------------------------------------------------------------------------------------- 问题原因:IDEA默认加载文件大

Mac下的unity兼容问题,打开项目提示错误:!GetPersistentManager().IsStreamLoaded(assetPath)

安装unity成功之后,打开unity提示如下 那么打开的unity项目很有可能出现找不到资源的错误. 在检查一下你的Mac宗卷格式,如果是APFS格式的话,基本都会不兼容低版本的32位unity应用. 解决办法: 新建一个分区,格式为MAC OS扩展(日志式),然后将项目拷贝到该分区,重新用Unity打开就好了. 原文地址:https://www.cnblogs.com/ring1992/p/10483990.html

Exchange 2013 Ediscovery功能打开失败

问题描述: 打开Exchange 2013 ECP后,打开"就地电子数据展示和保留"项时报错: 解决方法: 打开ADSI EDIT,定位到:CN=EWS (Exchange Back End),CN=HTTP,CN=Protocols,CN=MBX,CN=Servers,CN=Exchange Administrative Group ,CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Ser

win7 chm 打开失败记录

近期学习rails,制作的html帮助文件想生成chm文件,用了几个网上的html制作chm软件,生成的chm无法打开. 网上大部分解决方法是修改文件属性,Unlock之后可解决. 以前遇到过打不开,采用此方法也解决过,但是这次文件属性里根本没有Unlock按钮.根据此文提供的线索解决了. 问题原因:CHM文件在NTFS格式的硬盘里的时候就会被阻止显示.(非全部,很明显有些chm可以打开) 解决方法:先借助压缩软件把CHM文件压缩成zip文件,然后双击被压缩的CHM文件,选中它,双击它即可以查看

2016.6.20 eclipse安装完毕后打开失败,显示a JDK or a JRE must be avaliable in order to run Eclispe

下载完成后,点击eclipse.exe,跳出如下错误. 按照百度的方法,修改了一下eclispe的配置文件,不仅没解决问题,结果跳出另一个新的错误: Failed to load the JNI shared library. 然后又去百度了这个错误,其中一个人说,是版本问题.很大的原因是jdk是32位的,而eclipse是64位的. http://jingyan.baidu.com/article/9113f81b0607e42b3214c794.html 因为确认eclipse是64位的(自