总体介绍
Android Camera 框架从整体上看是一个 client/service 的架构,
有两个进程:
client 进程,可以看成是 AP 端,主要包括 JAVA 代码与一些 native c/c++代码;
service 进 程,属于服务端,是 native c/c++代码,主要负责和 linux kernel 中的 camera driver 交互,搜集 linux kernel 中 camera driver 传上来的数据,并交给显示系统显示。
client 进程与 service 进程通过 Binder 机制通信, client 端通过调用 service 端的接口实现各个具体的功能。
主要代码在packages/apps/Camera/
这层的代码主要编译成framework.jar frameworks/base/core/java/android/hardware/Camera.java
这部分是提供给Android的应用接口
这层是Camera的JAVA native调用部分:./frameworks/base/core/jni/android_hardware_Camera.cpp
libandroid_runtime.so除了给camera调用外,还有其他的功能
这里主要是编译生成libcamera_client.so client和libcameraservice.so进行通信(IPC binder通信)
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ ls frameworks/av/camera/
Android.mk Camera.cpp ICameraClient.cpp ICameraRecordingProxyListener.cpp IProCameraCallbacks.cpp NOTICE
camera2 CameraMetadata.cpp ICamera.cpp ICameraService.cpp IProCameraUser.cpp ProCamera.cpp
CameraBase.cpp CameraParameters.cpp ICameraRecordingProxy.cpp ICameraServiceListener.cpp MODULE_LICENSE_APACHE2 tests
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$
既然client和service用的是binder通信,那么就必须把service注册到servicemanager里面去,查看代码
./frameworks/av/media/mediaserver/main_mediaserver.cpp
里面有一句CameraService::instantiate(); 这一句就是用来注册这个service的
这样,Camera就在ServiceManager完成服务注册,提供给client随时使用。
Camera service是实现client的接口,并且和HAL层进行通信的,是camera的服务层
代码位置:/frameworks/av/services/camera/libcameraservice
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ ls ./frameworks/av/services/camera/libcameraservice
Android.mk api2 CameraDeviceFactory.cpp CameraService.cpp common device2 gui NOTICE
api1 api_pro CameraDeviceFactory.h CameraService.h device1 device3 MODULE_LICENSE_APACHE2 utils
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$
Camera Hal层是各个不同厂商的不通之处,上面的层次是Android系统特有的。
怎么确定我们使用这个系统的hal层呢?
首先用busybox在开发板上面确定一下我们so的名字
这样我们可以看出我们的so名字是camera.default.so
然后再通过命令在代码里面找到我们的代码位置
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ find ./ -iname *.mk|xargs grep -wrn camera.default
./mediatek/hardware/mtkcam/module/Android.mk:67:LOCAL_MODULE := camera.default.module
./mediatek/hardware/mtkcam/devicemgr/Android.mk:72:LOCAL_MODULE := camera.default.devicemgrbase
./mediatek/platform/mt8127/hardware/mtkcam/devicemgr/Android.mk:73:LOCAL_WHOLE_STATIC_LIBRARIES += camera.default.module
./mediatek/platform/mt8127/hardware/mtkcam/devicemgr/Android.mk:74:LOCAL_WHOLE_STATIC_LIBRARIES += camera.default.devicemgrbase
./mediatek/platform/mt8127/hardware/mtkcam/devicemgr/Android.mk:96:LOCAL_MODULE := camera.default
./build/target/product/common.mk:302: camera.default \
./hardware/libhardware/modules/camera/Android.mk:19:LOCAL_MODULE := camera.default
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$
可以看出我们的代码位置应该在:./mediatek/platform/mt8127/hardware/mtkcam/
驱动层的话一定要遵循v4l2的框架,并且生成设备节点给hal层调用,我们驱动层的代码可以从添加一个摄像头那个文章里面看出来。
mediatek/custom/mid713l_lp_lvds/kernel/imgsensor/bf3703_yuv/