转自:http://blog.csdn.net/loongembedded/article/details/7763083
1. 问题描述
打开摄像头应用程序预览,如果这时候进入睡眠状态,唤醒后经常不能正常接着预览的情况(但有时候也可以)。这时候,必须要先关闭摄像头应用程序,然后重新打开才能正常工作。
2. 问题分析
唤醒后不能正常预览的时候,发现CameraPreviewThread线程都等遇到Preview中断,说明这时候preview中断没有产生。但为什么有时候唤醒的时候却又可以呢?如果是睡眠和唤醒这两个过程种没有设置好preview中断对应的寄存器,就不可能出现时候唤醒后还可以正常的情况。
排除上面的情况后,怀疑在预览时,camera驱动还没有来得及处理完当前preview中断的时候系统就进入睡眠状态引起的,所以就在CameraPreviewThread线程调用InterruptDone(g_CamSysIntr_P)来通知IST当前preview中断完成的地方,改为直接处理对应的寄存器,目的就是减去调用系统函数InterruptDone这个过程,从而争取更快的时间处理晚这个动作,还是无法解决这个问题。
正当陷入困境的时候,想起有可能是睡眠时对camera sensor下电,而在上电时没有对其供电引起的。
3. 问题解决
经过上面的逐步分析和排除,通过代码的分析,在系统进入睡眠的过程中会调用camera
驱动的CameraSleep函数对camera sensor下电,在处理器即将进入睡眠状态前调用OEMPowerOff函数记录下GPG0和GPG1的状态(此时为低电平的状态),再处理器唤醒的时候,OEMPowerOff函数从睡眠前记录的内存地址处恢复(恢复的是输出低电平)。通过增加PowerOnCamera函数来给camera sensor上电,而在唤醒的时候camera驱动调用这个函数就解决了此问题。