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发生了变化,导致信号不良,从而识别异常。

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

你可能感兴趣的:(rockchip rk3368(px5)车载开发之路-bug解决篇1.快速倒车和正常系统倒车可能出现摄像头绿屏现象)