OpenHarmony南向之Camera简述
OpenHarmony南向之Camera简述
Camera驱动框架
该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层:
- HDI实现层:实现OHOS(OpenHarmony Operation System)相机标准南向接口。
- 框架层:对接HDI实现层的控制、流的转发,实现数据通路的搭建,管理相机各个硬件设备等功能。
- 设备适配层:屏蔽底层芯片和OS(Operation System)差异,支持多平台适配。
Camera模块主要包含服务、设备的初始化,数据通路的搭建,流的配置、创建、下发、捕获等。
基于HDF驱动框架的Camera驱动模型
目前,Camera驱动框架主要提供了两种适配方式:V4L2和MPP。
- MPP方式主要是针对海思系列的芯片,MPP是海思自己实现的多媒体框架,之前有介绍,具体可参见:Linux之摄像头简述
- V4L2方式主要是针对Camera驱动是基于V4L2接口实现的芯片平台,比如Rockchip,展锐等
如果其他芯片平台想适配OH的Camera驱动框架,如果是V4L2实现可参考Rockchip的适配方式,如果是私有实现(比如ioctl方式)则需要自己重新添加新的适配层。
下面是展锐SL8541E平台在OH下的Camera适配框图,更详细,参考Rockchip方案适配的,都是基于V4L2,所以很类似:
Camera 驱动框架所在源码目录为:drivers/peripheral/camera
由上可以看出,Camera 驱动框架最核心的3部分:
- pipeline
- device_manager
- driver_adapter
pipeline控制管理各个硬件模块,首先要获取对应设备的manager,通过manager获取其对应的controller,controller和对应的驱动进行交互
V4L2的适配
这里我们主要看下基于V4L2的适配,以rk3568为例,主要涉及到如下几块:
- platform平台通用公共代码:
drivers/peripheral/camera/hal/adapter/platform/v4l2
- chipset定制化代码:
device/board/hihope/rk3568/camera/
- hcs配置文件:
vendor/hihope/rk3568/hdf_config/uhdf/camera
platform公共代码
platform为平台性公共代码,如linux标准v4l2适配接口定义,为v4l2框架适配的通用node.以及为v4l2框架适配的通用device_manager等
目录结构如下:
drivers/peripheral/camera/hal/adapter/platform/v4l2/src/
├── device_manager
│ ├── enumerator_manager.cpp
│ ├── flash_controller.cpp
│ ├── flash_manager.cpp
│ ├── idevice_manager.cpp
│ ├── isp_controller.cpp
│ ├── isp_manager.cpp
│ ├── sensor_controller.cpp
│ ├── sensor_manager.cpp
│ └── v4l2_device_manager.cpp
├── driver_adapter
│ └── src
│ ├── v4l2_buffer.cpp
│ ├── v4l2_control.cpp
│ ├── v4l2_dev.cpp
│ ├── v4l2_fileformat.cpp
│ ├── v4l2_stream.cpp
│ └── v4l2_uvc.cpp
└── pipeline_core
└── nodes
├── uvc_node
│ ├── uvc_node.cpp
│ └── uvc_node.h
└── v4l2_source_node
├── v4l2_source_node.cpp
└── v4l2_source_node.h
- device_manager
device_manager 目录存放着向北与pipeline向南与v4l2 adapter交互的代码。 - driver_adapter
driver_adapter 目录中存放着v4l2协议相关代码。可通过它们实现与v4l2底层驱动交互。 - pipeline_core
Pipeline_core 目录与drivers/peripheral/camera/hal/pipeline_core
中代码组合为pipeline框架。v4l2_source_node 和 uvc_node为v4l2框架适配的通用node。
chipset定制化代码
chipset为具体某芯片平台相关代码。
目录结构如下:
device/board/hihope/rk3568/camera/
├── demo
│ └── include
│ └── project_camera_demo.h
├── device_manager
│ ├── include
│ │ ├── imx600.h
│ │ ├── project_hardware.h
│ │ └── rkispv5.h
│ └── src
│ ├── imx600.cpp
│ └── rkispv5.cpp
├── driver_adapter
│ └── test
│ ├── unittest
│ │ ├── include
│ │ │ └── utest_v4l2_dev.h
│ │ └── src
│ │ └── utest_v4l2_dev.cpp
│ └── v4l2_test
│ └── include
│ └── project_v4l2_main.h
└── pipeline_core
└── src
├── ipp_algo_example
│ └── ipp_algo_example.c
└── node
├── rk_codec_node.cpp
├── rk_codec_node.h
├── rk_exif_node.cpp
├── rk_exif_node.h
├── rk_face_node.cpp
└── rk_face_node.h
device_manager目录下存放了rk3568适配过的sensor的相关配置文件,适配的camera sensor 读取设备能力的代码及相关配置文件,其中 project_hardware.h
比较关键,存放了device_manager支持当前chipset的设备列表
pipeline_core路径下存放了由chipset开发者为满足特点需求增加的pipeline node等。
hcs配置文件
- device_info
vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs
...
hdi_server :: host {
hostName = "camera_host";
priority = 50;
gid = ["camera_host", "uhdf_driver", "vendor_mpp_driver"];
camera_device :: device {
device0 :: deviceNode {
policy = 2;
priority = 100;
moduleName = "libcamera_host_service_1.0.z.so";
serviceName = "camera_service";
}
}
...
}
...
- config
vendor/hihope/rk3568/hdf_config/uhdf/camera
vendor/hihope/rk3568/hdf_config/uhdf/camera
├── hdi_impl
│ └── camera_host_config.hcs
└── pipeline_core
├── config.hcs
├── ipp_algo_config.hcs
└── params.hcs
- hdi_impl下的
camera_host_config.hcs
为物理/逻辑Camera配置、能力配置,此处的物理/逻辑Camera配置,需要在hal内部使用,逻辑Camera及能力配置需要上报给上层,需按照所适配的芯片产品添加其能力配置。 - pipeline_core下的
config.hcs
为pipeline的连接方式,按场景划分每一路流由哪些Node组成,其连接方式是怎样的。使用或新增的node需要在代码中注册。 param.hcs
为场景、流类型名及其id定义,pipeline内部是以流id区分流类型的,所以此处需要添加定义。
因config配置文件里面内容比较多,这里就举例了,具体可自行看源码
总结
这里只是简单介绍了OpenHarmony南向的Camera框架,没有具体到代码分析,移植等细节。