bug描述:

开机过程中,某些时候打开倒车摄像头会绿屏。
原理分析

系统在启动过程中,前十几秒由于系统没有进入android,所以是处在快速倒车过程中,此时的实现方式是直接获取摄像头数据然后给到显示系统去显示。进入android系统后,则是底层发送消息给到android负责启动某个app,所以快速倒车(linux内核负责)和正常倒车(android负责)比较明显的差异就是有没有倒车线(android是可以画出来倒车线的)

系统实现分析

首先看内核部分代码:

        gpio_det: gpio-det {                compatible = "gpio-detection";                status = "okay";                pinctrl-0 = <&gpio3_b1 &gpio3_b2>;                pinctrl-names = "default";                car-reverse {                        car-reverse-gpios = <&gpio3 10 GPIO_ACTIVE_LOW>;                        linux,debounce-ms = <5>;                        label = "car-reverse";                        gpio,wakeup;                };                car-acc {                        car-acc-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;                        linux,debounce-ms = <5>;                        label = "car-acc";                        gpio,wakeup;                };        };

使用的是gpio3 B2接口进行gpio检测,驱动对应的是:
drivers/misc/gpio-getection.c
经过对驱动简单的分析,关键函数如下:

static void gpio_det_report_event(struct gpio_data *gpiod){        struct gpio_event event;        struct gpio_detection *gpio_det = gpiod->parent;        char *status = NULL;        char *envp[2];        event.val = gpiod->val;        event.name = gpiod->name;        status = kasprintf(GFP_KERNEL, "GPIO_NAME=%s GPIO_STATE=%s",                           gpiod->name, event.val ? "on" : "over");        envp[0] = status;        envp[1] = NULL;        wake_lock_timeout(&gpio_det->wake_lock,                          msecs_to_jiffies(WAKE_LOCK_TIMEOUT_MS));        kobject_uevent_env(&gpiod->dev.kobj, KOBJ_CHANGE, envp);        if (gpiod->notify)                gpio_det_notifier_call_chain(GPIO_EVENT, &event);        kfree(status);}

上面函数关键点如下:
1.gpio中断来了之后,通过kobject_event_env,也就是KOBJ_CHANGE来发送kobj消息给到上层uevent,从而framework有了service后进行唤醒相应的app显示倒车。
2.系统起来之前,函数会通过gpio_det_notifier_call_chain进行唤醒快速倒车流程。当系统启动后,上层会通过写文件节点(/sys/device/virtual/gpio-detection/car-reverse/status)方式,使得notify=0,从而告知系统,android已经启动,只需要发送消息即可,不需要进行快速倒车。
./base/services/core/java/com/android/server/ReverseObserver.java
3.gpio-detection.c文件中提供:

EXPORT_SYMBOL(gpio_det_register_notifier);

函数来使得快速倒车系统可以捕获到信号,从而启动,或者由于notify=0不通知快速倒车系统。

以上貌似不完全正确。更正分析中。
1.系统快速倒车代码在/kernel/drivers/video/rockchip/vehicle/中,通过vehicle_main.c启动一个thread检查系统状态。
2.系统在快速倒车状态时gpio应该被快速倒车部分申请(中断号158),从而gpio的名字是vehicle,(对应中断名字是vehicle gpio),正常启动后,gpio被gpio-detection.c申请,gpio名字是?(对应中断名字是car-reverse)。
3.退出快速倒车后,系统才开始probe新的camera(估计是上层根据底层是否在倒车状态,来决定是否probe,否则一直在等待)

最后发现快速倒车时候,摄像头会被识别成101,也就是720P 25帧的格式。但是正常倒车时候,如果被识别成101,那么则会显示正常(概率不大,10%)。余下的都会被识别成001,也就是720P 50帧的格式。这时候就显示绿屏了,估计是系统cif不支持这么高的帧率,或者其他什么原因导致的。

暂时的解决方式是,当tp2825识别成001的时候,强制更改成101,走101的软件代码,目前测试下来问题良好。

可能的问题点:
1.tp2825由于寄存器配置问题,导致识别不稳定。
2.杂牌摄像头在正常进android时候,电压或者电流发生了变化,又或者tp2825发生了变化,导致信号不良,从而识别异常。

暂时先这么掩盖过去这个问题。

更多相关文章

  1. C语言函数的递归(上)
  2. android大屏设备中的经典应用--MIQI卡片电脑之凤凰系统打造轻量
  3. Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
  4. 在 Android(安卓)上使用 XML 和 JSON,第 2 部分: 交付混合了 JSON
  5. Android(安卓)使用动画效果后的控件位置处理 类似系统通知栏下拉
  6. Android照相功能驱动层中HAL的实现(基于OK6410开发板+OV9650摄像
  7. 你需要知道的Android拍照适配方案
  8. Android的BUG(四) - Android(安卓)app的卡死问题
  9. 漫谈android系统(9)-androidO的Android(安卓)Treble 计划与大的

随机推荐

  1. Android开发之android命令大全
  2. Android(安卓)studio 中JNI JAVA和C++互
  3. android的触摸屏事件
  4. Theme.NoTitleBar问题
  5. Android_linux下android platforms下载地
  6. Android(安卓)VNC Server on G1 (PC 远程
  7. 使用SDK Manager更新时出现问题
  8. android拨打电话
  9. Android监听消息通知栏点击事件
  10. Android手机震动抖动效果的实现