rockchip rk3368(px5)车载开发之路-bug解决篇1.快速倒车和正常系统倒车可能出现摄像头绿屏现象
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发生了变化,导致信号不良,从而识别异常。
暂时先这么掩盖过去这个问题。
更多相关文章
- C语言函数的递归(上)
- android大屏设备中的经典应用--MIQI卡片电脑之凤凰系统打造轻量
- Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
- 在 Android(安卓)上使用 XML 和 JSON,第 2 部分: 交付混合了 JSON
- Android(安卓)使用动画效果后的控件位置处理 类似系统通知栏下拉
- Android照相功能驱动层中HAL的实现(基于OK6410开发板+OV9650摄像
- 你需要知道的Android拍照适配方案
- Android的BUG(四) - Android(安卓)app的卡死问题
- 漫谈android系统(9)-androidO的Android(安卓)Treble 计划与大的