一 编译HAL
1 修改BoardConfig.mk
device/wolf/smdk6410/BoardConfig.mk
USE_CAMERA_STUB := false
hardware建立Camera HAL目录
hardware/wolf/libcamera
CannedJpeg.h
Ov965xCamera.cpp
Ov965xCamera.h
S3C6410CameraHardware.cpp
S3C6410CameraHareware.h
USBCamera.cpp
USBCamera.h
编写Android.mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
USBCamera.cpp \
Ov965xCamera.cpp \
S3C6410CameraHardware.cpp
LOCAL_SHARED_LIBRARIES:= \
libui \
libutils \
libbinder \
liblog \
libcamera_client
LOCAL_MODULE:= libcamera
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES += \
frameworks/base/libs
include $(BUILD_SHARED_LIBRARY)
2 android2.3.4_32bit$ source ./build/envsetup.sh
3 android2.3.4_32bit$ choosecombo
Build for the simulator or the device?
1. Device
2. Simulator
1
1
Which product would you like? [smdk6410]
回车
eng
4 make libcamera编译特定模块
开始编译摄像头模块,动态连接库文件*.so存放在
Install: out/target/product/smdk6410/system/lib/libcamera.so
用adb push把libcamera.so推到目标机/system/lib/中
cd D:\software\android-sdk-windows\tools
d:
adb push libcamera.so /system/lib/
5 目标机上
export ANDROID_LOG_TAGS="CameraHardware:D CameraHardware:E *:S"
logcat -d
6 问题
拍照
E/AudioService( 1902): Media server died.
解决:在init.c中添加
chmod 0777 /dev/video0
二 CAMERA 系统
Camera系统分成以下几个部分
1)摄像头驱动程序:通常基于linux的video for linux视频驱动框架
2)Camera硬件抽象层
接口的代码路径:frameworks/base/include/camera/
主要文件为CameraHardwareInterfacd.h,需要各个系统根据自己的情况实现
3)Camera服务部分
代码路径:frameworks/base/include/camera
Camera服务是Android系统中一个单独部分,通过调用Camera硬件抽象层来实现
4)Camera的本地框架代码
代码路径:frameworks/base/include/camera
5)Camera的JNI代码
代码路径:frameworks/base/core/jni/android_hardware_Camera.cpp
提供给Java类的本地支持,也包含了反向调用java传递信息和数据功能
6)Camera系统的Java类
代码路径:frameworks/base/core/java/android/hardware/Camera.java
Camera对Java层次的类为android.hardware.Camera,自Java应用程序提供接口
可用于在Java应用程序层构建照相机和扫描类的程序
-----------------------------------------------------------------------
移植的内容
在Android系统中,照相机系统的标准化部分是硬件抽象层的接口,因此
针对特定平台Camera系统的移植包括Camera驱动程序和Camera硬件抽象层
在Linux系统中,Camera的驱动程序都是用Linux标准的Video for Linux 2(V4L2)
驱动程序,从内核空间到用户空间,主要的数据流和控制类的均由V4L2驱动程序
的框架来定义,在Android系统的实现中,一般也都使用标准的V4L2驱动程序作为
照相机部分的驱动程序
Camera硬件抽象层主要实现取景器,视频录制,拍摄相片三个方面功能。V4L2驱动
程序一般只提供的Video数据的获得,而如何实现视频预览,如何向上层发送数据等
功用,这些都是Camera的硬件抽象层需要负责的方面了。
三 硬件抽象层
1. Camera硬件抽象层
frameworks/base/include/camera/
主要文件为CameraHardwareInterface.h,需要各个系统根据自己的情况实现
2. Camera服务部分
frameworks/base/services/camera/libcameraservice
Camera服务是Andriod系统中一个单独的部分,通过调用camera硬件抽象层
来实现。
3. Camera 的本地框架代码
frameworks/base/libs/camera/
4. Camera的硬件抽象层
是位于V4L2驱动程序和CameraService之间的部分,这是
一个C++的接口类,需要具体的实现者继承这个类,并实现其中的各个纯虚函数。
纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时
再去具体地给出定义。
硬件抽象层的主要的头文件为CameraHardwareInterface.h,定义了C++的接口类
需要根据系统的情况继承实现。
camera.h 这是Camera系统本地对上层的接口
CameraParameters.h定义Camera系统的参数,在本地代码的各个层次中使用。
Camera硬件抽象层的实现通常需要生成动态库libcamera.so
5. CameraHardwareInterface中定义了几种回调函数
typedef void (*notify_callback)(int32_t msgType, //通知回调
int32_t ext1,