参考文档:http://blog.csdn.net/computertechnology/article/details/17006107
http://blog.csdn.net/eternity9255/article/details/52085864#reply
Camera驱动的调试过程与方法总结
1、首先对照电路图,检查Camera的电路连接是否正确;
2、用万用表量Camera的电源管脚,查看Camera的供电是否正常,确定是否需要我们在程序中进行电源控制;
3、查看Camera的Spec文档,检查PWDN和RESET的管脚触发是否正常,是否需要在程序中进行控制;
4、在Camera的Datasheet中找出该设备的I2C地址,检查I2C地址配置是否正确;
5、查看I2C通信是否正常,是否能正常进行读写,用示波器量出I2C的SCL和SDA的波形是否正常,未通信时都为高电平,通信时SCL为I2C时钟信号,SDA为I2C数据通路信号;
6、用示波器量Camera的MCLK管脚,看是否正确,如果MCLK正常,通常情况下PCLK也应该有波形;
7、检查Camera的初始化寄存器列表的配置是否正确。
camera关键代码解释:
Android的各个子模块的启动都是从它们的Service的启动开始的,所以我们将从CameraService的启动开始分析。CameraService的启动就在MediaServer的main函数中,代码路径在:frameworks/av/media/mediaserver/main_mediaserver.cpp
- int main(int argc __unused, char** argv)
- {
- ......
- CameraService::instantiate();
- ......
- }
CameraService类定义如下:
- class CameraService :
- public BinderService<CameraService>,
- public BnCameraService,
- public IBinder::DeathRecipient,
- public camera_module_callbacks_t
- {
- static char const* getServiceName() { return "media.camera"; }
- ......
- }
mediaserver的main函数中调用了CameraService的instantiate函数来创建实例,该函数的实现在其父类BinderService中实现
- template<typename SERVICE>
- class BinderService
- {
- static status_t publish(bool allowIsolated = false) {
- sp<IServiceManager> sm(defaultServiceManager());
- return sm->addService(
- String16(SERVICE::getServiceName()),
- new SERVICE(), allowIsolated);
- }
- static void instantiate() { publish(); }
- }