参考文档:http://blog.youkuaiyun.com/computertechnology/article/details/17006107
http://blog.youkuaiyun.com/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(); }
- }
1. instantiate函数只是简单的调用了publish函数
2. publish函数先构造CameraService,再通过addService函数将它注册到ServiceManager当中,而getServiceName函数获取到的值为“media camera”。这一切都是为了binder通信做准备
3. 这里使用了c++模版,从上面的CameraService类定义中可以看出,这里的SERVICE等于CameraService,也就是说publish函数中的new SERVICE等于new CameraService
4. 同时还使用了智能指针,也就是说除了调用CameraService的构造函数外,还会调用onFirstRef函数