camera 流程分析和关键代码解释

本文详细介绍了Android系统中Camera服务的启动流程,从CameraService的instantiate函数开始,分析了如何通过BinderService发布服务,再到硬件模块的加载和相机数量的获取。涉及的关键代码包括CameraService的onFirstRef函数,以及硬件模块接口hw_get_module的使用,深入讲解了如何通过JNI层获取HAL层的camera模块,并获取相机数量。此外,还探讨了HAL层的get_number_of_cameras函数如何通过枚举设备来确定相机个数,直至驱动层面的传感器搜索过程。
摘要由CSDN通过智能技术生成

参考文档: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

[cpp]  view plain  copy
 
  1. int main(int argc __unused, char** argv)  
  2. {  
  3.     ......  
  4.     CameraService::instantiate();  
  5.     ......  
  6. }  

CameraService类定义如下:

[cpp]  view plain  copy
 
  1. class CameraService :  
  2.     public BinderService<CameraService>,  
  3.     public BnCameraService,  
  4.     public IBinder::DeathRecipient,  
  5.     public camera_module_callbacks_t  
  6. {  
  7.     static char const* getServiceName() { return "media.camera"; }  
  8.     ......  
  9. }  

mediaserver的main函数中调用了CameraService的instantiate函数来创建实例,该函数的实现在其父类BinderService中实现

[cpp]  view plain  copy
 
  1. template<typename SERVICE>  
  2. class BinderService  
  3. {  
  4.     static status_t publish(bool allowIsolated = false) {  
  5.         sp<IServiceManager> sm(defaultServiceManager());  
  6.         return sm->addService(  
  7.                 String16(SERVICE::getServiceName()),  
  8.                 new SERVICE(), allowIsolated);  
  9.     }     
  10.   
  11.     static void instantiate() { publish(); }  
  12.   
  13. }  
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值